diff options
Diffstat (limited to 'cli/src/cli-cmd-system.c')
| -rw-r--r-- | cli/src/cli-cmd-system.c | 147 | 
1 files changed, 147 insertions, 0 deletions
diff --git a/cli/src/cli-cmd-system.c b/cli/src/cli-cmd-system.c index f73758ae3..8cfa5e70c 100644 --- a/cli/src/cli-cmd-system.c +++ b/cli/src/cli-cmd-system.c @@ -31,6 +31,12 @@ extern rpc_clnt_prog_t *cli_rpc_prog;  int cli_cmd_system_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,                               const char **words, int wordcount); +int cli_cmd_copy_file_cbk (struct cli_state *state, struct cli_cmd_word *word, +                           const char **words, int wordcount); + +int cli_cmd_sys_exec_cbk (struct cli_state *state, struct cli_cmd_word *word, +                          const char **words, int wordcount); +  int  cli_cmd_getspec_cbk (struct cli_state *state, struct cli_cmd_word *word,                       const char **words, int wordcount) @@ -423,10 +429,151 @@ struct cli_cmd cli_system_cmds[] = {             cli_cmd_system_help_cbk,             "display help for system commands"}, +        { "system:: copy file [<filename>]", +           cli_cmd_copy_file_cbk, +           "Copy file from current node's $working_dir to " +           "$working_dir of all cluster nodes"}, + +        { "system:: execute <command> <args>", +           cli_cmd_sys_exec_cbk, +           "Execute the command on all the nodes " +           "in the cluster and display their output."}, +          { NULL, NULL, NULL }  };  int +cli_cmd_sys_exec_cbk (struct cli_state *state, struct cli_cmd_word *word, +                      const char **words, int wordcount) +{ +        char                   cmd_arg_name[PATH_MAX] = ""; +        char                  *command                = NULL; +        char                  *saveptr                = NULL; +        char                  *tmp                    = NULL; +        int                    ret                    = -1; +        int                    i                      = -1; +        int                    cmd_args_count         = 0; +        int                    in_cmd_args_count      = 0; +        rpc_clnt_procedure_t  *proc                   = NULL; +        call_frame_t          *frame                  = NULL; +        dict_t                *dict                   = NULL; +        cli_local_t           *local                  = NULL; + +        if (wordcount < 3) { +                cli_usage_out (word->pattern); +                goto out; +        } + +        dict = dict_new (); +        if (!dict) +                goto out; + +        command = strtok_r ((char *)words[2], " ", &saveptr); +        do { +                tmp = strtok_r (NULL, " ", &saveptr); +                if (tmp) { +                        in_cmd_args_count++; +                        memset (cmd_arg_name, '\0', sizeof(cmd_arg_name)); +                        snprintf (cmd_arg_name, sizeof(cmd_arg_name), +                                  "cmd_arg_%d", in_cmd_args_count); +                        ret = dict_set_str (dict, cmd_arg_name, tmp); +                        if (ret) { +                                gf_log ("", GF_LOG_ERROR, "Unable to set " +                                        "%s in dict", cmd_arg_name); +                                goto out; +                        } +                } +        } while (tmp); + +        cmd_args_count = wordcount - 3; + +        ret = dict_set_str (dict, "command", command); +        if (ret) { +                gf_log ("", GF_LOG_ERROR, "Unable to set command in dict"); +                goto out; +        } + +        for (i=1; i <= cmd_args_count; i++) { +                in_cmd_args_count++; +                memset (cmd_arg_name, '\0', sizeof(cmd_arg_name)); +                snprintf (cmd_arg_name, sizeof(cmd_arg_name), +                          "cmd_arg_%d", in_cmd_args_count); +                ret = dict_set_str (dict, cmd_arg_name, +                                    (char *)words[2+i]); +                if (ret) { +                        gf_log ("", GF_LOG_ERROR, "Unable to set %s in dict", +                               cmd_arg_name); +                        goto out; +                } +        } + +        ret = dict_set_int32 (dict, "cmd_args_count", in_cmd_args_count); +        if (ret) { +                gf_log ("", GF_LOG_ERROR, +                        "Unable to set cmd_args_count in dict"); +                goto out; +        } + +        ret = dict_set_str (dict, "volname", "N/A"); +        if (ret) { +                gf_log ("", GF_LOG_ERROR, "Unable to set volname in dict"); +                goto out; +        } + +        proc = &cli_rpc_prog->proctable[GLUSTER_CLI_SYS_EXEC]; +        if (proc && proc->fn) { +                frame = create_frame (THIS, THIS->ctx->pool); +                if (!frame) +                        goto out; +                CLI_LOCAL_INIT (local, words, frame, dict); +                ret = proc->fn (frame, THIS, (void*)dict); +        } +out: +        return ret; +} + +int +cli_cmd_copy_file_cbk (struct cli_state *state, struct cli_cmd_word *word, +                       const char **words, int wordcount) +{ +        int                    ret      = -1; +        rpc_clnt_procedure_t  *proc     = NULL; +        call_frame_t          *frame    = NULL; +        char                  *filename = ""; +        dict_t                *dict     = NULL; +        cli_local_t           *local    = NULL; + +        if (wordcount != 4) { +                cli_usage_out (word->pattern); +                goto out; +        } + +        dict = dict_new (); +        if (!dict) +                goto out; + +        filename = (char*)words[3]; +        ret = dict_set_str (dict, "source", filename); +        if (ret) +                 gf_log ("", GF_LOG_ERROR, "Unable to set filename in dict"); + +        ret = dict_set_str (dict, "volname", "N/A"); +        if (ret) +                 gf_log ("", GF_LOG_ERROR, "Unable to set volname in dict"); + +        proc = &cli_rpc_prog->proctable[GLUSTER_CLI_COPY_FILE]; +        if (proc && proc->fn) { +                frame = create_frame (THIS, THIS->ctx->pool); +                if (!frame) +                        goto out; +                CLI_LOCAL_INIT (local, words, frame, dict); +                ret = proc->fn (frame, THIS, (void*)dict); +        } +out: +        return ret; +} + +int  cli_cmd_system_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,                           const char **words, int wordcount)  {  | 
