#!/usr/bin/env bash # usage usage() { USAGE=$(cat < Sends out notifications for failed services. Please see man systemd_failure_notify. EOF ) echo "$USAGE"; } set -e; SYSTEMD_FAILURE_NOTFY_SERVICE=$1 if [ -z "$SYSTEMD_FAILURE_NOTFY_SERVICE" ]; then echo "No service given"; echo ""; usage; exit 1; fi SYSTEMD_FAILURE_NOTFY_HOSTNAME=$(hostname) SYSTEMD_FAILURE_NOTFY_USER=$(whoami) SYSTEMD_FAILURE_NOTIFY_MAIL_ENABLED="true"; SYSTEMD_FAILURE_NOTIFY_MAIL_ADDRESS=""; SYSTEMD_FAILURE_NOTIFY_GOTIFY_ENABLED="false"; # check for config file apply_config() { local config=$1; if [[ ! -f "$config" ]]; then echo "No config file specified"; echo ""; usage; exit 1; fi set -a; # shellcheck disable=SC1090 source "$config"; set +a; } check_requirements() { local mailEnabled=$1; local gotifyEnabled=$2; if [[ "${mailEnabled}" == "true" ]]; then type mailx &> /dev/null || { echo "Requiring 'mailx' but it's not installed"; exit 1; } fi if [[ "${gotifyEnabled}" == "true" ]]; then type gotify &> /dev/null || { echo "Requiring 'gotify' but it's not installed"; exit 1; } fi } source_config() { local config=$1; local configFallback=$2; local configGlobalFallback=$3; if [[ -f "$config" ]]; then apply_config "$config"; return; fi if [[ -f "$configFallback" ]]; then apply_config "$configFallback"; return; fi if [[ -f "$configGlobalFallback" ]]; then apply_config "$configGlobalFallback"; return; fi } source_config "$2" "$HOME/.systemd_failure_notify.conf" "/etc/systemd_failure_notify.conf" check_requirements "$SYSTEMD_FAILURE_NOTIFY_MAIL_ENABLED" "$SYSTEMD_FAILURE_NOTIFY_GOTIFY_ENABLED" SUBJECT="[systemd $SYSTEMD_FAILURE_NOTFY_HOSTNAME for $SYSTEMD_FAILURE_NOTFY_USER] $SYSTEMD_FAILURE_NOTFY_SERVICE RUN FAILED" MESSAGE="$SYSTEMD_FAILURE_NOTFY_SERVICE run failed" if [[ "${SYSTEMD_FAILURE_NOTIFY_MAIL_ENABLED}" == "true" ]]; then echo "$MESSAGE"|mailx -Ssendwait -s "$SUBJECT" "$SYSTEMD_FAILURE_NOTIFY_MAIL_ADDRESS"; echo "Sent notifiction via mail" else echo "Sending notifictions via mail is disabled" fi if [[ "${SYSTEMD_FAILURE_NOTIFY_GOTIFY_ENABLED}" == "true" ]]; then if [[ ! -f "${HOME}/.config/gotify/cli.json" && ! -f "${HOME}/gotify/cli.json" && ! -f "./cli.json" && ! -f "/etc/gotify/cli.json" ]]; then echo "Cannot find a valid cli.json, please run 'gotify init' before using this" exit 1; fi echo "$MESSAGE"|gotify push --quiet --title "${SUBJECT}"; echo "Sent message via gotify" else echo "Sending notifictions via gotify is disabled" fi