trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR
errors=3
-cbase=/var/local/cron-errors
+cbase=$HOME/sysd-mail-once-state
case "$1" in
- -h|--help)
- cat <<EOF
-Usage: sysd-log-once [-ERRORS] SERVICE COMMAND
+ -h|--help)
+ cat <<EOF
+Usage: sysd-log-once [-ERRORS] SERVICE COMMAND [ARGS...]
+For systemd timers, email on repeated failure & success after failure.
-Use to wrap systemd timers and to email on repeated failure & success after failure
+In the service triggered by the timer, prepend this script to the ExecStart.
+The email will contain the service's logs for the last ERRORS runs.
-Stores error counts in $c\$error_count
--ERRORS: ERRORS is the number of failurs to accumulate before mailing the error
+Stores error counts in $cbase
+
+-ERRORS: ERRORS is the number of failurs to accumulate before mailing the error.
+ Default is 3.
EOF
- exit 0
- ;;
- -[0-9]*)
- errors=${1#-}
- shift
- ;;
+ exit 0
+ ;;
+ -[0-9]*)
+ errors=${1#-}
+ shift
+ ;;
esac
service=$1
shift
u=${USER:-root}
[[ -d $cbase ]] || mkdir -p $cbase
-cursor=$(journalctl --show-cursor -qn0|sed 's/^\s*--\scursor:\s*//')
+if [[ ! $file ]]; then
+ cursor=$(journalctl --show-cursor -qn0|sed 's/^\s*--\scursor:\s*//')
+fi
if "$@"; then
- if [[ $file ]]; then
- rm -f $file
- if [[ $file == $c$errors ]]; then
- echo | mail -s "$HOSTNAME: $service success" $u@localhost
- fi
+ if [[ $file ]]; then
+ rm -f $file
+ if [[ $file == $c$errors ]]; then
+ echo | mail -s "$HOSTNAME: $service success" $u@localhost
fi
-else
- if [[ $file ]]; then
- i=${file#$c}
- if (( i < errors )); then
- new_file=$c$((i+1))
- mv $file $new_file
- file=$new_file
- if [[ $file == $c$errors ]]; then
- journalctl -u $service.service --after-cursor=$cursor | \
- mail -s "$HOSTNAME: $service failure" $u@localhost
- fi
- fi
- else
- file=${c}1
- touch $file
+ fi
+else # $@ failed
+ if [[ $file ]]; then
+ i=${file#$c}
+ if (( i < errors )); then
+ new_file=$c$((i+1))
+ mv $file $new_file
+ file=$new_file
+ if [[ $file == $c$errors ]]; then
+ journalctl -u $service.service --after-cursor=$(<$file) | \
+ mail -s "$HOSTNAME: $service failure" $u@localhost
+ fi
fi
+ else
+ file=${c}1
+ printf "%s\n" "$cursor" >$file
+ fi
fi