From 30abb71e26d40d43b5ae954b960b5950a51cbd87 Mon Sep 17 00:00:00 2001 From: Eric Wagoner Date: Mon, 12 Oct 2026 10:07:05 -0400 Subject: [PATCH] The nightly rollup and backup say by their exit status whether they managed, and the deploy leaves the cron file off a host the hall schedules On the shared host the hall's hall-nightly.sh (game-kit, gamehall/ops) runs both scripts for every game and checks in with Sentry Crons once for all, so this game's own check-in files are absent there and its exit status is the word. A box of its own keeps its cron and check-ins as before. Co-Authored-By: Claude Fable 5.1 --- deploy/deploy.sh | 6 +++++- deploy/waving-hands-backup.sh | 7 ++++++- deploy/waving-hands-rollup.sh | 6 ++++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/deploy/deploy.sh b/deploy/deploy.sh index a16db81..ef1260a 100755 --- a/deploy/deploy.sh +++ b/deploy/deploy.sh @@ -43,7 +43,11 @@ ssh "root@$HOST" ' install -m 755 /opt/waving-hands/app/deploy/pulse.sh /usr/local/bin/waving-hands-pulse.sh install -m 755 /opt/waving-hands/app/deploy/waving-hands-rollup.sh /usr/local/bin/waving-hands-rollup.sh install -m 755 /opt/waving-hands/app/deploy/waving-hands-backup.sh /usr/local/bin/waving-hands-backup.sh - install -m 644 /opt/waving-hands/app/deploy/waving-hands.cron /etc/cron.d/waving-hands + # On a host the hall shares, its hall-nightly.sh runs the rollup and backup + # of every game and checks in with Sentry once for all; a game on a box of + # its own schedules its own. + if [ -f /etc/cron.d/gamehall ]; then rm -f /etc/cron.d/waving-hands + else install -m 644 /opt/waving-hands/app/deploy/waving-hands.cron /etc/cron.d/waving-hands; fi mkdir -p /var/log/waving-hands systemctl daemon-reload systemctl enable --now waving-hands diff --git a/deploy/waving-hands-backup.sh b/deploy/waving-hands-backup.sh index 8711cac..d034c2d 100755 --- a/deploy/waving-hands-backup.sh +++ b/deploy/waving-hands-backup.sh @@ -5,6 +5,8 @@ # Ledgers are append-only JSONL; the duel server never needs stopping. # Sentry Crons check-in: /root/.waving-hands-sentry-cron holds the check-in # URL (absent file = no check-ins). SCHEDULE must match /etc/cron.d/waving-hands. +# On a host the hall shares, hall-nightly.sh runs this and checks in once +# for every game, so the file is absent and the exit status is the word. set -u SCHEDULE="23 7 * * *" BUCKET="kestrel-wizwar-backups" @@ -27,9 +29,10 @@ checkin() { if [ ! -s /root/.config/rclone/rclone.conf ]; then echo "$(date -Is) skipped: rclone is not configured" >> "$LOG" - exit 0 + exit 1 fi +status=0 { echo "=== $(date -Is) backup start" if rclone sync "$SRC" "spaces:$BUCKET/$PREFIX/current" --exclude 'rollup.jsonl' 2>&1 && @@ -37,6 +40,7 @@ fi checkin ok else checkin error + status=1 fi CUTOFF=$(date -d "90 days ago" +%Y-%m-%d) rclone lsf "spaces:$BUCKET/$PREFIX/snapshots/" --dirs-only 2>/dev/null | \ @@ -49,3 +53,4 @@ fi done echo "=== $(date -Is) backup done" } >> "$LOG" 2>&1 +exit $status diff --git a/deploy/waving-hands-rollup.sh b/deploy/waving-hands-rollup.sh index 977d440..aef8286 100755 --- a/deploy/waving-hands-rollup.sh +++ b/deploy/waving-hands-rollup.sh @@ -8,7 +8,9 @@ # Cron: /etc/cron.d/waving-hands, installed by deploy.sh; SCHEDULE below # must match it, because the Sentry monitor is told the same shape. # Sentry Crons check-in: /root/.waving-hands-sentry-cron-rollup holds the -# check-in URL (absent = no check-ins). +# check-in URL (absent = no check-ins). On a host the hall shares, +# hall-nightly.sh runs this and checks in once for every game, so the +# file is absent and the exit status is the word. set -u OUT="/var/lib/waving-hands/rollup.jsonl" LOG="/var/log/waving-hands/rollup.log" @@ -78,4 +80,4 @@ with open(out + ".tmp", "w") as fh: os.replace(out + ".tmp", out) print("%s rolled: %d people, %d requests, %d rooms" % (day, len(t["addresses"]), t["human"], created)) PY -then checkin ok; else checkin error; fi +then checkin ok; else checkin error; exit 1; fi