diff --git a/spectrum_manager/src/CMakeLists.txt b/spectrum_manager/src/CMakeLists.txt index 9256eeb8..bccf7a6b 100644 --- a/spectrum_manager/src/CMakeLists.txt +++ b/spectrum_manager/src/CMakeLists.txt @@ -8,6 +8,11 @@ SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/../../include/transport/ target_link_libraries(spectrum2_manager transport ${SWIFTEN_LIBRARY} ${PROTOBUF_LIBRARIES}) +if (CMAKE_COMPILER_IS_GNUCXX) +add_definitions(-DMG_ENABLE_SSL) +target_link_libraries(spectrum2_manager ${OPENSSL_LIBRARIES}) +endif() + if(APPLE) target_link_libraries(spectrum2_manager transport ${APPLE_FRAMEWORKS}) endif() diff --git a/spectrum_manager/src/html/js/app.js b/spectrum_manager/src/html/js/app.js index 835baf62..54a7df0b 100644 --- a/spectrum_manager/src/html/js/app.js +++ b/spectrum_manager/src/html/js/app.js @@ -18,6 +18,9 @@ function show_instances() { else if (admin) { var command = "start"; } + else { + var command = ""; + } var row = '' row += '' + instance.name + '' row += '' + instance.status + '' @@ -26,8 +29,13 @@ function show_instances() { row += '' + command + '' + ''; $("#main_result > tbody:last-child").append(row); } + else if (command == "") { + row += ''; + $("#main_result > tbody:last-child").append(row); + } else { row += '' + command + '' + ''; + $("#main_result > tbody:last-child").append(row); $(".button_command").click(function(e) { e.preventDefault(); $(this).parent().empty().progressbar( {value: false} ).css('height', '1em'); diff --git a/spectrum_manager/src/managerconfig.cpp b/spectrum_manager/src/managerconfig.cpp index c25b1a04..02258e94 100644 --- a/spectrum_manager/src/managerconfig.cpp +++ b/spectrum_manager/src/managerconfig.cpp @@ -32,6 +32,7 @@ bool ManagerConfig::load(const std::string &configfile, boost::program_options:: ("service.admin_username", value()->default_value(""), "Administrator username.") ("service.admin_password", value()->default_value(""), "Administrator password.") ("service.port", value()->default_value(8081), "Web interface port.") + ("service.cert", value()->default_value(""), "Web interface certificate in PEM format when TLS should be used.") ("service.config_directory", value()->default_value("/etc/spectrum2/transports/"), "Directory with spectrum2 configuration files. One .cfg file per one instance") ("service.data_dir", value()->default_value("/var/lib/spectrum2_manager/html"), "Directory to store Spectrum 2 manager data") ("servers.server", value >()->multitoken(), "Server.") diff --git a/spectrum_manager/src/mongoose.c b/spectrum_manager/src/mongoose.c index 05bdee5c..29b87d62 100644 --- a/spectrum_manager/src/mongoose.c +++ b/spectrum_manager/src/mongoose.c @@ -2228,6 +2228,7 @@ static int mg_use_cert(SSL_CTX *ctx, const char *pem_file) { return 0; } else if (SSL_CTX_use_certificate_file(ctx, pem_file, 1) == 0 || SSL_CTX_use_PrivateKey_file(ctx, pem_file, 1) == 0) { + ERR_print_errors_fp(stderr); return -2; } else { #ifndef MG_DISABLE_PFS diff --git a/spectrum_manager/src/mongoose.h b/spectrum_manager/src/mongoose.h index e5ce1800..8f20bb13 100644 --- a/spectrum_manager/src/mongoose.h +++ b/spectrum_manager/src/mongoose.h @@ -644,6 +644,7 @@ int json_emit_va(char *buf, int buf_len, const char *fmt, va_list); #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif #include +#include #else typedef void *SSL; typedef void *SSL_CTX; diff --git a/spectrum_manager/src/server.cpp b/spectrum_manager/src/server.cpp index 44e4c13b..a4d6618a 100644 --- a/spectrum_manager/src/server.cpp +++ b/spectrum_manager/src/server.cpp @@ -63,7 +63,24 @@ Server::Server(ManagerConfig *config, const std::string &config_file) { m_password = CONFIG_STRING(m_config, "service.admin_password"); mg_mgr_init(&m_mgr, this); - m_nc = mg_bind(&m_mgr, std::string(":" + boost::lexical_cast(CONFIG_INT(m_config, "service.port"))).c_str(), &_event_handler); + + struct mg_bind_opts opts; + memset(&opts, 0, sizeof(opts)); + const char *error_string; + opts.error_string = &error_string; + m_nc = mg_bind_opt(&m_mgr, std::string(":" + boost::lexical_cast(CONFIG_INT(m_config, "service.port"))).c_str(), &_event_handler, opts); + if (!m_nc) { + std::cerr << "Error creating server: " << error_string << "\n"; + exit(1); + } + + if (!CONFIG_STRING(m_config, "service.cert").empty()) { + const char *err_str = mg_set_ssl(m_nc, CONFIG_STRING(m_config, "service.cert").c_str(), NULL); + if (err_str) { + std::cerr << "Error setting SSL certificate: " << err_str << "\n"; + exit(1); + } + } mg_set_protocol_http_websocket(m_nc); s_http_server_opts.document_root = CONFIG_STRING(m_config, "service.data_dir").c_str();