Improved configuration object checking

This commit is contained in:
Mark Riddoch
2013-09-26 10:37:55 +02:00
parent 947fc3509b
commit fe7d0477ba

View File

@ -47,6 +47,7 @@ static void free_config_context(CONFIG_CONTEXT *);
static char *config_get_value(CONFIG_PARAMETER *, const char *); static char *config_get_value(CONFIG_PARAMETER *, const char *);
static int handle_global_item(const char *, const char *); static int handle_global_item(const char *, const char *);
static void global_defaults(); static void global_defaults();
static void check_config_objects(CONFIG_CONTEXT *context);
static char *config_file = NULL; static char *config_file = NULL;
static GATEWAY_CONF gateway; static GATEWAY_CONF gateway;
@ -102,6 +103,7 @@ CONFIG_PARAMETER *param;
* Load the configuration file for the gateway * Load the configuration file for the gateway
* *
* @param file The filename of the configuration file * @param file The filename of the configuration file
* @return A zero return indicates a fatal error reading the configuration
*/ */
int int
config_load(char *file) config_load(char *file)
@ -119,6 +121,7 @@ int rval;
config_file = file; config_file = file;
check_config_objects(config.next);
rval = process_config_context(config.next); rval = process_config_context(config.next);
free_config_context(config.next); free_config_context(config.next);
@ -128,6 +131,7 @@ int rval;
/** /**
* Reload the configuration file for the gateway * Reload the configuration file for the gateway
* *
* @return A zero return indicates a fatal error reading the configuration
*/ */
int int
config_reload() config_reload()
@ -156,6 +160,7 @@ int rval;
* we need. * we need.
* *
* @param context The configuration data * @param context The configuration data
* @return A zero result indicates a fatal error
*/ */
static int static int
process_config_context(CONFIG_CONTEXT *context) process_config_context(CONFIG_CONTEXT *context)
@ -173,7 +178,7 @@ int error_count = 0;
char *type = config_get_value(obj->parameters, "type"); char *type = config_get_value(obj->parameters, "type");
if (type == NULL) if (type == NULL)
{ {
skygw_log_write( LOGFILE_ERROR, "Configuration object %s has no type\n", obj->object); skygw_log_write( LOGFILE_ERROR, "Configuration object '%s' has no type\n", obj->object);
error_count++; error_count++;
} }
else if (!strcmp(type, "service")) else if (!strcmp(type, "service"))
@ -250,8 +255,7 @@ int error_count = 0;
} }
else if (servers == NULL) else if (servers == NULL)
{ {
skygw_log_write(LOGFILE_ERROR, "The service '%s' is missing a definition of the servers within the service.\n", obj->object); skygw_log_write(LOGFILE_ERROR, "The service '%s' is missing a definition of the servers that provide the service.\n", obj->object);
error_count++;
} }
if (roptions && obj->element) if (roptions && obj->element)
{ {
@ -278,7 +282,7 @@ int error_count = 0;
} }
else else
{ {
skygw_log_write(LOGFILE_ERROR, "Listern '%s' is misisng a required parameter. A Listener must have a service, port and protocol defined.\n", obj->object); skygw_log_write(LOGFILE_ERROR, "Listener '%s' is misisng a required parameter. A Listener must have a service, port and protocol defined.\n", obj->object);
error_count++; error_count++;
} }
} }
@ -320,7 +324,7 @@ int error_count = 0;
} }
else if (strcmp(type, "server") != 0) else if (strcmp(type, "server") != 0)
{ {
skygw_log_write(LOGFILE_ERROR, "Configuration object %s has an invalid type specified", obj->object); skygw_log_write(LOGFILE_ERROR, "Configuration object '%s' has an invalid type specified", obj->object);
error_count++; error_count++;
} }
@ -330,6 +334,7 @@ int error_count = 0;
if (error_count) if (error_count)
{ {
skygw_log_write(LOGFILE_ERROR, "%d errors where encountered processing the configuration file '%s'.\n", error_count, config_file); skygw_log_write(LOGFILE_ERROR, "%d errors where encountered processing the configuration file '%s'.\n", error_count, config_file);
return 0;
} }
return 1; return 1;
@ -569,3 +574,60 @@ SERVER *server;
return 1; return 1;
} }
static char *service_params[] =
{ "type", "router", "router_options", "servers", "user", "auth", NULL };
static char *server_params[] =
{ "type", "address", "port", "protocol", "monitorpw", "monitoruser", NULL };
static char *listener_params[] =
{ "type", "service", "protocol", "port", NULL };
static char *monitor_params[] =
{ "type", "module", "servers", "user", "passwd", NULL };
/**
* Check the configuration objects have valid parameters
*/
static void
check_config_objects(CONFIG_CONTEXT *context)
{
CONFIG_CONTEXT *obj;
CONFIG_PARAMETER *params;
char *type, **param_set;
int i;
/**
* Process the data and create the services and servers defined
* in the data.
*/
obj = context;
while (obj)
{
type = config_get_value(obj->parameters, "type");
if (!strcmp(type, "service"))
param_set = service_params;
else if (!strcmp(type, "server"))
param_set = server_params;
else if (!strcmp(type, "listener"))
param_set = listener_params;
else if (!strcmp(type, "monitor"))
param_set = monitor_params;
else
param_set = NULL;
if (param_set != NULL)
{
params = obj->parameters;
while (params)
{
int found = 0;
for (i = 0; param_set[i]; i++)
if (!strcmp(params->name, param_set[i]))
found = 1;
if (found == 0)
skygw_log_write(LOGFILE_ERROR,
"Unexpected parameter '%s' for object '%s' of type '%s'.\n",
params->name, obj->object, type);
params = params->next;
}
}
obj = obj->next;
}
}