#!/usr/bin/env bash # The hall's nightly work for every game on this host, with one Sentry Crons # check-in for the lot: the rollups just after midnight, the backups at # breakfast. Each game's own script does its work and says by its exit # status whether it managed; the games are found by their scripts in # /usr/local/bin, so a game deployed here is covered without being listed. # hall-nightly.sh rollup|backup # Cron: /etc/cron.d/gamehall, installed by gamehall/deploy.sh. SCHEDULE # below must match it, because Sentry is told the same shape. # Sentry Crons check-in: /root/.hall-sentry-cron- holds the check-in # URL (absent = no check-ins). set -u JOB="${1:-}" case "$JOB" in rollup) SCHEDULE="12 0 * * *" ;; backup) SCHEDULE="23 7 * * *" ;; *) echo "usage: hall-nightly.sh rollup|backup" >&2; exit 2 ;; esac LOG="/var/log/gamehall/nightly.log" CRON_URL=$(cat "/root/.hall-sentry-cron-$JOB" 2>/dev/null || true) # One check-in, when the run ends, carrying its duration and the schedule # (Sentry keeps a monitor only once told its shape). A start and a finish # sent seconds apart can reach Sentry in either order, and a start that lands # second is never closed. A run that never ends sends nothing, and Sentry # marks the night missed. START=$SECONDS checkin() { [ -n "$CRON_URL" ] && curl -sf -o /dev/null -X POST -H "Content-Type: application/json" \ -d "{\"status\":\"$1\",\"duration\":$((SECONDS - START)),\"monitor_config\":{\"schedule\":{\"type\":\"crontab\",\"value\":\"$SCHEDULE\"},\"checkin_margin\":30,\"max_runtime\":30,\"timezone\":\"UTC\"}}" \ "$CRON_URL" || true } mkdir -p "$(dirname "$LOG")" # The hall's own count first, then each game's script, in name order. scripts=() [ "$JOB" = rollup ] && scripts+=(/usr/local/bin/gamehall-rollup.sh) for s in /usr/local/bin/*-"$JOB".sh; do [ "$s" = /usr/local/bin/gamehall-rollup.sh ] || scripts+=("$s") done failed=() for s in "${scripts[@]}"; do name=$(basename "$s" "-$JOB.sh") "$s" || failed+=("$name") done if [ ${#failed[@]} -eq 0 ]; then echo "$(date -Is) $JOB: ${#scripts[@]} done" >> "$LOG" checkin ok else echo "$(date -Is) $JOB: ${#scripts[@]} run, failed: ${failed[*]}" >> "$LOG" checkin error exit 1 fi