#!/bin/bash {# nocheck: shell-template grandfathered, values only: the mail envelope, charset and timeout #} set -u # Reverse systemd escaping for human-readable mail subject/body friendly="$(systemd-escape --unescape "$1")" sendmail_bin="$(command -v sendmail 2>/dev/null || true)" if [ -z "$sendmail_bin" ] && [ -x /usr/sbin/sendmail ]; then sendmail_bin="/usr/sbin/sendmail" fi if [ -z "$sendmail_bin" ] && [ -x /usr/bin/sendmail ]; then sendmail_bin="/usr/bin/sendmail" fi if [ -z "$sendmail_bin" ]; then echo "ERROR: sendmail binary not found" >&2 exit 1 fi STATUS_OUT="$(systemctl status --full "$1" 2>/dev/null | head -n 30)" if [ -z "$STATUS_OUT" ]; then esc="$(systemd-escape "$1")" STATUS_OUT="$(systemctl status --full "$esc" 2>/dev/null | head -n 30)" fi mail_tmp="$(mktemp)" trap 'rm -f "$mail_tmp"' EXIT {% set email = lookup('email') %} cat > "$mail_tmp" < Subject: ${friendly} Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset={{ HOST_CS }} A problem with the service ${friendly} occurred: $STATUS_OUT ERRMAIL attempts=3 delay=10 for attempt in $(seq 1 "${attempts}"); do send_err="$(timeout "{{ email.timeout }}s" "$sendmail_bin" -t < "$mail_tmp" 2>&1 1>/dev/null)" rc=$? [ "$rc" -eq 0 ] && exit 0 case "$rc" in 69 | 75 | 124 | 137) ;; 76) case "$send_err" in *"the server sent an empty reply"*) ;; *) break ;; esac ;; 77) case "$send_err" in *"server message: 4"* | *"Temporary authentication failure"*) ;; *) break ;; esac ;; *) break ;; esac if [ "$attempt" -lt "$attempts" ]; then echo "sendmail transient failure (rc=${rc}), attempt ${attempt}/${attempts}; retrying in ${delay}s" >&2 sleep "$delay" fi done [ -n "$send_err" ] && echo "$send_err" >&2 if [ "$rc" -eq 124 ] || [ "$rc" -eq 137 ]; then echo "ERROR: sendmail timed out after {{ email.timeout }}s" >&2 exit 1 fi exit "$rc"