From c500ddc7680aa670a987a87f61b515843380231e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Sun, 8 Jan 2017 15:07:18 +0200 Subject: [PATCH] Use module parameters in namedserverfilter The namedserverfilter module now uses the module parameters. Added new server type parameter which is validated both at startup and runtime. --- Documentation/Filters/Named-Server-Filter.md | 3 + include/maxscale/config.h | 20 ++++ include/maxscale/modinfo.h | 1 + server/core/config.c | 20 ++++ .../namedserverfilter/namedserverfilter.c | 98 +++++-------------- 5 files changed, 71 insertions(+), 71 deletions(-) diff --git a/Documentation/Filters/Named-Server-Filter.md b/Documentation/Filters/Named-Server-Filter.md index b524ae449..7c85e4e00 100644 --- a/Documentation/Filters/Named-Server-Filter.md +++ b/Documentation/Filters/Named-Server-Filter.md @@ -40,6 +40,9 @@ To use multiple filter options, list them in a comma-separated list. options=case,extended ``` +**Note:** The _ignorecase_ and _case_ options are mutually exclusive and only +one of them should be used. + ## Filter Parameters The named server filter requires two mandatory parameters to be defined. diff --git a/include/maxscale/config.h b/include/maxscale/config.h index aa3eeda58..79ae5d8fd 100644 --- a/include/maxscale/config.h +++ b/include/maxscale/config.h @@ -270,6 +270,26 @@ const char* config_get_string(const CONFIG_PARAMETER *params, const char *key); */ int config_get_enum(const CONFIG_PARAMETER *params, const char *key, const MXS_ENUM_VALUE *values); +/** + * @brief Get a service value + * + * @param params List of configuration parameters + * @param key Parameter name + * + * @return Pointer to configured service + */ +struct service* config_get_service(const CONFIG_PARAMETER *params, const char *key); + +/** + * @brief Get a server value + * + * @param params List of configuration parameters + * @param key Parameter name + * + * @return Pointer to configured server + */ +struct server* config_get_server(const CONFIG_PARAMETER *params, const char *key); + /** * @brief Get copy of parameter value if it is defined * diff --git a/include/maxscale/modinfo.h b/include/maxscale/modinfo.h index 236b6b508..6b700711d 100644 --- a/include/maxscale/modinfo.h +++ b/include/maxscale/modinfo.h @@ -77,6 +77,7 @@ enum mxs_module_param_type MXS_MODULE_PARAM_ENUM, /**< Enumeration of string values */ MXS_MODULE_PARAM_PATH, /**< Path to a file or a directory */ MXS_MODULE_PARAM_SERVICE, /**< Service name */ + MXS_MODULE_PARAM_SERVER, /**< Server name */ }; /** Maximum and minimum values for integer types */ diff --git a/server/core/config.c b/server/core/config.c index 007b7dfea..81206bd34 100644 --- a/server/core/config.c +++ b/server/core/config.c @@ -985,6 +985,18 @@ int config_get_enum(const CONFIG_PARAMETER *params, const char *key, const MXS_E return found ? rv : -1; } +SERVICE* config_get_service(const CONFIG_PARAMETER *params, const char *key) +{ + const char *value = config_get_value_string(params, key); + return service_find(value); +} + +SERVER* config_get_server(const CONFIG_PARAMETER *params, const char *key) +{ + const char *value = config_get_value_string(params, key); + return server_find_by_unique_name(value); +} + char* config_copy_string(const CONFIG_PARAMETER *params, const char *key) { const char *value = config_get_value_string(params, key); @@ -3171,6 +3183,14 @@ bool config_param_is_valid(const MXS_MODULE_PARAM *params, const char *key, } break; + case MXS_MODULE_PARAM_SERVER: + if ((context && config_contains_type(context, value, "server")) || + server_find_by_unique_name(value)) + { + valid = true; + } + break; + case MXS_MODULE_PARAM_PATH: if (params[i].options & (MXS_MODULE_OPT_PATH_W_OK | MXS_MODULE_OPT_PATH_R_OK | diff --git a/server/modules/filter/namedserverfilter/namedserverfilter.c b/server/modules/filter/namedserverfilter/namedserverfilter.c index d4ed20670..a12a97db0 100644 --- a/server/modules/filter/namedserverfilter/namedserverfilter.c +++ b/server/modules/filter/namedserverfilter/namedserverfilter.c @@ -72,6 +72,14 @@ typedef struct int active; /* Is filter active */ } REGEXHINT_SESSION; +static const MXS_ENUM_VALUE option_values[] = +{ + {"ignorecase", REG_ICASE}, + {"case", 0}, + {"extended", REG_EXTENDED}, + {NULL} +}; + /** * The module entry point routine. It is this routine that * must populate the structure that is referred to as the @@ -110,6 +118,17 @@ MXS_MODULE* MXS_CREATE_MODULE() NULL, /* Thread init. */ NULL, /* Thread finish. */ { + {"match", MXS_MODULE_PARAM_STRING, NULL, MXS_MODULE_OPT_REQUIRED}, + {"server", MXS_MODULE_PARAM_SERVER, NULL, MXS_MODULE_OPT_REQUIRED}, + {"source", MXS_MODULE_PARAM_STRING}, + {"user", MXS_MODULE_PARAM_STRING}, + { + "options", + MXS_MODULE_PARAM_ENUM, + "ignorecase", + MXS_MODULE_OPT_NONE, + option_values + }, {MXS_END_MODULE_PARAMS} } }; @@ -134,80 +153,17 @@ createInstance(const char *name, char **options, CONFIG_PARAMETER *params) if (my_instance) { - my_instance->match = NULL; - my_instance->server = NULL; - my_instance->source = NULL; - my_instance->user = NULL; + my_instance->match = MXS_STRDUP_A(config_get_string(params, "match")); + my_instance->server = MXS_STRDUP_A(config_get_string(params, "server")); + my_instance->source = config_copy_string(params, "source"); + my_instance->user = config_copy_string(params, "user"); bool error = false; - for (const CONFIG_PARAMETER *p = params; p; p = p->next) - { - if (!strcmp(p->name, "match")) - { - my_instance->match = MXS_STRDUP_A(p->value); - } - else if (!strcmp(p->name, "server")) - { - my_instance->server = MXS_STRDUP_A(p->value); - } - else if (!strcmp(p->name, "source")) - { - my_instance->source = MXS_STRDUP_A(p->value); - } - else if (!strcmp(p->name, "user")) - { - my_instance->user = MXS_STRDUP_A(p->value); - } - else if (!filter_standard_parameter(p->name)) - { - MXS_ERROR("namedserverfilter: Unexpected parameter '%s'.", p->name); - error = true; - } - } + int cflags = config_get_enum(params, "options", option_values); - int cflags = REG_ICASE; - - if (options) + if (regcomp(&my_instance->re, my_instance->match, cflags)) { - for (int i = 0; options[i]; i++) - { - if (!strcasecmp(options[i], "ignorecase")) - { - cflags |= REG_ICASE; - } - else if (!strcasecmp(options[i], "case")) - { - cflags &= ~REG_ICASE; - } - else if (!strcasecmp(options[i], "extended")) - { - cflags |= REG_EXTENDED; - } - else - { - MXS_ERROR("namedserverfilter: Unsupported option '%s'.", - options[i]); - error = true; - } - } - } - - if (my_instance->match == NULL) - { - MXS_ERROR("namedserverfilter: Missing required parameters 'match'."); - error = true; - } - - if (my_instance->server == NULL) - { - MXS_ERROR("namedserverfilter: Missing required parameters 'server'."); - error = true; - } - if (my_instance->server && my_instance->match && - regcomp(&my_instance->re, my_instance->match, cflags)) - { - MXS_ERROR("namedserverfilter: Invalid regular expression '%s'.\n", - my_instance->match); + MXS_ERROR("namedserverfilter: Invalid regular expression '%s'.", my_instance->match); MXS_FREE(my_instance->match); my_instance->match = NULL; error = true; @@ -226,8 +182,8 @@ createInstance(const char *name, char **options, CONFIG_PARAMETER *params) MXS_FREE(my_instance); my_instance = NULL; } - } + return (FILTER *) my_instance; }