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();