miércoles, agosto 06, 2014

Configurar Stockfish con xinetd y systemd

Detallo a continuación la forma de ofrecer Stockfish como un servicio para acceder al motor de ajedrez mediante una ip y un puerto remoto.

Descargar, compilar y instalar Stockfish
#!/bin/bash
NOMBRE=stockfish
VERSION=$NOMBRE-$(date +"%F")
if [ -e "$VERSION" ]; then
echo "Directorio $VERSION existe, se procede a borrarlo"
rm -rf $VERSION
fi
if [ -h "$NOMBRE" ]; then
echo "Borrando enlace simbolico"
rm -f $NOMBRE
fi
echo "Obteniendo version del repositorio"
git clone https://github.com/official-stockfish/Stockfish.git $VERSION
cd $VERSION/src
make build ARCH=x86-64-modern
cd ../..
ln -s $VERSION/src/ $NOMBRE
Lo de arriba descarga stockfish, lo compila y deja un enlace simbólico a la última versión compilada. Lo bueno de esto, es que podemos ir descargando versiones nuevas para probar sin borrar lo anterior, con solo cambiar el enlace simbólico, usaremos una versión u otra.

Hasta aqui, mas o menos lo normal. Ahora hay que distinguir como vamos a invocar el servicio remoto. Podemos hacerlo mediante xinetd.d al estilo unix antiguo o al nuevo estilo con systemd.

Instalación como servicio bajo xinetd.d estilo sysinit de System V

Se necesitan crear dos ficheros, el primero sirve para indicar a xinetd que cuando se encuentra una petición dirigida al puerto 3333, ejecute el script de arranque del engine stockfish.
cat /etc/xinetd.d
# default: on
# description: An RFC 863 discard server.
# This is the tcp version.
service stockfish
{
disable         = no
server          = /usr/local/bin/chess_server_stockfish.sh
socket_type     = stream
protocol        = tcp
user            = alidhaey
wait            = no
port            = 3333
only_from = localhost
}
El segundo es la propia invocación del engine. He añadido algunos detalles más para que deje en el log el momento de su invocación y de su cierre.
cat /usr/local/bin/chess_server_stockfish.sh
#!/bin/bash
BINENGINE=/usr/local/stockfish/
LOG="/tmp/chess-server-stockfish.log"
/bin/echo "Start $(/bin/date)" > $LOG
/bin/echo >> $LOG
$BINENGINE/stockfish
/bin/echo  | /usr/bin/tee -a $LOG
/bin/echo "Stop $(/bin/date)" | /usr/bin/tee -a $LOG
Instalación como servicio bajo systemd

Con Systemd la cosa va a cambiar, es posible que haya otro forma, ya que aún estoy aprendiendo como funciona systemd, pero no es complicado.
[root@hppavilion system]# pwd
/etc/systemd/system
Creamos el fichero de definición del socket para el servicio de stockfish
[root@hppavilion system]# cat stockfish.socket
[Unit]
Description=Stockfish Engine Chess
[Socket]
ListenStream=3333
Accept=yes
[Install]
WantedBy=sockets.target
y el fichero para el servicio propiamente dicho
[root@hppavilion system]# cat stockfish@.service
[Unit]
Description=Stockfish Engine Chess
[Service]
ExecStart=/home/alidhaey/src/stockfish/stockfish
StandardInput=socket
Y para habilitar el servicio y arrancarlo podemos hacer
systemctl enable stockfish.socket
systemctl status stockfish.socket
systemctl start stockfish.socket
systemctl status stockfish.socket
netstat -nap | grep :3333
En la ruta /home/alidhaey/src/stockfish/stockfish tenemos el fichero resultando de compilar el engine.

Prueba final
[alidhaey@hppavilion ~]# telnet localhost 3333
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Stockfish 220714 64 SSE4.2 by Tord Romstad, Marco Costalba and Joona Kiiski
uci
id name Stockfish 220714 64 SSE4.2
id author Tord Romstad, Marco Costalba and Joona Kiiski
option name Write Debug Log type check default false
option name Write Search Log type check default false
option name Search Log Filename type string default SearchLog.txt
option name Contempt Factor type spin default 0 min -100 max 100
option name Min Split Depth type spin default 0 min 0 max 12
option name Threads type spin default 1 min 1 max 128
option name Hash type spin default 32 min 1 max 1048576
option name Clear Hash type button
option name Ponder type check default true
option name MultiPV type spin default 1 min 1 max 500
option name Skill Level type spin default 20 min 0 max 20
option name Emergency Move Horizon type spin default 40 min 0 max 50
option name Emergency Base Time type spin default 60 min 0 max 30000
option name Emergency Move Time type spin default 30 min 0 max 5000
option name Minimum Thinking Time type spin default 20 min 0 max 5000
option name Slow Mover type spin default 80 min 10 max 1000
option name UCI_Chess960 type check default false
uciok
quit
Connection closed by foreign host.
Si recibimos un uciok, cuando le mandemos el comando 'uci', es que todo ha ido como la seda.

No hay comentarios:

Publicar un comentario