int main(int argc, char *argv[]) { struct md_exporter *mde; int32_t i, option_index = 0; uint32_t packets = 0; uint8_t test_mode = 0, show_help = 0, num_writers = 0, num_inputs = 0; const char *logfile_path = NULL; static struct option core_options[] = { {"netlink", no_argument, 0, 'n'}, #ifdef SQLITE_SUPPORT {"sqlite", no_argument, 0, 's'}, #endif #ifdef NSB_GPS {"nsb_gps", no_argument, 0, 0 }, #endif #ifdef ZEROMQ_SUPPORT {"zeromq", no_argument, 0, 'z'}, #endif #ifdef NNE_SUPPORT {"nne", no_argument, 0, 0 }, #endif #ifdef GPSD_SUPPORT {"gpsd", no_argument, 0, 'g'}, #endif #ifdef MUNIN_SUPPORT {"munin", no_argument, 0, 'm'}, #endif #ifdef SYSEVENT_SUPPORT {"sysevent", no_argument, 0, 'y'}, #endif {"packets", required_argument, 0, 'p'}, {"test", no_argument, 0, 't'}, {"logfile", required_argument, 0, 'l'}, {"help", no_argument, 0, 'h'}, {0, 0, 0, 0 }}; //Try to configure core before we set up the outputters if (configure_core(&mde)) exit(EXIT_FAILURE); //Process core options, short options allowed. We do this here since we need //an allocated writers array opterr = 0; while (1) { //Use glic extension to avoid getopt permuting array while processing i = getopt_long(argc, argv, "--szhmgtnkp:l:", core_options, &option_index); if (i == -1) break; if (i == 0) { #ifdef NSB_GPS if (strcmp(core_options[option_index].name, "nsb_gps") == 0) { mde->md_inputs[MD_INPUT_GPS_NSB] = calloc(sizeof(struct md_input_gps_nsb), 1); if (mde->md_inputs[MD_INPUT_GPS_NSB] == NULL) { META_PRINT_SYSLOG(mde, LOG_ERR, "Could not allocate NSB GPS input\n"); exit(EXIT_FAILURE); } md_gps_nsb_setup(mde, (struct md_input_gps_nsb*) mde->md_inputs[MD_INPUT_GPS_NSB]); num_inputs++; } #endif #ifdef NNE_SUPPORT if (strcmp(core_options[option_index].name, "nne") == 0) { mde->md_writers[MD_WRITER_NNE] = calloc(sizeof(struct md_writer_nne), 1); if (mde->md_writers[MD_WRITER_NNE] == NULL) { META_PRINT_SYSLOG(mde, LOG_ERR, "Could not allocate NNE writer\n"); exit(EXIT_FAILURE); } md_nne_setup(mde, (struct md_writer_nne*) mde->md_writers[MD_WRITER_NNE]); num_writers++; } #endif continue; } switch (i) { case 'n': mde->md_inputs[MD_INPUT_NETLINK] = calloc(sizeof(struct md_input_netlink),1); if (mde->md_inputs[MD_INPUT_NETLINK] == NULL) { META_PRINT_SYSLOG(mde, LOG_ERR, "Could not allocate Netlink input\n"); exit(EXIT_FAILURE); } md_netlink_setup(mde, (struct md_input_netlink*) mde->md_inputs[MD_INPUT_NETLINK]); num_inputs++; break; #ifdef GPSD_SUPPORT case 'g': mde->md_inputs[MD_INPUT_GPSD] = calloc(sizeof(struct md_input_gpsd), 1); if (mde->md_inputs[MD_INPUT_GPSD] == NULL) { META_PRINT_SYSLOG(mde, LOG_ERR, "Could not allocate GPSD input\n"); exit(EXIT_FAILURE); } md_gpsd_setup(mde, (struct md_input_gpsd*) mde->md_inputs[MD_INPUT_GPSD]); num_inputs++; break; #endif #ifdef MUNIN_SUPPORT case 'm': mde->md_inputs[MD_INPUT_MUNIN] = calloc(sizeof(struct md_input_munin), 1); if (mde->md_inputs[MD_INPUT_MUNIN] == NULL) { META_PRINT_SYSLOG(mde, LOG_ERR, "Could not allocate Munin input\n"); exit(EXIT_FAILURE); } md_munin_setup(mde, (struct md_input_munin*) mde->md_inputs[MD_INPUT_MUNIN]); num_inputs++; break; #endif #ifdef SYSEVENT_SUPPORT case 'y': mde->md_inputs[MD_INPUT_SYSEVENT] = calloc(sizeof(struct md_input_sysevent), 1); if (mde->md_inputs[MD_INPUT_SYSEVENT] == NULL) { META_PRINT(mde->logfile, "Could not allocate Sysevent input\n"); exit(EXIT_FAILURE); } md_sysevent_setup(mde, (struct md_input_sysevent*) mde->md_inputs[MD_INPUT_SYSEVENT]); num_inputs++; break; #endif #ifdef SQLITE_SUPPORT case 's': mde->md_writers[MD_WRITER_SQLITE] = calloc(sizeof(struct md_writer_sqlite), 1); if (mde->md_writers[MD_WRITER_SQLITE] == NULL) { META_PRINT_SYSLOG(mde, LOG_ERR, "Could not allocate SQLite writer\n"); exit(EXIT_FAILURE); } md_sqlite_setup(mde, (struct md_writer_sqlite*) mde->md_writers[MD_WRITER_SQLITE]); num_writers++; break; #endif #ifdef ZEROMQ_SUPPORT case 'z': mde->md_writers[MD_WRITER_ZEROMQ] = calloc(sizeof(struct md_writer_zeromq), 1); if (mde->md_writers[MD_WRITER_ZEROMQ] == NULL) { META_PRINT_SYSLOG(mde, LOG_ERR, "Could not allocate SQLite writer\n"); exit(EXIT_FAILURE); } md_zeromq_setup(mde, (struct md_writer_zeromq*) mde->md_writers[MD_WRITER_ZEROMQ]); num_writers++; break; #endif case 't': test_mode = 1; break; case 'p': packets = (uint32_t) atoi(optarg); break; case 'l': logfile_path = optarg; break; case 'k': mde->use_syslog = 1; break; case 'h': show_help = 1; break; } } if (show_help) { print_usage(mde); exit(EXIT_SUCCESS); } if (num_writers == 0 || num_inputs == 0) { fprintf(stderr, "No input(s)/writer(s) specified\n"); exit(EXIT_FAILURE); } if (logfile_path) { mde->logfile = fopen(logfile_path, "a"); if (mde->logfile == NULL) { fprintf(stderr, "Could not open logfile: %s\n", logfile_path); exit(EXIT_FAILURE); } } for (i=0; i<=MD_INPUT_MAX; i++) { if (mde->md_inputs[i] != NULL) { META_PRINT_SYSLOG(mde, LOG_INFO, "Will configure input %d\n", i); //glic requires optind to be 0 for internal state to be reset when //using extensions optind = 0; if (mde->md_inputs[i]->init(mde->md_inputs[i], argc, argv)) exit(EXIT_FAILURE); } } for (i=0; i<=MD_WRITER_MAX; i++) { if (mde->md_writers[i] != NULL) { META_PRINT_SYSLOG(mde, LOG_INFO, "Will configure writer %d\n", i); //glic requires optind to be 0 for internal state to be reset when //using extensions optind = 0; if (mde->md_writers[i]->init(mde->md_writers[i], argc, argv)) exit(EXIT_FAILURE); } } if (test_mode) run_test_mode(mde, packets); else backend_event_loop_run(mde->event_loop); META_PRINT_SYSLOG(mde, LOG_ERR, "Threads should NEVER exit\n"); exit(EXIT_FAILURE); }
int main(int argc, char *argv[]) { struct md_exporter *mde; int32_t i; uint32_t packets = 0; uint8_t test_mode = 0, num_writers = 0, num_inputs = 0; const char *logfile_path = NULL; json_object *config = NULL; //Try to configure core before we set up the outputters if (configure_core(&mde)) exit(EXIT_FAILURE); //Process core options, short options allowed. We do this here since we need //an allocated writers array opterr = 0; while ((i = getopt(argc, argv, "c:h")) != -1) { if (i == -1) { break; } else if (i == 'c') { read_config(optarg, &config); } else if (i == 'h') { print_usage(); exit(EXIT_SUCCESS); } } if (config == NULL) { META_PRINT_SYSLOG(mde, LOG_ERR, "Parameter -c is required to run.\n"); exit(EXIT_FAILURE); } json_object_object_foreach(config, key, val) { if (!strcmp(key, "netlink")) { mde->md_inputs[MD_INPUT_NETLINK] = calloc(sizeof(struct md_input_netlink),1); if (mde->md_inputs[MD_INPUT_NETLINK] == NULL) { META_PRINT_SYSLOG(mde, LOG_ERR, "Could not allocate Netlink input\n"); exit(EXIT_FAILURE); } md_netlink_setup(mde, (struct md_input_netlink*) mde->md_inputs[MD_INPUT_NETLINK]); num_inputs++; } #ifdef NSB_GPS else if (!strcmp(key, "nsb_gps")) { mde->md_inputs[MD_INPUT_GPS_NSB] = calloc(sizeof(struct md_input_gps_nsb), 1); if (mde->md_inputs[MD_INPUT_GPS_NSB] == NULL) { META_PRINT_SYSLOG(mde, LOG_ERR, "Could not allocate NSB GPS input\n"); exit(EXIT_FAILURE); } md_gps_nsb_setup(mde, (struct md_input_gps_nsb*) mde->md_inputs[MD_INPUT_GPS_NSB]); num_inputs++; } #endif #ifdef NNE_SUPPORT else if (!strcmp(key, "nne")) { mde->md_writers[MD_WRITER_NNE] = calloc(sizeof(struct md_writer_nne), 1); if (mde->md_writers[MD_WRITER_NNE] == NULL) { META_PRINT_SYSLOG(mde, LOG_ERR, "Could not allocate NNE writer\n"); exit(EXIT_FAILURE); } md_nne_setup(mde, (struct md_writer_nne*) mde->md_writers[MD_WRITER_NNE]); num_writers++; } #endif #ifdef GPSD_SUPPORT else if (!strcmp(key, "gpsd")) { mde->md_inputs[MD_INPUT_GPSD] = calloc(sizeof(struct md_input_gpsd), 1); if (mde->md_inputs[MD_INPUT_GPSD] == NULL) { META_PRINT_SYSLOG(mde, LOG_ERR, "Could not allocate GPSD input\n"); exit(EXIT_FAILURE); } md_gpsd_setup(mde, (struct md_input_gpsd*) mde->md_inputs[MD_INPUT_GPSD]); num_inputs++; } #endif #ifdef MUNIN_SUPPORT else if (!strcmp(key, "munin")) { mde->md_inputs[MD_INPUT_MUNIN] = calloc(sizeof(struct md_input_munin), 1); if (mde->md_inputs[MD_INPUT_MUNIN] == NULL) { META_PRINT_SYSLOG(mde, LOG_ERR, "Could not allocate Munin input\n"); exit(EXIT_FAILURE); } md_munin_setup(mde, (struct md_input_munin*) mde->md_inputs[MD_INPUT_MUNIN]); num_inputs++; } #endif #ifdef SYSEVENT_SUPPORT else if (!strcmp(key, "sysevent")) { mde->md_inputs[MD_INPUT_SYSEVENT] = calloc(sizeof(struct md_input_sysevent), 1); if (mde->md_inputs[MD_INPUT_SYSEVENT] == NULL) { META_PRINT(mde->logfile, "Could not allocate Sysevent input\n"); exit(EXIT_FAILURE); } md_sysevent_setup(mde, (struct md_input_sysevent*) mde->md_inputs[MD_INPUT_SYSEVENT]); num_inputs++; } #endif #ifdef SQLITE_SUPPORT else if (!strcmp(key, "sqlite")) { mde->md_writers[MD_WRITER_SQLITE] = calloc(sizeof(struct md_writer_sqlite), 1); if (mde->md_writers[MD_WRITER_SQLITE] == NULL) { META_PRINT_SYSLOG(mde, LOG_ERR, "Could not allocate SQLite writer\n"); exit(EXIT_FAILURE); } md_sqlite_setup(mde, (struct md_writer_sqlite*) mde->md_writers[MD_WRITER_SQLITE]); num_writers++; } #endif #ifdef ZEROMQ_SUPPORT else if (!strcmp(key, "zmq")) { mde->md_writers[MD_WRITER_ZEROMQ] = calloc(sizeof(struct md_writer_zeromq), 1); if (mde->md_writers[MD_WRITER_ZEROMQ] == NULL) { META_PRINT_SYSLOG(mde, LOG_ERR, "Could not allocate SQLite writer\n"); exit(EXIT_FAILURE); } md_zeromq_setup(mde, (struct md_writer_zeromq*) mde->md_writers[MD_WRITER_ZEROMQ]); num_writers++; } #endif else if (!strcmp(key, "test")) { test_mode = 1; } else if (!strcmp(key, "packets")) { packets = (uint32_t) json_object_get_int(val); } else if (!strcmp(key, "logfile")) { logfile_path = json_object_get_string(val); } else if (!strcmp(key, "syslog")) { mde->use_syslog = json_object_get_int(val); } } if (num_writers == 0 || num_inputs == 0) { fprintf(stderr, "No input(s)/writer(s) specified\n"); exit(EXIT_FAILURE); } if (logfile_path) { mde->logfile = fopen(logfile_path, "a"); if (mde->logfile == NULL) { fprintf(stderr, "Could not open logfile: %s\n", logfile_path); exit(EXIT_FAILURE); } } for (i=0; i<=MD_INPUT_MAX; i++) { if (mde->md_inputs[i] != NULL) { META_PRINT_SYSLOG(mde, LOG_INFO, "Will configure input %d\n", i); //glic requires optind to be 0 for internal state to be reset when //using extensions optind = 0; if (mde->md_inputs[i]->init(mde->md_inputs[i], config)) exit(EXIT_FAILURE); } } for (i=0; i<=MD_WRITER_MAX; i++) { if (mde->md_writers[i] != NULL) { META_PRINT_SYSLOG(mde, LOG_INFO, "Will configure writer %d\n", i); //glic requires optind to be 0 for internal state to be reset when //using extensions optind = 0; if (mde->md_writers[i]->init(mde->md_writers[i], config)) exit(EXIT_FAILURE); } } json_object_put(config); if (test_mode) run_test_mode(mde, packets); else backend_event_loop_run(mde->event_loop); META_PRINT_SYSLOG(mde, LOG_ERR, "Threads should NEVER exit\n"); exit(EXIT_FAILURE); }