summaryrefslogtreecommitdiff
path: root/src/cronjob
blob: 0e04c8b6f427012718ab4ede9952b95b489aff7b (plain) (blame)
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/bin/sh
set -eu


usage() {
	cat <<-'EOF'
		Usage: cronjob COMMAND...
	EOF
}


if [ -z "${1:-}" ]; then
	printf 'Missing COMMAND.\n\n' >&2
	usage >&2
	exit 2
fi



duration() {
	minutes=$((${1} / 60))
	seconds=$((${1} % 60))
	printf '%sm%ss' "$minutes" "$seconds"
}


CMD="$*"
HOSTNAME="$(hostname)"
FROM="cronjob@$HOSTNAME"
TIMEOUT='10800' # three hours
STATUS_F="$(mkstemp)"
OUT="$(mkstemp)"

email() {
	{
		cat <<-EOF
			Content-Type: text/plain; charset=UTF-8
			Content-Transfer-Encoding: 8bit
			From: $FROM
			To: root@localhost
			Subject: (exit status: $(cat "$STATUS_F")) - $HOSTNAME: $CMD

		EOF
		cat "$OUT"
	} | sendmail -t -f "$FROM"
	rm -f "$OUT" "$STATUS_F"
}
trap email EXIT

{
	cat <<-EOF
		Running commad: $CMD
		Starting at: $(timestamp -E)

	EOF

	START="$(now)"
	STATUS=0
	timeout "$TIMEOUT" "$@" || STATUS=$?
	printf '%s' "$STATUS" > "$STATUS_F"
	END="$(now)"
	DURATION_SECONDS=$((END - START))

	cat <<-EOF

		Finished at: $(timestamp -E)
		Duration: $(duration "$DURATION_SECONDS")
	EOF
} 2>&1 |
	pre "$(printf '[%s]: %s\n' "$CMD")" |
	ts '%Y-%m-%dT%H:%M:%S' |
	tee "$OUT" >> /var/log/cronjobs.log