/* * _load_config_file * * Read and load configuration file * * Returns data in structure and 0 on success, -1 on error */ static int _load_config_file(struct cerebro_config *conf, unsigned int *errnum) { char *config_file = NULL; struct conffile_option options[] = { /* * Libcerebro configuration */ { "cerebro_metric_server", CONFFILE_OPTION_LIST_STRING, -1, _cb_cerebro_metric_server, CEREBRO_CONFIG_CEREBRO_METRIC_SERVERS_MAX, 0, &(conf->cerebro_metric_server_flag), conf, 0 }, { "cerebro_event_server", CONFFILE_OPTION_LIST_STRING, -1, _cb_cerebro_event_server, CEREBRO_CONFIG_CEREBRO_EVENT_SERVERS_MAX, 0, &(conf->cerebro_event_server_flag), conf, 0 }, { "cerebro_timeout_len", CONFFILE_OPTION_INT, -1, conffile_int, 1, 0, &(conf->cerebro_timeout_len_flag), &(conf->cerebro_timeout_len), 0 }, { "cerebro_flags", CONFFILE_OPTION_INT, -1, conffile_int, 1, 0, &(conf->cerebro_flags_flag), &(conf->cerebro_flags), 0 }, /* * Cerebrod configuration */ { "cerebrod_heartbeat_frequency", CONFFILE_OPTION_LIST_INT, -1, _cb_cerebrod_heartbeat_freq, 1, 0, &(conf->cerebrod_heartbeat_frequency_flag), conf, 0 }, { "cerebrod_speak", CONFFILE_OPTION_BOOL, -1, conffile_bool, 1, 0, &(conf->cerebrod_speak_flag), &conf->cerebrod_speak, 0 }, { "cerebrod_speak_message_config", CONFFILE_OPTION_LIST_STRING, -1, _cb_cerebrod_speak_message_config, CEREBRO_CONFIG_SPEAK_MESSAGE_CONFIG_MAX, 0, &(conf->cerebrod_speak_message_config_flag), conf, 0 }, { "cerebrod_speak_message_ttl", CONFFILE_OPTION_INT, -1, conffile_int, 1, 0, &(conf->cerebrod_speak_message_ttl_flag), &(conf->cerebrod_speak_message_ttl), 0 }, { "cerebrod_listen", CONFFILE_OPTION_BOOL, -1, conffile_bool, 1, 0, &(conf->cerebrod_listen_flag), &conf->cerebrod_listen, 0 }, { "cerebrod_listen_threads", CONFFILE_OPTION_INT, -1, conffile_int, 1, 0, &(conf->cerebrod_listen_threads_flag), &(conf->cerebrod_listen_threads), 0 }, { "cerebrod_listen_message_config", CONFFILE_OPTION_LIST_STRING, -1, _cb_cerebrod_listen_message_config, CEREBRO_CONFIG_LISTEN_MESSAGE_CONFIG_MAX, 0, &(conf->cerebrod_listen_message_config_flag), conf, 0 }, { "cerebrod_metric_controller", CONFFILE_OPTION_BOOL, -1, conffile_bool, 1, 0, &(conf->cerebrod_metric_controller_flag), &conf->cerebrod_metric_controller, 0 }, { "cerebrod_metric_server", CONFFILE_OPTION_BOOL, -1, conffile_bool, 1, 0, &(conf->cerebrod_metric_server_flag), &conf->cerebrod_metric_server, 0 }, { "cerebrod_metric_server_port", CONFFILE_OPTION_INT, -1, conffile_int, 1, 0, &(conf->cerebrod_metric_server_port_flag), &(conf->cerebrod_metric_server_port), 0 }, { "cerebrod_event_server", CONFFILE_OPTION_BOOL, -1, conffile_bool, 1, 0, &(conf->cerebrod_event_server_flag), &conf->cerebrod_event_server, 0 }, { "cerebrod_event_server_port", CONFFILE_OPTION_INT, -1, conffile_int, 1, 0, &(conf->cerebrod_event_server_port_flag), &(conf->cerebrod_event_server_port), 0 }, { "cerebrod_forward_message_config", CONFFILE_OPTION_LIST_STRING, -1, _cb_cerebrod_forward_message_config, CEREBRO_CONFIG_FORWARD_MESSAGE_CONFIG_MAX, 0, &(conf->cerebrod_forward_message_config_flag), conf, 0 }, { "cerebrod_forward_message_ttl", CONFFILE_OPTION_INT, -1, conffile_int, 1, 0, &(conf->cerebrod_forward_message_ttl_flag), &(conf->cerebrod_forward_message_ttl), 0 }, { "cerebrod_forward_host_accept", CONFFILE_OPTION_LIST_STRING, -1, _cb_cerebrod_forward_host_accept, CEREBRO_CONFIG_FORWARD_HOST_ACCEPT_MAX, 0, &(conf->cerebrod_forward_host_accept_flag), conf, 0 }, { "cerebrod_metric_module_exclude", CONFFILE_OPTION_LIST_STRING, -1, _cb_cerebrod_module_exclude, CEREBRO_CONFIG_METRIC_MODULE_EXCLUDE_MAX, 0, &(conf->cerebrod_metric_module_exclude_flag), conf, 0 }, { "cerebrod_monitor_module_exclude", CONFFILE_OPTION_LIST_STRING, -1, _cb_cerebrod_module_exclude, CEREBRO_CONFIG_MONITOR_MODULE_EXCLUDE_MAX, 0, &(conf->cerebrod_monitor_module_exclude_flag), conf, 0 }, { "cerebrod_event_module_exclude", CONFFILE_OPTION_LIST_STRING, -1, _cb_cerebrod_module_exclude, CEREBRO_CONFIG_EVENT_MODULE_EXCLUDE_MAX, 0, &(conf->cerebrod_event_module_exclude_flag), conf, 0 }, { "cerebrod_speak_debug", CONFFILE_OPTION_BOOL, -1, conffile_bool, 1, 0, &(conf->cerebrod_speak_debug_flag), &conf->cerebrod_speak_debug, 0 }, { "cerebrod_listen_debug", CONFFILE_OPTION_BOOL, -1, conffile_bool, 1, 0, &(conf->cerebrod_listen_debug_flag), &conf->cerebrod_listen_debug, 0 }, { "cerebrod_metric_controller_debug", CONFFILE_OPTION_BOOL, -1, conffile_bool, 1, 0, &(conf->cerebrod_metric_controller_debug_flag), &conf->cerebrod_metric_controller_debug, 0 }, { "cerebrod_metric_server_debug", CONFFILE_OPTION_BOOL, -1, conffile_bool, 1, 0, &(conf->cerebrod_metric_server_debug_flag), &conf->cerebrod_metric_server_debug, 0 }, { "cerebrod_event_server_debug", CONFFILE_OPTION_BOOL, -1, conffile_bool, 1, 0, &(conf->cerebrod_event_server_debug_flag), &conf->cerebrod_event_server_debug, 0 }, { "cerebrod_gettimeofday_workaround", CONFFILE_OPTION_BOOL, -1, conffile_bool, 1, 0, &(conf->cerebrod_gettimeofday_workaround_flag), &conf->cerebrod_gettimeofday_workaround, 0 }, #if CEREBRO_DEBUG { "cerebrod_alternate_hostname", CONFFILE_OPTION_STRING, -1, _cb_cerebrod_alternate_hostname, 1, 0, &(conf->cerebrod_alternate_hostname_flag), conf, 0 }, #endif /* CEREBRO_DEBUG */ }; conffile_t cf = NULL; int num; if (!(cf = conffile_handle_create())) { CEREBRO_ERR(("conffile_handle_create")); if (errnum) *errnum = CEREBRO_ERR_OUTMEM; goto cleanup; } if (!config_debug_config_file) config_file = CEREBRO_CONFIG_FILE_DEFAULT; else config_file = config_debug_config_file; memset(conf, '\0', sizeof(struct cerebro_config)); num = sizeof(options)/sizeof(struct conffile_option); if (conffile_parse(cf, config_file, options, num, NULL, 0, 0) < 0) { char buf[CONFFILE_MAX_ERRMSGLEN]; /* Its not an error if the default configuration file doesn't exist */ if (!strcmp(config_file, CEREBRO_CONFIG_FILE_DEFAULT) && conffile_errnum(cf) == CONFFILE_ERR_EXIST) goto out; if (conffile_errmsg(cf, buf, CONFFILE_MAX_ERRMSGLEN) < 0) CEREBRO_DBG(("conffile_parse: %d", conffile_errnum(cf))); else CEREBRO_DBG(("conffile_parse: %s", buf)); if (errnum) *errnum = CEREBRO_ERR_CONFIG_FILE; goto cleanup; } out: conffile_handle_destroy(cf); return 0; cleanup: memset(conf, '\0', sizeof(struct cerebro_config)); conffile_handle_destroy(cf); return -1; }
static void _config_file_parse (void) { int ipmiping_period_flag, ipmidetectd_server_port_flag, host_flag; struct conffile_option options[] = { { "ipmiping_period", CONFFILE_OPTION_INT, -1, conffile_int, 1, 0, &(ipmiping_period_flag), &(conf.ipmiping_period), 0 }, { "ipmidetectd_server_port", CONFFILE_OPTION_INT, -1, conffile_int, 1, 0, &(ipmidetectd_server_port_flag), &(conf.ipmidetectd_server_port), 0, }, { "host", CONFFILE_OPTION_STRING, -1, _cb_host, INT_MAX, 0, &host_flag, NULL, 0 }, }; conffile_t cf = NULL; int legacy_file_loaded = 0; int num; if (!(cf = conffile_handle_create ())) { err_output ("conffile_handle_create"); goto cleanup; } num = sizeof (options)/sizeof (struct conffile_option); /* Try legacy file first */ if (!cmd_args.config_file) { if (!conffile_parse (cf, IPMIDETECTD_CONFIG_FILE_LEGACY, options, num, NULL, 0, 0)) legacy_file_loaded++; } if (!legacy_file_loaded) { if (conffile_parse (cf, cmd_args.config_file ? cmd_args.config_file : IPMIDETECTD_CONFIG_FILE_DEFAULT, options, num, NULL, 0, 0) < 0) { char buf[CONFFILE_MAX_ERRMSGLEN]; /* Its not an error if the default configuration file doesn't exist */ if ((!cmd_args.config_file || !strcmp (cmd_args.config_file, IPMIDETECTD_CONFIG_FILE_DEFAULT)) && conffile_errnum (cf) == CONFFILE_ERR_EXIST) goto cleanup; if (conffile_errmsg (cf, buf, CONFFILE_MAX_ERRMSGLEN) < 0) err_exit ("conffile_parse: %d", conffile_errnum (cf)); else err_exit ("conffile_parse: %s", buf); } } cleanup: conffile_handle_destroy (cf); }