Webinterface für Gameserver

T

ThePatriot

Grünschnabel
Hi!!

Wir bieten auf unserem Root-Server Gameserver an, und ich möchte gerne ein eigenes Webinterface dafür schreiben und wäre Froh, wenn ihr mich hierbei in diesem Thread unterstützen könntet! (Oder sozusagen zusammen mit mir erarbeiten und u.a. drüber diskutieren, welche Lösungen am besten sind!)

Und es gäbe doch bestimmt auch gleich ein nettes Tutorial, wenn man das am Schluss zusammenfasst?! =)

Momentane Kenntisse:

- PHP
Ich kann Homepages damit programmieren und hab' schonmal was von dem Befehl shell_exec(), Backticks und dergleichen gehört und auch ein wenig angewendet^^
Wie man z.B. mit PHP die (Game-)Daten eines externen Servers abfragt weiss ich leider noch überhaupt nicht... Genausowenig wie man ihm mit PHP z.B. RCon-Befehle zusenden kann.

- HTML
Eigentlich alles was man braucht

- JavaScript
Ein paar Textfelder vor dem absenden auf den Inhalt prüfen reicht eigentlich bereits =)

- Linux
Ja hmm... gameserver starten, stoppen, bisschen was mit in- und output.. nicht sonderlich viel aber bestimmt mal etwas Grundwissen =)
Aber keine sorge ich bin kein newbie sondern schlage mich bereits seit 10 Jahren mit Computern herum und mach zur Zeit eine Lehre als Informatiker (bin 16)


So zwei dinge mal, die bestimmt wichtig zu wissen sind...

Gameserver als richtigen User starten lassen
----------------
Den Gameserver via PHP starten lassen ist kein Problem.. Doch mit welchem (Linux-)Befehl führt man dies als korrekten Benutzer aus?


PID organisieren
-----------------
Um ihn sicher wieder zu stoppen, denk ich, braucht man die PID. Mit "term <PID>" oder wenn nötig "kill <PID>". Doch wie ermittelt man diese?

Manche (alle?!) Programme legen netterweise eine *.pid Datei ab, in der diese drinsteht. Und sonst?
Ich dachte mir evtl etwa mit
Code:
ps -u <username> -C cod2_lnxded -o pid=
oder ähnlich, aber das ps verarscht mich (naja der Fehler wird halt schon bei mir liegen;) ) und gibt mir nicht das Resultat, das ich will! (z.b. werden bestimmt mehrere "cod2_lnxded" laufen, jedoch unter verschiedenen Benutzernamen. Aber auch zwei gleiche Prozessnamen unter dem selben Benutzer sind nicht auszuschliessen. Notfalls lässt sich dies natürlich vermeiden.)

Als Alternative sähe ich auch, dass man die Ausgabe von
Code:
 ps -o pid,user,fname -u <username>
mit PHP zurechtschneiden würde...


Soweit erstmal zum starten und stoppen der Gameserver =) Ich hoffe ich kann auf eure Mitarbeit zählen, ich wäre euch sehr dankbar!!
 
Wäre das nicht besser in einem der Programmierforen aufgehoben?
 
mcas schrieb:
Wäre das nicht besser in einem der Programmierforen aufgehoben?

Ja, ich verschieb das mal, hat nicht so wirklich viel mit Debian/Ubuntu zu tun.

Gruß, Apu
 
Jo sorry eigentlich wollte ich zu beginn was anderes Fragen aber hab mich dann umentschieden, hab aber nicht mer dran gedacht =)
 
Zuletzt bearbeitet:
Hallo
Wie wär es, wenn du dich erstmal mit der Shell auseinandersetzt, bevor du anfängst diese Möglichkeiten in php zu verpacken?
Zumindest solltest du in der Lage sein, essentielle Dinge eines Linuxsystems zu beherrschen.
Das ist weit mehr als nur ein Start/Stop des Systems.
Sorry, aber deine Frage ist so ähnlich wie:
Ich möchte einen Autopiloten für ein Flugzeug bauen, weiss aber nicht wie man ein Flugzeug steuert.

PHP ist IMHO da auch nicht gerade die am besten geeignete Scriptsprache für soetwas.
Es gibt wesentlich systemnähere Scriptsprachen dafür, die es dir auch mit Performance-Gewinn danken. (e.g.perl, c-script u.ä.)

Gruß Wolfgang
 
Wolfgang_1 schrieb:
Hallo
Wie wär es, wenn du dich erstmal mit der Shell auseinandersetzt, bevor du anfängst diese Möglichkeiten in php zu verpacken?
Zumindest solltest du in der Lage sein, essentielle Dinge eines Linuxsystems zu beherrschen.


Wofür ist denn bitte das Forum hier? Ich würd' mal sagen "learning by doing"! Und wenn du lesen gelernt hast, steht oben geschrieben "Oder sozusagen zusammen mit mir erarbeiten und u.a. drüber diskutieren"

Ich möchte es LERNEN und wäre dankbar, wenn ihr mich dabei UNTERSTÜTZEN würdet!

Wenn ich es könnte bräucht ich erst gar nicht hierher kommen!!


PHP ist IMHO da auch nicht gerade die am besten geeignete Scriptsprache für soetwas.


Code:
Es gibt wesentlich systemnähere Scriptsprachen dafür, die es dir auch mit Performance-Gewinn danken. (e.g.perl, c-script u.ä.)

Performance... MEIN GOTT!! Ok.. was muss das Interface (bzw. PHP in Zusammenarbeit mit Linux) machen?
- Prüfen, ob der Server läuft oder nicht?
- Startbefehl richtig ausführen, so dass...
- ... der Gameserver sich einfach wieder beenden lässt.
- Einen Befehl (z.B. RCon) an den Server senden!


Für das Zeugs braucht man gerade mal ein paar Linux in- und outputs, und DAS WARS! Aber die müssen stimmen, und DESWEGEN FRAG ICH HIER!

Was bitteschön hat DAS mit Performance zu tun?! Ob jetzt der Start-/Stoppbefehl 1 Sekunde früher oder später ausgeführt wird, spielt IMHO keine Rolle!! Und den Server komplett auslasten tut da auch nix!!

---------------------------------------------------

@name
Hm... wie genau stellst du dir das vor? Was, wenn zwei Gameserver den selben Befehl verwenden? Obwohl... da man in den Startbefehl z.b. auch den Port reinbauen kann wär's bestimmt möglich... Obwohl dann eine unheimliche Genauigkeit (ich meine einen String von etwa 50 Zeichen) notwendig ist. Sollte bestimmt möglich sein, jedoch fänd ich's über PID bestimmt sauberer!

Jemand einen Vorschlag?
 
Wow, wow, reg Dich doch nicht direkt so auf!! Wolfgang hat nur eine feststellung gemacht. Keine sorge hier wird Dir geholfen aber auf ein wenig Kretik darfst du nich so reagieren.

Zu PHP und performance. Das ist vieleicht nicht das richtige Wort, es ging darum das es mit PHP ziemlich viel gefummel sein kann das alles ans laufen zu kriegen!! Wenn du was lernen möchtest dann schau dir mal python, die bash, perl und Ruby on rails an. Ich weiß nicht genau was diese rcon dinger sind, aber wenn das nur netzwerverbindungen zu einem Gameserver sind, dann geht das mit den og um vieles einfacher als mit PHP.

Wenn du unbedingt PHP nutzen möchtest, würde ich Dir empfehlen für jede Aufgabe ein bash script zu schreiben, somit hast du nur ein execute im PHP code und das ganze wird übersichtlicher.

Gruss Daniel
 
zu den PID Problemen:
Da erstmal alles als der Benutzer ausgeführt wird, der den apache laufen lässt, müsste alles so installiert werden, dass dieser Benutzer die Gameserver starten kann. Was man evtl. versuchen könnte: Du installierst dir screen und startest den Gameserver immer mit screen und benennst jede screen session eindeutig. Dann kannst du nach dem Namen in ps "greppen" und hast die PID für dein kill. Ist wahrscheinlich nicht die beste Lösung aber gehen tut das bestimmt.
Das was du mit JavaScript machen möchtest kannst du auch mit php erledigen. Du solltest versuchen das ganze dann in so wenig verschiedene Sprachen wie möglich zu programmieren, zumindest wenn mehrere Sprachen das gleiche leisten können. Was nicht heissen soll, dass die Idee von Daniel schlecht ist. Für die Übersichtlichkeit ist das sicher das beste und auch die Wiederverwendbarkeit steigt dadurch.
Zu der Wahl der Sprachen würd ich dir raten die Sprache zu nehmen, die du am besten beherscht. Dadurch kannst du dich am Anfang auf die "Linuxprobleme" konzentrieren. Ein Redesign in Perl kannste später immernoch machen ;-)
Gruß
Marcus
 
Lösung und nicht Teuer:

www.clan-point.de

Fazit: www.gamers-solution.com

Wirklich, das ist das Webinterface was du suchst! Lass das mit dem Selber machen, wenn man ziemlich unerfahren ist in sachen PHP, Shell usw... sollte man die Finger weglassen, weil man andere nur damit belästigst. Denn wenn man ein Hosting aufsetzen will, müßte man vorher schon wissen, was PHP und Mysql+ Shell eigenlich heisst.

Ich kann auch nicht einfach Hoster spielen und keine Ahnung haben. Was ist wenn dem Kunden der Server durch deine Scripte abstürzt? Weisst du nicht und kannst ihn nicht helfen, weil du nicht mal weisst was Shell bedeutet. Also lass die Finger weg, wenn man keine Ahnung hat.

Kauf dir das: www.clan-point.de (erfodert ebendfalls ein WENIG PHP und Shell)

Gruß Michael
 
Nur mal so am Rande: mit PHP kannste das eigentlich vergessen.
Ist zwar möglich aber wirklich sehr sehr umständlich und auch ziemlich unsicher weil du so oder so register_globals auf on und safe_mode auf off haben musst und dann ist auch der kleinste Fehler eine riesen Lücke im System.

Du solltest dir einfach mal angucken wie man einfache Deamons in C++ schreibt und dann nur die jeweiligen Befehle senden. VHCS hat da auch einen sehr guten script da müsstest du nur wenig drann verändern.

Zu deinem Problem mit dem Server und falls du doch PHP verwenden willst:
Machs mit screen.
Es ist ganz einfach, setzt den server mit screen auf, später musst du nur den screen killen (der nicht dynamisch sondern statisch bennant wird) und der Server ist sauber down.
Hier ein Script dafür wo du nur ./cs start und ./cs stop bzw. ./cs restart senden musst:

Code:
clear

# Edit and uncomment it to run the server as non-root
# CS_USER="jwm"

PATH=/bin:/usr/bin:/sbin:/usr/sbin

# # DON'T FORGET TO CHANGE THE PATH TO YOUR NEEDS!
DIR=/hlds

DAEMON=$DIR/hlds_run

# LAN-server:
#PARAMS="-game cstrike -nomaster -insecure +sv_lan 1 +maxplayers 16 +map de_dust"
# Internet-server:
PARAMS="-game cstrike +ip YOUR WAN-IP +map de_dust +maxplayers 16"

NAME=cstrike
DESC="CounterStrike dedicated server"

case "$1" in
 start)
   echo "Starting $DESC: $NAME"
   if [ -e $DIR ];
   then
    cd $DIR
#  Change the lines for running as non-root!
#  su $CS_USER - -c "screen -d -m -S $NAME $DAEMON $PARAMS"
    screen -d -m -S $NAME $DAEMON $PARAMS
   else echo "No such directory: $DIR!"
   fi
   ;;

 stop)
   if [[ `screen -ls |grep $NAME` ]]
   then
       echo -n "Stopping $DESC: $NAME"
       kill `screen -ls |grep $NAME |awk -F . '{print $1}'|awk '{print $1}'`
       echo " ... done."
   else
       echo "Coulnd't find a running $DESC"
   fi
   ;;

 restart)
   if [[ `screen -ls |grep $NAME` ]]
   then
       echo -n "Stopping $DESC: $NAME"
       kill `screen -ls |grep $NAME |awk -F . '{print $1}'|awk '{print $1}'`
       echo " ... done."
   else
       echo "Coulnd't find a running $DESC"
   fi
   
   echo -n "Starting $DESC: $NAME"
   cd $DIR
   screen -d -m -S $NAME $DAEMON $PARAMS
   echo " ... done."
   ;;
 
 status)
   # Check whether there's a "hlds" process
   # if "checkproc" is installed, you can use this:
   # checkproc $DIR/hlds_run && echo "CS-Server RUNNING" || echo "CS-Server NOT RUNNING"
   # (thx to commander)
   ps aux | grep -v grep | grep hlds_r > /dev/null
   CHECK=$?
   [ $CHECK -eq 0 ] && echo "HLDS is UP" || echo "HLDS is DOWN"
   ;; 
 
 *)
   echo "Usage: $0 {start|stop|status|restart}"
   exit 1
   ;;
esac

exit 0

Den Code hatte ich noch aufm PC ist glaube ich von counterstrike.de oder so.
Falls du hilfe dabei brauchst wie du ihn verwendest kannste mir gerne ne PN schreiben.
 
Zuletzt bearbeitet:
register_globals auf on
nein...
und ob nun register_globals off sind und/oder safe_mode spielt doch dann keine Rolle, wenn nur er als einziger User auf dem Server mit PHP agiert, denn solange er die Programmierung sauber durchführt, spielen diese Faktoren keine Rolle. Es spielt nur eine Rolle, wenn er schlampig programmiert und global auf irgendwelches Zeugs zugreift und sich darauf verlässt.
Wenn er das jetzt mit Perl machen müsste, würde er sich um die gleichen Sicherheitsprobleme kümmern müssen wie mit PHP auch. Das macht diesbezüglich also keinen Unterschied.
Auch performancetechnisch sollte man seine Engstirnigkeit mal außen vor lassen, denn für ein Webinterface auf PHP zurückzufallen ist keine so schlechte Entscheidung, da die Performance als Apache-Modul oder über das FastCGI (Apache oder besser noch Lighttpd) um einiges schneller ist als jede stinkige Perl-Anwendung, die über's CGI gezerrt wird, solange es dabei bleibt. Für alles andere soll und kann man ja gerne eine C-Anwendung nutzen, die im Hintergrund agiert. Ich persönlich würde alles, was im Hintergrund wichtig ausgeführt und verwaltet werden muss, in Perl realisieren und die Bedienoberfläche halt mit PHP5 generieren, entweder als Modul oder über das FCGI geschleust.

Ähnliches Konstrukt erlebt man zum Beispiel bei bewährten Produkten wie Plesk e.g..

@ThePatriot: besorg dir einen fähigen Anwendungsentwickler, der dir das dementsprechend entwickelt und implementiert. Wichtig dabei ist in erster Linie die Sicherheit, die mit deinem Wissen nicht gegeben ist. Der zweite Aspekt ist die Funktionalität und Bedienung. Es soll doch funktionieren oder?

*kopfschüttelnd_ins_bett_fall*.
Slasher.
 
Hmmm ... also ich verstehe die ganze Hektik nicht.
sudo könnte doch klappen, oder ... sprich:

/etc/sudoers:

Code:
Host_Alias      LOCAL = localhost, mein.fqn.de
User_Alias      GAMESERVERSTART = user_unter_dem_mein_webserver_laueft, anderer_user
Cmnd_Alias      GAMESERVERCOMMAND = /pfad/zu/meinem/gameserverscript.sh

GAMESERVERSTART LOCAL = (benutzer_unter_welchem_gestartet_werden_soll) NOPASSWD:GAMESERVERCOMMAND
root            ALL = (ALL) ALL

und dann per php einfach
'sudo -u benutzer_unter_welchem_gestartet_werden_soll /pfad/zu/meinem/gameserverscript.sh'

ausführen unn gut iss ....

Das Startskript vom Gameserver sollte auf Bugs geprüft werden, und die Gameserveruser die per sudo die UID wechseln sollten auch SEEEEHR wenig Rechte (ausser eben dem Gameserverstart) besitzen. Aber das ist sowieso wichtig und hat mit dem Start per sudo nix zu tun.

PS: Info's zu sudo: http://www.sudo.ws/sudo

Vielleicht trifft's das ja ;)

Ach, @g0t0: Dein Skript müsste als root ausgeführt werden damit su fusioniert. Damit müsste auch der Apache (o. was auch immer) mit UID 0 Rechten laufen. Würde ich von abraten. Per sudo kann kontrolliert werden wer, wann was, als was, ausführen kann ... oder so .. ;)
Sprich: Man erlaubt dem Benutzer, unter welchem der Apache läuft, den Gameserver unter einer anderen UID laufen zu lassen. Er darf aber nur das, was ich ihm in der sudoers erlaube. Sonst nix. Fehler und Zugriffsverletzungen werden von sudo protokolliert und können ggf. weitergeleitet werden (HIDS, LogFile Parser etc.).

Ich denke, dass dies die einfachste Lösung ist.
Einen Daemon zu basteln finde ich zu viel Aufwand. Er müsste ja auch eine Authentifizierung und Authorisierung durchführen. Dann ist man wieder an PAM und ... und .. und ....

Nuja, vielleicht hilfts ja *winkt*


Aaaah, da war ja noch was mit der PID:
Über die Shell kriegst du die PID des letzten gestarteten Prozesses mit der Variable $!

Allerdings muss man mit daemons aufpassen, da diese ja zumindest 1x forken und sich dann verabschieden, wobei das child dann natürlich eine andere pid hat. Auch wenn im Skript eine subshell aufgemacht wird, wirst du nicht die erwartete PID (sondern nur die von der subshell) bekommen. Also erstmal testen. Die meisten Gameserver bleiben aber normalerweise auf der Shell, töten also nicht den Hauptprozess.
also:
./gameserver_binary [optionen] 1> log 2>> log &
feuert dir das ding in den Background. Danach ein echo $! > /var/run/gameserver.pid und es sollte funzen.
Im stopscript genügt ja dann ein
kill $("/bin/cat" "/var/run/gameserver.pid")

Wenn du die PID so partut nich bekommst, weil er forked, oder subshelled .. oder .. oder ... (mir fallen leider nicht mehr denglische Dinger ein) dann wirst du wohl oder übel über pgrep, pkill gehen müssen. Im Schlimmsten Fall musst du die Ausgabe von ps parsen und dir die PID manuell aus den Diensten holen .. iss zwar umständlich, aber nicht unmöglich ....



Achja, was ich mit dem allen sagen wollte:

Bau dir 2 Shellskripte (keines mit parametern!)
/pfad/wo/es/hin/soll/gameserverstart
/pfad/wo/es/hin/soll/gameserverstop

Beiden erlaubst du, über die /etc/sudoers, dass der apacheuser sie mit dem gameserveruser starten darf
Über php rufst du das jeweilige skript per exec 'sudo -u gameserveruser skriptname' auf
Ob er läuft, oder nicht, kannst du durchs parsen der logs, connecten auf die rcon, parsen der prozessliste oder über setzen/löschen des pid files (letzteres bringst du in den shell skripten unter) kontrollieren.

So müsste es eigentlich funzeln

(in der Zeit wo ich das geschrieben hab', hätt' ich's auch testen können *lach*)


UUUUND: registered_globals kann auf off bleiben :D
UUUUUUUUUND: auch allow_url_fopen kann auf off bleiben ... (iss übrigens fast noch ein grösseres Loch als register_gobals)

UUUUUUUUUUUUUUUND: Ich glaub' ich habe fertig

edit:

Uh, oh ... hatte $? mit $! verwechselt -- $? liefert den _exit() Status des letzten Prozesses, also den Wert der mit return aus der main() oder per exit auf der shell an den aufrufenden Prozess übergeben wird, nicht die PID .. $! liefert selbige ...


Jetzt aba ...

cya


Nachtrag zu allem:
Alles was mit dem Starten/Stoppen der Gameengine zu tun hat NUR in die beiden Skripte.
PHP sollte nur die Dinger aufrufen. Wie du's auf der Shell auch machen würdest.
Die Skripte müssen erkennen, dass ein Stop nicht möglich ist, weil der Gameserver zwischenzeitlich (warum auch immer) weggekracht ist, und ein Start nicht notwendig wäre, und zu fehlern führt, weil der Gameserver schon läuft.
Teste die Skripte unter dem User auf Lauffähigkeit, dann mit dem webserveruser per sudo und erst wenn da alles sauber funktioniert, teste das exec aus php.
Die Skripte kannst du natürlich auch mit perl oder php basteln, du kannst das auch in jeder anderen Sprache machen, aber das muss nich sein. Der Overhead ist zwar vernachlässigbar (was hat ein rootie i.d.R.? Opteron 2.4Ghz Büchsen mit 1.5GB RAM sind schon für 40€ zu haben, was interessierts mich ob da die Büchse ein mal im Monat beim Gameserverneustart 0.5ms länger braucht weils nen perl skript ist und der Interpreter erst geladen werden muss) aber ich tendiere zum Minimalen. Die Shell bietet genug Funktionalität dafür, ist stabil, relativ gut portierbar und von vielen wartbar. Ein Perl o. php skript kannste u.U. nicht mal deinem Kumpel für nen LAN Server 'rüberreichen.
Im php code von der Webseite solltest du vermeiden die Prozesse zu suchen, oder sonst irgendwas systemspezifisches zu machen. Der Aufruf der Skripte ist mehr als genug.
Zustandsabfragen des Gameservers (Spielstand, frags, config errors etc.), per php, kannst du über einen lokalen connect() auf die rcon des Gameservers (anders kommt man eh' nimmer dran, da mit der Trennung von stdin, stdout und stderr die lokale Konsole des Servers wech iss) und unter Verwendung der jeweiligen rcon Befehle herausfinden.
Ausserdem würde ich raten den Zugriff auf die Gameserversteuerung per Benutzerauthentifizierung und ssl/tls verschlüsseltem (ausschliesslich, kein http als fallback erlauben) Zugang zu sichern. Am Besten sogar per SSL Client Authentifizierung, aber das ist viel Aufwand (und für die User meist zu kompliziert).
 
Zuletzt bearbeitet:

Ähnliche Themen

Webinterface für Gameserver/Shellscript wird nicht ausgeführt

SH & PHP funktion klapp aber keine ausgabe

[HowTo] TeamSpeak 2 - RC2 - Server (Deutsch/Englisch)

Server-Monitoring mit RRDTool

Zurück
Oben