From 02daddc0ce328f7fc77595ec68c349af8b15a0d3 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Thu, 3 Nov 2011 20:44:33 +0100 Subject: [PATCH] Fixed some bugs in config parsing + added vhosts.vhost variable --- include/transport/config.h | 6 ++-- spectrum/src/main.cpp | 4 ++- spectrum_manager/src/main.cpp | 60 +++++++++++++++++++++++++---------- src/config.cpp | 51 +++++++++++++++++++++++++---- 4 files changed, 94 insertions(+), 27 deletions(-) diff --git a/include/transport/config.h b/include/transport/config.h index c0ad64e5..d6900d30 100644 --- a/include/transport/config.h +++ b/include/transport/config.h @@ -60,9 +60,9 @@ class Config { /// the parser using opts parameter. /// \param configfile path to config file /// \param opts extra options which will be recognized by a parser - bool load(const std::string &configfile, boost::program_options::options_description &opts); + bool load(const std::string &configfile, boost::program_options::options_description &opts, const std::string &jid = ""); - bool load(std::istream &ifs, boost::program_options::options_description &opts); + bool load(std::istream &ifs, boost::program_options::options_description &opts, const std::string &jid = ""); bool load(std::istream &ifs); @@ -71,7 +71,7 @@ class Config { /// This function loads only config variables needed by libtransport. /// \see load(const std::string &, boost::program_options::options_description &) /// \param configfile path to config file - bool load(const std::string &configfile); + bool load(const std::string &configfile, const std::string &jid = ""); bool reload(); diff --git a/spectrum/src/main.cpp b/spectrum/src/main.cpp index 5037e6d0..8074d354 100644 --- a/spectrum/src/main.cpp +++ b/spectrum/src/main.cpp @@ -122,6 +122,7 @@ int main(int argc, char **argv) boost::program_options::variables_map vm; bool no_daemon = false; std::string config_file; + std::string jid; #ifndef WIN32 @@ -139,6 +140,7 @@ int main(int argc, char **argv) desc.add_options() ("help,h", "help") ("no-daemonize,n", "Do not run spectrum as daemon") + ("jid,j", boost::program_options::value(&jid)->default_value(""), "Specify JID of transport manually") ("config", boost::program_options::value(&config_file)->default_value(""), "Config file") ; try @@ -177,7 +179,7 @@ int main(int argc, char **argv) return 1; } - if (!config.load(vm["config"].as())) { + if (!config.load(vm["config"].as(), jid)) { std::cerr << "Can't load configuration file.\n"; return 1; } diff --git a/spectrum_manager/src/main.cpp b/spectrum_manager/src/main.cpp index efa5038e..d4b8e383 100644 --- a/spectrum_manager/src/main.cpp +++ b/spectrum_manager/src/main.cpp @@ -82,12 +82,17 @@ static std::string searchForBinary(const std::string &binary) { } // Executes new backend -static unsigned long exec_(std::string path, std::string config) { +static unsigned long exec_(std::string path, std::string config, std::string jid = "") { // fork and exec pid_t pid = fork(); if ( pid == 0 ) { // child process - exit(execl(path.c_str(), path.c_str(), config.c_str(), NULL)); + if (jid.empty()) { + exit(execl(path.c_str(), path.c_str(), config.c_str(), NULL)); + } + else { + exit(execl(path.c_str(), path.c_str(), "-j", jid.c_str(), config.c_str(), NULL)); + } } else if ( pid < 0 ) { // fork failed } @@ -143,15 +148,27 @@ static void start_all_instances(ManagerConfig *config) { Config cfg; if (cfg.load(itr->path().string()) == false) { std::cerr << "Can't load config file " << itr->path().string() << ". Skipping...\n"; + continue; } - int pid = isRunning(CONFIG_STRING(&cfg, "service.pidfile")); - if (pid == 0) { - std::cout << "Starting " << itr->path() << ": OK\n"; - exec_(spectrum2_binary, itr->path().string()); - } - else { - std::cout << "Starting " << itr->path() << ": Already started (PID=" << pid << ")\n"; + std::vector vhosts = CONFIG_VECTOR(&cfg, "vhosts.vhost"); + vhosts.push_back(CONFIG_STRING(&cfg, "service.jid")); + + BOOST_FOREACH(std::string &vhost, vhosts) { + Config vhostCfg; + if (vhostCfg.load(itr->path().string(), vhost) == false) { + std::cerr << "Can't load config file " << itr->path().string() << ". Skipping...\n"; + continue; + } + + int pid = isRunning(CONFIG_STRING(&vhostCfg, "service.pidfile")); + if (pid == 0) { + std::cout << "Starting " << itr->path() << ": OK\n"; + exec_(spectrum2_binary, itr->path().string(), vhost); + } + else { + std::cout << "Starting " << itr->path() << ": Already started (PID=" << pid << ")\n"; + } } } } @@ -184,13 +201,24 @@ static void stop_all_instances(ManagerConfig *config) { std::cerr << "Can't load config file " << itr->path().string() << ". Skipping...\n"; } - int pid = isRunning(CONFIG_STRING(&cfg, "service.pidfile")); - if (pid) { - std::cout << "Stopping " << itr->path() << ": OK\n"; - kill(pid, SIGTERM); - } - else { - std::cout << "Stopping " << itr->path() << ": Not running\n"; + std::vector vhosts = CONFIG_VECTOR(&cfg, "vhosts.vhost"); + vhosts.push_back(CONFIG_STRING(&cfg, "service.jid")); + + BOOST_FOREACH(std::string &vhost, vhosts) { + Config vhostCfg; + if (vhostCfg.load(itr->path().string(), vhost) == false) { + std::cerr << "Can't load config file " << itr->path().string() << ". Skipping...\n"; + continue; + } + + int pid = isRunning(CONFIG_STRING(&vhostCfg, "service.pidfile")); + if (pid) { + std::cout << "Stopping " << itr->path() << ": OK\n"; + kill(pid, SIGTERM); + } + else { + std::cout << "Stopping " << itr->path() << ": Not running\n"; + } } } } diff --git a/src/config.cpp b/src/config.cpp index d0307788..655ce4b7 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -31,13 +31,13 @@ using namespace boost::program_options; namespace Transport { -bool Config::load(const std::string &configfile, boost::program_options::options_description &opts) { +bool Config::load(const std::string &configfile, boost::program_options::options_description &opts, const std::string &jid) { std::ifstream ifs(configfile.c_str()); if (!ifs.is_open()) return false; m_file = configfile; - bool ret = load(ifs, opts); + bool ret = load(ifs, opts, jid); ifs.close(); char path[PATH_MAX] = ""; @@ -49,7 +49,7 @@ bool Config::load(const std::string &configfile, boost::program_options::options return ret; } -bool Config::load(std::istream &ifs, boost::program_options::options_description &opts) { +bool Config::load(std::istream &ifs, boost::program_options::options_description &opts, const std::string &_jid) { m_unregistered.clear(); opts.add_options() ("service.jid", value()->default_value(""), "Transport Jabber ID") @@ -76,6 +76,7 @@ bool Config::load(std::istream &ifs, boost::program_options::options_description ("service.memory_collector_time", value()->default_value(0), "Time in seconds after which backend with most memory is set to die.") ("service.more_resources", value()->default_value(false), "Allow more resources to be connected in server mode at the same time.") ("service.enable_privacy_lists", value()->default_value(true), "") + ("vhosts.vhost", value >()->multitoken(), "") ("identity.name", value()->default_value("Spectrum 2 Transport"), "Name showed in service discovery.") ("identity.category", value()->default_value("gateway"), "Disco#info identity category. 'gateway' by default.") ("identity.type", value()->default_value(""), "Type of transport ('icq','msn','gg','irc', ...)") @@ -102,11 +103,47 @@ bool Config::load(std::istream &ifs, boost::program_options::options_description parsed_options parsed = parse_config_file(ifs, opts, true); + bool found_working = false; + bool found_pidfile = false; std::string jid = ""; - BOOST_FOREACH(option opt, parsed.options) { + BOOST_FOREACH(option &opt, parsed.options) { if (opt.string_key == "service.jid") { - jid = opt.value[0]; + if (_jid.empty()) { + jid = opt.value[0]; + } + else { + opt.value[0] = _jid; + jid = _jid; + } } + else if (opt.string_key == "service.backend_port") { + if (opt.value[0] == "0") { + unsigned long r = 0; + BOOST_FOREACH(char c, _jid) { + r += (int) c; + } + srand(time(NULL) + r); + int randomPort = 30000 + rand() % 10000; + opt.value[0] = boost::lexical_cast(randomPort); + } + } + else if (opt.string_key == "service.working_dir") { + found_working = true; + } + else if (opt.string_key == "service.pidfile") { + found_pidfile = true; + } + } + + if (!found_working) { + std::vector value; + value.push_back("/var/lib/spectrum2/$jid"); + parsed.options.push_back(boost::program_options::basic_option("service.working_dir", value)); + } + if (!found_pidfile) { + std::vector value; + value.push_back("/var/run/spectrum2/$jid.pid"); + parsed.options.push_back(boost::program_options::basic_option("service.pidfile", value)); } BOOST_FOREACH(option &opt, parsed.options) { @@ -131,9 +168,9 @@ bool Config::load(std::istream &ifs) { return load(ifs, opts); } -bool Config::load(const std::string &configfile) { +bool Config::load(const std::string &configfile, const std::string &jid) { options_description opts("Transport options"); - return load(configfile, opts); + return load(configfile, opts, jid); } bool Config::reload() {