int main(int argc, char ** argv) { string data; stringstream buf; unsigned int i; Stats stats; ClientSet clients; SocketSet sockets; Switchboard switchboard; ArgumentSet arguments(argc, argv); if (arguments.isset("version") || arguments.isset("v")) { cout << PACKAGE_NAME << " version " << PACKAGE_VERSION << endl; return 0; } if (arguments.isset("help") || arguments.isset("h")) { cout << endl; cout << "usage: istatd [-a HOST] [-p PORT]" << endl; cout << endl; cout << " -d run in background" << endl; cout << " -h print this help text" << endl; cout << " -v print version number" << endl; cout << endl; cout << " -c FILE custom config file location" << endl; cout << " -a HOST listen on this address" << endl; cout << " -p PORT listen on this port" << endl; cout << " -u USER change running user" << endl; cout << " -g GROUP change running group" << endl; cout << endl; cout << " --pid=FILE custom pid file location" << endl; cout << " --cache=DIR custom cache file location" << endl; cout << " --socket=FILE custom socket file location" << endl; cout << " --code=CODE custom lock code" << endl; cout << endl; return 0; } // Load and parse configuration Config config(arguments.get("c", CONFIG_FILE_PATH)); config.parse(); config.validate(); // Load configuration properties from command line and config file bool arg_d = arguments.isset("d"); string cf_network_addr = arguments.get("a", config.get("network_addr", "0.0.0.0")); string cf_network_port = arguments.get("p", config.get("network_port", "5109")); string cf_server_user = arguments.get("u", config.get("server_user", "istat")); string cf_server_group = arguments.get("g", config.get("server_group", "istat")); string cf_server_pid = arguments.get("pid", config.get("server_pid", "")); string cf_cache_dir = arguments.get("cache", config.get("cache_dir", "/var/cache/istat")); string cf_server_socket = arguments.get("socket", config.get("server_socket", "/tmp/istatd.sock")); #ifdef HAVE_LIBKSTAT if(-1 == kstat_init()) return 1; #endif Daemon unixdaemon(cf_server_pid, cf_server_socket, cf_cache_dir); Socket listener(cf_network_addr, to_int(cf_network_port)); SignalResponder signalresponder(&sockets, &listener, &unixdaemon, &clients); ::pn_signalresponder = &signalresponder; // Create socket, pid file and put in background if desired unixdaemon.create(arg_d, cf_server_user, cf_server_group); // Get old sessions from disk cache clients.read_cache(cf_cache_dir); // Clear cache of saved sessions if (arguments.isset("clear-sessions")) { clients.clear_cache(); return 0; } signal(SIGHUP, handler); signal(SIGUSR1, handler); signal(SIGINT, handler); signal(SIGTERM, handler); signal(SIGPIPE, handler); if (!listener.listen()) return 1; sockets += listener; // Add disks for monitoring if (config.get("monitor_disk") != "") { // No array found. Add value given. stats.add_disk(config.get("monitor_disk").c_str()); } else { // Array found. Add all values in the array. for (i = 0; i < config.get_property("monitor_disk").get_array_size(); i++) { stats.add_disk(config.get_property("monitor_disk").get_array(i).c_str()); } } // Add network interfaces for monitoring if (config.get("monitor_net") != "") { // No array found. Add value given. stats.add_net(config.get("monitor_net").c_str()); } else { // Array found. Add all values in the array. for (i = 0; i < config.get_property("monitor_net").get_array_size(); i++) { stats.add_net(config.get_property("monitor_net").get_array(i).c_str()); } } #ifdef HAVE_LIBSENSORS unsigned int sensor_num; struct sensor_data sensor_data; sensor_num = get_sensor_num(); for (i = 0; i < sensor_num; i++) { get_sensor_data(i, &sensor_data); stats.add_sensor(&sensor_data); } #endif #ifdef HAVE_QNAPTEMP struct sensor_data sensor_data; if (have_qnaptemp()) { get_qnaptemp(0, &sensor_data); stats.add_sensor(&sensor_data); } #endif while (1) { stats.update_system_stats(); if (sockets.get_status(1)) { if (sockets == listener) { Socket new_socket(listener.accept()); sockets += new_socket; } else { Socket active_socket(sockets.get_ready()); if (active_socket.receive(data, 1024)) { switchboard.parse(&sockets, &clients, &config, &active_socket, &stats, &arguments, data); } else { sockets -= active_socket; } } } } ::pn_signalresponder = NULL; return 0; }