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