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