mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-26 04:07:45 +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
+47
-19
@@ -4190,25 +4190,22 @@ print_zpool_script_help(char *name, char *path)
|
||||
libzfs_free_str_array(lines, lines_cnt);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Go though the list of all the zpool status/iostat -c scripts, run their
|
||||
* Go though the zpool status/iostat -c scripts in the user's path, run their
|
||||
* help option (-h), and print out the results.
|
||||
*/
|
||||
static void
|
||||
print_zpool_script_list(void)
|
||||
print_zpool_dir_scripts(char *dirpath)
|
||||
{
|
||||
DIR *dir;
|
||||
struct dirent *ent;
|
||||
char fullpath[MAXPATHLEN];
|
||||
struct stat dir_stat;
|
||||
|
||||
if ((dir = opendir(ZPOOL_SCRIPTS_DIR)) != NULL) {
|
||||
printf("\n");
|
||||
if ((dir = opendir(dirpath)) != NULL) {
|
||||
/* print all the files and directories within directory */
|
||||
while ((ent = readdir(dir)) != NULL) {
|
||||
sprintf(fullpath, "%s/%s", ZPOOL_SCRIPTS_DIR,
|
||||
ent->d_name);
|
||||
sprintf(fullpath, "%s/%s", dirpath, ent->d_name);
|
||||
|
||||
/* Print the scripts */
|
||||
if (stat(fullpath, &dir_stat) == 0)
|
||||
@@ -4217,14 +4214,33 @@ print_zpool_script_list(void)
|
||||
print_zpool_script_help(ent->d_name,
|
||||
fullpath);
|
||||
}
|
||||
printf("\n");
|
||||
closedir(dir);
|
||||
} else {
|
||||
fprintf(stderr, gettext("Can't open %s scripts dir\n"),
|
||||
ZPOOL_SCRIPTS_DIR);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Print out help text for all zpool status/iostat -c scripts.
|
||||
*/
|
||||
static void
|
||||
print_zpool_script_list(char *subcommand)
|
||||
{
|
||||
char *dir, *sp;
|
||||
|
||||
printf(gettext("Available 'zpool %s -c' commands:\n"), subcommand);
|
||||
|
||||
sp = zpool_get_cmd_search_path();
|
||||
if (sp == NULL)
|
||||
return;
|
||||
|
||||
dir = strtok(sp, ":");
|
||||
while (dir != NULL) {
|
||||
print_zpool_dir_scripts(dir);
|
||||
dir = strtok(NULL, ":");
|
||||
}
|
||||
|
||||
free(sp);
|
||||
}
|
||||
|
||||
/*
|
||||
* zpool iostat [[-c [script1,script2,...]] [-lq]|[-rw]] [-ghHLpPvy] [-n name]
|
||||
* [-T d|u] [[ pool ...]|[pool vdev ...]|[vdev ...]]
|
||||
@@ -4285,6 +4301,15 @@ zpool_do_iostat(int argc, char **argv)
|
||||
gettext("Can't set -c flag twice\n"));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (getenv("ZPOOL_SCRIPTS_ENABLED") != NULL &&
|
||||
!libzfs_envvar_is_set("ZPOOL_SCRIPTS_ENABLED")) {
|
||||
fprintf(stderr, gettext(
|
||||
"Can't run -c, disabled by "
|
||||
"ZPOOL_SCRIPTS_ENABLED.\n"));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if ((getuid() <= 0 || geteuid() <= 0) &&
|
||||
!libzfs_envvar_is_set("ZPOOL_SCRIPTS_AS_ROOT")) {
|
||||
fprintf(stderr, gettext(
|
||||
@@ -4336,10 +4361,7 @@ zpool_do_iostat(int argc, char **argv)
|
||||
break;
|
||||
case '?':
|
||||
if (optopt == 'c') {
|
||||
fprintf(stderr, gettext(
|
||||
"Current scripts in %s:\n"),
|
||||
ZPOOL_SCRIPTS_DIR);
|
||||
print_zpool_script_list();
|
||||
print_zpool_script_list("iostat");
|
||||
exit(0);
|
||||
} else {
|
||||
fprintf(stderr,
|
||||
@@ -6427,6 +6449,15 @@ zpool_do_status(int argc, char **argv)
|
||||
gettext("Can't set -c flag twice\n"));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (getenv("ZPOOL_SCRIPTS_ENABLED") != NULL &&
|
||||
!libzfs_envvar_is_set("ZPOOL_SCRIPTS_ENABLED")) {
|
||||
fprintf(stderr, gettext(
|
||||
"Can't run -c, disabled by "
|
||||
"ZPOOL_SCRIPTS_ENABLED.\n"));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if ((getuid() <= 0 || geteuid() <= 0) &&
|
||||
!libzfs_envvar_is_set("ZPOOL_SCRIPTS_AS_ROOT")) {
|
||||
fprintf(stderr, gettext(
|
||||
@@ -6459,10 +6490,7 @@ zpool_do_status(int argc, char **argv)
|
||||
break;
|
||||
case '?':
|
||||
if (optopt == 'c') {
|
||||
fprintf(stderr, gettext(
|
||||
"Current scripts in %s:\n"),
|
||||
ZPOOL_SCRIPTS_DIR);
|
||||
print_zpool_script_list();
|
||||
print_zpool_script_list("status");
|
||||
exit(0);
|
||||
} else {
|
||||
fprintf(stderr,
|
||||
|
||||
Reference in New Issue
Block a user