Toon posts:

[inetd] Starten van Services

Pagina: 1
Acties:

Verwijderd

Topicstarter
Omdat ik via 1 bak services op andere bakken wil aan/uit kunnen schakelen, heb ik inetd in de hand genomen en een php scriptje gemaakt. Als je connect naar mijn script, wordt er eerst ge-authenticate, etc. Daana worden de input commando's geparsed, en start of stop ik de service:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
// KNIP
                $path = "/startstop/game/" . $data['which'] . "/" . $data['username'];
                if (is_link($path) || is_file($path))
                {
                    $cmd = "/usr/bin/nohup $path " . $data['do'] . " >/dev/null 2>&1 &";
                    $ret = shell_exec($cmd);

                    die ("+OK Attempted to " . $data['do'] . " server\n");
                }
                else
                    die ("-ERR Script not found\n");
// KNIP


In /startstop/game/{gamenaam}/{username} staan symbolic links naar de init scripts van de servers. Het gaat om Unreal Tournament servers, en de links verwijzen naar de alom bekende ASU ucc.init scripts. De service op deze manier stoppen gaat perfect, maar het starten is een probleem, omdat de verbinding na het starten van de service en het uitvoeren van het PHP script niet automatisch closed.

Wat er gebeurt bij het stoppen van een UT server:
code:
1
2
3
4
server:/scripts# echo "username=utserver&password=blablabla&action=server&which=ut&do=stop"\
| nc localhost adminservice
+OK Attempted to stop server
server:/scripts#

Dit ziet er dus goed uit.

Bij het starten van een UT server:

code:
1
2
3
server:/scripts# echo "username=utserver&password=blablabla&action=server&which=ut&do=start"\
| nc localhost adminservice
+OK Attempted to start server

Ik krijg mijn commandprompt niet terug: de connectie wordt niet gesloten, terwijl het PHP script toch helemaal is uitgevoerd. Ik vermoed dus dat inetd de verbinding pas sluit als alle processen gestart door het script, ook gestopt zijn. Iets wat ik dus niet wil :'(. Als ik overigens ctrl-c na de startpoging is de server wel gestart.

Heeft iemand enig idee hoe ik dit kan oplossen?

[ Voor 6% gewijzigd door Verwijderd op 07-09-2003 20:39 ]


  • _JGC_
  • Registratie: Juli 2000
  • Laatst online: 01:39
je zou met fopen die poort kunnen openen, dan met fputs die string erheen flikkeren en dan fclose kunnen doen. Misschien zou je een fgets kunnen doen om het statusbericht terug te krijgen, maar ik denk dat ie gaat wachten op een timeout of iets dergelijks.

Verwijderd

Topicstarter
Klopt :) ik denk dat ik zelfs met die fgets dat statusbericht nog wel kan ophalen, als ik de timeout heel laag zet. Probleem is dat de werking van mn daemon dan redelijk afhankelijk is van de werking van de client: iets wat mij niet aanstaat :). Vandaar dat ik het graag aan de serverkant wil oplossen. Toch bedankt voor je reactie :)

  • _JGC_
  • Registratie: Juli 2000
  • Laatst online: 01:39
Of je nou een exec uitvreet of een fopen/fputs/fgets, je krijgt beide keren hetzelfde resultaat: die PHP code moet uitgevoerd worden op de server, de output krijg je op je browserscherm. Tis dus helemaal niet clientafhankelijk.

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 14-04 13:57

Bergen

Spellingscontroleur

Misschien geeft hij toch output terug in de vorm van een vraag ofzo. In dit geval natuurlijk niet naar STDOUT, dus maak er eens echo shell_exec (...); van zonder > /dev/null, om te kijken of je output krijgt.

Verwijderd

Topicstarter
_JGC_ schreef op 07 September 2003 @ 22:57:
Of je nou een exec uitvreet of een fopen/fputs/fgets, je krijgt beide keren hetzelfde resultaat: die PHP code moet uitgevoerd worden op de server, de output krijg je op je browserscherm. Tis dus helemaal niet clientafhankelijk.
Volgens mij begrijp ik je niet helemaal (of jij begrijpt mij niet :) ). Die php code wordt uitgevoerd dmv inetd, in /etc/inetd.conf staat:

code:
1
adminservice     stream  tcp     nowait  root    /scripts/admin.daemon.php


Het heeft dus verder niks met een browser ofzo te maken. Het is de bedoeling dat ik met een andere (ook php) applicatie (de client) naar deze server to connect en dan die commands ga uitvoeren. Ik wil dan wel dat de server automatisch de verbinding sluit nadat het resultaat is geoutput.

Verwijderd

Topicstarter
GerbenW schreef op 07 September 2003 @ 23:07:
Misschien geeft hij toch output terug in de vorm van een vraag ofzo. In dit geval natuurlijk niet naar STDOUT, dus maak er eens echo shell_exec (...); van zonder > /dev/null, om te kijken of je output krijgt.
Dan komt het probleem dat PHP gaat wachten op de output. >/dev/null voorkomt onder andere dat PHP gaat wachten op output (http://php.net/exec staat het ergens bij user comments).

De output die ik krijg is dan:

code:
1
2
3
echo "username=utserver&password=blabla&action=server&which=ut&do=start"\
| nc localhost adminservice
Starting Unreal Tournament: ucc.utserver.init


(geen prompt dus)

Het probleem is echt duidelijk de inetd en niet PHP (anders stond dit topic wel in P&W :+), want als ik dat command rechtsreeks naar het PHP script pipe werkt het wel (dit dus weer met die > /dev/null, zonder dit komt ook hier geen prompt terug):

code:
1
2
3
4
server:/scripts# echo "username=utserver&password=blabla&action=server&which=ut&do=start"\
| /scripts/adminservice.daemon.php
+OK Attempted to start server
server:/scripts#



[edit]
Dat is wel waar, ook door je & aan het eind zou hij meteen terug moeten komen... Als je het handmatig intoetst op die bak gaat het dus wel helemaal goed?
Jup...

[ Voor 21% gewijzigd door Verwijderd op 07-09-2003 23:26 ]


  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 14-04 13:57

Bergen

Spellingscontroleur

Dat is wel waar, ook door je & aan het eind zou hij meteen terug moeten komen... Als je het handmatig intoetst op die bak gaat het dus wel helemaal goed?

  • sebas
  • Registratie: April 2000
  • Laatst online: 16-12-2025
offtopic:
11 years of inetd default insecurity?

deze al gelezen?

Everyone complains of his memory, no one of his judgement.


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 01-05 17:37

Gerco

Professional Newbie

Wat ik altijd heb is als ik een ut server start via ssh (PuTTY) en dan op ctrl-d druk, mn ssh sessie ook blijft hangen. Misschien heeft dat er iets mee te maken? Lijkt er wel op namelijk.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Verwijderd

Topicstarter
Gerco schreef op 08 September 2003 @ 10:53:
Wat ik altijd heb is als ik een ut server start via ssh (PuTTY) en dan op ctrl-d druk, mn ssh sessie ook blijft hangen. Misschien heeft dat er iets mee te maken? Lijkt er wel op namelijk.
Gebruik je dan nohup om de server te starten?

Verwijderd

Topicstarter
Ben er nog steeds niet uit :'(, dus een voorzichtige *kick*.
Pagina: 1