xref: /openbmc/bmcweb/src/webserver_main.cpp (revision 9140a674ac06c3d40e78557b69cba8e5d2b6c72a)
1 #include "crow/app.h"
2 #include "crow/ci_map.h"
3 #include "crow/common.h"
4 #include "crow/dumb_timer_queue.h"
5 #include "crow/http_connection.h"
6 #include "crow/http_parser_merged.h"
7 #include "crow/http_request.h"
8 #include "crow/http_response.h"
9 #include "crow/http_server.h"
10 #include "crow/json.h"
11 #include "crow/logging.h"
12 #include "crow/middleware.h"
13 #include "crow/middleware_context.h"
14 #include "crow/mustache.h"
15 #include "crow/parser.h"
16 #include "crow/query_string.h"
17 #include "crow/routing.h"
18 #include "crow/settings.h"
19 #include "crow/socket_adaptors.h"
20 #include "crow/utility.h"
21 #include "crow/websocket.h"
22 
23 #include "color_cout_g3_sink.hpp"
24 #include "security_headers_middleware.hpp"
25 #include "ssl_key_handler.hpp"
26 #include "token_authorization_middleware.hpp"
27 #include "web_kvm.hpp"
28 #include "webassets.hpp"
29 #include "webassets.hpp"
30 
31 #include <boost/asio.hpp>
32 #include <boost/endian/arithmetic.hpp>
33 
34 #include <iostream>
35 #include <memory>
36 #include <string>
37 #include <unordered_set>
38 
39 int main(int argc, char** argv) {
40   auto worker(g3::LogWorker::createLogWorker());
41   std::string logger_name("bmcweb");
42   std::string folder("/tmp/");
43   auto handle = worker->addDefaultLogger(logger_name, folder);
44   g3::initializeLogging(worker.get());
45   auto sink_handle = worker->addSink(std::make_unique<crow::ColorCoutSink>(),
46                                      &crow::ColorCoutSink::ReceiveLogMessage);
47 
48   std::string ssl_pem_file("server.pem");
49   ensuressl::ensure_openssl_key_present_and_valid(ssl_pem_file);
50 
51   crow::App<crow::TokenAuthorizationMiddleware, crow::SecurityHeadersMiddleware>
52       app;
53 
54   crow::webassets::request_routes(app);
55   crow::kvm::request_routes(app);
56 
57   crow::logger::setLogLevel(crow::LogLevel::INFO);
58   CROW_ROUTE(app, "/systeminfo")
59   ([]() {
60 
61     crow::json::wvalue j;
62     j["device_id"] = 0x7B;
63     j["device_provides_sdrs"] = true;
64     j["device_revision"] = true;
65     j["device_available"] = true;
66     j["firmware_revision"] = "0.68";
67 
68     j["ipmi_revision"] = "2.0";
69     j["supports_chassis_device"] = true;
70     j["supports_bridge"] = true;
71     j["supports_ipmb_event_generator"] = true;
72     j["supports_ipmb_event_receiver"] = true;
73     j["supports_fru_inventory_device"] = true;
74     j["supports_sel_device"] = true;
75     j["supports_sdr_repository_device"] = true;
76     j["supports_sensor_device"] = true;
77 
78     j["firmware_aux_revision"] = "0.60.foobar";
79 
80     return j;
81   });
82 
83   CROW_ROUTE(app, "/ipmiws")
84       .websocket()
85       .onopen([&](crow::websocket::connection& conn) {
86 
87       })
88       .onclose(
89           [&](crow::websocket::connection& conn, const std::string& reason) {
90 
91           })
92       .onmessage([&](crow::websocket::connection& conn, const std::string& data,
93                      bool is_binary) {
94         boost::asio::io_service io_service;
95         using boost::asio::ip::udp;
96         udp::resolver resolver(io_service);
97         udp::resolver::query query(udp::v4(), "10.243.48.31", "623");
98         udp::endpoint receiver_endpoint = *resolver.resolve(query);
99 
100         udp::socket socket(io_service);
101         socket.open(udp::v4());
102 
103         socket.send_to(boost::asio::buffer(data), receiver_endpoint);
104 
105         std::array<char, 255> recv_buf;
106 
107         udp::endpoint sender_endpoint;
108         size_t len =
109             socket.receive_from(boost::asio::buffer(recv_buf), sender_endpoint);
110         // TODO(ed) THis is ugly.  Find a way to not make a copy (ie, use
111         // std::string::data() to
112         std::string str(std::begin(recv_buf), std::end(recv_buf));
113         LOG(DEBUG) << "Got " << str << "back \n";
114         conn.send_binary(str);
115 
116       });
117   auto ssl_context = ensuressl::get_ssl_context(ssl_pem_file);
118   app.port(18080)
119       //.ssl(std::move(ssl_context))
120       //.concurrency(4)
121       .run();
122 }
123