Files
configs/playbooks/roles/software_scripts/files/pushover.sh
Morten Olsen dce2196c32 update
2024-12-05 23:29:30 +01:00

259 lines
9.0 KiB
Bash

#!/usr/bin/env bash
# https://github.com/akusei/pushover-bash/tree/main
set -o errexit
set -o nounset
readonly VERSION=1.21
readonly API_URL="https://api.pushover.net/1/messages.json"
readonly CONFIG_FILE="pushover-config"
readonly DEFAULT_CONFIG="/etc/pushover/${CONFIG_FILE}"
readonly USER_OVERRIDE=~/.config/pushover/${CONFIG_FILE}
readonly EXPIRE_DEFAULT=180
readonly RETRY_DEFAULT=30
HIDE_REPLY=true
showHelp()
{
local script=`basename "$0"`
echo "Send Pushover v${VERSION} scripted by Nathan Martini"
echo "Push notifications to your Android, iOS, or desktop devices"
echo
echo "NOTE: This script requires an account at http://www.pushover.net"
echo
echo "usage: ${script} <-t|--token apikey> <-u|--user userkey> [options] <MESSAGE>"
echo
echo " MESSAGE The message to send; supports HTML formatting. Quotes are not"
echo " required but recommended"
echo " -t, --token APIKEY The pushover.net API Key for your application. Not required if"
echo " using a configuration file"
echo " -u, --user USERKEY Your pushover.net user key. Not required if using a"
echo " configuration file"
echo
echo " Options:"
echo " -a, --attachment filename The Picture you want to send"
echo " -T, --title TITLE Title of the message"
echo " -d, --device NAME Comma seperated list of devices to receive message"
echo " -U, --url URL URL to send with message"
echo " --url-title URLTITLE Title of the URL"
echo " -H, --html Enable HTML formatting, cannot be used with the --monospace flag"
echo " -M, --monospace Enable monospace messages, cannot be used with the --html flag"
echo " -p, --priority PRIORITY Priority of the message"
echo " -2 - no notification/alert"
echo " -1 - quiet notification"
echo " 0 - normal priority"
echo " 1 - bypass the user's quiet hours"
echo " 2 - require confirmation from the user"
echo " -e, --expire SECONDS Set expiration time for notifications with priority 2 (default ${EXPIRE_DEFAULT})"
echo " -r, --retry COUNT Set retry period for notifications with priority 2 (default ${RETRY_DEFAULT})"
echo " -s, --sound SOUND Notification sound to play with message"
echo " pushover - Pushover (default)"
echo " bike - Bike"
echo " bugle - Bugle"
echo " cashregister - Cash Register"
echo " classical - Classical"
echo " cosmic - Cosmic"
echo " falling - Falling"
echo " gamelan - Gamelan"
echo " incoming - Incoming"
echo " intermission - Intermission"
echo " magic - Magic"
echo " mechanical - Mechanical"
echo " pianobar - Piano Bar"
echo " siren - Siren"
echo " spacealarm - Space Alarm"
echo " tugboat - Tug Boat"
echo " alien - Alien Alarm (long)"
echo " climb - Climb (long)"
echo " persistent - Persistent (long)"
echo " echo - Pushover Echo (long)"
echo " updown - Up Down (long)"
echo " none - None (silent)"
echo " -v, --verbose Return API execution reply to stdout"
echo
echo "EXAMPLES:"
echo
echo " ${script} -t xxxxxxxxxx -u yyyyyyyyyy \"This is a test\""
echo " Sends a simple \"This is a test\" message to all devices."
echo
echo " ${script} -t xxxxxxxxxx -u yyyyyyyyyy -T \"Test Title\" \"This is a test\""
echo " Sends a simple \"This is a test\" message with the title \"Test Title\" to all devices."
echo
echo " ${script} -t xxxxxxxxxx -u yyyyyyyyyy -d \"Phone,Home Desktop\" \"This is a test\""
echo " Sends a simple \"This is a test\" message to the devices named \"Phone\" and \"Home Desktop\"."
echo
echo " ${script} -t xxxxxxxxxx -u yyyyyyyyyy -U \"http://www.google.com\" --url-title Google \"This is a test\""
echo " Sends a simple \"This is a test\" message to all devices that contains a link to www.google.com titled \"Google\"."
echo
echo " ${script} -t xxxxxxxxxx -u yyyyyyyyyy -p 1 \"This is a test\""
echo " Sends a simple \"This is a test\" high priority message to all devices."
echo
echo " ${script} -t xxxxxxxxxx -u yyyyyyyyyy -s bike \"This is a test\""
echo " Sends a simple \"This is a test\" message to all devices that uses the sound of a bike bell as the notification sound."
echo
echo " ${script} -t xxxxxxxxxx -u yyyyyyyyyy -a /path/to/pic.jpg \"This is a test Pic\""
echo " Sends a simple \"This is a test Pic\" message to all devices and send the Picture with the message."
echo
}
curl --version > /dev/null 2>&1 || { echo "This script requires curl; aborting."; echo; exit 1; }
if [ -f ${DEFAULT_CONFIG} ]; then
source ${DEFAULT_CONFIG}
fi
if [ -f ${USER_OVERRIDE} ]; then
source ${USER_OVERRIDE}
fi
while [ $# -gt 0 ]
do
case "${1:-}" in
-t|--token)
api_token="${2:-}"
shift
;;
-u|--user)
user_key="${2:-}"
shift
;;
-a|--attachment)
attachment="${2:-}"
shift
;;
-T|--title)
title="${2:-}"
shift
;;
-d|--device)
device="${2:-}"
shift
;;
-U|--url)
url="${2:-}"
shift
;;
--url-title)
url_title="${2:-}"
shift
;;
-H|--html)
html=1
;;
-M|--monospace)
monospace=1
;;
-p|--priority)
priority="${2:-}"
shift
;;
-s|--sound)
sound="${2:-}"
shift
;;
-e|--expire)
expire="${2:-}"
shift
;;
-r|--retry)
retry="${2:-}"
shift
;;
-v|--verbose)
unset HIDE_REPLY
;;
-h|--help)
showHelp
exit
;;
*)
message="${*:1}"
break
;;
esac
shift
done
if [ ${priority:-0} -eq 2 ]; then
if [ -z "${expire:-}" ]; then
expire=${EXPIRE_DEFAULT}
fi
if [ -z "${retry:-}" ]; then
retry=${RETRY_DEFAULT}
fi
fi
if [ -z "${api_token:-}" ]; then
echo "-t|--token must be set"
exit 1
fi
if [ -z "${user_key:-}" ]; then
echo "-u|--user must be set"
exit 1
fi
if [ -z "${message:-}" ]; then
echo "positional argument MESSAGE must be set"
exit 1
fi
if [ ! -z "${html:-}" ] && [ ! -z "${monospace:-}" ]; then
echo "--html and --monospace are mutually exclusive"
exit 1
fi
if [ ! -z "${attachment:-}" ] && [ ! -f "${attachment}" ]; then
echo "${attachment} not found"
exit 1
fi
if [ -z "${attachment:-}" ]; then
json="{\"token\":\"${api_token}\",\"user\":\"${user_key}\",\"message\":\"${message}\""
if [ "${device:-}" ]; then json="${json},\"device\":\"${device}\""; fi
if [ "${title:-}" ]; then json="${json},\"title\":\"${title}\""; fi
if [ "${url:-}" ]; then json="${json},\"url\":\"${url}\""; fi
if [ "${url_title:-}" ]; then json="${json},\"url_title\":\"${url_title}\""; fi
if [ "${html:-}" ]; then json="${json},\"html\":1"; fi
if [ "${monospace:-}" ]; then json="${json},\"monospace\":1"; fi
if [ "${priority:-}" ]; then json="${json},\"priority\":${priority}"; fi
if [ "${expire:-}" ]; then json="${json},\"expire\":${expire}"; fi
if [ "${retry:-}" ]; then json="${json},\"retry\":${retry}"; fi
if [ "${sound:-}" ]; then json="${json},\"sound\":\"${sound}\""; fi
json="${json}}"
curl --fail -s ${HIDE_REPLY:+ -o /dev/null} \
-H "Content-Type: application/json" \
-d "${json}" \
"${API_URL}" 2>&1
else
curl --fail -s ${HIDE_REPLY:+ -o /dev/null} \
--form-string "token=${api_token}" \
--form-string "user=${user_key}" \
--form-string "message=${message}" \
--form "attachment=@${attachment}" \
${html:+ --form-string "html=1"} \
${monospace:+ --form-string "monospace=1"} \
${priority:+ --form-string "priority=${priority}"} \
${sound:+ --form-string "sound=${sound}"} \
${device:+ --form-string "device=${device}"} \
${title:+ --form-string "title=${title}"} \
"${API_URL}" 2>&1
fi