blob: 80354fbe63747dde5170e4400344a1e003164ca4 [file] [log] [blame]
Ed Tanousb4d29f42017-03-24 16:39:25 -07001#include <webassets.hpp>
2#include <web_kvm.hpp>
3#include "ssl_key_handler.hpp"
4
5#include "app_type.hpp"
6
Ed Tanousf9273472017-02-28 16:05:13 -08007#include "crow/app.h"
Ed Tanousc4771fb2017-03-13 13:39:49 -07008#include "crow/ci_map.h"
Ed Tanousf9273472017-02-28 16:05:13 -08009#include "crow/common.h"
10#include "crow/dumb_timer_queue.h"
11#include "crow/http_connection.h"
Ed Tanousc4771fb2017-03-13 13:39:49 -070012#include "crow/http_parser_merged.h"
Ed Tanousf9273472017-02-28 16:05:13 -080013#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"
Ed Tanousc4771fb2017-03-13 13:39:49 -070022#include "crow/query_string.h"
Ed Tanousf9273472017-02-28 16:05:13 -080023#include "crow/routing.h"
Ed Tanous0fdddb12017-02-28 11:06:34 -080024#include "crow/settings.h"
25#include "crow/socket_adaptors.h"
Ed Tanous0fdddb12017-02-28 11:06:34 -080026#include "crow/utility.h"
Ed Tanous0fdddb12017-02-28 11:06:34 -080027#include "crow/websocket.h"
Ed Tanous0fdddb12017-02-28 11:06:34 -080028
Ed Tanous1ccd57c2017-03-21 13:15:58 -070029
Ed Tanous5f34a9c2017-02-28 12:35:13 -080030#include "color_cout_g3_sink.hpp"
Ed Tanousf9273472017-02-28 16:05:13 -080031#include "token_authorization_middleware.hpp"
Ed Tanous99923322017-03-03 14:21:24 -080032#include "webassets.hpp"
Ed Tanousf9273472017-02-28 16:05:13 -080033
Ed Tanousb4d29f42017-03-24 16:39:25 -070034
35#include <boost/asio.hpp>
36#include <boost/endian/arithmetic.hpp>
37
38
Ed Tanous0fdddb12017-02-28 11:06:34 -080039#include <iostream>
Ed Tanousc4771fb2017-03-13 13:39:49 -070040#include <memory>
Ed Tanous0fdddb12017-02-28 11:06:34 -080041#include <string>
Ed Tanousc4771fb2017-03-13 13:39:49 -070042#include <unordered_set>
Ed Tanous9b65f1f2017-03-07 15:17:13 -080043
Ed Tanous99923322017-03-03 14:21:24 -080044int main(int argc, char** argv) {
Ed Tanous9b65f1f2017-03-07 15:17:13 -080045 auto worker(g3::LogWorker::createLogWorker());
Ed Tanous1ccd57c2017-03-21 13:15:58 -070046 std::string logger_name("bmcweb");
47 std::string folder("/tmp/");
48 auto handle = worker->addDefaultLogger(logger_name, folder);
Ed Tanous99923322017-03-03 14:21:24 -080049 g3::initializeLogging(worker.get());
Ed Tanous1ccd57c2017-03-21 13:15:58 -070050 auto sink_handle = worker->addSink(std::make_unique<crow::ColorCoutSink>(),
51 &crow::ColorCoutSink::ReceiveLogMessage);
Ed Tanous0fdddb12017-02-28 11:06:34 -080052
Ed Tanous99923322017-03-03 14:21:24 -080053 std::string ssl_pem_file("server.pem");
54 ensuressl::ensure_openssl_key_present_and_valid(ssl_pem_file);
Ed Tanous0fdddb12017-02-28 11:06:34 -080055
Ed Tanous1ccd57c2017-03-21 13:15:58 -070056 BmcAppType app;
Ed Tanousb4d29f42017-03-24 16:39:25 -070057
Ed Tanous99923322017-03-03 14:21:24 -080058 crow::webassets::request_routes(app);
Ed Tanousc81ca422017-03-21 16:18:49 -070059 crow::kvm::request_routes(app);
Ed Tanous0fdddb12017-02-28 11:06:34 -080060
Ed Tanous9b65f1f2017-03-07 15:17:13 -080061 crow::logger::setLogLevel(crow::LogLevel::INFO);
Ed Tanous0fdddb12017-02-28 11:06:34 -080062
Ed Tanous9b65f1f2017-03-07 15:17:13 -080063 CROW_ROUTE(app, "/routes")
64 ([&app]() {
65 crow::json::wvalue routes;
66
67 routes["routes"] = app.get_rules();
68 return routes;
69 });
70
Ed Tanousc4771fb2017-03-13 13:39:49 -070071 CROW_ROUTE(app, "/login")
72 .methods("POST"_method)([&](const crow::request& req) {
Ed Tanousb4d29f42017-03-24 16:39:25 -070073 crow::json::wvalue x;
Ed Tanous1ccd57c2017-03-21 13:15:58 -070074 auto auth_token =
75 app.get_context<crow::TokenAuthorizationMiddleware>(req).auth_token;
Ed Tanousb4d29f42017-03-24 16:39:25 -070076
Ed Tanousc4771fb2017-03-13 13:39:49 -070077 x["token"] = auth_token;
78
79 return x;
80 });
81
82 CROW_ROUTE(app, "/logout")
Ed Tanousb4d29f42017-03-24 16:39:25 -070083 .methods("GET"_method, "POST"_method)([&](const crow::request& req) {
84
85 app.get_context<crow::TokenAuthorizationMiddleware>(req).auth_token = "";
Ed Tanousc4771fb2017-03-13 13:39:49 -070086 // 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
Ed Tanousc4771fb2017-03-13 13:39:49 -0700115 CROW_ROUTE(app, "/ipmiws")
116 .websocket()
117 .onopen([&](crow::websocket::connection& conn) {
118
119 })
Ed Tanous1ccd57c2017-03-21 13:15:58 -0700120 .onclose(
121 [&](crow::websocket::connection& conn, const std::string& reason) {
Ed Tanousc4771fb2017-03-13 13:39:49 -0700122
Ed Tanous1ccd57c2017-03-21 13:15:58 -0700123 })
124 .onmessage([&](crow::websocket::connection& conn, const std::string& data,
125 bool is_binary) {
Ed Tanousc4771fb2017-03-13 13:39:49 -0700126 boost::asio::io_service io_service;
Ed Tanous1ccd57c2017-03-21 13:15:58 -0700127 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
Ed Tanousc4771fb2017-03-13 13:39:49 -0700148 });
149
Ed Tanous1ccd57c2017-03-21 13:15:58 -0700150 app.port(18080)
151 //.ssl(std::move(ensuressl::get_ssl_context(ssl_pem_file)))
152 .run();
Ed Tanous0fdddb12017-02-28 11:06:34 -0800153}