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