mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 10:37:35 +03:00
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 <hutter2@llnl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Giuseppe Di Natale <dinatale2@llnl.gov> Closes #6121 Closes #6153
This commit is contained in:
committed by
Brian Behlendorf
parent
92aceb2a7e
commit
099700d9df
+48
-10
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user