diff options
| -rw-r--r-- | cli/src/cli-cmd-parser.c | 113 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.c | 66 | 
2 files changed, 146 insertions, 33 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index f590a4a5acc..ecdf61a77cc 100644 --- a/cli/src/cli-cmd-parser.c +++ b/cli/src/cli-cmd-parser.c @@ -635,6 +635,90 @@ out:          return ret;  } +static inline gf_boolean_t +cli_is_key_spl (char *key) +{ +        return (strcmp (key, "group") == 0); +} + +#define GLUSTERD_DEFAULT_WORKDIR "/var/lib/glusterd" +static int +cli_add_key_group (dict_t *dict, char *key, char *value) +{ +        int             ret = -1; +        int             opt_count = 0; +        char            iter_key[1024] = {0,}; +        char            iter_val[1024] = {0,}; +        char            *saveptr = NULL; +        char            *tok_key = NULL; +        char            *tok_val = NULL; +        char            *dkey = NULL; +        char            *dval = NULL; +        char            *tagpath = NULL; +        char            *buf = NULL; +        char            line[PATH_MAX + 256] = {0,}; +        FILE            *fp = NULL; + +        ret = gf_asprintf (&tagpath, "%s/groups/%s", +                           GLUSTERD_DEFAULT_WORKDIR, value); +        if (ret == -1) { +                tagpath = NULL; +                goto out; +        } + +        fp = fopen (tagpath, "r"); +        if (!fp) { +                ret = -1; +                goto out; +        } + +        opt_count = 0; +        buf = line; +        while (fscanf (fp, "%s", buf) != EOF) { + +                opt_count++; +                tok_key = strtok_r (line, "=", &saveptr); +                tok_val = strtok_r (NULL, "=", &saveptr); +                if (!tok_key || !tok_val) { +                        ret = -1; +                        goto out; +                } + +                snprintf (iter_key, sizeof (iter_key), "key%d", opt_count); +                dkey = gf_strdup (tok_key); +                ret = dict_set_dynstr (dict, iter_key, dkey); +                if (ret) +                        goto out; + +                snprintf (iter_val, sizeof (iter_val), "value%d", opt_count); +                dval = gf_strdup (tok_val); +                ret = dict_set_dynstr (dict, iter_val, dval); +                if (ret) +                        goto out; + +        } + +        if (!opt_count) { +                ret = -1; +                goto out; +        } +        ret = dict_set_int32 (dict, "count", opt_count); +out: + +        GF_FREE (tagpath); + +        if (ret) { +                GF_FREE (dkey); +                GF_FREE (dval); +        } + +        if (fp) +                fclose (fp); + +        return ret; +} +#undef GLUSTERD_DEFAULT_WORKDIR +  int32_t  cli_cmd_volume_set_parse (const char **words, int wordcount, dict_t **options)  { @@ -672,9 +756,27 @@ cli_cmd_volume_set_parse (const char **words, int wordcount, dict_t **options)                  ret = dict_set_str (dict, volname, volname);                  if (ret)                          goto out; +          } else if (wordcount < 5) {                  ret = -1;                  goto out; + +        } else if (wordcount == 5  && cli_is_key_spl ((char *)words[3])) { +                key = (char *) words[3]; +                value = (char *) words[4]; +                if ( !key || !value) { +                        ret = -1; +                        goto out; +                } + +                ret = gf_strip_whitespace (value, strlen (value)); +                if (ret == -1) +                        goto out; + +                ret = cli_add_key_group (dict, key, value); +                if (ret == 0) +                        *options = dict; +                goto out;          }          for (i = 3; i < wordcount; i+=2) { @@ -693,6 +795,11 @@ cli_cmd_volume_set_parse (const char **words, int wordcount, dict_t **options)                  if (ret == -1)                          goto out; +                if (cli_is_key_spl (key)) { +                        ret = -1; +                        goto out; +                } +                  sprintf (str, "key%d", count);                  ret = dict_set_str (dict, str, key);                  if (ret) @@ -713,10 +820,8 @@ cli_cmd_volume_set_parse (const char **words, int wordcount, dict_t **options)          *options = dict;  out: -        if (ret) { -                if (dict) -                        dict_destroy (dict); -        } +        if (ret) +                dict_destroy (dict);          return ret;  } diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c index fc55a001006..50e73f20483 100644 --- a/xlators/mgmt/glusterd/src/glusterd.c +++ b/xlators/mgmt/glusterd/src/glusterd.c @@ -755,10 +755,10 @@ init (xlator_t *this)          glusterd_conf_t   *conf              = NULL;          data_t            *dir_data          = NULL;          struct stat        buf               = {0,}; -        char               voldir [PATH_MAX] = {0,}; -        char               dirname [PATH_MAX]; -        char               cmd_log_filename [PATH_MAX] = {0,}; +        char               storedir [PATH_MAX] = {0,}; +        char               workdir [PATH_MAX] = {0,};          char               hooks_dir [PATH_MAX] = {0,}; +        char               cmd_log_filename [PATH_MAX] = {0,};          int                first_time        = 0;          char              *mountbroker_root  = NULL; @@ -769,34 +769,34 @@ init (xlator_t *this)          if (!dir_data) {                  //Use default working dir -                strncpy (dirname, GLUSTERD_DEFAULT_WORKDIR, PATH_MAX); +                strncpy (workdir, GLUSTERD_DEFAULT_WORKDIR, PATH_MAX);          } else { -                strncpy (dirname, dir_data->data, PATH_MAX); +                strncpy (workdir, dir_data->data, PATH_MAX);          } -        ret = stat (dirname, &buf); +        ret = stat (workdir, &buf);          if ((ret != 0) && (ENOENT != errno)) {                  gf_log (this->name, GF_LOG_ERROR,                          "stat fails on %s, exiting. (errno = %d)", -			dirname, errno); +			workdir, errno);                  exit (1);          }          if ((!ret) && (!S_ISDIR(buf.st_mode))) {                  gf_log (this->name, GF_LOG_CRITICAL,                          "Provided working area %s is not a directory," -                        "exiting", dirname); +                        "exiting", workdir);                  exit (1);          }          if ((-1 == ret) && (ENOENT == errno)) { -                ret = mkdir (dirname, 0777); +                ret = mkdir (workdir, 0777);                  if (-1 == ret) {                          gf_log (this->name, GF_LOG_CRITICAL,                                  "Unable to create directory %s" -                                " ,errno = %d", dirname, errno); +                                " ,errno = %d", workdir, errno);                          exit (1);                  } @@ -804,7 +804,7 @@ init (xlator_t *this)          }          gf_log (this->name, GF_LOG_INFO, "Using %s as working directory", -                dirname); +                workdir);          snprintf (cmd_log_filename, PATH_MAX,"%s/.cmd_log_history",                    DEFAULT_LOG_FILE_DIRECTORY); @@ -816,52 +816,61 @@ init (xlator_t *this)                  exit (1);          } -        snprintf (voldir, PATH_MAX, "%s/vols", dirname); +        snprintf (storedir, PATH_MAX, "%s/vols", workdir); -        ret = mkdir (voldir, 0777); +        ret = mkdir (storedir, 0777);          if ((-1 == ret) && (errno != EEXIST)) {                  gf_log (this->name, GF_LOG_CRITICAL,                          "Unable to create volume directory %s" -                        " ,errno = %d", voldir, errno); +                        " ,errno = %d", storedir, errno);                  exit (1);          } -        snprintf (voldir, PATH_MAX, "%s/peers", dirname); +        snprintf (storedir, PATH_MAX, "%s/peers", workdir); -        ret = mkdir (voldir, 0777); +        ret = mkdir (storedir, 0777);          if ((-1 == ret) && (errno != EEXIST)) {                  gf_log (this->name, GF_LOG_CRITICAL,                          "Unable to create peers directory %s" -                        " ,errno = %d", voldir, errno); +                        " ,errno = %d", storedir, errno);                  exit (1);          } -        snprintf (voldir, PATH_MAX, "%s/bricks", DEFAULT_LOG_FILE_DIRECTORY); -        ret = mkdir (voldir, 0777); +        snprintf (storedir, PATH_MAX, "%s/bricks", DEFAULT_LOG_FILE_DIRECTORY); +        ret = mkdir (storedir, 0777);          if ((-1 == ret) && (errno != EEXIST)) {                  gf_log (this->name, GF_LOG_CRITICAL,                          "Unable to create logs directory %s" -                        " ,errno = %d", voldir, errno); +                        " ,errno = %d", storedir, errno);                  exit (1);          } -        snprintf (voldir, PATH_MAX, "%s/nfs", dirname); -        ret = mkdir (voldir, 0777); +        snprintf (storedir, PATH_MAX, "%s/nfs", workdir); +        ret = mkdir (storedir, 0777);          if ((-1 == ret) && (errno != EEXIST)) {                  gf_log (this->name, GF_LOG_CRITICAL,                          "Unable to create nfs directory %s" -                        " ,errno = %d", voldir, errno); +                        " ,errno = %d", storedir, errno); +                exit (1); +        } + +        snprintf (storedir, PATH_MAX, "%s/glustershd", workdir); +        ret = mkdir (storedir, 0777); +        if ((-1 == ret) && (errno != EEXIST)) { +                gf_log (this->name, GF_LOG_CRITICAL, +                        "Unable to create glustershd directory %s" +                        " ,errno = %d", storedir, errno);                  exit (1);          } -        snprintf (voldir, PATH_MAX, "%s/glustershd", dirname); -        ret = mkdir (voldir, 0777); +        snprintf (storedir, PATH_MAX, "%s/groups", workdir); +        ret = mkdir (storedir, 0777);          if ((-1 == ret) && (errno != EEXIST)) {                  gf_log (this->name, GF_LOG_CRITICAL,                          "Unable to create glustershd directory %s" -                        " ,errno = %d", voldir, errno); +                        " ,errno = %d", storedir, errno);                  exit (1);          } @@ -944,7 +953,7 @@ init (xlator_t *this)          pthread_mutex_init (&conf->mutex, NULL);          conf->rpc = rpc;          conf->gfs_mgmt = &gd_brick_prog; -        strncpy (conf->workdir, dirname, PATH_MAX); +        strncpy (conf->workdir, workdir, PATH_MAX);          INIT_LIST_HEAD (&conf->xprt_list); @@ -976,7 +985,6 @@ init (xlator_t *this)          this->private = conf;          (void) glusterd_nodesvc_set_running ("glustershd", _gf_false); -        /* this->ctx->top = this;*/          ret = glusterd_uuid_init (first_time);          if (ret < 0) @@ -984,7 +992,7 @@ init (xlator_t *this)          GLUSTERD_GET_HOOKS_DIR (hooks_dir, GLUSTERD_HOOK_VER, conf);          if (stat (hooks_dir, &buf)) { -                ret = glusterd_hooks_create_hooks_directory (dirname); +                ret = glusterd_hooks_create_hooks_directory (conf->workdir);                  if (-1 == ret) {                          gf_log (this->name, GF_LOG_CRITICAL,                                  "Unable to create hooks directory ");  | 
