juegos

Juegos de terminal de Pancho: Catan (TUI, GUI, web, servidor, PicoCalc), ajedrez, calculadora y minijuegos
git clone https://git.lu3dhn.xyz/juegos.git
Log | Files | Refs

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