Web interface: allow using service.cert PEM certificate to enable SSL support.

This commit is contained in:
Jan Kaluza 2016-01-20 08:20:45 +01:00
parent 17fe52b61f
commit d0d08adf5a
6 changed files with 34 additions and 1 deletions

View file

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

View file

@ -18,6 +18,9 @@ function show_instances() {
else if (admin) {
var command = "start";
}
else {
var command = "";
}
var row = '<tr>'
row += '<td>' + instance.name + '</td>'
row += '<td>' + instance.status + '</td>'
@ -26,8 +29,13 @@ function show_instances() {
row += '<td><a class="button_command" href="/instances/register.shtml?id=' + instance.id + '">' + command + '</a>' + '</td></tr>';
$("#main_result > tbody:last-child").append(row);
}
else if (command == "") {
row += '<td></td></tr>';
$("#main_result > tbody:last-child").append(row);
}
else {
row += '<td><a class="button_command" href="/api/v1/instances/' + command + '/' + instance.id + '">' + command + '</a>' + '</td></tr>';
$("#main_result > tbody:last-child").append(row);
$(".button_command").click(function(e) {
e.preventDefault();
$(this).parent().empty().progressbar( {value: false} ).css('height', '1em');

View file

@ -32,6 +32,7 @@ bool ManagerConfig::load(const std::string &configfile, boost::program_options::
("service.admin_username", value<std::string>()->default_value(""), "Administrator username.")
("service.admin_password", value<std::string>()->default_value(""), "Administrator password.")
("service.port", value<int>()->default_value(8081), "Web interface port.")
("service.cert", value<std::string>()->default_value(""), "Web interface certificate in PEM format when TLS should be used.")
("service.config_directory", value<std::string>()->default_value("/etc/spectrum2/transports/"), "Directory with spectrum2 configuration files. One .cfg file per one instance")
("service.data_dir", value<std::string>()->default_value("/var/lib/spectrum2_manager/html"), "Directory to store Spectrum 2 manager data")
("servers.server", value<std::vector<std::string> >()->multitoken(), "Server.")

View file

@ -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

View file

@ -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 <openssl/ssl.h>
#include <openssl/err.h>
#else
typedef void *SSL;
typedef void *SSL_CTX;

View file

@ -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<std::string>(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<std::string>(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();