xref: /openbmc/bmcweb/src/webserver_main.cpp (revision 168792a1349438ca10d9e275a41ddb412634c171)
1 #include <dbus/connection.hpp>
2 #include <dbus_monitor.hpp>
3 #include <dbus_singleton.hpp>
4 #include <intel_oem.hpp>
5 #include <openbmc_dbus_rest.hpp>
6 #include <persistent_data_middleware.hpp>
7 #include <redfish_v1.hpp>
8 #include <security_headers_middleware.hpp>
9 #include <ssl_key_handler.hpp>
10 #include <token_authorization_middleware.hpp>
11 #include <web_kvm.hpp>
12 #include <webassets.hpp>
13 #include <memory>
14 #include <string>
15 #include <crow/app.h>
16 #include <boost/asio.hpp>
17 #include <systemd/sd-daemon.h>
18 #include "redfish.hpp"
19 
20 constexpr int defaultPort = 18080;
21 
22 template <typename... Middlewares>
23 void setup_socket(crow::Crow<Middlewares...>& app) {
24   int listen_fd = sd_listen_fds(0);
25   if (1 == listen_fd) {
26     CROW_LOG_INFO << "attempting systemd socket activation";
27     if (sd_is_socket_inet(SD_LISTEN_FDS_START, AF_UNSPEC, SOCK_STREAM, 1, 0)) {
28       CROW_LOG_INFO << "Starting webserver on socket handle "
29                     << SD_LISTEN_FDS_START;
30       app.socket(SD_LISTEN_FDS_START);
31     } else {
32       CROW_LOG_INFO << "bad incoming socket, starting webserver on port "
33                 << defaultPort;
34       app.port(defaultPort);
35     }
36   } else {
37     CROW_LOG_INFO << "Starting webserver on port " << defaultPort;
38     app.port(defaultPort);
39   }
40 }
41 
42 int main(int argc, char** argv) {
43   auto io = std::make_shared<boost::asio::io_service>();
44   crow::App<crow::PersistentData::Middleware,
45             crow::TokenAuthorization::Middleware,
46             crow::SecurityHeadersMiddleware>
47       app(io);
48 
49 #ifdef CROW_ENABLE_SSL
50   std::string ssl_pem_file("server.pem");
51   std::cout << "Building SSL context\n";
52 
53   ensuressl::ensure_openssl_key_present_and_valid(ssl_pem_file);
54   std::cout << "SSL Enabled\n";
55   auto ssl_context = ensuressl::get_ssl_context(ssl_pem_file);
56   app.ssl(std::move(ssl_context));
57 #endif
58   // Static assets need to be initialized before Authorization, because auth
59   // needs to build the whitelist from the static routes
60   crow::webassets::request_routes(app);
61   crow::TokenAuthorization::request_routes(app);
62 
63   crow::kvm::request_routes(app);
64   crow::redfish::request_routes(app);
65   crow::dbus_monitor::request_routes(app);
66   crow::intel_oem::request_routes(app);
67   crow::openbmc_mapper::request_routes(app);
68 
69   crow::logger::setLogLevel(crow::LogLevel::INFO);
70 
71   CROW_LOG_INFO << "bmcweb (" << __DATE__ << ": " << __TIME__ << ')';
72   setup_socket(app);
73 
74   // Start dbus connection
75   crow::connections::system_bus =
76       std::make_shared<dbus::connection>(*io, dbus::bus::system);
77 
78   redfish::RedfishService redfish(app);
79 
80   app.run();
81 }
82