Integracja serwera ICS ze stroną internetową

2010-09-30 , Papiewski Łukasz , Szachy

Na podstawie serwera FICS (zob. fics) oraz wiadomości o mainframe'ach (zob. mainframe) został zaimplementowany serwer dla programów szachowych.

Serwer ten w obecnej formie jest dostępny pod adresem IP 212.191.89.82 na porcie 5001. Można dzięki niemu rejestrować silniki szachowe oraz mierzyć ich wydajność.

Serwer programów szachowych. Powyżej przedstawiono aplikacje (wymagane lub opcjonalne) potrzebne do zrealizowania serwera programów szchowych na mainframie. Są to m.in system operacyjny Linux (Debian lub Slack390), serwer WWW - Apache, parser PHP, serwer szachowy - Chessd, oraz baza danych (MySQL lub PostrgreSQL). Proces instalacji przebiaga za pośrednictwem HMC (system operacyjny) oraz poprzez zdalne połączenie SSH w terminalu (reszta aplikacji).

W związku, że cała platforma jest oparta na architekturze s390, aplikacje które nie były dostępne wraz z dystrybucją Linux musiały zostać skompilowany ze źródeł. Tak było m.in w przypadku serwera chessd (zob. chessd).

Należy podkreślić, że rynek aplikacji dla komputera mainframe wraz z wprowadzeniem systemu z/Linux bardzo się poszerzył, umożliwiając tym samym realizacje tego projektu. Jednak mimo wprowadzenia pierwszej wersji systemu ok. 10 lat temu, nadal wielu deweloperów aplikacji nie w pełni wspiera architektury s390 (zobacz rozdział timeseal).

Komputery PC jako silniki szachowe

Skonfigurowano i przygotowano do pracy pięć komputerów klasy PC, jako klientów serwera szachowego (wraz z mocą procesora i ilością pamięci RAM):

  • 2 x Compaq - 1.2 GHz, 512MB
  • 2 x Dell - 1.8 GHz, 512 MB
  • 1 x IBM x445 4 x 1.8 GHz, 4GB

Zainstalowano na nich systemy operacyjne Linux (Slackware, Gentoo, Debian) oraz Windows (XP). Na każdym skonfigurowano i uruchomiono silnik szachowy (Stockfish, Crafty, Gnuchess, Rybka). Wszystkie Komputery umieszczono w racku. Znajdują się w KIS na ul. Stefanowskiego. Poglądowy schemat połączeń silników wraz z serwerem na mainframie z800 przedstawia rysunekpic:diagram.

Schemat projektu serwera programów szachowych na mainframie w KIS. Po prawej znajduje się rack z pięcioma skonfigurowanymi komputerami (programami szachowymi) podłączonymi do serwera na mainframie (po lewej stroni). Chmura reprezentuje sieć internetową łącząca zewnętrznych klientów z serwerem. Mogą to być użytkownicy bądź silniki szachowe. pic:diagram

Automatyzacja zadań serwera Chessd

chessd-scripts

W związku z potrzebą automatyzacji zadań na serwerze chessd opracowano dodatkowe skrypty.

Poniżej plik telnet.sh mający za zadanie połączenia się z serwerem ICS jako użytkownik typu admin oraz wykonania podskryptu pose-match.sh z dalszymi komendami.

caption=telnet.sh,language=bash
sleep 2
echo "roboAdmin"
sleep 2
echo "49g9"
sleep 2
./pose-match.sh `cat list.txt | xargs`
sleep 2
echo "exit"

Powyższy skrypt należy wywołać poleceniem:

./telnet.sh | telnet 212.191.89.82 5000

Dla każdego danego użytkownika wykonywana jest wbudowana komenda match rozpoczynająca grę z podanym przeciwnikiem.

caption=pose-match.sh,language=bash
#!/bin/sh
list1=$(printf "%s\n" $@ | ./randomShuffle.sh)
list2=$(printf "%s\n" $@ | ./randomShuffle.sh)
for i in $list1 ;do pose=$pose"pose $i seek 5 0 rated;"; done;
echo $pose;
language=bash,caption=Skrypt roboAdmin - komenda mecz #!/bin/sh list=$@ for i in $list; do for j in $list; do echo "pose $i match $j 1 0 rated"; sleep 1 ; done; done;

Lista podana jako pierwszy parametr jest plikiem tekstowym zawierającym oddzielone znakiem końca linii nazwy silników szachowych.

W przypadku gdy silnik szachowy jest administrowany z poziomu strony internetowej na serwerze należy sprawdzić, czy dozwolone jest z poziomu PHP operowania na plikach tekstowych, gdyż często funkcja ta w związku z bezpieczeństwem jest zablokowana.

Alternatywnym sposobem pobierania listy jest komenda SQL wykonywana za pośrednictwem konsolowego klienta bazy danych (tylko dla serwera chessd) np. jak mysql:

mysql -s chessd -e "select username from ChessdList where action='seek'"

Przełącznik -s usuwa ramki i separuje kolumny tabulatorem, chessd jest tu bazą danych, a komenda po przełączniku -e zwraca nazwy użytkowników z tabeli ChessdList spełniający warunek (action) odpowiedni dla zadanej listy (tu seek, czyli użytkowników, którzy zadeklarowali grę z każdym chętnym do gry).

Inicjacja całej sekwencji wykonywana jest w pętli while. Uwzględniono wartość pauzy (komenda sleep) tu średnio równej długości najkrótszego pojedynku, czyli ok. 60 sekund, w celu zapewnienia optymalnego czasu ponownego logowania.

while true; do ./telnet.sh | telnet localhost 5000; sleep 60; done;

Implementacja skryptów dla silników szachowych

Skrypt crafty.sh uruchamia silnik z odpowiednimi parametrami. Crafty potrafi się bezpośrednio komunikować z Xboardem, więc można to wykorzystać w celu łączenia się za jego pośrednictwem z ICS-em. Skrypt startowy jest podobny do przedstawionego niżej sryptu startowego dla silnika Stockfish. Ten drugi wymaga programu polyglot (linijka 11), gdyż komunikuje się protokołem UCI (9). Linijki 17 i 18 poniższego skryptu zapewniają, że w przypadku jakiegoś błędnego ruchu lub wyjątku program nie będzie wyświetlał informacji blokujących dalszą aktywność. Linijka 14 wskazuje na plik z dwoma linijkami zawierającymi login i hasło (znak końca linii pliku musi być w formacie unix).

caption=stockfish.sh
while true;
    do 
    xboard  
        -size small 
        -zp 
        -ics 
        -icshost 212.191.89.82 
        -autoflag 
        -fUCI   
        -fd "stockfish-171-linux/src/" 
        -fcp "polyglot stockfish.ini"
        -zippyPlay True 
        -zippyGameEnd "say thaks; ;seek 1 0 rated;"   
        -icslogon .stockfish  
        -usePolyglotBook true
        -icshelper "timeseal"
        -popupMoveErrors false 
        -popupExitMessage false
        ;
        sleep 10;
    done;

Analogiczny jak dla systemu Linuks skrypt wsadowy dla systemu Windows (tu dla programu gnuchess) przedstawiono poniżej:

caption=gnuchess.bat
"c:\Program Files\WinBoard-4.2.7\winboard.exe" 
    /zp /ics 
    /icshost=212.191.89.82  
    /zippyGameEnd="say thanks!; seek 1 0; seek 2 0; seek 5 0;" 
    /fcp=GNUChess.exe 
    /fd="C:\Program Files\WinBoard-4.2.7" 
    /icslogon="c:\Documents and Settings\engine\My Documents\gnuchess.txt" 
    /popupExitMessage=false
    /icshelper=timeseal

Przydatną rzeczą jest uruchomienie silnika pod Windowsem wykorzystując komende while. Rozwiązaniem może być tu biblioteka cygwin.dll oraz pakiet BASH taką komende zawierający. Dzięki temu można uruchomić skrypt .bat następująco:

while true; do gnuchess.bat; sleep 10; done;

Pętla zapewnia, w wypadku jakiegoś czynnika rozłączającego połącznie, automatyczne wznowienie pracy.

Cytaty

- Simplicity is the ultimate sophistication. - Leonardo da Vinci,
- Popularny człowiek wzbudza zawiść potężnych - Thufir Hawat o Leto Atrydzie (na Kaladanie),
- Szczęście następuje po smutku, a smutek po szczęściu; człowiek jest naprawdę wolny, gdy przestaje rozróżniać między smutkiem a szczęściem, między dobrem a złem - Aforyzmy buddyjskie.