diff --git a/cmd/zed/zed.d/all-debug.sh b/cmd/zed/zed.d/all-debug.sh index ae64e0a799..aa20ef2686 100755 --- a/cmd/zed/zed.d/all-debug.sh +++ b/cmd/zed/zed.d/all-debug.sh @@ -2,7 +2,7 @@ # # Log all environment variables to ZED_DEBUG_LOG. # -test -f "${ZED_SCRIPT_DIR}/zed.rc" && . "${ZED_SCRIPT_DIR}/zed.rc" +test -f "${ZED_ZEDLET_DIR}/zed.rc" && . "${ZED_ZEDLET_DIR}/zed.rc" # Override the default umask to restrict access to a newly-created logfile. umask 077 diff --git a/cmd/zed/zed.d/all-syslog.sh b/cmd/zed/zed.d/all-syslog.sh index b8bd307a1d..acf9e83bde 100755 --- a/cmd/zed/zed.d/all-syslog.sh +++ b/cmd/zed/zed.d/all-syslog.sh @@ -2,7 +2,7 @@ # # Log the zevent via syslog. # -test -f "${ZED_SCRIPT_DIR}/zed.rc" && . "${ZED_SCRIPT_DIR}/zed.rc" +test -f "${ZED_ZEDLET_DIR}/zed.rc" && . "${ZED_ZEDLET_DIR}/zed.rc" logger -t "${ZED_SYSLOG_TAG:=zed}" -p "${ZED_SYSLOG_PRIORITY:=daemon.notice}" \ eid="${ZEVENT_EID}" class="${ZEVENT_SUBCLASS}" \ diff --git a/cmd/zed/zed.d/data-email.sh b/cmd/zed/zed.d/data-email.sh index f056ac8032..543b8fe55c 100755 --- a/cmd/zed/zed.d/data-email.sh +++ b/cmd/zed/zed.d/data-email.sh @@ -14,7 +14,7 @@ # State File Format: # POOL;TIME_OF_LAST_EMAIL # -test -f "${ZED_SCRIPT_DIR}/zed.rc" && . "${ZED_SCRIPT_DIR}/zed.rc" +test -f "${ZED_ZEDLET_DIR}/zed.rc" && . "${ZED_ZEDLET_DIR}/zed.rc" test -n "${ZEVENT_POOL}" || exit 5 test -n "${ZEVENT_SUBCLASS}" || exit 5 diff --git a/cmd/zed/zed.d/generic-email.sh b/cmd/zed/zed.d/generic-email.sh index 16bbdb1974..357aedee5f 100755 --- a/cmd/zed/zed.d/generic-email.sh +++ b/cmd/zed/zed.d/generic-email.sh @@ -12,7 +12,7 @@ # 2: email suppressed # 3: missing executable # -test -f "${ZED_SCRIPT_DIR}/zed.rc" && . "${ZED_SCRIPT_DIR}/zed.rc" +test -f "${ZED_ZEDLET_DIR}/zed.rc" && . "${ZED_ZEDLET_DIR}/zed.rc" # Only send email if ZED_EMAIL has been configured. test -n "${ZED_EMAIL}" || exit 2 diff --git a/cmd/zed/zed.d/io-email.sh b/cmd/zed/zed.d/io-email.sh index f975911751..9edbe6670d 100755 --- a/cmd/zed/zed.d/io-email.sh +++ b/cmd/zed/zed.d/io-email.sh @@ -14,7 +14,7 @@ # State File Format: # POOL;VDEV_PATH;TIME_OF_LAST_EMAIL # -test -f "${ZED_SCRIPT_DIR}/zed.rc" && . "${ZED_SCRIPT_DIR}/zed.rc" +test -f "${ZED_ZEDLET_DIR}/zed.rc" && . "${ZED_ZEDLET_DIR}/zed.rc" test -n "${ZEVENT_POOL}" || exit 5 test -n "${ZEVENT_SUBCLASS}" || exit 5 diff --git a/cmd/zed/zed.d/io-spare.sh b/cmd/zed/zed.d/io-spare.sh index 894817317a..2fcbfb7913 100755 --- a/cmd/zed/zed.d/io-spare.sh +++ b/cmd/zed/zed.d/io-spare.sh @@ -28,7 +28,7 @@ # 4: unsupported event class # 5: internal error # -test -f "${ZED_SCRIPT_DIR}/zed.rc" && . "${ZED_SCRIPT_DIR}/zed.rc" +test -f "${ZED_ZEDLET_DIR}/zed.rc" && . "${ZED_ZEDLET_DIR}/zed.rc" test -n "${ZEVENT_POOL}" || exit 5 test -n "${ZEVENT_SUBCLASS}" || exit 5 diff --git a/cmd/zed/zed.d/scrub.finish-email.sh b/cmd/zed/zed.d/scrub.finish-email.sh index b5ce3f74d7..d92ccfea12 100755 --- a/cmd/zed/zed.d/scrub.finish-email.sh +++ b/cmd/zed/zed.d/scrub.finish-email.sh @@ -12,7 +12,7 @@ # 4: unsupported event class # 5: internal error # -test -f "${ZED_SCRIPT_DIR}/zed.rc" && . "${ZED_SCRIPT_DIR}/zed.rc" +test -f "${ZED_ZEDLET_DIR}/zed.rc" && . "${ZED_ZEDLET_DIR}/zed.rc" test -n "${ZEVENT_POOL}" || exit 5 test -n "${ZEVENT_SUBCLASS}" || exit 5 diff --git a/cmd/zed/zed.h b/cmd/zed/zed.h index 179006cd37..1e8716c990 100644 --- a/cmd/zed/zed.h +++ b/cmd/zed/zed.h @@ -43,9 +43,9 @@ #define ZED_STATE_FILE RUNSTATEDIR "/zed.state" /* - * Absolute path for the default zed script directory. + * Absolute path for the default zed zedlet directory. */ -#define ZED_SCRIPT_DIR SYSCONFDIR "/zfs/zed.d" +#define ZED_ZEDLET_DIR SYSCONFDIR "/zfs/zed.d" /* * Reserved for future use. diff --git a/cmd/zed/zed_conf.c b/cmd/zed/zed_conf.c index fc7bd8a7ec..5e21a3db9b 100644 --- a/cmd/zed/zed_conf.c +++ b/cmd/zed/zed_conf.c @@ -58,7 +58,7 @@ zed_conf_create(void) zcp->syslog_facility = LOG_DAEMON; zcp->min_events = ZED_MIN_EVENTS; zcp->max_events = ZED_MAX_EVENTS; - zcp->scripts = NULL; /* created via zed_conf_scan_dir() */ + zcp->zedlets = NULL; /* created via zed_conf_scan_dir() */ zcp->state_fd = -1; /* opened via zed_conf_open_state() */ zcp->zfs_hdl = NULL; /* opened via zed_event_init() */ zcp->zevent_fd = -1; /* opened via zed_event_init() */ @@ -69,7 +69,7 @@ zed_conf_create(void) if (!(zcp->pid_file = strdup(ZED_PID_FILE))) goto nomem; - if (!(zcp->script_dir = strdup(ZED_SCRIPT_DIR))) + if (!(zcp->zedlet_dir = strdup(ZED_ZEDLET_DIR))) goto nomem; if (!(zcp->state_file = strdup(ZED_STATE_FILE))) @@ -111,14 +111,14 @@ zed_conf_destroy(struct zed_conf *zcp) if (zcp->pid_file) free(zcp->pid_file); - if (zcp->script_dir) - free(zcp->script_dir); + if (zcp->zedlet_dir) + free(zcp->zedlet_dir); if (zcp->state_file) free(zcp->state_file); - if (zcp->scripts) - zed_strings_destroy(zcp->scripts); + if (zcp->zedlets) + zed_strings_destroy(zcp->zedlets); free(zcp); } @@ -161,7 +161,7 @@ _zed_conf_display_help(const char *prog, int got_err) "Read configuration from FILE.", ZED_CONF_FILE); #endif fprintf(fp, "%*c%*s %s [%s]\n", w1, 0x20, -w2, "-d DIR", - "Read enabled scripts from DIR.", ZED_SCRIPT_DIR); + "Read enabled ZEDLETs from DIR.", ZED_ZEDLET_DIR); fprintf(fp, "%*c%*s %s [%s]\n", w1, 0x20, -w2, "-p FILE", "Write daemon's PID to FILE.", ZED_PID_FILE); fprintf(fp, "%*c%*s %s [%s]\n", w1, 0x20, -w2, "-s FILE", @@ -269,7 +269,7 @@ zed_conf_parse_opts(struct zed_conf *zcp, int argc, char **argv) _zed_conf_parse_path(&zcp->conf_file, optarg); break; case 'd': - _zed_conf_parse_path(&zcp->script_dir, optarg); + _zed_conf_parse_path(&zcp->zedlet_dir, optarg); break; case 'p': _zed_conf_parse_path(&zcp->pid_file, optarg); @@ -318,19 +318,19 @@ zed_conf_parse_file(struct zed_conf *zcp) } /* - * Scan the [zcp] script_dir for files to exec based on the event class. + * Scan the [zcp] zedlet_dir for files to exec based on the event class. * Files must be executable by user, but not writable by group or other. * Dotfiles are ignored. * - * Return 0 on success with an updated set of scripts, + * Return 0 on success with an updated set of zedlets, * or -1 on error with errno set. * - * FIXME: Check if script_dir and all parent dirs are secure. + * FIXME: Check if zedlet_dir and all parent dirs are secure. */ int zed_conf_scan_dir(struct zed_conf *zcp) { - zed_strings_t *scripts; + zed_strings_t *zedlets; DIR *dirp; struct dirent *direntp; char pathname[PATH_MAX]; @@ -339,23 +339,23 @@ zed_conf_scan_dir(struct zed_conf *zcp) if (!zcp) { errno = EINVAL; - zed_log_msg(LOG_ERR, "Failed to scan script dir: %s", + zed_log_msg(LOG_ERR, "Failed to scan zedlet dir: %s", strerror(errno)); return (-1); } - scripts = zed_strings_create(); - if (!scripts) { + zedlets = zed_strings_create(); + if (!zedlets) { errno = ENOMEM; zed_log_msg(LOG_WARNING, "Failed to scan dir \"%s\": %s", - zcp->script_dir, strerror(errno)); + zcp->zedlet_dir, strerror(errno)); return (-1); } - dirp = opendir(zcp->script_dir); + dirp = opendir(zcp->zedlet_dir); if (!dirp) { int errno_bak = errno; zed_log_msg(LOG_WARNING, "Failed to open dir \"%s\": %s", - zcp->script_dir, strerror(errno)); - zed_strings_destroy(scripts); + zcp->zedlet_dir, strerror(errno)); + zed_strings_destroy(zedlets); errno = errno_bak; return (-1); } @@ -364,7 +364,7 @@ zed_conf_scan_dir(struct zed_conf *zcp) continue; n = snprintf(pathname, sizeof (pathname), - "%s/%s", zcp->script_dir, direntp->d_name); + "%s/%s", zcp->zedlet_dir, direntp->d_name); if ((n < 0) || (n >= sizeof (pathname))) { zed_log_msg(LOG_WARNING, "Failed to stat \"%s\": %s", direntp->d_name, strerror(ENAMETOOLONG)); @@ -405,7 +405,7 @@ zed_conf_scan_dir(struct zed_conf *zcp) direntp->d_name); continue; } - if (zed_strings_add(scripts, direntp->d_name) < 0) { + if (zed_strings_add(zedlets, direntp->d_name) < 0) { zed_log_msg(LOG_WARNING, "Failed to register \"%s\": %s", direntp->d_name, strerror(errno)); @@ -413,20 +413,20 @@ zed_conf_scan_dir(struct zed_conf *zcp) } if (zcp->do_verbose) zed_log_msg(LOG_INFO, - "Registered script \"%s\"", direntp->d_name); + "Registered zedlet \"%s\"", direntp->d_name); } if (closedir(dirp) < 0) { int errno_bak = errno; zed_log_msg(LOG_WARNING, "Failed to close dir \"%s\": %s", - zcp->script_dir, strerror(errno)); - zed_strings_destroy(scripts); + zcp->zedlet_dir, strerror(errno)); + zed_strings_destroy(zedlets); errno = errno_bak; return (-1); } - if (zcp->scripts) - zed_strings_destroy(zcp->scripts); + if (zcp->zedlets) + zed_strings_destroy(zcp->zedlets); - zcp->scripts = scripts; + zcp->zedlets = zedlets; return (0); } diff --git a/cmd/zed/zed_conf.h b/cmd/zed/zed_conf.h index 51b98ea769..126075842b 100644 --- a/cmd/zed/zed_conf.h +++ b/cmd/zed/zed_conf.h @@ -42,8 +42,8 @@ struct zed_conf { int max_events; /* RESERVED FOR FUTURE USE */ char *conf_file; /* abs path to config file */ char *pid_file; /* abs path to pid file */ - char *script_dir; /* abs path to script dir */ - zed_strings_t *scripts; /* names of enabled scripts */ + char *zedlet_dir; /* abs path to zedlet dir */ + zed_strings_t *zedlets; /* names of enabled zedlets */ char *state_file; /* abs path to state file */ int state_fd; /* fd to state file */ libzfs_handle_t *zfs_hdl; /* handle to libzfs */ diff --git a/cmd/zed/zed_event.c b/cmd/zed/zed_event.c index 940172bc38..f3f201800c 100644 --- a/cmd/zed/zed_event.c +++ b/cmd/zed/zed_event.c @@ -814,7 +814,7 @@ zed_event_service(struct zed_conf *zcp) _zed_event_add_var(eid, zsp, "%s%s=%d", ZED_VAR_PREFIX, "PID", (int) getpid()); _zed_event_add_var(eid, zsp, "%s%s=%s", - ZED_VAR_PREFIX, "SCRIPT_DIR", zcp->script_dir); + ZED_VAR_PREFIX, "ZEDLET_DIR", zcp->zedlet_dir); subclass = _zed_event_get_subclass(class); _zed_event_add_var(eid, zsp, "%s%s=%s", @@ -823,7 +823,7 @@ zed_event_service(struct zed_conf *zcp) _zed_event_add_time_strings(eid, zsp, etime); zed_exec_process(eid, class, subclass, - zcp->script_dir, zcp->scripts, zsp, zcp->zevent_fd); + zcp->zedlet_dir, zcp->zedlets, zsp, zcp->zevent_fd); zed_conf_write_state(zcp, eid, etime); diff --git a/cmd/zed/zed_exec.c b/cmd/zed/zed_exec.c index 19fc30b599..d4193219f4 100644 --- a/cmd/zed/zed_exec.c +++ b/cmd/zed/zed_exec.c @@ -156,13 +156,13 @@ restart: } /* - * Process the event [eid] by synchronously invoking all scripts with a + * Process the event [eid] by synchronously invoking all zedlets with a * matching class prefix. * - * Each executable in [scripts] from the directory [dir] is matched against + * Each executable in [zedlets] from the directory [dir] is matched against * the event's [class], [subclass], and the "all" class (which matches - * all events). Every script with a matching class prefix is invoked. - * The NAME=VALUE strings in [envs] will be passed to the script as + * all events). Every zedlet with a matching class prefix is invoked. + * The NAME=VALUE strings in [envs] will be passed to the zedlet as * environment variables. * * The file descriptor [zfd] is the zevent_fd used to track the @@ -172,16 +172,16 @@ restart: */ int zed_exec_process(uint64_t eid, const char *class, const char *subclass, - const char *dir, zed_strings_t *scripts, zed_strings_t *envs, int zfd) + const char *dir, zed_strings_t *zedlets, zed_strings_t *envs, int zfd) { const char *class_strings[4]; const char *allclass = "all"; const char **csp; - const char *s; + const char *z; char **e; int n; - if (!dir || !scripts || !envs || zfd < 0) + if (!dir || !zedlets || !envs || zfd < 0) return (-1); csp = class_strings; @@ -199,11 +199,11 @@ zed_exec_process(uint64_t eid, const char *class, const char *subclass, e = _zed_exec_create_env(envs); - for (s = zed_strings_first(scripts); s; s = zed_strings_next(scripts)) { + for (z = zed_strings_first(zedlets); z; z = zed_strings_next(zedlets)) { for (csp = class_strings; *csp; csp++) { n = strlen(*csp); - if ((strncmp(s, *csp, n) == 0) && !isalpha(s[n])) - _zed_exec_fork_child(eid, dir, s, e, zfd); + if ((strncmp(z, *csp, n) == 0) && !isalpha(z[n])) + _zed_exec_fork_child(eid, dir, z, e, zfd); } } free(e); diff --git a/cmd/zed/zed_exec.h b/cmd/zed/zed_exec.h index 52bdc12a89..fee068fb6c 100644 --- a/cmd/zed/zed_exec.h +++ b/cmd/zed/zed_exec.h @@ -30,7 +30,7 @@ #include int zed_exec_process(uint64_t eid, const char *class, const char *subclass, - const char *dir, zed_strings_t *scripts, zed_strings_t *envs, + const char *dir, zed_strings_t *zedlets, zed_strings_t *envs, int zevent_fd); #endif /* !ZED_EXEC_H */ diff --git a/man/man8/zed.8.in b/man/man8/zed.8.in index b853d86e5f..71a1dce605 100644 --- a/man/man8/zed.8.in +++ b/man/man8/zed.8.in @@ -24,13 +24,13 @@ .TH ZED 8 "Octember 1, 2013" "ZFS on Linux" "System Administration Commands" .SH NAME -zed \- ZFS Event Daemon +ZED \- ZFS Event Daemon .SH SYNOPSIS .HP .B zed .\" [\fB\-c\fR \fIconfigfile\fR] -[\fB\-d\fR \fIscriptdir\fR] +[\fB\-d\fR \fIzedletdir\fR] [\fB\-f\fR] [\fB\-F\fR] [\fB\-h\fR] @@ -44,9 +44,10 @@ zed \- ZFS Event Daemon .SH DESCRIPTION .PP -\fBzed\fR (ZFS Event Daemon) monitors events generated by the ZFS kernel -module. When a ZFS event (zevent) is posted, \fBzed\fR will run any scripts -that have been enabled for the corresponding zevent class. +\fBZED\fR (ZFS Event Daemon) monitors events generated by the ZFS kernel +module. When a zevent (ZFS Event) is posted, \fBZED\fR will run any ZEDLETs +(ZFS Event Daemon Linkage for Executable Tasks) that have been enabled for the +corresponding zevent class. .SH OPTIONS .TP @@ -81,8 +82,8 @@ to be reprocessed. .\" .BI \-c\ configfile .\" Read the configuration from the specified file. .TP -.BI \-d\ scriptdir -Read the enabled scripts from the specified directory. +.BI \-d\ zedletdir +Read the enabled ZEDLETs from the specified directory. .TP .BI \-p\ pidfile Write the daemon's process ID to the specified file. @@ -92,7 +93,7 @@ Write the daemon's state to the specified file. .SH ZEVENTS .PP -A zevent is comprised of a list of name/value pairs (nvpairs). Each zevent +A zevent is comprised of a list of nvpairs (name/value pairs). Each zevent contains an EID (Event IDentifier) that uniquely identifies it throughout the lifetime of the loaded ZFS kernel module; this EID is a monotonically increasing integer that resets to 1 each time the kernel module is loaded. @@ -105,29 +106,29 @@ their associated lists of nvpairs) using the "\fBzpool events \-v\fR" command. .SH CONFIGURATION .PP -The scripts to be invoked in response to zevents are located in the -enabled-scripts directory. These can be symlinked or copied from the -installed-scripts directory; symlinks allow for automatic updates from the -installed scripts, whereas copies preserve local modifications. As a security -measure, scripts must be owned by root. They must have execute permissions -for the user, but they must not have write permissions for group or other. -Dotfiles are ignored. +ZEDLETs to be invoked in response to zevents are located in the +\fIenabled-zedlets\fR directory. These can be symlinked or copied from the +\fIinstalled-zedlets\fR directory; symlinks allow for automatic updates +from the installed ZEDLETs, whereas copies preserve local modifications. +As a security measure, ZEDLETs must be owned by root. They must have +execute permissions for the user, but they must not have write permissions +for group or other. Dotfiles are ignored. .PP -Scripts are named after the zevent class for which they should be invoked. -In particular, a script will be invoked for a given zevent if either its +ZEDLETs are named after the zevent class for which they should be invoked. +In particular, a ZEDLET will be invoked for a given zevent if either its class or subclass string is a prefix of its filename (and is followed by a non-alphabetic character). As a special case, the prefix "all" matches -all zevents. Multiple scripts may be invoked for a given zevent. +all zevents. Multiple ZEDLETs may be invoked for a given zevent. -.SH SCRIPTS +.SH ZEDLETS .PP -Scripts should be written under the presumption they can be invoked -concurrently, and they should use appropriate locking to access any shared -resources. Common variables used by the scripts can be stored in the default -rc file which is sourced by the scripts; these variables should be prefixed -with "ZED_". +ZEDLETs are executables invoked by the ZED in response to a given zevent. +They should be written under the presumption they can be invoked concurrently, +and they should use appropriate locking to access any shared resources. +Common variables used by ZEDLETs can be stored in the default rc file which +is sourced by scripts; these variables should be prefixed with "ZED_". .PP -The zevent nvpairs are passed to the scripts as environment variables. +The zevent nvpairs are passed to ZEDLETs as environment variables. Each nvpair name is converted to an environment variable in the following manner: 1) it is prefixed with "ZEVENT_", 2) it is converted to uppercase, and 3) each non-alphanumeric character is converted to an underscore. @@ -171,12 +172,12 @@ ZED_PID The daemon's process ID. .TP .B -ZED_SCRIPT_DIR -The daemon's current enabled-scripts directory. +ZED_ZEDLET_DIR +The daemon's current \fIenabled-zedlets\fR directory. .TP .B ZFS_ALIAS -The ZFS alias (name-ver-rel) string used to build the daemon. +The ZFS alias (\fIname-version-release\fR) string used to build the daemon. .TP .B ZFS_VERSION @@ -186,10 +187,10 @@ The ZFS version used to build the daemon. ZFS_RELEASE The ZFS release used to build the daemon. .PP -Scripts may need to call other ZFS commands. The installation paths of +ZEDLETs may need to call other ZFS commands. The installation paths of the following executables are defined: \fBZDB\fR, \fBZED\fR, \fBZFS\fR, \fBZINJECT\fR, and \fBZPOOL\fR. These variables can be overridden in the -zed.rc if needed. +rc file if needed. .SH FILES .\" .TP @@ -197,13 +198,13 @@ zed.rc if needed. .\" The default configuration file for the daemon. .TP .I @sysconfdir@/zfs/zed.d -The default directory for enabled scripts. +The default directory for enabled ZEDLETs. .TP .I @sysconfdir@/zfs/zed.d/zed.rc -The default rc file for common variables used by the scripts. +The default rc file for common variables used by ZEDLETs. .TP .I @libexecdir@/zfs/zed.d -The default directory for installed scripts. +The default directory for installed ZEDLETs. .TP .I @runstatedir@/zed.pid The default file containing the daemon's process ID. @@ -214,14 +215,14 @@ The default file containing the daemon's state. .SH SIGNALS .TP .B HUP -Reconfigure the daemon and rescan the directory for enabled scripts. +Reconfigure the daemon and rescan the directory for enabled ZEDLETs. .TP .B TERM Terminate the daemon. .SH NOTES .PP -\fBzed\fR requires root privileges. +\fBZED\fR requires root privileges. .\" Do not taunt zed. .SH BUGS @@ -229,16 +230,16 @@ Terminate the daemon. Events are processed synchronously by a single thread. This can delay the processing of simultaneous zevents. .PP -There is no maximum timeout for script execution. Consequently, a misbehaving -script can delay the processing of subsequent zevents. +There is no maximum timeout for ZEDLET execution. Consequently, a misbehaving +ZEDLET can delay the processing of subsequent zevents. .PP -The ownership and permissions of the enabled-scripts directory (along +The ownership and permissions of the \fIenabled-zedlets\fR directory (along with all parent directories) are not checked. If any of these directories are improperly owned or permissioned, an unprivileged user could insert a -script to be executed as root. The requirement that scripts be owned by +ZEDLET to be executed as root. The requirement that ZEDLETs be owned by root mitigates this to some extent. .PP -Scripts are unable to return state/status information to the kernel. +ZEDLETs are unable to return state/status information to the kernel. .PP Some zevent nvpair types are not handled. These are denoted by zevent environment variables having a "_NOT_IMPLEMENTED_" value. @@ -257,7 +258,7 @@ Copyright (C) 2013\-2014 Lawrence Livermore National Security, LLC. .SH LICENSE .PP -\fBzed\fR (ZFS Event Daemon) is distributed under the terms of the +\fBZED\fR (ZFS Event Daemon) is distributed under the terms of the Common Development and Distribution License (CDDL\-1.0). .SH SEE ALSO