diff options
-rw-r--r-- | cli/src/cli-cmd-system.c | 48 | ||||
-rw-r--r-- | cli/src/cli3_1-cops.c | 67 | ||||
-rw-r--r-- | rpc/rpc-lib/src/protocol-common.h | 1 |
3 files changed, 116 insertions, 0 deletions
diff --git a/cli/src/cli-cmd-system.c b/cli/src/cli-cmd-system.c index 86e2c167b57..08fc44a37c2 100644 --- a/cli/src/cli-cmd-system.c +++ b/cli/src/cli-cmd-system.c @@ -34,6 +34,7 @@ #include "protocol-common.h" #define GETSPEC_SYNTAX "system:: getspec <VOLID>" +#define BRICKTOPORT_SYNTAX "system:: portmap brick2port <BRICK>" extern struct rpc_clnt *global_rpc; @@ -85,11 +86,58 @@ out: return ret; } +int +cli_cmd_pmap_b2p_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; + dict_t *dict = NULL; + + frame = create_frame (THIS, THIS->ctx->pool); + if (!frame) + goto out; + + dict = dict_new (); + if (!dict) + goto out; + + if (wordcount != 4) { + cli_out ("Usage: " BRICKTOPORT_SYNTAX); + goto out; + } + + ret = dict_set_str (dict, "brick", (char *)words[3]); + if (ret) + goto out; + + proc = &cli_rpc_prog->proctable[GF1_CLI_PMAP_PORTBYBRICK]; + if (proc->fn) { + ret = proc->fn (frame, THIS, dict); + } + +out: + if (!proc && ret) { + if (dict) + dict_destroy (dict); + if (wordcount > 1) + cli_out ("Fetching spec for volume %s failed", + (char *)words[3]); + } + + return ret; +} + struct cli_cmd cli_system_cmds[] = { { GETSPEC_SYNTAX, cli_cmd_getspec_cbk, "fetch spec for volume <VOLID>"}, + { BRICKTOPORT_SYNTAX, + cli_cmd_pmap_b2p_cbk, + "query which port <BRICK> listens on"}, + { "system:: help", cli_cmd_system_help_cbk, "display help for system commands"}, diff --git a/cli/src/cli3_1-cops.c b/cli/src/cli3_1-cops.c index a63c2e17a3a..026231b1f9a 100644 --- a/cli/src/cli3_1-cops.c +++ b/cli/src/cli3_1-cops.c @@ -35,6 +35,7 @@ #include "compat.h" #include "glusterfs3.h" +#include "portmap.h" extern rpc_clnt_prog_t *cli_rpc_prog; extern int cli_op_ret; @@ -61,6 +62,12 @@ rpc_clnt_prog_t cli_handshake_prog = { .progver = GLUSTER_HNDSK_VERSION, }; +rpc_clnt_prog_t cli_pmap_prog = { + .progname = "cli portmap", + .prognum = GLUSTER_PMAP_PROGRAM, + .progver = GLUSTER_PMAP_VERSION, +}; + int gf_cli3_1_probe_cbk (struct rpc_req *req, struct iovec *iov, @@ -1062,6 +1069,36 @@ out: return ret; } +int +gf_cli3_1_pmap_b2p_cbk (struct rpc_req *req, struct iovec *iov, + int count, void *myframe) +{ + pmap_port_by_brick_rsp rsp = {0,}; + int ret = 0; + char *spec = NULL; + + if (-1 == req->rpc_status) { + goto out; + } + + ret = xdr_to_pmap_port_by_brick_rsp (*iov, &rsp); + if (ret < 0 || rsp.op_ret == -1) { + gf_log ("", GF_LOG_ERROR, "error"); + goto out; + } + + gf_log ("cli", GF_LOG_NORMAL, "Received resp to pmap b2p"); + + cli_out ("%d", rsp.port); + GF_FREE (spec); + + ret = rsp.op_ret; + +out: + cli_cmd_broadcast_response (ret); + return ret; +} + int32_t gf_cli3_1_probe (call_frame_t *frame, xlator_t *this, @@ -1873,6 +1910,35 @@ out: return ret; } +int32_t +gf_cli3_1_pmap_b2p (call_frame_t *frame, xlator_t *this, void *data) +{ + pmap_port_by_brick_req req = {0,}; + int ret = 0; + dict_t *dict = NULL; + + if (!frame || !this || !data) { + ret = -1; + goto out; + } + + dict = data; + + ret = dict_get_str (dict, "brick", &req.brick); + if (ret) + goto out; + + ret = cli_cmd_submit (&req, frame, &cli_pmap_prog, + GF_PMAP_PORTBYBRICK, NULL, + xdr_from_pmap_port_by_brick_req, + this, gf_cli3_1_pmap_b2p_cbk); + +out: + gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + + return ret; +} + struct rpc_clnt_procedure gluster3_1_cli_actors[GF1_CLI_MAXVALUE] = { [GF1_CLI_NULL] = {"NULL", NULL }, @@ -1895,6 +1961,7 @@ struct rpc_clnt_procedure gluster3_1_cli_actors[GF1_CLI_MAXVALUE] = { [GF1_CLI_LOG_LOCATE] = {"LOG LOCATE", gf_cli3_1_log_locate}, [GF1_CLI_LOG_ROTATE] = {"LOG ROTATE", gf_cli3_1_log_rotate}, [GF1_CLI_GETSPEC] = {"GETSPEC", gf_cli3_1_getspec}, + [GF1_CLI_PMAP_PORTBYBRICK] = {"PMAP PORTBYBRICK", gf_cli3_1_pmap_b2p}, }; struct rpc_clnt_program cli3_1_prog = { diff --git a/rpc/rpc-lib/src/protocol-common.h b/rpc/rpc-lib/src/protocol-common.h index 4bb32a5908a..4d1576446d4 100644 --- a/rpc/rpc-lib/src/protocol-common.h +++ b/rpc/rpc-lib/src/protocol-common.h @@ -128,6 +128,7 @@ enum gf_cli_procnum { GF1_CLI_LOG_LOCATE, GF1_CLI_LOG_ROTATE, GF1_CLI_GETSPEC, + GF1_CLI_PMAP_PORTBYBRICK, GF1_CLI_MAXVALUE, }; |