#!/bin/bash # $HeadURL$ $LastChangedRevision$ PROGNAME=$(/usr/bin/basename $0) TMP_DIR=${TMP_DIR:-/var/tmp} # The purpose of this script is to workaround mail injectors that timeout if # the body is not provided quickly enough. (E.g. masqmail times out before # my backup script completes.) main() { local RECIPIENT STDERRREDIRECTION_FLAG RC CMD # Defaults for options RECIPIENT=$LOGNAME STDERRREDIRECTION_FLAG=true VERBOSELEVEL=2 # Process options while [ "X$1" != X ]; do case $1 in -v|--verbose) VERBOSELEVEL=3 ;; -d) VERBOSELEVEL=$2; shift ;; --debug=*) VERBOSELEVEL=${1#*=} ;; --to=*) RECIPIENT=${1#*=} ;; --) shift; break ;; --no-stderr-redirection) STDERRREDIRECTION_FLAG=false ;; -h|--help) usage 0 ;; -*) usage ;; *) break ;; esac shift done # Process arguments [ "X$1" != X -a "X$2" = X ] || usage CMD="$1" # Sanity checks [ "X$RECIPIENT" != X ] || error "recipients not specified/determinable" # Run command if $STDERRREDIRECTION_FLAG; then eval "$CMD" > $TMP_DIR/$PROGNAME.$$.cmdout 2>&1 else eval "$CMD" > $TMP_DIR/$PROGNAME.$$.cmdout fi RC=$? CMDOUT_SIZE=$(stat -c %s $TMP_DIR/$PROGNAME.$$.cmdout) # Catch silent errors if [ $RC != 0 -a $CMDOUT_SIZE = 0 ]; then echo "$PROGNAME: ERROR: command \"$CMD\" exited with exit code $RC, but produced no output" > $TMP_DIR/$PROGNAME.$$.cmdout CMDOUT_SIZE=$(stat -c %s $TMP_DIR/$PROGNAME.$$.cmdout) fi # Mail output if there is any if [ $CMDOUT_SIZE != 0 ]; then mail -s "$PROGNAME <$LOGNAME@$HOSTNAME> $CMD" $RECIPIENT < $TMP_DIR/$PROGNAME.$$.cmdout > $TMP_DIR/$PROGNAME.$$.mailout fi # Clean up rm -f $TMP_DIR/$PROGNAME.$$.cmdout $TMP_DIR/$PROGNAME.$$.mailout return $RC } usage() { local RC RC=${1:-1} { echo "Usage: $PROGNAME [ ] " echo echo "Options: -v | --verbose be verbose" echo " -d | --debug= be very verbose" echo " -h | --help show this text" echo " --no-stderr-redirection don't capture stderr" echo " --to= mail output to instead of \$LOGNAME" echo } | if [ $RC = 0 ]; then cat else cat >&2 fi exit $RC } ############################################################################## # # Messaging functions # ############################################################################## debug() { [ ${VERBOSELEVEL:-2} -lt $1 ] || echo "$PROGNAME: DEBUG[$1]: $2" >&2; } info() { [ ${VERBOSELEVEL:-2} -lt 3 ] || echo "$PROGNAME: INFO: $1" >&2; } warning() { [ ${VERBOSELEVEL:-2} -lt 2 ] || echo "$PROGNAME: WARNING: $1" >&2; } error() { [ ${VERBOSELEVEL:-2} -lt 1 ] || echo "$PROGNAME: ERROR: $1" >&2; exit 1; } internal() { echo "$PROGNAME: INTERNAL ERROR: $1" >&2; exit 2; } ############################################################################## # # Entry point # ############################################################################## main "$@"