void TestResultSetForOneHost(CuTest *tc) { struct rtgconf *conf = rtgconf_create("test/example-rtg.conf"); struct rtgtargets *hosts = rtgtargets_parse("test/example-targets.cfg", conf); struct clinsert **inserts = get_clinserts(hosts->hosts[0], 3); sleep(1); inserts = get_clinserts(hosts->hosts[0], 3); CuAssertTrue(tc, NULL != inserts[0]); /* One table */ CuAssertTrue(tc, NULL == inserts[1]); /* Not two tables */ CuAssertStrEquals(tc, "ifOutOctets_362", inserts[0]->table); /* Two rows */ CuAssertIntEquals(tc, 2u, inserts[0]->nvalues); /* Two rows */ CuAssertIntEquals(tc, 4309u, inserts[0]->values[0].id); CuAssertIntEquals(tc, 4310u, inserts[0]->values[1].id); }
int main(int argc, char *const argv[]) { int detach = 1; const char *rtgconf_file = DEFAULT_RTGCONF_FILE; const char *targets_file = DEFAULT_TARGETS_FILE; int use_db = 1; int use_rate_column = 1; int allow_db_zero = 0; unsigned max_db_queue = DEFAULT_QUEUE_LENGTH; unsigned num_dbthreads = DEFAULT_NUM_DBTHREADS; int c; char *last_component; struct rtgtargets *targets; struct rtgtargets *old_targets = NULL; if (argc < 2) { help(); exit(EXIT_FAILURE); } while ((c = getopt(argc, argv, "c:dt:vzDOOQ:W:")) != -1) { switch (c) { case 'c': rtgconf_file = optarg; break; case 'd': use_db = 0; break; case 't': targets_file = optarg; break; case 'v': verbosity++; break; case 'z': allow_db_zero = 1; break; case 'D': detach = 0; break; case 'O': use_rate_column = 0; break; case 'Q': max_db_queue = (unsigned) strtol(optarg, NULL, 10); break; case 'W': num_dbthreads = (unsigned) strtol(optarg, NULL, 10); break; case '?': default: help(); exit(EXIT_FAILURE); } } if (argc != optind) { help(); exit(EXIT_FAILURE); } if (max_db_queue < MIN_QUEUE_LENGTH) { fprintf(stderr, "Error: minimum queue length is %d.\n", MIN_QUEUE_LENGTH); help(); exit(EXIT_FAILURE); } if (num_dbthreads < 1) { fprintf(stderr, "Error: you need at least one database thread.\n"); help(); exit(EXIT_FAILURE); } /* Convert given path names to full paths. */ rtgconf_file = realpath(rtgconf_file, NULL); targets_file = realpath(targets_file, NULL); cllog(0, "clpoll v%s starting up", VERSION); if (detach) { /* Try to parse configuration and target files so we can give error messages before we detach. */ struct rtgconf *config_test; struct rtgtargets *targets_test; config_test = rtgconf_create(rtgconf_file); if (!config_test || !rtgconf_verify(config_test)) { cllog(0, "Missing or incorrect configuration file, so nothing to do."); exit(EXIT_FAILURE); } rtgconf_free(config_test); targets_test = rtgtargets_parse(targets_file, config_test); if (targets_test->ntargets == 0) { cllog(0, "No targets, so nothing to do."); exit(EXIT_FAILURE); } rtgtargets_free(targets_test); /* Move to backgorund. */ daemonize(); } last_component = strrchr(argv[0], '/'); if (last_component) last_component++; else last_component = argv[0]; openlog(last_component, LOG_PID, LOG_USER); signal(SIGHUP, sighup_handler); signal(SIGTERM, sigterm_handler); clsnmp_global_init(); while (!full_stop_requested) { /* Read rtg.conf */ struct rtgconf *config = rtgconf_create(rtgconf_file); if (!config || !rtgconf_verify(config)) { cllog(0, "Missing or incorrect configuration file, so nothing to do."); exit(EXIT_FAILURE); } /* "Patch" rtgconf with command line values */ config->use_db = use_db; config->use_rate_column = use_rate_column; config->allow_db_zero = allow_db_zero; config->max_db_queue = max_db_queue; config->num_dbthreads = num_dbthreads; /* Read targets.cfg */ targets = rtgtargets_parse(targets_file, config); if (targets->ntargets == 0) { cllog(0, "No targets, so nothing to do."); exit(EXIT_FAILURE); } if (old_targets != NULL) { rtgtargets_copy_cache(targets, old_targets); rtgtargets_free(old_targets); old_targets = NULL; } cllog(1, "Polling every %d seconds.", config->interval); run_threads(targets, config); rtgconf_free(config); old_targets = targets; } return 0; }