#!/usr/bin/env bash # Frey's servers: which one is on, which exist, and switching between them. # The macOS twin of tools/server.ps1 — same commands, same behaviour. # # tools/server.sh status # which server is on, and is it up # tools/server.sh list # every server in this repo # tools/server.sh switch terror # turn "terror" on (and the current one off) set -euo pipefail ns=game-servers root="$(cd "$(dirname "$0")/.." && pwd)" active() { kubectl -n "$ns" get statefulset minecraft -o jsonpath='{.spec.template.metadata.annotations.valls\.dev/server}'; } case "${1:-status}" in status) echo "Server on now: $(active)" kubectl -n "$ns" get pod minecraft-0 ;; list) on=$(active) for d in "$root"/servers/*/; do n=$(basename "$d") [[ -f "$d/server.env" ]] || continue v=$(grep -E '^(TYPE|VERSION)=' "$d/server.env" | cut -d= -f2 | tr '\n' ' ') printf '%-20s %s%s\n' "$n" "$v" "$([[ $n == "$on" ]] && echo ' <- on now')" done ;; switch) name="${2:?say which server: tools/server.sh switch }" [[ "$name" =~ ^[a-z0-9][a-z0-9-]{0,39}$ ]] || { echo "server names are lowercase letters, digits and dashes only" >&2; exit 1; } git -C "$root" fetch -q origin git -C "$root" cat-file -e "origin/main:servers/$name/server.env" 2>/dev/null || { echo "servers/$name/server.env is not pushed yet: commit and push it first" >&2; exit 1; } on=$(active) [[ "$on" == "$name" ]] && { echo "$name is already on."; exit 0; } kubectl -n "$ns" patch statefulset minecraft --type merge \ -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"valls.dev/server\":\"$name\"}}}}}" echo "Switching $on -> $name. Waiting for it to start (a brand-new server can take up to 15 minutes)..." kubectl -n "$ns" rollout status statefulset/minecraft --timeout=16m || { echo "It did not start. Look at: kubectl -n $ns logs minecraft-0 -c minecraft --tail=100" >&2; exit 1; } echo "$name is on." ;; *) echo "usage: tools/server.sh status | list | switch " >&2 exit 1 ;; esac