12 #include <boost/asio.hpp>
13 #include <pion/PionPlugin.hpp>
14 #include <pion/net/WebServer.hpp>
15 #include "ShutdownManager.hpp"
19 PION_DECLARE_PLUGIN(EchoService)
20 PION_DECLARE_PLUGIN(FileService)
21 PION_DECLARE_PLUGIN(HelloService)
22 PION_DECLARE_PLUGIN(LogService)
23 PION_DECLARE_PLUGIN(CookieService)
27 using namespace pion::net;
31 void argument_error(
void)
33 std::cerr <<
"usage: PionWebServer [OPTIONS] RESOURCE WEBSERVICE" << std::endl
34 <<
" PionWebServer [OPTIONS] -c SERVICE_CONFIG_FILE" << std::endl
35 <<
"options: [-ssl PEM_FILE] [-i IP] [-p PORT] [-d PLUGINS_DIR] [-o OPTION=VALUE]" << std::endl;
40 int main (
int argc,
char *argv[])
42 static const unsigned int DEFAULT_PORT = 8080;
45 typedef std::vector<std::pair<std::string, std::string> > ServiceOptionsType;
46 ServiceOptionsType service_options;
49 boost::asio::ip::tcp::endpoint cfg_endpoint(boost::asio::ip::tcp::v4(), DEFAULT_PORT);
50 std::string service_config_file;
51 std::string resource_name;
52 std::string service_name;
53 std::string ssl_pem_file;
54 bool ssl_flag =
false;
56 for (
int argnum=1; argnum < argc; ++argnum) {
57 if (argv[argnum][0] ==
'-') {
58 if (argv[argnum][1] ==
'p' && argv[argnum][2] ==
'\0' && argnum+1 < argc) {
61 cfg_endpoint.port(strtoul(argv[argnum], 0, 10));
62 if (cfg_endpoint.port() == 0) cfg_endpoint.port(DEFAULT_PORT);
63 }
else if (argv[argnum][1] ==
'i' && argv[argnum][2] ==
'\0' && argnum+1 < argc) {
65 cfg_endpoint.address(boost::asio::ip::address::from_string(argv[++argnum]));
66 }
else if (argv[argnum][1] ==
'c' && argv[argnum][2] ==
'\0' && argnum+1 < argc) {
67 service_config_file = argv[++argnum];
68 }
else if (argv[argnum][1] ==
'd' && argv[argnum][2] ==
'\0' && argnum+1 < argc) {
70 try { PionPlugin::addPluginDirectory(argv[++argnum]); }
72 std::cerr <<
"PionWebServer: Web service plug-ins directory does not exist: "
73 << argv[argnum] << std::endl;
76 }
else if (argv[argnum][1] ==
'o' && argv[argnum][2] ==
'\0' && argnum+1 < argc) {
77 std::string option_name(argv[++argnum]);
78 std::string::size_type pos = option_name.find(
'=');
79 if (pos == std::string::npos) {
83 std::string option_value(option_name, pos + 1);
84 option_name.resize(pos);
85 service_options.push_back( std::make_pair(option_name, option_value) );
86 }
else if (argv[argnum][1] ==
's' && argv[argnum][2] ==
's' &&
87 argv[argnum][3] ==
'l' && argv[argnum][4] ==
'\0' && argnum+1 < argc) {
89 ssl_pem_file = argv[++argnum];
94 }
else if (argnum+2 == argc) {
96 resource_name = argv[argnum];
97 }
else if (argnum+1 == argc) {
99 service_name = argv[argnum];
106 if (service_config_file.empty() && (resource_name.empty() || service_name.empty())) {
113 SetConsoleCtrlHandler(console_ctrl_handler, TRUE);
115 signal(SIGINT, handle_signal);
119 PionLogger main_log(PION_GET_LOGGER(
"PionWebServer"));
121 PION_LOG_SETLEVEL_INFO(main_log);
122 PION_LOG_SETLEVEL_INFO(pion_log);
123 PION_LOG_CONFIG_BASIC;
127 try { PionPlugin::addPluginDirectory(PION_PLUGINS_DIRECTORY); }
129 PION_LOG_WARN(main_log,
"Default plug-ins directory does not exist: "
130 << PION_PLUGINS_DIRECTORY);
134 try { PionPlugin::addPluginDirectory(boost::filesystem::path(argv[0]).branch_path().
string()); }
136 PION_LOG_WARN(main_log,
"Directory of current executable does not exist: "
137 << boost::filesystem::path(argv[0]).branch_path());
146 web_server.setSSLKeyFile(ssl_pem_file);
147 PION_LOG_INFO(main_log,
"SSL support enabled using key file: " << ssl_pem_file);
149 PION_LOG_ERROR(main_log,
"SSL support is not enabled");
153 if (service_config_file.empty()) {
155 web_server.loadService(resource_name, service_name);
158 for (ServiceOptionsType::iterator i = service_options.begin();
159 i != service_options.end(); ++i)
161 web_server.setServiceOption(resource_name, i->first, i->second);
165 web_server.loadServiceConfig(service_config_file);
170 main_shutdown_manager.wait();
172 }
catch (std::exception& e) {
173 PION_LOG_FATAL(main_log, e.what());
exception thrown if the plug-in directory does not exist
the following enables use of the lock-free cache