admin.sh (2438B)
1 #!/bin/bash 2 # admin.sh - administracion de un servidor de comun/server desde el VPS. 3 # install-vps.sh lo instala como /usr/local/bin/<juego>-admin con NAME, PORT y 4 # KEY_PREFIX ya puestos. Correr con sudo (lee /var/lib/<juego>/admin.key). 5 # 6 # <juego>-admin partidas lista codigos y asientos 7 # <juego>-admin reset <codigo> <nombre> <clave> blanquea la contrasena de ese asiento: 8 # con la clave nueva entra como siempre 9 # 10 # La llave del asiento se deriva igual que en el cliente (seat_key en linux/online.c): 11 # primeros 32 hex de sha256("<prefijo>|" + nombre en minusculas + "|" + contrasena); 12 # las minusculas son solo ASCII (el cliente usa tolower byte a byte, no toca acentos). 13 NAME=${NAME:-catan} 14 PORT=${PORT:-7373} 15 KEY_PREFIX=${KEY_PREFIX:-catan-asiento} 16 DATA=${DATA:-/var/lib/$NAME} 17 18 seat_key() { 19 local name pass 20 name=$(printf '%s' "$1" | LC_ALL=C tr 'A-Z' 'a-z') 21 pass=$2 22 printf '%s|%s|%s' "$KEY_PREFIX" "$name" "$pass" | sha256sum | cut -c1-32 23 } 24 25 case "$1" in 26 partidas) 27 [ -r "$DATA" ] || { echo "no puedo leer $DATA (sudo?)" >&2; exit 1; } 28 for m in "$DATA"/*/meta; do 29 [ -f "$m" ] || continue 30 code=$(basename "$(dirname "$m")") 31 echo "$code $(grep '^OPTS' "$m" | cut -c6-)" 32 grep '^SEAT' "$m" | while read -r _ i k _ name; do 33 case $k in P) kind=humano ;; H) kind=libre ;; B) kind=bot ;; N) kind=neutral ;; *) kind=$k ;; esac 34 printf ' asiento %s: %-8s %s\n' "$i" "$kind" "$name" 35 done 36 done 37 ;; 38 reset) 39 code=$(printf '%s' "$2" | LC_ALL=C tr 'a-z' 'A-Z'); name=$3; pass=$4 40 if [ -z "$code" ] || [ -z "$name" ] || [ -z "$pass" ]; then 41 echo "uso: $0 reset <codigo> <nombre> <contrasena nueva>" >&2 42 exit 1 43 fi 44 secret=$(cat "$DATA/admin.key" 2>/dev/null) || { echo "no puedo leer $DATA/admin.key (sudo?)" >&2; exit 1; } 45 key=$(seat_key "$name" "$pass") 46 exec 3<>"/dev/tcp/127.0.0.1/$PORT" || exit 1 47 # el nombre va al final porque puede tener espacios 48 printf 'HELLO 1 admin\nADMIN %s RESET %s %s %s\nLEAVE\n' "$secret" "$code" "$key" "$name" >&3 49 # WELCOME, despues OK o ERR 50 read -r -t 5 line <&3 51 read -r -t 5 line <&3 52 exec 3>&- 53 echo "$line" 54 case $line in OK*) exit 0 ;; *) exit 1 ;; esac 55 ;; 56 *) 57 echo "uso: $0 partidas | reset <codigo> <nombre> <contrasena nueva>" >&2 58 exit 1 59 ;; 60 esac