chess-server.sh (4206B)
1 #!/usr/bin/env bash 2 # ^ Esta primera linea se llama "shebang". Le dice al sistema operativo con que 3 # programa tiene que ejecutar este archivo. En este caso, con "bash" (el 4 # interprete de comandos). Asi podemos correr el archivo directamente con 5 # ./bin/chess-server.sh en vez de tener que escribir "bash bin/chess-server.sh". 6 # 7 # ============================================================================ 8 # bin/chess-server.sh -- Servidor "relay" (repetidor) para jugar en red. 9 # ============================================================================ 10 # 11 # QUE ES ESTE ARCHIVO (para alguien que recien arranca): 12 # El ajedrez se puede jugar entre dos computadoras conectadas a la misma red 13 # local (por ejemplo, dos notebooks en la misma casa con el mismo WiFi). 14 # Hay dos formas de conectarlas: 15 # 1) "peer to peer": una computadora hace de servidor y la otra se conecta 16 # directo a ella. 17 # 2) con un "relay" (repetidor): una tercera computadora (o la misma) corre 18 # ESTE programa, y las dos jugadoras se conectan al relay. El relay no 19 # sabe nada de ajedrez: lo unico que hace es copiar cada mensaje que le 20 # manda una jugadora y reenviarselo a la otra. Como un cartero. 21 # 22 # Toda la logica del ajedrez vive en las jugadoras (en ches.sh y lib/). El relay 23 # es "tonto" a proposito: solo mueve textos de un lado al otro. 24 # 25 # COMO SE USA: 26 # ./bin/chess-server.sh [puerto] (si no pasas puerto, usa el 9000) 27 # y despues cada jugadora corre: ./ches.sh server <ip-de-esta-maquina> <puerto> 28 29 # --- Que puerto vamos a usar ------------------------------------------------ 30 # Un "puerto" es como el numero de un departamento dentro de un edificio (la 31 # computadora es el edificio, identificado por su IP). Los programas de red 32 # escuchan en un puerto para que otros sepan a donde golpear la puerta. 33 # 34 # "$1" es el PRIMER argumento que le pasamos al script en la linea de comandos. 35 # La sintaxis "${1:-9000}" significa: "usa $1; pero si $1 esta vacio o no 36 # existe, usa 9000 en su lugar". O sea, 9000 es el valor por defecto. 37 PORT="${1:-9000}" 38 39 # --- Chequear que tengamos la herramienta que necesitamos ------------------- 40 # "ncat" es un programita (viene en el paquete "nmap") que sabe abrir conexiones 41 # de red. Lo usamos para el relay. Antes de seguir, verificamos que este 42 # instalado. 43 # 44 # "command -v ncat" busca el programa ncat y, si lo encuentra, devuelve exito. 45 # ">/dev/null" tira a la basura lo que imprima ese comando (no nos interesa ver 46 # la ruta, solo queremos saber si existe). "/dev/null" es un "agujero negro": 47 # todo lo que mandas ahi desaparece. 48 # 49 # El "||" quiere decir "O si lo anterior FALLO, entonces...". En bash, cada 50 # comando devuelve un numero: 0 = salio todo bien, distinto de 0 = hubo error. 51 # Entonces "comandoA || comandoB" ejecuta comandoB SOLO si comandoA fallo. 52 # 53 # Las llaves { ... } agrupan varios comandos para que se ejecuten juntos. 54 # "echo ... >&2" imprime un mensaje de error: ">&2" lo manda a la "salida de 55 # errores" (que es la forma correcta de mostrar errores, separados de la salida 56 # normal). "exit 1" termina el programa devolviendo 1 (codigo de error). 57 command -v ncat >/dev/null || { echo "ncat is required (install nmap)." >&2; exit 1; } 58 59 # --- Avisarle a la persona que arranco bien --------------------------------- 60 # "echo" simplemente imprime texto en la pantalla. Ojo: los mensajes que ve la 61 # persona quedan en ingles a proposito (es la interfaz del juego). 62 echo "Chess relay server listening on port ${PORT} (broker mode)." 63 echo "Players connect with: ./ches.sh server <server-ip> ${PORT}" 64 echo "Press Ctrl-C to stop." 65 66 # --- Arrancar el relay de verdad -------------------------------------------- 67 # "exec" reemplaza este script por el programa que le pasamos (ncat). Es decir, 68 # a partir de aca el proceso DEJA de ser nuestro script y PASA a ser ncat. Lo 69 # usamos porque no necesitamos hacer nada mas despues: que ncat se quede 70 # corriendo para siempre haciendo de repetidor. 71 # 72 # Banderas de ncat: 73 # -l "$PORT" "listen": quedate escuchando conexiones en este puerto. 74 # --broker modo repetidor: reenvia a cada cliente lo que mandan los demas. 75 exec ncat -l "$PORT" --broker