diff --git a/sbosrcarch-wrapper b/sbosrcarch-wrapper new file mode 100755 index 0000000..55fe5fa --- /dev/null +++ b/sbosrcarch-wrapper @@ -0,0 +1,80 @@ +#!/bin/bash +# Version: 0.2.0 +# Copyright (c) 2023-2026: +# Darren 'Tadgy' Austin +# Licensed under the terms of the GNU General Public License version 3. +# +# Wrapper around /opt/bin/sbosrcarch to keep a log of the session, and email it. + +# Configuration. +COMMAND="/opt/bin/sbosrcarch" +LOGSDIR="/var/log/duplication/sbosrcarch/$(printf "%(%Y/%m)T")" +LOGFILE="$(printf "%(%Y%m%d-%H%M%S)T")-$$" +# Where from/to to send emails. Comment for no emailing. +EMAIL_FROM="\"Server: ${HOSTNAME%%.*}\" " +EMAIL_TO=("Systems' Administrator ") + +# Functions +notify() { + [[ -n "$EMAIL_FROM" ]] && (( "${#EMAIL_TO[@]}" != 0 )) && { + printf "%s: %s\\n%s: %s\\n%s:\\n%s\\n" "Exit code" "$ERR" "Logfile" "$LOGSDIR/$LOGFILE.xz" "Output" "$(<"$LOGSDIR/$LOGFILE")" | mail -r "$EMAIL_FROM" -s "SboSrcArch $1" "${EMAIL_TO[@]}" >/dev/null 2>&1 || { + printf "%s: %s\\n" "${0##*/}" "mail command failed" >&2 + return 1 + } + } + + return 0 +} + +# Only allow one copy of the script to run at any time. +# shellcheck disable=SC2154 +if [[ "$FLOCK" != "$0" ]]; then + # shellcheck disable=SC2093 + exec env FLOCK="$0" flock -E 10 -e -n "$0" "$0" "$@" + ERR="$?" + if (( ERR == 10 )); then + # File is locked, exit now. + exit 0 + elif (( ERR > 0 )); then + printf "%s: %s\\n" "${0##*/}" "flock execution error" >&2 + exit 1 + fi +fi + +# Logs are only for root. +umask 027 + +# Make sure the logs directory exists. +# shellcheck disable=SC2174 +mkdir -p -m 750 "$LOGSDIR" 2>/dev/null || { + printf "%s: %s\\n" "${0##*/}" "Failed to create logs directory '$LOGSDIR'" >&2 + exit 1 +} + +# Make sure the command to do the work is runnable. +[[ ! -x "$COMMAND" ]] && { + printf "%s: %s\\n" "${0##*/}" "'$COMMAND' is not executable" >&2 + exit 1 +} + +# Do the sbosrcarch work. +"$COMMAND" "${@:-update}" >"$LOGSDIR/$LOGFILE" 2>&1 +ERR="$?" +printf "\\n" >>"$LOGSDIR/$LOGFILE" +"$COMMAND" "status" >>"$LOGSDIR/$LOGFILE" 2>&1 + +# Tell the sysadmin what went on. +if (( "$ERR" == 0 )); then + # Send a report. + notify "report" + ERR="$?" +else + # sbosrcarch failed, tell the admin. + notify "failure" || [[ -x /opt/bin/pushover-client ]] && /opt/bin/pushover-client "mirroring" -p -1 -s "SBoSrcArch failure" -m "Check log in email" + ERR="1" +fi + +# Compress the log to save some space. +xz -9 "$LOGSDIR/$LOGFILE" 2>/dev/null || printf "%s: %s\\n" "${0##*/}" "failed to compress '$LOGSDIR/$LOGFILE'" >&2 + +exit "$ERR"