#include #include #include #include #include "process.h" #include "rrdtool.h" #include "parser.h" #include "debug.h" #include "database.h" #include "config.h" struct user_options { int max_jobs; char *config_file; int dump_defaults; }; int read_args(int argc, char *argv[], struct user_options *opts) { int option_index = 0, c; static struct option long_options[] = { { .val = 'j', .has_arg = 1, .name = "jobs", }, { .val = 'c', .has_arg = 1, .name = "config", }, { .val = 'd', .has_arg = 1, .name = "dump-default", }, { }, }; char short_options[] = "j:c:d:"; while (1) { c = getopt_long(argc, argv, short_options, long_options, &option_index); if (c == -1) break; switch (c) { case 'j': opts->max_jobs = atoi(optarg); break; case 'c': opts->config_file = optarg; break; case 'd': opts->dump_defaults = 1; opts->config_file = optarg; break; case '?': return -1; } } return 0; } int main(int argc, char *argv[]) { struct user_options opts; struct rrd_database *db, **db_list = NULL; int sleeptime; int ret = 0; bzero(&opts, sizeof(opts)); if (read_args(argc, argv, &opts) < 0) return -1; if (opts.dump_defaults) { ret = write_database(opts.config_file, default_rrds); return 0; } if (opts.config_file) db_list = populate_database(opts.config_file); else db_list = default_rrds; if (ret || !db_list) return 1; if (rrdtool_create_missing_databases(db_list)) return 1; if (init_jobcontrol(opts.max_jobs)) return -1; while (1) { const char *db_name; char timestr[128]; time_t t; pr_info("loop start\n"); /* * Update all databases parallel in one shot */ while ((db = get_outdated_db(db_list))) rrdtool_update_data(db); sleeptime = get_next_update(db_list, &db_name); t = time(0) + sleeptime; strftime(timestr, sizeof(timestr), "%T", localtime(&t)); pr_info("Next scheduled event \"%s\" at %s, in %d seconds\n", db_name, timestr, sleeptime); poll_job_requests(sleeptime); } return 0; }