aboutsummaryrefslogtreecommitdiff
path: root/straper/db/public/zfs/etc-zfs/zed.d/zed-functions.sh
diff options
context:
space:
mode:
Diffstat (limited to 'straper/db/public/zfs/etc-zfs/zed.d/zed-functions.sh')
-rw-r--r--straper/db/public/zfs/etc-zfs/zed.d/zed-functions.sh824
1 files changed, 0 insertions, 824 deletions
diff --git a/straper/db/public/zfs/etc-zfs/zed.d/zed-functions.sh b/straper/db/public/zfs/etc-zfs/zed.d/zed-functions.sh
deleted file mode 100644
index 6e00f15..0000000
--- a/straper/db/public/zfs/etc-zfs/zed.d/zed-functions.sh
+++ /dev/null
@@ -1,824 +0,0 @@
-#!/bin/sh
-# shellcheck disable=SC2154,SC3043
-# zed-functions.sh
-#
-# ZED helper functions for use in ZEDLETs
-
-
-# Variable Defaults
-#
-: "${ZED_LOCKDIR:="/var/lock"}"
-: "${ZED_NOTIFY_INTERVAL_SECS:=3600}"
-: "${ZED_NOTIFY_VERBOSE:=0}"
-: "${ZED_RUNDIR:="/var/run"}"
-: "${ZED_SYSLOG_PRIORITY:="daemon.notice"}"
-: "${ZED_SYSLOG_TAG:="zed"}"
-
-ZED_FLOCK_FD=8
-
-
-# zed_check_cmd (cmd, ...)
-#
-# For each argument given, search PATH for the executable command [cmd].
-# Log a message if [cmd] is not found.
-#
-# Arguments
-# cmd: name of executable command for which to search
-#
-# Return
-# 0 if all commands are found in PATH and are executable
-# n for a count of the command executables that are not found
-#
-zed_check_cmd()
-{
- local cmd
- local rv=0
-
- for cmd; do
- if ! command -v "${cmd}" >/dev/null 2>&1; then
- zed_log_err "\"${cmd}\" not installed"
- rv=$((rv + 1))
- fi
- done
- return "${rv}"
-}
-
-
-# zed_log_msg (msg, ...)
-#
-# Write all argument strings to the system log.
-#
-# Globals
-# ZED_SYSLOG_PRIORITY
-# ZED_SYSLOG_TAG
-#
-# Return
-# nothing
-#
-zed_log_msg()
-{
- logger -p "${ZED_SYSLOG_PRIORITY}" -t "${ZED_SYSLOG_TAG}" -- "$@"
-}
-
-
-# zed_log_err (msg, ...)
-#
-# Write an error message to the system log. This message will contain the
-# script name, EID, and all argument strings.
-#
-# Globals
-# ZED_SYSLOG_PRIORITY
-# ZED_SYSLOG_TAG
-# ZEVENT_EID
-#
-# Return
-# nothing
-#
-zed_log_err()
-{
- zed_log_msg "error: ${0##*/}:""${ZEVENT_EID:+" eid=${ZEVENT_EID}:"}" "$@"
-}
-
-
-# zed_lock (lockfile, [fd])
-#
-# Obtain an exclusive (write) lock on [lockfile]. If the lock cannot be
-# immediately acquired, wait until it becomes available.
-#
-# Every zed_lock() must be paired with a corresponding zed_unlock().
-#
-# By default, flock-style locks associate the lockfile with file descriptor 8.
-# The bash manpage warns that file descriptors >9 should be used with care as
-# they may conflict with file descriptors used internally by the shell. File
-# descriptor 9 is reserved for zed_rate_limit(). If concurrent locks are held
-# within the same process, they must use different file descriptors (preferably
-# decrementing from 8); otherwise, obtaining a new lock with a given file
-# descriptor will release the previous lock associated with that descriptor.
-#
-# Arguments
-# lockfile: pathname of the lock file; the lock will be stored in
-# ZED_LOCKDIR unless the pathname contains a "/".
-# fd: integer for the file descriptor used by flock (OPTIONAL unless holding
-# concurrent locks)
-#
-# Globals
-# ZED_FLOCK_FD
-# ZED_LOCKDIR
-#
-# Return
-# nothing
-#
-zed_lock()
-{
- local lockfile="$1"
- local fd="${2:-${ZED_FLOCK_FD}}"
- local umask_bak
- local err
-
- [ -n "${lockfile}" ] || return
- if ! expr "${lockfile}" : '.*/' >/dev/null 2>&1; then
- lockfile="${ZED_LOCKDIR}/${lockfile}"
- fi
-
- umask_bak="$(umask)"
- umask 077
-
- # Obtain a lock on the file bound to the given file descriptor.
- #
- eval "exec ${fd}>> '${lockfile}'"
- if ! err="$(flock --exclusive "${fd}" 2>&1)"; then
- zed_log_err "failed to lock \"${lockfile}\": ${err}"
- fi
-
- umask "${umask_bak}"
-}
-
-
-# zed_unlock (lockfile, [fd])
-#
-# Release the lock on [lockfile].
-#
-# Arguments
-# lockfile: pathname of the lock file
-# fd: integer for the file descriptor used by flock (must match the file
-# descriptor passed to the zed_lock function call)
-#
-# Globals
-# ZED_FLOCK_FD
-# ZED_LOCKDIR
-#
-# Return
-# nothing
-#
-zed_unlock()
-{
- local lockfile="$1"
- local fd="${2:-${ZED_FLOCK_FD}}"
- local err
-
- [ -n "${lockfile}" ] || return
- if ! expr "${lockfile}" : '.*/' >/dev/null 2>&1; then
- lockfile="${ZED_LOCKDIR}/${lockfile}"
- fi
-
- # Release the lock and close the file descriptor.
- if ! err="$(flock --unlock "${fd}" 2>&1)"; then
- zed_log_err "failed to unlock \"${lockfile}\": ${err}"
- fi
- eval "exec ${fd}>&-"
-}
-
-
-# zed_notify (subject, pathname)
-#
-# Send a notification via all available methods.
-#
-# Arguments
-# subject: notification subject
-# pathname: pathname containing the notification message (OPTIONAL)
-#
-# Return
-# 0: notification succeeded via at least one method
-# 1: notification failed
-# 2: no notification methods configured
-#
-zed_notify()
-{
- local subject="$1"
- local pathname="$2"
- local num_success=0
- local num_failure=0
-
- zed_notify_email "${subject}" "${pathname}"; rv=$?
- [ "${rv}" -eq 0 ] && num_success=$((num_success + 1))
- [ "${rv}" -eq 1 ] && num_failure=$((num_failure + 1))
-
- zed_notify_pushbullet "${subject}" "${pathname}"; rv=$?
- [ "${rv}" -eq 0 ] && num_success=$((num_success + 1))
- [ "${rv}" -eq 1 ] && num_failure=$((num_failure + 1))
-
- zed_notify_slack_webhook "${subject}" "${pathname}"; rv=$?
- [ "${rv}" -eq 0 ] && num_success=$((num_success + 1))
- [ "${rv}" -eq 1 ] && num_failure=$((num_failure + 1))
-
- zed_notify_pushover "${subject}" "${pathname}"; rv=$?
- [ "${rv}" -eq 0 ] && num_success=$((num_success + 1))
- [ "${rv}" -eq 1 ] && num_failure=$((num_failure + 1))
-
- zed_notify_ntfy "${subject}" "${pathname}"; rv=$?
- [ "${rv}" -eq 0 ] && num_success=$((num_success + 1))
- [ "${rv}" -eq 1 ] && num_failure=$((num_failure + 1))
-
- zed_notify_gotify "${subject}" "${pathname}"; rv=$?
- [ "${rv}" -eq 0 ] && num_success=$((num_success + 1))
- [ "${rv}" -eq 1 ] && num_failure=$((num_failure + 1))
-
- [ "${num_success}" -gt 0 ] && return 0
- [ "${num_failure}" -gt 0 ] && return 1
- return 2
-}
-
-
-# zed_notify_email (subject, pathname)
-#
-# Send a notification via email to the address specified by ZED_EMAIL_ADDR.
-#
-# Requires the mail executable to be installed in the standard PATH, or
-# ZED_EMAIL_PROG to be defined with the pathname of an executable capable of
-# reading a message body from stdin.
-#
-# Command-line options to the mail executable can be specified in
-# ZED_EMAIL_OPTS. This undergoes the following keyword substitutions:
-# - @ADDRESS@ is replaced with the space-delimited recipient email address(es)
-# - @SUBJECT@ is replaced with the notification subject
-# If @SUBJECT@ was omited here, a "Subject: ..." header will be added to notification
-#
-#
-# Arguments
-# subject: notification subject
-# pathname: pathname containing the notification message (OPTIONAL)
-#
-# Globals
-# ZED_EMAIL_PROG
-# ZED_EMAIL_OPTS
-# ZED_EMAIL_ADDR
-#
-# Return
-# 0: notification sent
-# 1: notification failed
-# 2: not configured
-#
-zed_notify_email()
-{
- local subject="${1:-"ZED notification"}"
- local pathname="${2:-"/dev/null"}"
-
- : "${ZED_EMAIL_PROG:="mail"}"
- : "${ZED_EMAIL_OPTS:="-s '@SUBJECT@' @ADDRESS@"}"
-
- # For backward compatibility with ZED_EMAIL.
- if [ -n "${ZED_EMAIL}" ] && [ -z "${ZED_EMAIL_ADDR}" ]; then
- ZED_EMAIL_ADDR="${ZED_EMAIL}"
- fi
- [ -n "${ZED_EMAIL_ADDR}" ] || return 2
-
- zed_check_cmd "${ZED_EMAIL_PROG}" || return 1
-
- [ -n "${subject}" ] || return 1
- if [ ! -r "${pathname}" ]; then
- zed_log_err \
- "${ZED_EMAIL_PROG##*/} cannot read \"${pathname}\""
- return 1
- fi
-
- # construct cmdline options
- ZED_EMAIL_OPTS_PARSED="$(echo "${ZED_EMAIL_OPTS}" \
- | sed -e "s/@ADDRESS@/${ZED_EMAIL_ADDR}/g" \
- -e "s/@SUBJECT@/${subject}/g")"
-
- # pipe message to email prog
- # shellcheck disable=SC2086,SC2248
- {
- # no subject passed as option?
- if [ "${ZED_EMAIL_OPTS%@SUBJECT@*}" = "${ZED_EMAIL_OPTS}" ] ; then
- # inject subject header
- printf "Subject: %s\n" "${subject}"
- # The following empty line is needed to separate the header from the
- # body of the message. Otherwise programs like sendmail will skip
- # everything up to the first empty line (or wont send an email at
- # all) and will still exit with exit code 0
- printf "\n"
- fi
- # output message
- cat "${pathname}"
- } |
- eval ${ZED_EMAIL_PROG} ${ZED_EMAIL_OPTS_PARSED} >/dev/null 2>&1
- rv=$?
- if [ "${rv}" -ne 0 ]; then
- zed_log_err "${ZED_EMAIL_PROG##*/} exit=${rv}"
- return 1
- fi
- return 0
-}
-
-
-# zed_notify_pushbullet (subject, pathname)
-#
-# Send a notification via Pushbullet <https://www.pushbullet.com/>.
-# The access token (ZED_PUSHBULLET_ACCESS_TOKEN) identifies this client to the
-# Pushbullet server. The optional channel tag (ZED_PUSHBULLET_CHANNEL_TAG) is
-# for pushing to notification feeds that can be subscribed to; if a channel is
-# not defined, push notifications will instead be sent to all devices
-# associated with the account specified by the access token.
-#
-# Requires awk, curl, and sed executables to be installed in the standard PATH.
-#
-# References
-# https://docs.pushbullet.com/
-# https://www.pushbullet.com/security
-#
-# Arguments
-# subject: notification subject
-# pathname: pathname containing the notification message (OPTIONAL)
-#
-# Globals
-# ZED_PUSHBULLET_ACCESS_TOKEN
-# ZED_PUSHBULLET_CHANNEL_TAG
-#
-# Return
-# 0: notification sent
-# 1: notification failed
-# 2: not configured
-#
-zed_notify_pushbullet()
-{
- local subject="$1"
- local pathname="${2:-"/dev/null"}"
- local msg_body
- local msg_tag
- local msg_json
- local msg_out
- local msg_err
- local url="https://api.pushbullet.com/v2/pushes"
-
- [ -n "${ZED_PUSHBULLET_ACCESS_TOKEN}" ] || return 2
-
- [ -n "${subject}" ] || return 1
- if [ ! -r "${pathname}" ]; then
- zed_log_err "pushbullet cannot read \"${pathname}\""
- return 1
- fi
-
- zed_check_cmd "awk" "curl" "sed" || return 1
-
- # Escape the following characters in the message body for JSON:
- # newline, backslash, double quote, horizontal tab, vertical tab,
- # and carriage return.
- #
- msg_body="$(awk '{ ORS="\\n" } { gsub(/\\/, "\\\\"); gsub(/"/, "\\\"");
- gsub(/\t/, "\\t"); gsub(/\f/, "\\f"); gsub(/\r/, "\\r"); print }' \
- "${pathname}")"
-
- # Push to a channel if one is configured.
- #
- [ -n "${ZED_PUSHBULLET_CHANNEL_TAG}" ] && msg_tag="$(printf \
- '"channel_tag": "%s", ' "${ZED_PUSHBULLET_CHANNEL_TAG}")"
-
- # Construct the JSON message for pushing a note.
- #
- msg_json="$(printf '{%s"type": "note", "title": "%s", "body": "%s"}' \
- "${msg_tag}" "${subject}" "${msg_body}")"
-
- # Send the POST request and check for errors.
- #
- msg_out="$(curl -u "${ZED_PUSHBULLET_ACCESS_TOKEN}:" -X POST "${url}" \
- --header "Content-Type: application/json" --data-binary "${msg_json}" \
- 2>/dev/null)"; rv=$?
- if [ "${rv}" -ne 0 ]; then
- zed_log_err "curl exit=${rv}"
- return 1
- fi
- msg_err="$(echo "${msg_out}" \
- | sed -n -e 's/.*"error" *:.*"message" *: *"\([^"]*\)".*/\1/p')"
- if [ -n "${msg_err}" ]; then
- zed_log_err "pushbullet \"${msg_err}"\"
- return 1
- fi
- return 0
-}
-
-
-# zed_notify_slack_webhook (subject, pathname)
-#
-# Notification via Slack Webhook <https://api.slack.com/incoming-webhooks>.
-# The Webhook URL (ZED_SLACK_WEBHOOK_URL) identifies this client to the
-# Slack channel.
-#
-# Requires awk, curl, and sed executables to be installed in the standard PATH.
-#
-# References
-# https://api.slack.com/incoming-webhooks
-#
-# Arguments
-# subject: notification subject
-# pathname: pathname containing the notification message (OPTIONAL)
-#
-# Globals
-# ZED_SLACK_WEBHOOK_URL
-#
-# Return
-# 0: notification sent
-# 1: notification failed
-# 2: not configured
-#
-zed_notify_slack_webhook()
-{
- [ -n "${ZED_SLACK_WEBHOOK_URL}" ] || return 2
-
- local subject="$1"
- local pathname="${2:-"/dev/null"}"
- local msg_body
- local msg_tag
- local msg_json
- local msg_out
- local msg_err
- local url="${ZED_SLACK_WEBHOOK_URL}"
-
- [ -n "${subject}" ] || return 1
- if [ ! -r "${pathname}" ]; then
- zed_log_err "slack webhook cannot read \"${pathname}\""
- return 1
- fi
-
- zed_check_cmd "awk" "curl" "sed" || return 1
-
- # Escape the following characters in the message body for JSON:
- # newline, backslash, double quote, horizontal tab, vertical tab,
- # and carriage return.
- #
- msg_body="$(awk '{ ORS="\\n" } { gsub(/\\/, "\\\\"); gsub(/"/, "\\\"");
- gsub(/\t/, "\\t"); gsub(/\f/, "\\f"); gsub(/\r/, "\\r"); print }' \
- "${pathname}")"
-
- # Construct the JSON message for posting.
- #
- msg_json="$(printf '{"text": "*%s*\\n%s"}' "${subject}" "${msg_body}" )"
-
- # Send the POST request and check for errors.
- #
- msg_out="$(curl -X POST "${url}" \
- --header "Content-Type: application/json" --data-binary "${msg_json}" \
- 2>/dev/null)"; rv=$?
- if [ "${rv}" -ne 0 ]; then
- zed_log_err "curl exit=${rv}"
- return 1
- fi
- msg_err="$(echo "${msg_out}" \
- | sed -n -e 's/.*"error" *:.*"message" *: *"\([^"]*\)".*/\1/p')"
- if [ -n "${msg_err}" ]; then
- zed_log_err "slack webhook \"${msg_err}"\"
- return 1
- fi
- return 0
-}
-
-# zed_notify_pushover (subject, pathname)
-#
-# Send a notification via Pushover <https://pushover.net/>.
-# The access token (ZED_PUSHOVER_TOKEN) identifies this client to the
-# Pushover server. The user token (ZED_PUSHOVER_USER) defines the user or
-# group to which the notification will be sent.
-#
-# Requires curl and sed executables to be installed in the standard PATH.
-#
-# References
-# https://pushover.net/api
-#
-# Arguments
-# subject: notification subject
-# pathname: pathname containing the notification message (OPTIONAL)
-#
-# Globals
-# ZED_PUSHOVER_TOKEN
-# ZED_PUSHOVER_USER
-#
-# Return
-# 0: notification sent
-# 1: notification failed
-# 2: not configured
-#
-zed_notify_pushover()
-{
- local subject="$1"
- local pathname="${2:-"/dev/null"}"
- local msg_body
- local msg_out
- local msg_err
- local url="https://api.pushover.net/1/messages.json"
-
- [ -n "${ZED_PUSHOVER_TOKEN}" ] && [ -n "${ZED_PUSHOVER_USER}" ] || return 2
-
- if [ ! -r "${pathname}" ]; then
- zed_log_err "pushover cannot read \"${pathname}\""
- return 1
- fi
-
- zed_check_cmd "curl" "sed" || return 1
-
- # Read the message body in.
- #
- msg_body="$(cat "${pathname}")"
-
- if [ -z "${msg_body}" ]
- then
- msg_body=$subject
- subject=""
- fi
-
- # Send the POST request and check for errors.
- #
- msg_out="$( \
- curl \
- --form-string "token=${ZED_PUSHOVER_TOKEN}" \
- --form-string "user=${ZED_PUSHOVER_USER}" \
- --form-string "message=${msg_body}" \
- --form-string "title=${subject}" \
- "${url}" \
- 2>/dev/null \
- )"; rv=$?
- if [ "${rv}" -ne 0 ]; then
- zed_log_err "curl exit=${rv}"
- return 1
- fi
- msg_err="$(echo "${msg_out}" \
- | sed -n -e 's/.*"errors" *:.*\[\(.*\)\].*/\1/p')"
- if [ -n "${msg_err}" ]; then
- zed_log_err "pushover \"${msg_err}"\"
- return 1
- fi
- return 0
-}
-
-
-# zed_notify_ntfy (subject, pathname)
-#
-# Send a notification via Ntfy.sh <https://ntfy.sh/>.
-# The ntfy topic (ZED_NTFY_TOPIC) identifies the topic that the notification
-# will be sent to Ntfy.sh server. The ntfy url (ZED_NTFY_URL) defines the
-# self-hosted or provided hosted ntfy service location. The ntfy access token
-# <https://docs.ntfy.sh/publish/#access-tokens> (ZED_NTFY_ACCESS_TOKEN) reprsents an
-# access token that could be used if a topic is read/write protected. If a
-# topic can be written to publicaly, a ZED_NTFY_ACCESS_TOKEN is not required.
-#
-# Requires curl and sed executables to be installed in the standard PATH.
-#
-# References
-# https://docs.ntfy.sh
-#
-# Arguments
-# subject: notification subject
-# pathname: pathname containing the notification message (OPTIONAL)
-#
-# Globals
-# ZED_NTFY_TOPIC
-# ZED_NTFY_ACCESS_TOKEN (OPTIONAL)
-# ZED_NTFY_URL
-#
-# Return
-# 0: notification sent
-# 1: notification failed
-# 2: not configured
-#
-zed_notify_ntfy()
-{
- local subject="$1"
- local pathname="${2:-"/dev/null"}"
- local msg_body
- local msg_out
- local msg_err
-
- [ -n "${ZED_NTFY_TOPIC}" ] || return 2
- local url="${ZED_NTFY_URL:-"https://ntfy.sh"}/${ZED_NTFY_TOPIC}"
-
- if [ ! -r "${pathname}" ]; then
- zed_log_err "ntfy cannot read \"${pathname}\""
- return 1
- fi
-
- zed_check_cmd "curl" "sed" || return 1
-
- # Read the message body in.
- #
- msg_body="$(cat "${pathname}")"
-
- if [ -z "${msg_body}" ]
- then
- msg_body=$subject
- subject=""
- fi
-
- # Send the POST request and check for errors.
- #
- if [ -n "${ZED_NTFY_ACCESS_TOKEN}" ]; then
- msg_out="$( \
- curl \
- -u ":${ZED_NTFY_ACCESS_TOKEN}" \
- -H "Title: ${subject}" \
- -d "${msg_body}" \
- -H "Priority: high" \
- "${url}" \
- 2>/dev/null \
- )"; rv=$?
- else
- msg_out="$( \
- curl \
- -H "Title: ${subject}" \
- -d "${msg_body}" \
- -H "Priority: high" \
- "${url}" \
- 2>/dev/null \
- )"; rv=$?
- fi
- if [ "${rv}" -ne 0 ]; then
- zed_log_err "curl exit=${rv}"
- return 1
- fi
- msg_err="$(echo "${msg_out}" \
- | sed -n -e 's/.*"errors" *:.*\[\(.*\)\].*/\1/p')"
- if [ -n "${msg_err}" ]; then
- zed_log_err "ntfy \"${msg_err}"\"
- return 1
- fi
- return 0
-}
-
-
-# zed_notify_gotify (subject, pathname)
-#
-# Send a notification via Gotify <https://gotify.net/>.
-# The Gotify URL (ZED_GOTIFY_URL) defines a self-hosted Gotify location.
-# The Gotify application token (ZED_GOTIFY_APPTOKEN) defines a
-# Gotify application token which is associated with a message.
-# The optional Gotify priority value (ZED_GOTIFY_PRIORITY) overrides the
-# default or configured priority at the Gotify server for the application.
-#
-# Requires curl and sed executables to be installed in the standard PATH.
-#
-# References
-# https://gotify.net/docs/index
-#
-# Arguments
-# subject: notification subject
-# pathname: pathname containing the notification message (OPTIONAL)
-#
-# Globals
-# ZED_GOTIFY_URL
-# ZED_GOTIFY_APPTOKEN
-# ZED_GOTIFY_PRIORITY
-#
-# Return
-# 0: notification sent
-# 1: notification failed
-# 2: not configured
-#
-zed_notify_gotify()
-{
- local subject="$1"
- local pathname="${2:-"/dev/null"}"
- local msg_body
- local msg_out
- local msg_err
-
- [ -n "${ZED_GOTIFY_URL}" ] && [ -n "${ZED_GOTIFY_APPTOKEN}" ] || return 2
- local url="${ZED_GOTIFY_URL}/message?token=${ZED_GOTIFY_APPTOKEN}"
-
- if [ ! -r "${pathname}" ]; then
- zed_log_err "gotify cannot read \"${pathname}\""
- return 1
- fi
-
- zed_check_cmd "curl" "sed" || return 1
-
- # Read the message body in.
- #
- msg_body="$(cat "${pathname}")"
-
- if [ -z "${msg_body}" ]
- then
- msg_body=$subject
- subject=""
- fi
-
- # Send the POST request and check for errors.
- #
- if [ -n "${ZED_GOTIFY_PRIORITY}" ]; then
- msg_out="$( \
- curl \
- --form-string "title=${subject}" \
- --form-string "message=${msg_body}" \
- --form-string "priority=${ZED_GOTIFY_PRIORITY}" \
- "${url}" \
- 2>/dev/null \
- )"; rv=$?
- else
- msg_out="$( \
- curl \
- --form-string "title=${subject}" \
- --form-string "message=${msg_body}" \
- "${url}" \
- 2>/dev/null \
- )"; rv=$?
- fi
-
- if [ "${rv}" -ne 0 ]; then
- zed_log_err "curl exit=${rv}"
- return 1
- fi
- msg_err="$(echo "${msg_out}" \
- | sed -n -e 's/.*"errors" *:.*\[\(.*\)\].*/\1/p')"
- if [ -n "${msg_err}" ]; then
- zed_log_err "gotify \"${msg_err}"\"
- return 1
- fi
- return 0
-}
-
-
-
-# zed_rate_limit (tag, [interval])
-#
-# Check whether an event of a given type [tag] has already occurred within the
-# last [interval] seconds.
-#
-# This function obtains a lock on the statefile using file descriptor 9.
-#
-# Arguments
-# tag: arbitrary string for grouping related events to rate-limit
-# interval: time interval in seconds (OPTIONAL)
-#
-# Globals
-# ZED_NOTIFY_INTERVAL_SECS
-# ZED_RUNDIR
-#
-# Return
-# 0 if the event should be processed
-# 1 if the event should be dropped
-#
-# State File Format
-# time;tag
-#
-zed_rate_limit()
-{
- local tag="$1"
- local interval="${2:-${ZED_NOTIFY_INTERVAL_SECS}}"
- local lockfile="zed.zedlet.state.lock"
- local lockfile_fd=9
- local statefile="${ZED_RUNDIR}/zed.zedlet.state"
- local time_now
- local time_prev
- local umask_bak
- local rv=0
-
- [ -n "${tag}" ] || return 0
-
- zed_lock "${lockfile}" "${lockfile_fd}"
- time_now="$(date +%s)"
- time_prev="$(grep -E "^[0-9]+;${tag}\$" "${statefile}" 2>/dev/null \
- | tail -1 | cut -d\; -f1)"
-
- if [ -n "${time_prev}" ] \
- && [ "$((time_now - time_prev))" -lt "${interval}" ]; then
- rv=1
- else
- umask_bak="$(umask)"
- umask 077
- grep -E -v "^[0-9]+;${tag}\$" "${statefile}" 2>/dev/null \
- > "${statefile}.$$"
- echo "${time_now};${tag}" >> "${statefile}.$$"
- mv -f "${statefile}.$$" "${statefile}"
- umask "${umask_bak}"
- fi
-
- zed_unlock "${lockfile}" "${lockfile_fd}"
- return "${rv}"
-}
-
-
-# zed_guid_to_pool (guid)
-#
-# Convert a pool GUID into its pool name (like "tank")
-# Arguments
-# guid: pool GUID (decimal or hex)
-#
-# Return
-# Pool name
-#
-zed_guid_to_pool()
-{
- if [ -z "$1" ] ; then
- return
- fi
-
- guid="$(printf "%u" "$1")"
- $ZPOOL get -H -ovalue,name guid | awk '$1 == '"$guid"' {print $2; exit}'
-}
-
-# zed_exit_if_ignoring_this_event
-#
-# Exit the script if we should ignore this event, as determined by
-# $ZED_SYSLOG_SUBCLASS_INCLUDE and $ZED_SYSLOG_SUBCLASS_EXCLUDE in zed.rc.
-# This function assumes you've imported the normal zed variables.
-zed_exit_if_ignoring_this_event()
-{
- if [ -n "${ZED_SYSLOG_SUBCLASS_INCLUDE}" ]; then
- eval "case ${ZEVENT_SUBCLASS} in
- ${ZED_SYSLOG_SUBCLASS_INCLUDE});;
- *) exit 0;;
- esac"
- elif [ -n "${ZED_SYSLOG_SUBCLASS_EXCLUDE}" ]; then
- eval "case ${ZEVENT_SUBCLASS} in
- ${ZED_SYSLOG_SUBCLASS_EXCLUDE}) exit 0;;
- *);;
- esac"
- fi
-}