int main(int argc, char *argv[]) { struct mg_mgr mgr; struct mg_connection *nc; int i; char *cp; #ifdef MG_ENABLE_SSL const char *ssl_cert = NULL; #endif mg_mgr_init(&mgr, NULL); /* Use current binary directory as document root */ if (argc > 0 && ((cp = strrchr(argv[0], DIRSEP)) != NULL)) { *cp = '\0'; s_http_server_opts.document_root = argv[0]; } /* Process command line options to customize HTTP server */ for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-D") == 0 && i + 1 < argc) { mgr.hexdump_file = argv[++i]; } else if (strcmp(argv[i], "-d") == 0 && i + 1 < argc) { s_http_server_opts.document_root = argv[++i]; } else if (strcmp(argv[i], "-p") == 0 && i + 1 < argc) { s_http_port = argv[++i]; } else if (strcmp(argv[i], "-a") == 0 && i + 1 < argc) { s_http_server_opts.auth_domain = argv[++i]; #ifdef MG_ENABLE_JAVASCRIPT } else if (strcmp(argv[i], "-j") == 0 && i + 1 < argc) { const char *init_file = argv[++i]; mg_enable_javascript(&mgr, v7_create(), init_file); #endif } else if (strcmp(argv[i], "-P") == 0 && i + 1 < argc) { s_http_server_opts.global_auth_file = argv[++i]; } else if (strcmp(argv[i], "-A") == 0 && i + 1 < argc) { s_http_server_opts.per_directory_auth_file = argv[++i]; } else if (strcmp(argv[i], "-r") == 0 && i + 1 < argc) { s_http_server_opts.url_rewrites = argv[++i]; #ifndef MG_DISABLE_CGI } else if (strcmp(argv[i], "-i") == 0 && i + 1 < argc) { s_http_server_opts.cgi_interpreter = argv[++i]; #endif #ifdef MG_ENABLE_SSL } else if (strcmp(argv[i], "-s") == 0 && i + 1 < argc) { ssl_cert = argv[++i]; #endif } else { fprintf(stderr, "Unknown option: [%s]\n", argv[i]); exit(1); } } /* Set HTTP server options */ nc = mg_bind(&mgr, s_http_port, ev_handler); if (nc == NULL) { fprintf(stderr, "Error starting server on port %s\n", s_http_port); exit(1); } #ifdef MG_ENABLE_SSL if (ssl_cert != NULL) { const char *err_str = mg_set_ssl(nc, ssl_cert, NULL); if (err_str != NULL) { fprintf(stderr, "Error loading SSL cert: %s\n", err_str); exit(1); } } #endif mg_set_protocol_http_websocket(nc); s_http_server_opts.enable_directory_listing = "yes"; printf("Starting RESTful server on port %s, serving %s\n", s_http_port, s_http_server_opts.document_root); for (;;) { mg_mgr_poll(&mgr, 1000); } mg_mgr_free(&mgr); return 0; }
void APP_Tasks ( void ) { SYS_STATUS tcpipStat; const char *netName, *netBiosName; static IPV4_ADDR dwLastIP[2] = { {-1}, {-1} }; IPV4_ADDR ipAddr; TCPIP_NET_HANDLE netH; int i, nNets; /* Check the application's current state. */ switch ( appData.state ) { /* Application's initial state. */ case APP_STATE_INIT: { tcpipStat = TCPIP_STACK_Status(sysObj.tcpip); if(tcpipStat < 0) { // some error occurred SYS_CONSOLE_MESSAGE(" APP: TCP/IP stack initialization failed!\r\n"); appData.state = APP_DONE; } else if(tcpipStat == SYS_STATUS_READY) { // now that the stack is ready we can check the // available interfaces nNets = TCPIP_STACK_NumberOfNetworksGet(); for(i = 0; i < nNets; i++) { netH = TCPIP_STACK_IndexToNet(i); netName = TCPIP_STACK_NetNameGet(netH); netBiosName = TCPIP_STACK_NetBIOSName(netH); #if defined(TCPIP_STACK_USE_NBNS) SYS_CONSOLE_PRINT(" Interface %s on host %s - NBNS enabled\r\n", netName, netBiosName); #else SYS_CONSOLE_PRINT(" Interface %s on host %s - NBNS disabled\r\n", netName, netBiosName); #endif // defined(TCPIP_STACK_USE_NBNS) } appData.state = APP_TCPIP_WAIT_FOR_IP; } break; } case APP_TCPIP_WAIT_FOR_IP: // if the IP address of an interface has changed // display the new value on the system console nNets = TCPIP_STACK_NumberOfNetworksGet(); for (i = 0; i < nNets; i++) { netH = TCPIP_STACK_IndexToNet(i); ipAddr.Val = TCPIP_STACK_NetAddress(netH); if(dwLastIP[i].Val != ipAddr.Val) { dwLastIP[i].Val = ipAddr.Val; SYS_CONSOLE_MESSAGE(TCPIP_STACK_NetNameGet(netH)); SYS_CONSOLE_MESSAGE(" IP Address: "); SYS_CONSOLE_PRINT("%d.%d.%d.%d \r\n", ipAddr.v[0], ipAddr.v[1], ipAddr.v[2], ipAddr.v[3]); if (ipAddr.v[0] != 0 && ipAddr.v[0] != 169) // Wait for a Valid IP { appData.state = APP_START_LISTENING; } } } break; case APP_START_LISTENING: { SYS_CONSOLE_PRINT("Starting listening on port 8000\r\n"); struct mg_connection *nc = mg_bind(&mgr, "8000", ev_handler); // Create listening connection and add it to the event manager if (nc == NULL) { SYS_CONSOLE_PRINT("Failed to create listener\n\r"); appData.state = APP_DONE; break; } mg_set_protocol_http_websocket(nc); SYS_CONSOLE_PRINT("Listener started\r\n"); appData.state = APP_POLL; break; } case APP_POLL: { mg_mgr_poll(&mgr, 1000); break; } case APP_DONE: { SYS_CONSOLE_PRINT("Server stopped\n\r"); appData.state = APP_EMPTY; break; } case APP_EMPTY: { break; } /* The default state should never be executed. */ default: { /* TODO: Handle error in application's state machine. */ break; } } }
int main(int argc, char *argv[]) { struct mg_mgr mgr; struct mg_connection *nc; int i, redirect = 0; const char *vhost = NULL; mg_mgr_init(&mgr, NULL); /* Parse command line arguments */ for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-D") == 0) { mgr.hexdump_file = argv[i + 1]; i++; } else if (strcmp(argv[i], "-k") == 0) { s_backend_keepalive = 1; } else if (strcmp(argv[i], "-l") == 0 && i + 1 < argc) { if (strcmp(argv[i + 1], "-") == 0) { s_log_file = stdout; } else { s_log_file = fopen(argv[i + 1], "a"); if (s_log_file == NULL) { perror("fopen"); exit(EXIT_FAILURE); } } i++; } else if (strcmp(argv[i], "-p") == 0) { s_http_port = argv[i + 1]; i++; } else if (strcmp(argv[i], "-r") == 0 && i + 1 < argc) { redirect = 1; } else if (strcmp(argv[i], "-v") == 0 && i + 1 < argc) { if (strcmp(argv[i + 1], "") == 0) { vhost = NULL; } else { vhost = argv[i + 1]; } i++; } else if (strcmp(argv[i], "-b") == 0 && i + 2 < argc) { struct http_backend *be = vhost != NULL ? &s_vhost_backends[s_num_vhost_backends++] : &s_default_backends[s_num_default_backends++]; STAILQ_INIT(&be->conns); char *r = NULL; be->vhost = vhost; be->uri_prefix = argv[i + 1]; be->host_port = argv[i + 2]; be->redirect = redirect; be->uri_prefix_replacement = be->uri_prefix; if ((r = strchr(be->uri_prefix, '=')) != NULL) { *r = '\0'; be->uri_prefix_replacement = r + 1; } printf( "Adding backend for %s%s : %s " "[redirect=%d,prefix_replacement=%s]\n", be->vhost == NULL ? "" : be->vhost, be->uri_prefix, be->host_port, be->redirect, be->uri_prefix_replacement); vhost = NULL; redirect = 0; i += 2; #if MG_ENABLE_SSL } else if (strcmp(argv[i], "-s") == 0 && i + 1 < argc) { s_ssl_cert = argv[++i]; #endif } else { print_usage_and_exit(argv[0]); } } /* Open listening socket */ if ((nc = mg_bind(&mgr, s_http_port, ev_handler)) == NULL) { fprintf(stderr, "mg_bind(%s) failed\n", s_http_port); exit(EXIT_FAILURE); } #if MG_ENABLE_SSL if (s_ssl_cert != NULL) { const char *err_str = mg_set_ssl(nc, s_ssl_cert, NULL); if (err_str != NULL) { fprintf(stderr, "Error loading SSL cert: %s\n", err_str); exit(1); } } #endif mg_set_protocol_http_websocket(nc); if (s_num_vhost_backends + s_num_default_backends == 0) { print_usage_and_exit(argv[0]); } signal(SIGINT, signal_handler); signal(SIGTERM, signal_handler); /* Run event loop until signal is received */ printf("Starting LB on port %s\n", s_http_port); while (s_sig_num == 0) { mg_mgr_poll(&mgr, 1000); } /* Cleanup */ mg_mgr_free(&mgr); printf("Exiting on signal %d\n", s_sig_num); return EXIT_SUCCESS; }
Server::Server(ManagerConfig *config, const std::string &config_file) { srand((unsigned) time(0)); m_config = config; m_user = CONFIG_STRING(m_config, "service.admin_username"); m_password = CONFIG_STRING(m_config, "service.admin_password"); mg_mgr_init(&m_mgr, this); 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(); std::ifstream header(std::string(CONFIG_STRING(m_config, "service.data_dir") + "/header.html").c_str(), std::ios::in); if (header) { header.seekg(0, std::ios::end); m_header.resize(header.tellg()); header.seekg(0, std::ios::beg); header.read(&m_header[0], m_header.size()); header.close(); } std::ifstream footer(std::string(CONFIG_STRING(m_config, "service.data_dir") + "/footer.html").c_str(), std::ios::in); if (footer) { footer.seekg(0, std::ios::end); m_footer.resize(footer.tellg()); footer.seekg(0, std::ios::beg); footer.read(&m_footer[0], m_footer.size()); footer.close(); } m_storageCfg = new Config(); m_storageCfg->load(config_file); Logging::initManagerLogging(m_storageCfg); std::string error; m_storage = StorageBackend::createBackend(m_storageCfg, error); if (m_storage == NULL) { std::cerr << "Error creating StorageBackend! " << error << "\n"; std::cerr << "Registering new Spectrum 2 manager users won't work" << "\n"; } else if (!m_storage->connect()) { delete m_storage; m_storage = NULL; std::cerr << "Can't connect to database!\n"; } m_apiServer = new APIServer(config, m_storage); }