summaryrefslogtreecommitdiffstats
path: root/cli
diff options
context:
space:
mode:
authorRajesh Amaravathi <rajesh@redhat.com>2012-01-31 17:04:37 +0530
committerVijay Bellur <vijay@gluster.com>2012-02-18 00:03:00 -0800
commitdf12073c4cc8340eb85b5d25c2da84fc21ec1f38 (patch)
treebea7be987249a13120faeefd61f92362a0ab61bc /cli
parentacb691f8908049e651fc12ff1cf01e9cf4ddde65 (diff)
cli/glusterd: volume status modification
* Method of getting mount details of brick has been changed from direct reading of /etc/mtab to using libc's <mntent.h>, providing a fairly portable version independent of different linux distributions. It is only supported on Linux though. * Wrong fs type (rootfs for /) in fedora-based distributions has been fixed. * Allows options (detail, mem, fd, et al) to "all" volumes. * Use of the fnmatch's GNU extension flag, FNM_LEADING_DIR is restricted to Linux hosts only. In case of non-Linux hosts, partial match functionality is absent. Change-Id: I102ce808c192ef635c2536a2167101be0aa0fc50 BUG: 786367 Signed-off-by: Rajesh Amaravathi <rajesh@redhat.com> Reviewed-on: http://review.gluster.com/2705 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Jeff Darcy <jdarcy@redhat.com> Reviewed-by: Vijay Bellur <vijay@gluster.com>
Diffstat (limited to 'cli')
-rw-r--r--cli/src/cli-cmd-parser.c128
-rw-r--r--cli/src/cli-cmd-volume.c24
-rw-r--r--cli/src/cli-rpc-ops.c6
-rw-r--r--cli/src/cli.h4
4 files changed, 92 insertions, 70 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c
index b4c86bf1abd..e483a1bd477 100644
--- a/cli/src/cli-cmd-parser.c
+++ b/cli/src/cli-cmd-parser.c
@@ -1839,39 +1839,42 @@ out:
return ret;
}
-gf_boolean_t
-cli_cmd_validate_statusop (const char *arg)
+uint32_t
+cli_cmd_get_statusop (const char *arg)
{
- char *opwords[] = {"misc-details", "mem", "clients", "fd", "inode",
- "callpool", NULL};
- char *w = NULL;
+ int i = 0;
+ uint32_t ret = GF_CLI_STATUS_NONE;
+ char *w = NULL;
+ char *opwords[] = {"detail", "mem", "clients", "fd",
+ "inode", "callpool", NULL};
+ struct {
+ char *opname;
+ uint32_t opcode;
+ } optable[] = {
+ { "detail", GF_CLI_STATUS_DETAIL },
+ { "mem", GF_CLI_STATUS_MEM },
+ { "clients", GF_CLI_STATUS_CLIENTS },
+ { "fd", GF_CLI_STATUS_FD },
+ { "inode", GF_CLI_STATUS_INODE },
+ { "callpool", GF_CLI_STATUS_CALLPOOL },
+ { NULL }
+ };
w = str_getunamb (arg, opwords);
if (!w) {
- gf_log ("cli", GF_LOG_ERROR, "Unknown status op %s",
- arg);
- return _gf_false;
+ gf_log ("cli", GF_LOG_DEBUG,
+ "Not a status op %s", arg);
+ goto out;
}
- return _gf_true;
-}
-int
-cli_cmd_get_statusop (const char *arg)
-{
- int ret = GF_CLI_STATUS_INVAL;
- if (!strcmp (arg, "misc-details"))
- ret = GF_CLI_STATUS_DETAIL;
- else if (!strcmp (arg, "mem"))
- ret = GF_CLI_STATUS_MEM;
- else if (!strcmp (arg, "clients"))
- ret = GF_CLI_STATUS_CLIENTS;
- else if (!strcmp (arg, "inode"))
- ret = GF_CLI_STATUS_INODE;
- else if (!strcmp (arg, "fd"))
- ret = GF_CLI_STATUS_FD;
- else if (!strcmp (arg, "callpool"))
- ret = GF_CLI_STATUS_CALLPOOL;
+ for (i = 0; optable[i].opname; i++) {
+ if (!strcmp (w, optable[i].opname)) {
+ ret = optable[i].opcode;
+ break;
+ }
+ }
+ out:
return ret;
}
@@ -1879,9 +1882,9 @@ int
cli_cmd_volume_status_parse (const char **words, int wordcount,
dict_t **options)
{
- dict_t *dict = NULL;
- int ret = -1;
- int cmd = 0;
+ dict_t *dict = NULL;
+ int ret = -1;
+ uint32_t cmd = 0;
GF_ASSERT (options);
@@ -1898,60 +1901,69 @@ cli_cmd_volume_status_parse (const char **words, int wordcount,
case 3:
if (!strcmp (words[2], "all")) {
-
cmd = GF_CLI_STATUS_ALL;
ret = 0;
+
} else {
cmd = GF_CLI_STATUS_VOL;
ret = dict_set_str (dict, "volname", (char *)words[2]);
}
+
break;
case 4:
+ cmd = cli_cmd_get_statusop (words[3]);
+
if (!strcmp (words[2], "all")) {
- cli_out ("Cannot specify brick/status-type for \"all\"");
- ret = -1;
- goto out;
+ if (cmd == GF_CLI_STATUS_NONE) {
+ cli_out ("%s is not a valid status option",
+ words[3]);
+ ret = -1;
+ goto out;
+ }
+ cmd |= GF_CLI_STATUS_ALL;
+ ret = 0;
+
} else {
- cmd = GF_CLI_STATUS_VOL;
- ret = dict_set_str (dict, "volname", (char *)words[2]);
+ ret = dict_set_str (dict, "volname",
+ (char *)words[2]);
if (ret)
goto out;
- }
- if (cli_cmd_validate_statusop (words[3])) {
- ret = cli_cmd_get_statusop (words[3]);
- if (GF_CLI_STATUS_INVAL == ret)
- goto out;
- cmd |= ret;
- ret = 0;
- } else {
- cmd = GF_CLI_STATUS_BRICK;
- ret = dict_set_str (dict, "brick", (char *)words[3]);
+ if (cmd == GF_CLI_STATUS_NONE) {
+ cmd = GF_CLI_STATUS_BRICK;
+ ret = dict_set_str (dict, "brick",
+ (char *)words[3]);
+
+ } else {
+ cmd |= GF_CLI_STATUS_VOL;
+ ret = 0;
+ }
}
+
break;
case 5:
- if (!cli_cmd_validate_statusop (words[4])) {
+ if (!strcmp (words[2], "all")) {
+ cli_out ("Cannot specify brick for \"all\"");
ret = -1;
goto out;
}
- cmd = GF_CLI_STATUS_BRICK;
- ret = cli_cmd_get_statusop (words[4]);
- if (GF_CLI_STATUS_INVAL == ret)
- goto out;
- cmd |= ret;
-
- if (!strcmp (words[2], "all")) {
- cli_out ("Cannot specify brick/status-type for \"all\"");
+ cmd = cli_cmd_get_statusop (words[4]);
+ if (cmd == GF_CLI_STATUS_NONE) {
+ cli_out ("%s is not a valid status option",
+ words[4]);
ret = -1;
goto out;
- } else {
- ret = dict_set_str (dict, "volname", (char *)words[2]);
- if (ret)
- goto out;
}
+
+ cmd |= GF_CLI_STATUS_BRICK;
+
+ ret = dict_set_str (dict, "volname", (char *)words[2]);
+ if (ret)
+ goto out;
+
ret = dict_set_str (dict, "brick", (char *)words[3]);
break;
diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c
index 41007cb7b2d..6bea948e968 100644
--- a/cli/src/cli-cmd-volume.c
+++ b/cli/src/cli-cmd-volume.c
@@ -1431,6 +1431,7 @@ cli_get_detail_status (dict_t *dict, int i, cli_volume_status_t *status)
if (ret)
goto out;
+#ifdef GF_LINUX_HOST_OS
memset (key, 0, sizeof (key));
snprintf (key, sizeof (key), "brick%d.mnt_options", i);
ret = dict_get_str (dict, key, &(status->mount_options));
@@ -1442,19 +1443,23 @@ cli_get_detail_status (dict_t *dict, int i, cli_volume_status_t *status)
ret = dict_get_str (dict, key, &(status->fs_name));
if (ret)
goto out;
+#endif
if (IS_EXT_FS(status->fs_name) ||
!strcmp (status->fs_name, "xfs")) {
+#ifdef GF_LINUX_HOST_OS
memset (key, 0, sizeof (key));
snprintf (key, sizeof (key), "brick%d.inode_size", i);
ret = dict_get_str (dict, key, &(status->inode_size));
if (ret)
status->inode_size = NULL;
+#endif
memset (key, 0, sizeof (key));
snprintf (key, sizeof (key), "brick%d.total_inodes", i);
- ret = dict_get_uint64 (dict, key, &(status->total_inodes));
+ ret = dict_get_uint64 (dict, key,
+ &(status->total_inodes));
if (ret)
goto out;
@@ -1463,9 +1468,10 @@ cli_get_detail_status (dict_t *dict, int i, cli_volume_status_t *status)
ret = dict_get_uint64 (dict, key, &(status->free_inodes));
if (ret)
goto out;
-
} else {
+#ifdef GF_LINUX_HOST_OS
status->inode_size = NULL;
+#endif
status->total_inodes = 0;
status->free_inodes = 0;
}
@@ -1481,6 +1487,8 @@ cli_print_detailed_status (cli_volume_status_t *status)
cli_out ("%-20s : %-20d", "Port", status->port);
cli_out ("%-20s : %-20c", "Online", (status->online) ? 'Y' : 'N');
cli_out ("%-20s : %-20s", "Pid", status->pid_str);
+
+#ifdef GF_LINUX_HOST_OS
cli_out ("%-20s : %-20s", "File System", status->fs_name);
cli_out ("%-20s : %-20s", "Device", status->device);
@@ -1491,15 +1499,15 @@ cli_print_detailed_status (cli_volume_status_t *status)
cli_out ("%-20s : %-20s", "Mount Options", "N/A");
}
- cli_out ("%-20s : %-20s", "Disk Space Free", status->free);
- cli_out ("%-20s : %-20s", "Total Disk Space", status->total);
-
if (status->inode_size) {
cli_out ("%-20s : %-20s", "Inode Size",
status->inode_size);
} else {
cli_out ("%-20s : %-20s", "Inode Size", "N/A");
}
+#endif
+ cli_out ("%-20s : %-20s", "Disk Space Free", status->free);
+ cli_out ("%-20s : %-20s", "Total Disk Space", status->total);
if (status->total_inodes) {
cli_out ("%-20s : %-20ld", "Inode Count",
@@ -1821,10 +1829,10 @@ struct cli_cmd volume_cmds[] = {
cli_cmd_volume_top_cbk,
"volume top operations"},
- { "volume status [all|{<VOLNAME> [<BRICKNAME>] "
- "[misc-details|clients|mem|inode|fd|callpool]}]",
+ { "volume status [all | <VOLNAME> [<BRICK>]]"
+ " [detail|clients|mem|inode|fd|callpool]",
cli_cmd_volume_status_cbk,
- "display status of specified volume"},
+ "display status of all or specified volume(s)/brick"},
{ "volume heal <VOLNAME>",
cli_cmd_volume_heal_cbk,
diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c
index 07a2f9fc7be..6ed380bffa8 100644
--- a/cli/src/cli-rpc-ops.c
+++ b/cli/src/cli-rpc-ops.c
@@ -4956,7 +4956,7 @@ gf_cli3_1_status_cbk (struct rpc_req *req, struct iovec *iov,
char *volname = NULL;
dict_t *dict = NULL;
gf_cli_rsp rsp = {0,};
- cli_volume_status_t status = {0};
+ cli_volume_status_t status = {0};
if (req->rpc_status == -1)
goto out;
@@ -5044,10 +5044,10 @@ gf_cli3_1_status_cbk (struct rpc_req *req, struct iovec *iov,
if (ret)
goto out;
- cli_out ("\nSTATUS OF VOLUME: %s", volname);
+ cli_out ("\nStatus of volume: %s", volname);
if ((cmd & GF_CLI_STATUS_DETAIL) == 0)
- cli_out ("BRICK\t\t\t\t\t\t\tPORT\tONLINE\tPID");
+ cli_out ("Brick\t\t\t\t\t\t\tPort\tOnline\tPid");
for (i = 0; i < count; i++) {
diff --git a/cli/src/cli.h b/cli/src/cli.h
index 25b17da4968..74e1423f5db 100644
--- a/cli/src/cli.h
+++ b/cli/src/cli.h
@@ -132,12 +132,14 @@ struct cli_volume_status {
uint64_t free_inodes;
char *brick;
char *pid_str;
- char *fs_name;
char *free;
char *total;
+#ifdef GF_LINUX_HOST_OS
+ char *fs_name;
char *mount_options;
char *device;
char *inode_size;
+#endif
};
typedef struct cli_volume_status cli_volume_status_t;