Example #1
0
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);
}
Example #2
0
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;
}