Esempio n. 1
0
int rrd_fetch(
    int argc,
    char **argv,
    time_t *start,
    time_t *end,        /* which time frame do you want ?
                         * will be changed to represent reality */
    unsigned long *step,    /* which stepsize do you want? 
                             * will be changed to represent reality */
    unsigned long *ds_cnt,  /* number of data sources in file */
    char ***ds_namv,    /* names of data sources */
    rrd_value_t **data)
{                       /* two dimensional array containing the data */
    unsigned long step_tmp = 1;
    time_t    start_tmp = 0, end_tmp = 0;
    const char *cf;
    char *opt_daemon = NULL;
    int align_start = 0;
    int status;

    rrd_time_value_t start_tv, end_tv;
    const char *parsetime_error = NULL;
    struct option long_options[] = {
        {"resolution", required_argument, 0, 'r'},
        {"start", required_argument, 0, 's'},
        {"end", required_argument, 0, 'e'},
        {"align-start", optional_argument, 0, 'a'},
        {"daemon", required_argument, 0, 'd'},
        {0, 0, 0, 0}
    };

    optind = 0;
    opterr = 0;         /* initialize getopt */

    /* init start and end time */
    rrd_parsetime("end-24h", &start_tv);
    rrd_parsetime("now", &end_tv);

    while (1) {
        int       option_index = 0;
        int       opt;

        opt = getopt_long(argc, argv, "ar:s:e:d:", long_options, &option_index);

        if (opt == EOF)
            break;

        switch (opt) {
        case 's':
            if ((parsetime_error = rrd_parsetime(optarg, &start_tv))) {
                rrd_set_error("start time: %s", parsetime_error);
                return -1;
            }
            break;
        case 'e':
            if ((parsetime_error = rrd_parsetime(optarg, &end_tv))) {
                rrd_set_error("end time: %s", parsetime_error);
                return -1;
            }
            break;
        case 'a':
            align_start = 1;
            break;
        case 'r':
            if ((parsetime_error = rrd_scaled_duration(optarg, 1, &step_tmp))) {
                rrd_set_error("resolution: %s", parsetime_error);
                return -1;
            }
            break;

        case 'd':
            if (opt_daemon != NULL)
                    free (opt_daemon);
            opt_daemon = strdup (optarg);
            if (opt_daemon == NULL)
            {
                rrd_set_error ("strdup failed.");
                return (-1);
            }
            break;

        case '?':
            rrd_set_error("unknown option '-%c'", optopt);
            return (-1);
        }
    }


    if (rrd_proc_start_end(&start_tv, &end_tv, &start_tmp, &end_tmp) == -1) {
        return -1;
    }

    if (start_tmp < 3600 * 24 * 365 * 10) {
        rrd_set_error("the first entry to fetch should be after 1980");
        return (-1);
    }

    if (align_start) {
        time_t delta = (start_tmp % step_tmp);
        start_tmp -= delta;
        end_tmp -= delta;
    }

    if (end_tmp < start_tmp) {
        rrd_set_error("start (%ld) should be less than end (%ld)", start_tmp,
                      end_tmp);
        return (-1);
    }

    *start = start_tmp;
    *end = end_tmp;
    *step = step_tmp;

    if (optind + 1 >= argc) {
        rrd_set_error("Usage: rrdtool %s <file> <CF> [options]", argv[0]);
        return -1;
    }

    cf = argv[optind + 1];

    rrdc_connect (opt_daemon);
    if (rrdc_is_connected (opt_daemon))
	    status = rrdc_fetch (argv[optind], cf, start, end, step,
			    ds_cnt, ds_namv, data);

    else
	    status = rrd_fetch_r(argv[optind], cf, start, end, step,
			    ds_cnt, ds_namv, data);

    if (status != 0)
        return (-1);
    return (0);
}
Esempio n. 2
0
int rrd_fetch(
    int argc,
    char **argv,
    time_t *start,
    time_t *end,        /* which time frame do you want ?
                         * will be changed to represent reality */
    unsigned long *step,    /* which stepsize do you want? 
                             * will be changed to represent reality */
    unsigned long *ds_cnt,  /* number of data sources in file */
    char ***ds_namv,    /* names of data sources */
    rrd_value_t **data)
{                       /* two dimensional array containing the data */
    unsigned long step_tmp = 1;
    time_t    start_tmp = 0, end_tmp = 0;
    const char *cf;
    char *opt_daemon = NULL;
    int align_start = 0;
    int status;

    rrd_time_value_t start_tv, end_tv;
    const char *parsetime_error = NULL;
    struct optparse_long longopts[] = {
        {"resolution", 'r', OPTPARSE_REQUIRED},
        {"start", 's', OPTPARSE_REQUIRED},
        {"end", 'e', OPTPARSE_REQUIRED},
        {"align-start", 'a', OPTPARSE_NONE},
        {"daemon", 'd', OPTPARSE_REQUIRED},
        {0},
    };
    struct optparse options;
    int opt;

    /* init start and end time */
    rrd_parsetime("end-24h", &start_tv);
    rrd_parsetime("now", &end_tv);

    optparse_init(&options, argc, argv);
    while ((opt = optparse_long(&options, longopts, NULL)) != -1) {
        switch (opt) {
        case 's':
            if ((parsetime_error = rrd_parsetime(options.optarg, &start_tv))) {
                rrd_set_error("start time: %s", parsetime_error);
                return -1;
            }
            break;
        case 'e':
            if ((parsetime_error = rrd_parsetime(options.optarg, &end_tv))) {
                rrd_set_error("end time: %s", parsetime_error);
                return -1;
            }
            break;
        case 'a':
            align_start = 1;
            break;
        case 'r':
            if ((parsetime_error = rrd_scaled_duration(options.optarg, 1, &step_tmp))) {
                rrd_set_error("resolution: %s", parsetime_error);
                return -1;
            }
            break;

        case 'd':
            if (opt_daemon != NULL)
                free (opt_daemon);
            opt_daemon = strdup(options.optarg);
            if (opt_daemon == NULL)
            {
                rrd_set_error ("strdup failed.");
                return -1;
            }
            break;

        case '?':
            rrd_set_error("%s", options.errmsg);
            return -1;
        }
    }


    if (rrd_proc_start_end(&start_tv, &end_tv, &start_tmp, &end_tmp) == -1) {
        return -1;
    }

    if (start_tmp < 3600 * 24 * 365 * 10) {
        rrd_set_error("the first entry to fetch should be after 1980");
        return (-1);
    }

    if (align_start) {
        time_t delta = (start_tmp % step_tmp);
        start_tmp -= delta;
        end_tmp -= delta;
    }

    if (end_tmp < start_tmp) {
        rrd_set_error("start (%ld) should be less than end (%ld)", start_tmp,
                      end_tmp);
        return (-1);
    }

    *start = start_tmp;
    *end = end_tmp;
    *step = step_tmp;

    if (options.optind + 1 >= options.argc) {
        rrd_set_error("Usage: rrdtool %s <file> <CF> [options]", options.argv[0]);
        return -1;
    }

    cf = options.argv[options.optind + 1];

    rrdc_connect (opt_daemon);
    if (rrdc_is_connected (opt_daemon))
	    status = rrdc_fetch (options.argv[options.optind],
			    cf, start, end, step, ds_cnt, ds_namv, data);

    else
	    status = rrd_fetch_r(options.argv[options.optind],
			    cf, start, end, step, ds_cnt, ds_namv, data);

    if (status != 0)
        return (-1);
    return (0);
}