aboutsummaryrefslogtreecommitdiffstats
path: root/cmd/zed/zed.d/io-email.sh
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/zed/zed.d/io-email.sh')
-rwxr-xr-xcmd/zed/zed.d/io-email.sh95
1 files changed, 33 insertions, 62 deletions
diff --git a/cmd/zed/zed.d/io-email.sh b/cmd/zed/zed.d/io-email.sh
index 9edbe6670..1854b1593 100755
--- a/cmd/zed/zed.d/io-email.sh
+++ b/cmd/zed/zed.d/io-email.sh
@@ -1,86 +1,57 @@
#!/bin/sh
#
-# Send email to ZED_EMAIL in response to a CHECKSUM or IO zevent.
-# Only one message per ZED_EMAIL_INTERVAL_SECS will be sent for a given
-# class/pool/vdev combination. This protects against spamming the recipient
-# should multiple events occur together in time for the same pool/device.
+# Send email to ZED_EMAIL in response to a CHECKSUM or IO error.
+#
+# Only one email per ZED_EMAIL_INTERVAL_SECS will be sent for a given
+# class/pool/vdev combination. This protects against spamming the recipient
+# should multiple events occur together in time for the same pool/device.
+#
# Exit codes:
# 0: email sent
# 1: email failed
-# 2: email suppressed
-# 3: missing executable
-# 4: unsupported event class
-# 5: internal error
-# State File Format:
-# POOL;VDEV_PATH;TIME_OF_LAST_EMAIL
-#
-test -f "${ZED_ZEDLET_DIR}/zed.rc" && . "${ZED_ZEDLET_DIR}/zed.rc"
+# 2: email not configured
+# 3: email suppressed
+# 9: internal error
-test -n "${ZEVENT_POOL}" || exit 5
-test -n "${ZEVENT_SUBCLASS}" || exit 5
-test -n "${ZEVENT_VDEV_PATH}" || exit 5
+[ -f "${ZED_ZEDLET_DIR}/zed.rc" ] && . "${ZED_ZEDLET_DIR}/zed.rc"
+. "${ZED_ZEDLET_DIR}/zed-functions.sh"
-if test "${ZEVENT_SUBCLASS}" != "checksum" \
- -a "${ZEVENT_SUBCLASS}" != "io"; then
- logger -t "${ZED_SYSLOG_TAG:=zed}" \
- -p "${ZED_SYSLOG_PRIORITY:=daemon.warning}" \
- `basename "$0"`: unsupported event class \"${ZEVENT_SUBCLASS}\"
- exit 4
-fi
+[ -n "${ZED_EMAIL}" ] || exit 2
-# Only send email if ZED_EMAIL has been configured.
-test -n "${ZED_EMAIL}" || exit 2
+[ -n "${ZEVENT_POOL}" ] || exit 9
+[ -n "${ZEVENT_SUBCLASS}" ] || exit 9
+[ -n "${ZEVENT_VDEV_PATH}" ] || exit 9
-# Ensure requisite executables are installed.
-if ! command -v "${MAIL:=mail}" >/dev/null 2>&1; then
- logger -t "${ZED_SYSLOG_TAG:=zed}" \
- -p "${ZED_SYSLOG_PRIORITY:=daemon.warning}" \
- `basename "$0"`: "${MAIL}" not installed
- exit 3
+if [ "${ZEVENT_SUBCLASS}" != "checksum" ] \
+ && [ "${ZEVENT_SUBCLASS}" != "io" ]; then
+ zed_log_err "unsupported event class \"${ZEVENT_SUBCLASS}\""
+ exit 9
fi
-NAME="zed.${ZEVENT_SUBCLASS}.email"
-LOCKFILE="${ZED_LOCKDIR:=/var/lock}/${NAME}.lock"
-STATEFILE="${ZED_RUNDIR:=/var/run}/${NAME}.state"
+zed_check_cmd "mail" || exit 9
-# Obtain lock to ensure mutual exclusion for accessing state.
-exec 8> "${LOCKFILE}"
-flock -x 8
+zed_rate_limit "${ZEVENT_POOL};${ZEVENT_VDEV_PATH};${ZEVENT_SUBCLASS};email" \
+ || exit 3
-# Query state for last time email was sent for this pool/vdev.
-TIME_NOW=`date +%s`
-TIME_LAST=`egrep "^${ZEVENT_POOL};${ZEVENT_VDEV_PATH};" "${STATEFILE}" \
- 2>/dev/null | cut -d ";" -f3`
-if test -n "${TIME_LAST}"; then
- TIME_DELTA=`expr "${TIME_NOW}" - "${TIME_LAST}"`
- if test "${TIME_DELTA}" -lt "${ZED_EMAIL_INTERVAL_SECS:=3600}"; then
- exit 2
- fi
-fi
-
-"${MAIL}" -s "ZFS ${ZEVENT_SUBCLASS} error for ${ZEVENT_POOL} on `hostname`" \
- "${ZED_EMAIL}" <<EOF
+umask 077
+email_subject="ZFS ${ZEVENT_SUBCLASS} error for ${ZEVENT_POOL} on $(hostname)"
+email_pathname="${TMPDIR:="/tmp"}/$(basename -- "$0").${ZEVENT_EID}.$$"
+cat > "${email_pathname}" <<EOF
A ZFS ${ZEVENT_SUBCLASS} error has been detected:
eid: ${ZEVENT_EID}
- host: `hostname`
+ host: $(hostname)
time: ${ZEVENT_TIME_STRING}
pool: ${ZEVENT_POOL}
vdev: ${ZEVENT_VDEV_TYPE}:${ZEVENT_VDEV_PATH}
EOF
-MAIL_STATUS=$?
-# Update state.
-egrep -v "^${ZEVENT_POOL};${ZEVENT_VDEV_PATH};" "${STATEFILE}" \
- 2>/dev/null > "${STATEFILE}.$$"
-echo "${ZEVENT_POOL};${ZEVENT_VDEV_PATH};${TIME_NOW}" >> "${STATEFILE}.$$"
-mv -f "${STATEFILE}.$$" "${STATEFILE}"
+mail -s "${email_subject}" "${ZED_EMAIL}" < "${email_pathname}"
+mail_status=$?
-if test "${MAIL_STATUS}" -ne 0; then
- logger -t "${ZED_SYSLOG_TAG:=zed}" \
- -p "${ZED_SYSLOG_PRIORITY:=daemon.warning}" \
- `basename "$0"`: "${MAIL}" exit="${MAIL_STATUS}"
- exit 1
+if [ "${mail_status}" -ne 0 ]; then
+ zed_log_msg "mail exit=${mail_status}"
+ exit 1
fi
-
+rm -f "${email_pathname}"
exit 0