diff options
author | Csaba Henk <csaba@gluster.com> | 2011-04-13 01:46:08 +0000 |
---|---|---|
committer | Anand Avati <avati@gluster.com> | 2011-04-13 04:43:18 -0700 |
commit | 72f88e50dbf1f492db7bcc70b074bc64e6b994cb (patch) | |
tree | 73d08cfa721dabeb4fa46ea4a2286f3bf992303f /xlators/mgmt | |
parent | ac27e6980869d52ea90b869de01538dec28620ae (diff) |
glusterd: sanitize gsyncd config option validation
- rely on --config-check functionality of gsyncd to find out if option exists
- maintain a list of those options with which we don't want the user to fiddle with
(glusterd internals imply these so it' just the proper component for it)
- fail if user does a set/del on these
Signed-off-by: Csaba Henk <csaba@gluster.com>
Signed-off-by: Anand Avati <avati@gluster.com>
BUG: 2659 (gsync config-del option is not working properly)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2659
Diffstat (limited to 'xlators/mgmt')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-op-sm.c | 59 |
1 files changed, 37 insertions, 22 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index b9d63605a..4017dd91c 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -95,17 +95,11 @@ static char *glusterd_op_sm_event_names[] = { "GD_OP_EVENT_INVALID" }; -static char *gsync_opname[] = { +static char *gsync_reserved_opts[] = { "gluster-command", - "gluster-log-file", - "gluster-log-level", + "pid-file", "log-file", - "log-level", - "remote-gsyncd", - "ssh-command", - "rsync-command", - "timeout", - "sync-jobs", + "state-file", NULL }; @@ -1829,9 +1823,12 @@ int gsync_validate_config_option (dict_t *dict, int32_t config_type, char **op_errstr) { + char cmd[PATH_MAX] = {0,}; int ret = -1; + char **resopt = NULL; int i = 0; - char *op_name = NULL; + char *op_name = NULL; + gf_boolean_t banned = _gf_true; if (config_type == GF_GSYNC_OPTION_TYPE_CONFIG_GET_ALL) return 0; @@ -1840,24 +1837,42 @@ gsync_validate_config_option (dict_t *dict, int32_t config_type, if (ret < 0) { gf_log ("", GF_LOG_WARNING, "option not specified"); *op_errstr = gf_strdup ("Please specify the option"); - goto out; + return -1; } - i = 0; - while (gsync_opname[i] != NULL) { - if (strcmp (gsync_opname[i], op_name) == 0) { - ret = 0; - goto out; - } - i++; + snprintf (cmd, PATH_MAX, GSYNCD_PREFIX"/gsyncd --config-check %s", op_name); + ret = system (cmd); + if (ret) { + gf_log ("", GF_LOG_WARNING, "Invalid option %s", op_name); + *op_errstr = gf_strdup ("Invalid option"); + + ret = -1; } - gf_log ("", GF_LOG_WARNING, "Invalid option"); - *op_errstr = gf_strdup ("Invalid option"); + if (ret != -1 && + (config_type == GF_GSYNC_OPTION_TYPE_CONFIG_SET || + config_type == GF_GSYNC_OPTION_TYPE_CONFIG_DEL)) { + /* match option name against reserved options, modulo -/- + * difference + */ + for (resopt = gsync_reserved_opts; *resopt; resopt++) { + banned = _gf_true; + for (i = 0; (*resopt)[i] && op_name[i]; i++) { + if ((*resopt)[i] == op_name[i] || + ((*resopt)[i] == '-' && op_name[i] == '_')) + continue; + banned = _gf_false; + } + if (banned) { + gf_log ("", GF_LOG_WARNING, "Reserved option %s", op_name); + *op_errstr = gf_strdup ("Reserved option"); - ret = -1; + ret = -1; + break; + } + } + } -out: return ret; } |