summaryrefslogtreecommitdiff
path: root/contrib/cirrus/ooe.sh
blob: 0966b5ce85b0d66e2a54edf7d6171e4449d3981e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/usr/bin/env bash

# This script executes a command while logging all output to a temporary
# file.  If the command exits non-zero, then all output is sent to the console,
# before returning the exit code.  If the script itself fails, the exit code 121
# is returned.

set -eo pipefail

SCRIPT_BASEDIR="$(basename $0)"

badusage() {
    echo "Incorrect usage: $SCRIPT_BASEDIR) <command> [options]" > /dev/stderr
    echo "ERROR: $1"
    exit 121
}

COMMAND="$@"
[[ -n "$COMMAND" ]] || badusage "No command specified"

OUTPUT_TMPFILE="$(mktemp -p '' ${SCRIPT_BASEDIR}_output_XXXX)"
output_on_error() {
    RET=$?
    set +e
    if [[ "$RET" -ne "0" ]]
    then
        echo "---------------------------"
        cat "$OUTPUT_TMPFILE"
        echo "[$(date --iso-8601=second)] <exit $RET> $COMMAND"
    fi
    rm -f "$OUTPUT_TMPFILE"
}
trap "output_on_error" EXIT

"$@" 2>&1 | while IFS='' read LINE  # Preserve leading/trailing whitespace
do
    # Every stdout and (copied) stderr line
    echo "[$(date --iso-8601=second)] $LINE"
done >> "$OUTPUT_TMPFILE"