Wer einen Gameserver betreibt kennt das Problem, immer wenn man des Server starten oder stoppen will muss man sich auf der Konsole anmelden und dort den Befehlt eingeben. Gleiches gilt wenn man die Konfiguration des Servers ändern möchte. Für einen Erfahrenen Admin mag das noch problemlos machbar sein, aber wenn man auch Freunden die Möglichkeit geben will den Gameserver zu nutzen und zu verwalten stößt man hier auf ein Problem. Einige Einstellungen können zwar falls der Gameserver das unterstützt per RCON gemacht werden aber oft werden die Einstellungen beim Mapwechsel wieder überschrieben. Starten kann man den Server auf keinen Fall per RCON da RCON erst verfügbar ist wenn der Server läuft.
Die einfachste Lösung für das Problem wäre ein Webinterface, allerdings gibt es hier kaum fertige Lösungen. Es gibt zwar ein Webinterface von Teklab mit dem sich auch Gameserver verwalten lassen, aber das ist sehr teuer und bringt viele Dinge wie eine Kundenverwaltung mit die man nicht benötigt wenn man einfach nur seinen privaten Gameserver steuern möchte. Ich habe für meinen Gameserver lange nach einer optimalen Lösung gesucht aber nichts gefunden mit dem ich zufrieden war. Also musste mal wieder selber gecodet werden. In meinen ersten Versuchen habe ich einfach die nötigen Befehle per shell_exec von PHP an das Betriebssystem übergeben. Das hat aber mehrere Nachteile, zum einen muss der PHP safe mode ausgeschaltet werden was Sicherheitslücken aufreisen kann und zum anderen muss auf dem Gameserver ein Webserver installiert sein. Außerdem kann man so nicht mehrere Gameserver die auf verschiedenen Maschinen liegen über ein Interface steuern. Die deutlich bessere Lösung liegt darin das man auf dem Gameserver ein Programm installiert das auf einem bestimmten Port horcht und dort Befehle vom Interface entgegen nimmt. Auf meinen Servern habe ich das in Perl umgesetzt, der Code dazu sieht grob folgendermaßen aus:
#!/usr/bin/perl -w use strict; use IO::Socket; my $port = 8055; # Port angeben # Socket erstellen my $socket = new IO::Socket::INET ( LocalPort => $port, Listen => 1, Proto => 'tcp', Reuse => 1 ); print "Server gestartet...\n"; # Benutzer volllabern while() # Dauerschleife zum horchen { my $client = $socket->accept(); # Ankommende Socket Verbindungen annehmen $client->recv(my $response, 1024); # Befehl empfangen if($response eq "start") # Wenn "start" gesendet wurde { system("BEFEHL ZUM SERVER STARTEN"); # Befehl auf Konsole ausführen $client->send("Server gestartet"); # Rückgabe an Client senden } if($response eq "stop") # Wenn "stop" gesendet wurde { system("BEFEHL ZUM SERVER STOPPEN"); # Befehl auf Konsole ausführen $client->send("Server gestoppt"); # Rückgabe an Client senden } }
Damit lässt sich der Server dann schon mal starten und stoppen, das ganze kann dann noch um weitere Funktionen wie lesen oder schreiben der Config-Datei erweitert werden.
Jetzt braucht man noch das Interface das den Gameserver anspricht, das kann eigentlich mit jeder Programmiersprache die Sockets unterstützt geschrieben werden. Da ich meine Server über ein Webinterface verwalte habe ich es in PHP umgesetzt, der Code dazu sieht folgendermaßen aus:
$host = 'localhost'; // Host
$port = 8055; // Port auf dem das Perl Script läuft
$action = 'start'; // Variable für die Aktion die ausgeführt werden soll
$socket = fsockopen($host,$port,$errno,$error,5); // Verbindung aufbauen
fwrite($socket, $action); // Befehl an Socket senden
while (!feof($socket)) // Socket lesen
{
$tmp = fgets($socket); // Rückgabe holen
echo $tmp; // Rückgabe ausgeben
}
fclose($socket); // Socket schließen
Damit nicht jeder der den Port kennt den Gameserver steuern kann sollte das ganze natürlich noch mit einem Passwort geschützt werden oder man nimmt Befehle nur von einer bestimmten IP-Adresse an.
Das Ganze gibt natürlich nur als Bespiel und sollte auf keinen Fall so 1:1 übernommen werden, aber es zeigt recht gut wie einfach man sich ein Interface für seinen Gameserver selber schreiben kann.
Kommentare