/** * Update the definition of a service * * @param service The service to update * @param router The router module to use * @param user The user to use to extract information from the database * @param auth The password for the user above */ void service_update(SERVICE *service, char *router, char *user, char *auth) { void *router_obj; if (!strcmp(service->routerModule, router)) { if ((router_obj = load_module(router, MODULE_ROUTER)) == NULL) { LOGIF(LE, (skygw_log_write_flush( LOGFILE_ERROR, "Error : Failed to update router " "for service %s to %s.", service->name, router))); } else { LOGIF(LM, (skygw_log_write( LOGFILE_MESSAGE, "Update router for service %s to %s.", service->name, router))); free(service->routerModule); service->routerModule = strdup(router); service->router = router_obj; } } if (user && (strcmp(service->credentials.name, user) != 0 || strcmp(service->credentials.authdata, auth) != 0)) { LOGIF(LM, (skygw_log_write( LOGFILE_MESSAGE, "Update credentials for service %s.", service->name))); serviceSetUser(service, user, auth); } }
/** * Process a configuration context update and turn it into the set of object * we need. * * @param context The configuration data */ static int process_config_update(CONFIG_CONTEXT *context) { CONFIG_CONTEXT *obj; SERVICE *service; SERVER *server; /** * Process the data and create the services and servers defined * in the data. */ obj = context; while (obj) { char *type = config_get_value(obj->parameters, "type"); if (type == NULL) { LOGIF(LE, (skygw_log_write_flush( LOGFILE_ERROR, "Error : Configuration object %s has no type.", obj->object))); } else if (!strcmp(type, "service")) { char *router = config_get_value(obj->parameters, "router"); if (router) { if ((service = service_find(obj->object)) != NULL) { char *user; char *auth; char *enable_root_user; enable_root_user = config_get_value(obj->parameters, "enable_root_user"); user = config_get_value(obj->parameters, "user"); auth = config_get_value(obj->parameters, "passwd"); if (user && auth) { service_update(service, router, user, auth); if (enable_root_user) serviceEnableRootUser(service, atoi(enable_root_user)); } obj->element = service; } else { char *user; char *auth; char *enable_root_user; enable_root_user = config_get_value(obj->parameters, "enable_root_user"); user = config_get_value(obj->parameters, "user"); auth = config_get_value(obj->parameters, "passwd"); obj->element = service_alloc(obj->object, router); if (obj->element && user && auth) { serviceSetUser(obj->element, user, auth); if (enable_root_user) serviceEnableRootUser(service, atoi(enable_root_user)); } } } else { obj->element = NULL; LOGIF(LE, (skygw_log_write_flush( LOGFILE_ERROR, "Error : No router defined for service " "'%s'.", obj->object))); } } else if (!strcmp(type, "server")) { char *address; char *port; char *protocol; char *monuser; char *monpw; address = config_get_value(obj->parameters, "address"); port = config_get_value(obj->parameters, "port"); protocol = config_get_value(obj->parameters, "protocol"); monuser = config_get_value(obj->parameters, "monitoruser"); monpw = config_get_value(obj->parameters, "monitorpw"); if (address && port && protocol) { if ((server = server_find(address, atoi(port))) != NULL) { server_update(server, protocol, monuser, monpw); obj->element = server; } else { obj->element = server_alloc(address, protocol, atoi(port)); if (obj->element && monuser && monpw) { serverAddMonUser(obj->element, monuser, monpw); } } } else { LOGIF(LE, (skygw_log_write_flush( LOGFILE_ERROR, "Error : Server '%s' is missing a " "required " "configuration parameter. A server must " "have address, port and protocol " "defined.", obj->object))); } } obj = obj->next; } /* * Now we have the services we can add the servers to the services * add the protocols to the services */ obj = context; while (obj) { char *type = config_get_value(obj->parameters, "type"); if (type == NULL) ; else if (!strcmp(type, "service")) { char *servers; char *roptions; servers = config_get_value(obj->parameters, "servers"); roptions = config_get_value(obj->parameters, "router_options"); if (servers && obj->element) { char *s = strtok(servers, ","); while (s) { CONFIG_CONTEXT *obj1 = context; while (obj1) { if (strcmp(s, obj1->object) == 0 && obj->element && obj1->element) { if (!serviceHasBackend(obj->element, obj1->element)) { serviceAddBackend( obj->element, obj1->element); } } obj1 = obj1->next; } s = strtok(NULL, ","); } } if (roptions && obj->element) { char *s = strtok(roptions, ","); serviceClearRouterOptions(obj->element); while (s) { serviceAddRouterOption(obj->element, s); s = strtok(NULL, ","); } } } else if (!strcmp(type, "listener")) { char *service; char *port; char *protocol; char *address; service = config_get_value(obj->parameters, "service"); address = config_get_value(obj->parameters, "address"); port = config_get_value(obj->parameters, "port"); protocol = config_get_value(obj->parameters, "protocol"); if (service && port && protocol) { CONFIG_CONTEXT *ptr = context; while (ptr && strcmp(ptr->object, service) != 0) ptr = ptr->next; if (ptr && ptr->element && serviceHasProtocol(ptr->element, protocol, atoi(port)) == 0) { serviceAddProtocol(ptr->element, protocol, address, atoi(port)); serviceStartProtocol(ptr->element, protocol, atoi(port)); } } } else if (strcmp(type, "server") != 0 && strcmp(type, "monitor") != 0) { LOGIF(LE, (skygw_log_write_flush( LOGFILE_ERROR, "Error : Configuration object %s has an invalid " "type specified.", obj->object))); } obj = obj->next; } return 1; }
/** * Process a configuration context and turn it into the set of object * we need. * * @param context The configuration data * @return A zero result indicates a fatal error */ static int process_config_context(CONFIG_CONTEXT *context) { CONFIG_CONTEXT *obj; int error_count = 0; /** * Process the data and create the services and servers defined * in the data. */ obj = context; while (obj) { char *type = config_get_value(obj->parameters, "type"); if (type == NULL) { LOGIF(LE, (skygw_log_write_flush( LOGFILE_ERROR, "Error : Configuration object '%s' has no type.", obj->object))); error_count++; } else if (!strcmp(type, "service")) { char *router = config_get_value(obj->parameters, "router"); if (router) { obj->element = service_alloc(obj->object, router); char *user = config_get_value(obj->parameters, "user"); char *auth = config_get_value(obj->parameters, "passwd"); char *enable_root_user = config_get_value(obj->parameters, "enable_root_user"); if (enable_root_user) serviceEnableRootUser(obj->element, atoi(enable_root_user)); if (!auth) auth = config_get_value(obj->parameters, "auth"); if (obj->element && user && auth) { serviceSetUser(obj->element, user, auth); } else if (user && auth == NULL) { LOGIF(LE, (skygw_log_write_flush( LOGFILE_ERROR, "Error : Service '%s' has a " "user defined but no " "corresponding password.", obj->object))); } } else { obj->element = NULL; LOGIF(LE, (skygw_log_write_flush( LOGFILE_ERROR, "Error : No router defined for service " "'%s'\n", obj->object))); error_count++; } } else if (!strcmp(type, "server")) { char *address; char *port; char *protocol; char *monuser; char *monpw; address = config_get_value(obj->parameters, "address"); port = config_get_value(obj->parameters, "port"); protocol = config_get_value(obj->parameters, "protocol"); monuser = config_get_value(obj->parameters, "monitoruser"); monpw = config_get_value(obj->parameters, "monitorpw"); if (address && port && protocol) { obj->element = server_alloc(address, protocol, atoi(port)); } else { obj->element = NULL; LOGIF(LE, (skygw_log_write_flush( LOGFILE_ERROR, "Error : Server '%s' is missing a " "required configuration parameter. A " "server must " "have address, port and protocol " "defined.", obj->object))); error_count++; } if (obj->element && monuser && monpw) serverAddMonUser(obj->element, monuser, monpw); else if (monuser && monpw == NULL) { LOGIF(LE, (skygw_log_write_flush( LOGFILE_ERROR, "Error : Server '%s' has a monitoruser" "defined but no corresponding password.", obj->object))); } } obj = obj->next; } /* * Now we have the services we can add the servers to the services * add the protocols to the services */ obj = context; while (obj) { char *type = config_get_value(obj->parameters, "type"); if (type == NULL) ; else if (!strcmp(type, "service")) { char *servers; char *roptions; servers = config_get_value(obj->parameters, "servers"); roptions = config_get_value(obj->parameters, "router_options"); if (servers && obj->element) { char *s = strtok(servers, ","); while (s) { CONFIG_CONTEXT *obj1 = context; while (obj1) { if (strcmp(s, obj1->object) == 0 && obj->element && obj1->element) { serviceAddBackend( obj->element, obj1->element); } obj1 = obj1->next; } s = strtok(NULL, ","); } } else if (servers == NULL) { LOGIF(LE, (skygw_log_write_flush( LOGFILE_ERROR, "Error : The service '%s' is missing a " "definition of the servers that provide " "the service.", obj->object))); } if (roptions && obj->element) { char *s = strtok(roptions, ","); while (s) { serviceAddRouterOption(obj->element, s); s = strtok(NULL, ","); } } } else if (!strcmp(type, "listener")) { char *service; char *address; char *port; char *protocol; service = config_get_value(obj->parameters, "service"); port = config_get_value(obj->parameters, "port"); address = config_get_value(obj->parameters, "address"); protocol = config_get_value(obj->parameters, "protocol"); if (service && port && protocol) { CONFIG_CONTEXT *ptr = context; while (ptr && strcmp(ptr->object, service) != 0) ptr = ptr->next; if (ptr && ptr->element) { serviceAddProtocol(ptr->element, protocol, address, atoi(port)); } else { LOGIF(LE, (skygw_log_write_flush( LOGFILE_ERROR, "Error : Listener '%s', " "service '%s' not found. " "Listener will not execute.", obj->object, service))); error_count++; } } else { LOGIF(LE, (skygw_log_write_flush( LOGFILE_ERROR, "Error : Listener '%s' is misisng a " "required " "parameter. A Listener must have a " "service, port and protocol defined.", obj->object))); error_count++; } } else if (!strcmp(type, "monitor")) { char *module; char *servers; char *user; char *passwd; module = config_get_value(obj->parameters, "module"); servers = config_get_value(obj->parameters, "servers"); user = config_get_value(obj->parameters, "user"); passwd = config_get_value(obj->parameters, "passwd"); if (module) { obj->element = monitor_alloc(obj->object, module); if (servers && obj->element) { char *s = strtok(servers, ","); while (s) { CONFIG_CONTEXT *obj1 = context; while (obj1) { if (strcmp(s, obj1->object) == 0 && obj->element && obj1->element) { monitorAddServer( obj->element, obj1->element); } obj1 = obj1->next; } s = strtok(NULL, ","); } } if (obj->element && user && passwd) { monitorAddUser(obj->element, user, passwd); } else if (obj->element && user) { LOGIF(LE, (skygw_log_write_flush( LOGFILE_ERROR, "Error: " "Monitor '%s' defines a " "username with no password.", obj->object))); error_count++; } } else { obj->element = NULL; LOGIF(LE, (skygw_log_write_flush( LOGFILE_ERROR, "Error : Monitor '%s' is missing a " "require module parameter.", obj->object))); error_count++; } } else if (strcmp(type, "server") != 0) { LOGIF(LE, (skygw_log_write_flush( LOGFILE_ERROR, "Error : Configuration object '%s' has an " "invalid type specified.", obj->object))); error_count++; } obj = obj->next; } if (error_count) { LOGIF(LE, (skygw_log_write_flush( LOGFILE_ERROR, "Error : %d errors where encountered processing the " "configuration file '%s'.", error_count, config_file))); return 0; } return 1; }