diff options
author | Giuseppe Di Natale <[email protected]> | 2017-06-05 13:52:15 -0400 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2017-06-05 10:52:15 -0700 |
commit | 099700d9dff46309cdd16f4c4331daddb70d8570 (patch) | |
tree | 13383ee2af7cc69b0f790b3c3f70fbc61ae074fb /cmd/zpool/zpool_iter.c | |
parent | 92aceb2a7ee8c9367fdc901fed933f6f258173e0 (diff) |
zpool iostat/status -c improvements
Users can now provide their own scripts to be run
with 'zpool iostat/status -c'. User scripts should be
placed in ~/.zpool.d to be included in zpool's
default search path.
Provide a script which can be used with
'zpool iostat|status -c' that will return the type of
device (hdd, sdd, file).
Provide a script to get various values from smartctl
when using 'zpool iostat/status -c'.
Allow users to define the ZPOOL_SCRIPTS_PATH
environment variable which can be used to override
the default 'zpool iostat/status -c' search path.
Allow the ZPOOL_SCRIPTS_ENABLED environment
variable to enable or disable 'zpool status/iostat -c'
functionality.
Use the new smart script to provide the serial command.
Install /etc/sudoers.d/zfs file which contains the sudoer
rule for smartctl as a sample.
Allow 'zpool iostat/status -c' tests to run in tree.
Reviewed-by: Tony Hutter <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Giuseppe Di Natale <[email protected]>
Closes #6121
Closes #6153
Diffstat (limited to 'cmd/zpool/zpool_iter.c')
-rw-r--r-- | cmd/zpool/zpool_iter.c | 58 |
1 files changed, 48 insertions, 10 deletions
diff --git a/cmd/zpool/zpool_iter.c b/cmd/zpool/zpool_iter.c index 94777f076..abb1b1798 100644 --- a/cmd/zpool/zpool_iter.c +++ b/cmd/zpool/zpool_iter.c @@ -521,28 +521,66 @@ out: free(env[i]); } +/* + * Generate the search path for zpool iostat/status -c scripts. + * The string returned must be freed. + */ +char * +zpool_get_cmd_search_path(void) +{ + const char *env; + char *sp = NULL; + + env = getenv("ZPOOL_SCRIPTS_PATH"); + if (env != NULL) + return (strdup(env)); + + env = getenv("HOME"); + if (env != NULL) { + if (asprintf(&sp, "%s/.zpool.d:%s", + env, ZPOOL_SCRIPTS_DIR) != -1) { + return (sp); + } + } + + if (asprintf(&sp, "%s", ZPOOL_SCRIPTS_DIR) != -1) + return (sp); + + return (NULL); +} + /* Thread function run for each vdev */ static void vdev_run_cmd_thread(void *cb_cmd_data) { vdev_cmd_data_t *data = cb_cmd_data; - const char *sep = ","; - char *cmd = NULL, *cmddup, *rest; - char fullpath[MAXPATHLEN]; + char *cmd = NULL, *cmddup, *cmdrest; cmddup = strdup(data->cmd); if (cmddup == NULL) return; - rest = cmddup; - while ((cmd = strtok_r(rest, sep, &rest))) { - if (snprintf(fullpath, sizeof (fullpath), "%s/%s", - ZPOOL_SCRIPTS_DIR, cmd) == -1) + cmdrest = cmddup; + while ((cmd = strtok_r(cmdrest, ",", &cmdrest))) { + char *dir = NULL, *sp, *sprest; + char fullpath[MAXPATHLEN]; + + sp = zpool_get_cmd_search_path(); + if (sp == NULL) continue; - /* Does the script exist in our zpool scripts dir? */ - if (access(fullpath, X_OK) == 0) - vdev_run_cmd(data, fullpath); + sprest = sp; + while ((dir = strtok_r(sprest, ":", &sprest))) { + if (snprintf(fullpath, sizeof (fullpath), + "%s/%s", dir, cmd) == -1) + continue; + + if (access(fullpath, X_OK) == 0) { + vdev_run_cmd(data, fullpath); + break; + } + } + free(sp); } free(cmddup); } |