The keeper's door asks for a key only root and the waving-hands user can read, so another service on the host cannot re-seat anyone; the deploy makes the key once and the reseat script sends it from a file descriptor; and a seat link is taken out of the address bar with the browser's own call, since the page reads it before the router starts
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MbtUPJ24P6vc6tE1x6RS3m
This commit is contained in:
1 parent
b51934ecd6
commit
21d9c12f48
5 files changed
+41
-8
No files matched your search
+3
-1
@@ -54,7 +54,9 @@ A fresh host, when one is needed: `doctl compute droplet create hall --region ny
|
||||
- `waving-hands-visitors.sh [day]`: who is here now and who came that day.
|
||||
- `waving-hands-reseat.sh ROOM [SEAT]`: who sits at a table; with a seat, a new
|
||||
token for a player locked out of it, as a link to send them. It answers
|
||||
through the duel server's `/keeper` door, which Caddy does not proxy.
|
||||
through the duel server's `/keeper` door, which Caddy does not proxy and
|
||||
which asks for the key in /etc/waving-hands/keeper.key, made by the deploy
|
||||
and readable by root and the waving-hands user alone.
|
||||
- `waving-hands-pulse.sh`: the weekly health check (service, errors, rollup
|
||||
trend, backup, box).
|
||||
- `waving-hands-rollup.sh [day]`: one JSON line per day of counts, run
|
||||
|
||||
@@ -44,6 +44,12 @@ ssh "root@$HOST" '
|
||||
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 755 /opt/waving-hands/app/deploy/waving-hands-reseat.sh /usr/local/bin/waving-hands-reseat.sh
|
||||
# The key to the keeper door: made once, readable by root (the reseat script) and the game user (the server) alone.
|
||||
if [ ! -s /etc/waving-hands/keeper.key ]; then
|
||||
install -d -m 750 -o root -g waving-hands /etc/waving-hands
|
||||
(umask 037; openssl rand -hex 32 > /etc/waving-hands/keeper.key)
|
||||
chown root:waving-hands /etc/waving-hands/keeper.key
|
||||
fi
|
||||
# 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.
|
||||
|
||||
@@ -8,8 +8,12 @@
|
||||
set -euo pipefail
|
||||
ROOM="${1:?usage: waving-hands-reseat.sh ROOM [SEAT]}"
|
||||
DOOR="http://127.0.0.1:8788/keeper/rooms/${ROOM^^}"
|
||||
[ -s /etc/waving-hands/keeper.key ] || { echo "No keeper's key at /etc/waving-hands/keeper.key; a deploy makes it." >&2; exit 1; }
|
||||
# The key goes as a header read from a file descriptor, never on a command line another user could see.
|
||||
KEY="@/dev/fd/3"
|
||||
exec 3< <(printf 'x-keeper-key: %s\n' "$(cat /etc/waving-hands/keeper.key)")
|
||||
if [ $# -lt 2 ]; then
|
||||
curl -s "$DOOR" | python3 -c '
|
||||
curl -s -H "$KEY" "$DOOR" | python3 -c '
|
||||
import datetime, json, sys
|
||||
r = json.load(sys.stdin)
|
||||
if "error" in r: sys.exit(r["error"])
|
||||
@@ -19,7 +23,7 @@ for s in r["seats"]:
|
||||
print(" %-3s %-24s %s" % (s["id"], s["name"], when))
|
||||
'
|
||||
else
|
||||
curl -s -X POST -H 'content-type: application/json' -d "{\"seat\":\"${2^^}\"}" "$DOOR/reseat" | python3 -c '
|
||||
curl -s -X POST -H "$KEY" -H 'content-type: application/json' -d "{\"seat\":\"${2^^}\"}" "$DOOR/reseat" | python3 -c '
|
||||
import json, sys
|
||||
r = json.load(sys.stdin)
|
||||
if "error" in r: sys.exit(r["error"])
|
||||
|
||||
Reference in new issue
Block a user