Mit monit die Serverdienste zu überwachen ist ja eigentlich ganz einfach.
Haarig kann es werden, wenn man auch Gameserver überwachen will.
Zum Beispiel die Battlefield 2 Familie. Erstes Problem ist, wo bekommt man Unterlagen vom proprietären Netzwerkprotokoll für BF2?
Da allerdings BF2 auch über Gamespy gelistet wird, muss es ja auch ein Rcon Abkömmling sein. Und tatsächlich, das berühmte qstat unterstützt auch mit -gs3 / -gs4 das Gamespy Protokoll.
Ein
qstat -nh -P -pa -sort P -gs4 188.40.141.53:29902 score -32767 0ms team#0 [Bot] .=BFC=Wolfhound09
funktionert jedenfalls. Mit dem zusätzlichen Parameter -dump erhält man
000_send.pkt 001_recv.pkt 002_send.pkt 003_recv.pkt 004_recv.pkt
Mit od -x 000_send.pkt erhält man die Hex Darstellung des gesendeten Paketes ansehen:
od -xw2 000_send.pkt 0000000 fdfe 0000002 1009 0000004 3020 0000006 0040 0000007
Nun kann man mal versuchen, ob man es auch per shell hinbekommt: echo "\xfe\xfd\x09\x10\x20\x30\x40\x00" >selbst.pkt Achtung: Hier gibt es eine kleine Falle, wegen der vertauschten Byte Order muss man die Pärchen jeweils drehen, wie hier im Beispiel schon richtig eingetragen ist.Ein diff 000_send.pkt selbst.pkt sollte nun nichts ergeben, die Files sind also identisch.
Bleibt no ein weiterer Test: Mit echo -en "\xfe\xfd\x09\x10\x20\x30\x40"| nc -uvw 1 188.40.141.53 29902 erhält man tatsachlich einen kurzen Stream zurück:
' 0@0'
Und das ist exakt das selbe, wie in 001_receive.pkt enthalten ist.
Damit ist das Rüstzeug für den nächsten Schritt getan.
Ich habe die folgende Datei in /etc/monit/conf.d/bf2aix2 angelegt:
# cat /etc/monit/conf.d/bf2aix2 check process bf2_aix2 with pidfile /var/pfad/zum/gameserver/aix2_tng//bf2-aix2-ng-screen.pid group games start program = "/etc/init.d/bf2aix2 start" stop program = "/etc/init.d/bf2aix2 stop" if failed host 188.40.141.53 port 29902 type udp send "\0xFE\0xFD\0x09\0x10\0x20\0x30\0x40" expect "0@0" with TIMEOUT 4 SECONDS 2 times within 3 cycles then restart if 5 restarts within 5 cycles then timeout
Achtung, monit besteht auf die 4stellige Hex Notation und groß geschriebenen Code Bei expect habe ich die ASCII Code benutzt. Prinzipiell steste ich mit diesem Code nicht wirklich irgend eine Funktion, sondern nur, ob der UDP Port antwortet. So, wenn man nun auch noch das include in der monitrc Datei einträgt,( siehe hier), dann kann man das vor dem monit restart schon mal testen.
monit -t testet die Syntax
#monit -v validate 'bf2_aix2' zombie check passed [status_flag=0000] 'bf2_aix2' succeeded connecting to INET[188.40.141.53:29902] via UDP GENERIC: successfully sent: '�� 0@\0x00' GENERIC: successfully received: ' 0@0' 'bf2_aix2' succeeded testing protocol [generic] at INET[188.40.141.53:29902] via UDP
Das übrigens 2 times within 3 cycles then restartim Script eingebaut ist, verhindert, das der Server nach dem Start gleich als nicht funktionierend bebranntmarkt wird. Bf2 braucht zum start zu lange.
Achso, zum starten verwende ich ein selbstgeschriebenes Startscript, das muss ich nur noch etwas aufhübschen fürs Web.