]> git.itanic.dy.fi Git - rrdd/blob - main.c
Add utils.h
[rrdd] / main.c
1 #include <sys/types.h>
2 #include <unistd.h>
3 #include <getopt.h>
4 #include <time.h>
5
6 #include "process.h"
7 #include "rrdtool.h"
8 #include "parser.h"
9 #include "debug.h"
10
11 #include "database.h"
12 #include "config.h"
13
14 struct user_options {
15         int max_jobs;
16         char *config_file;
17         int dump_defaults;
18 };
19
20 int read_args(int argc, char *argv[], struct user_options *opts)
21 {
22         int option_index = 0, c;
23         static struct option long_options[] = {
24                 { .val = 'j', .has_arg = 1, .name = "jobs", },
25                 { .val = 'c', .has_arg = 1, .name = "config", },
26                 { .val = 'd', .has_arg = 1, .name = "dump-default", },
27                 { },
28         };
29         char short_options[] = "j:c:d:";
30
31         while (1) {
32                 c = getopt_long(argc, argv, short_options, long_options,
33                                 &option_index);
34
35                 if (c == -1)
36                         break;
37
38                 switch (c) {
39                 case 'j':
40                         opts->max_jobs = atoi(optarg);
41                         break;
42
43                 case 'c':
44                         opts->config_file = optarg;
45                         break;
46
47                 case 'd':
48                         opts->dump_defaults = 1;
49                         opts->config_file = optarg;
50                         break;
51
52                 case '?':
53                         return -1;
54                 }
55         }
56         return 0;
57 }
58
59 int main(int argc, char *argv[])
60 {
61         struct user_options opts;
62         struct rrd_database *db, **db_list = NULL;
63         int sleeptime;
64         int ret = 0;
65
66         bzero(&opts, sizeof(opts));
67
68         if (read_args(argc, argv, &opts) < 0)
69                 return -1;
70
71         if (opts.dump_defaults) {
72                 ret = write_database(opts.config_file, default_rrds);
73                 return 0;
74         }
75
76         if (opts.config_file)
77                 db_list = populate_database(opts.config_file);
78         else
79                 db_list = default_rrds;
80
81         if (ret || !db_list)
82                 return 1;
83
84         if (rrdtool_create_missing_databases(db_list))
85                 return 1;
86
87         if (init_jobcontrol(opts.max_jobs))
88                 return -1;
89
90         while (1) {
91                 const char *db_name;
92                 char timestr[128];
93                 time_t t;
94
95                 pr_info("loop start\n");
96                 /*
97                  * Update all databases parallel in one shot
98                  */
99                 while ((db = get_outdated_db(db_list)))
100                         rrdtool_update_data(db);
101
102                 sleeptime = get_next_update(db_list, &db_name);
103
104                 t = time(0) + sleeptime;
105                 strftime(timestr, sizeof(timestr), "%T", localtime(&t));
106                 pr_info("Next scheduled event \"%s\" at %s, in %d seconds\n",
107                         db_name, timestr, sleeptime);
108
109                 poll_job_requests(sleeptime);
110         }
111         return 0;
112 }