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