mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 11:19:32 +03:00
Add support for Pushbullet notifications
This commit adds the zed_notify_pushbullet() function and hooks it into zed_notify(), thereby integrating it with the existing "notify" ZEDLETs. This enables ZED to push notifications to your desktop computer and/or mobile device(s). It is configured with the ZED_PUSHBULLET_ACCESS_TOKEN and ZED_PUSHBULLET_CHANNEL_TAG variables in zed.rc. https://www.pushbullet.com/ The Makefile install-data-local target has been replaced with install-data-hook. With the "-local" target, there is no particular guarantee of execution order. But with the zed.rc now potentially containing sensitive information (i.e., the Pushbullet access token), the recommended permissions have changed to 0600. The "-hook" target is always executed after the main rule's work is done; thus, the chmod will always take place after the zed.rc file has been installed. https://www.gnu.org/software/automake/manual/automake.html#Extending Signed-off-by: Chris Dunlap <cdunlap@llnl.gov>
This commit is contained in:
parent
20967ff1a4
commit
a0d065fa92
@ -62,10 +62,11 @@ zedconfdefaults = \
|
|||||||
resilver.finish-notify.sh \
|
resilver.finish-notify.sh \
|
||||||
scrub.finish-notify.sh
|
scrub.finish-notify.sh
|
||||||
|
|
||||||
install-data-local:
|
install-data-hook:
|
||||||
$(MKDIR_P) "$(DESTDIR)$(zedconfdir)"
|
$(MKDIR_P) "$(DESTDIR)$(zedconfdir)"
|
||||||
for f in $(zedconfdefaults); do \
|
for f in $(zedconfdefaults); do \
|
||||||
test -f "$(DESTDIR)$(zedconfdir)/$${f}" -o \
|
test -f "$(DESTDIR)$(zedconfdir)/$${f}" -o \
|
||||||
-L "$(DESTDIR)$(zedconfdir)/$${f}" || \
|
-L "$(DESTDIR)$(zedconfdir)/$${f}" || \
|
||||||
ln -s "$(zedexecdir)/$${f}" "$(DESTDIR)$(zedconfdir)"; \
|
ln -s "$(zedexecdir)/$${f}" "$(DESTDIR)$(zedconfdir)"; \
|
||||||
done
|
done
|
||||||
|
chmod 0600 "$(DESTDIR)$(zedconfdir)/zed.rc"
|
||||||
|
@ -195,6 +195,10 @@ zed_notify()
|
|||||||
[ "${rv}" -eq 0 ] && num_success=$((num_success + 1))
|
[ "${rv}" -eq 0 ] && num_success=$((num_success + 1))
|
||||||
[ "${rv}" -eq 1 ] && num_failure=$((num_failure + 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))
|
||||||
|
|
||||||
[ "${num_success}" -gt 0 ] && return 0
|
[ "${num_success}" -gt 0 ] && return 0
|
||||||
[ "${num_failure}" -gt 0 ] && return 1
|
[ "${num_failure}" -gt 0 ] && return 1
|
||||||
return 2
|
return 2
|
||||||
@ -243,6 +247,92 @@ zed_notify_email()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# 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_rate_limit (tag, [interval])
|
# zed_rate_limit (tag, [interval])
|
||||||
#
|
#
|
||||||
# Check whether an event of a given type [tag] has already occurred within the
|
# Check whether an event of a given type [tag] has already occurred within the
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
##
|
##
|
||||||
# zed.rc
|
# zed.rc
|
||||||
|
#
|
||||||
|
# This file should be owned by root and permissioned 0600.
|
||||||
##
|
##
|
||||||
|
|
||||||
##
|
##
|
||||||
@ -31,6 +33,24 @@
|
|||||||
#
|
#
|
||||||
#ZED_NOTIFY_VERBOSE=0
|
#ZED_NOTIFY_VERBOSE=0
|
||||||
|
|
||||||
|
##
|
||||||
|
# Pushbullet access token.
|
||||||
|
# This grants full access to your account -- protect it accordingly!
|
||||||
|
# <https://www.pushbullet.com/get-started>
|
||||||
|
# <https://www.pushbullet.com/account>
|
||||||
|
# Disabled by default; uncomment to enable.
|
||||||
|
#
|
||||||
|
#ZED_PUSHBULLET_ACCESS_TOKEN=""
|
||||||
|
|
||||||
|
##
|
||||||
|
# Pushbullet channel tag for push notification feeds that can be subscribed to.
|
||||||
|
# <https://www.pushbullet.com/my-channel>
|
||||||
|
# If not defined, push notifications will instead be sent to all devices
|
||||||
|
# associated with the account specified by the access token.
|
||||||
|
# Disabled by default; uncomment to enable.
|
||||||
|
#
|
||||||
|
#ZED_PUSHBULLET_CHANNEL_TAG=""
|
||||||
|
|
||||||
##
|
##
|
||||||
# Default directory for zed state files.
|
# Default directory for zed state files.
|
||||||
#
|
#
|
||||||
|
Loading…
Reference in New Issue
Block a user