mit inetd Python-Server starten lassen...

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Samstag 12. März 2005, 18:25

Hab in "/etc/inetd.conf" folgendes eingetragen:

Code: Alles auswählen

pyadmin	stream	tcp	nowait	root	/usr/bin/python	/daten/www/PyAdmin/PyAdminStart.py
und in "/etc/services" das:

Code: Alles auswählen

pyadmin	9000/tcp
Der Server läuft anscheinend auch, wenn ich auf Port 9000 eine Anfrage stelle, allerdings funktioniert es nicht wirklich... Es kommen merkwürdige Fehlermeldungen an...

Kann man es garnicht so einfach zusammen basteln?

Ich hab leider nicht sehr viel Ahnung und wenig Informationen zu inetd gefunden...
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 12. März 2005, 19:02

Ja wahnsinn, ich bin an genau dem gleichen dran: Python Server mit inetd. DU musst aufpassen, du darfst dort keine sockets nutzten nur stdin und stdout, siehe mein Prog. Das geht.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 14. März 2005, 07:02

Achso, dann ist inetd also quasi schon ein HTTP Server und ich dachte er statet nur einen entsprechenden Server, wenn auf Port xy eine Anfrage gestellt wurde...

Wie sieht es dann mit CGI Geschichten aus?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 14. März 2005, 13:30

Nein, der inetd ist kein HTTP Server. Der inetd überwacht nur die in der /etc/services.conf angegebenen posts und wenn dort ein Request ist, startet er das in der /etc/inetd.conf aufgeführte Programm. Dabei erstellt er selbst ein Socket, so dass alles was bei stdout raus geht zum Client geschickt wird, und alles was in stdin reingeht zu deinem Programm geschickt wird. In inetxmlrpc.py habe ich das so gelöst, dass ich erstmal den HTTP Header einlese, den mir der Client schickt, dann Content-Length auswerte, und danach so weit eben lese. Also das Müsste dann der Content sein. Diesen Content, der als POST reinkommt, lasse ich von der xmlrpclib parsen, rufe die Funktionen auf und lasse der Ergebnis von der xmlrpclib erstellen, bevor ich es dann einfach ohne weiteres an den Client schicke. Das ist zwar nicht wirklich ein vollwertiger XML-RPC Server, denn er kann nicht wirklich HTTP, aber das reicht mir schon.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Gast

Montag 14. März 2005, 13:40

Hmmm... d.h. ich müßte mich selber um die HTTP Header kümmern... d.H. also von Browser die Headerinformation vom Request auswerten und für mein CGI Programm zusammenstellen...

Gibt es einen einfacheren Weg quasi die Funktionalität und Einfachheit eines CGIHTTPServer mit inetd zu paaren?
Kann man irgendwie den Socket übergeben, oder so?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 14. März 2005, 13:52

Anonymous hat geschrieben:Gibt es einen einfacheren Weg quasi die Funktionalität und Einfachheit eines CGIHTTPServer mit inetd zu paaren?
Kann man irgendwie den Socket übergeben, oder so?
Nein, ich ahbe bis jetzt keine Möglichkeit gefunden, ich habe überlegt im BaseServer self.socket durch ein durch fromfd generiertes socket aus dem stdin zu machen, aber das wollte nicht :(
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 15. März 2005, 15:05

Wahrscheinlich ist es auch so gut wie unmöglich das ganze mit TLSlite zu koppeln um HTTPs zu erhalten, was?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 15. März 2005, 16:49

jens hat geschrieben:Wahrscheinlich ist es auch so gut wie unmöglich das ganze mit TLSlite zu koppeln um HTTPs zu erhalten, was?
Ich nehme mal an dass es möglich wäre, aber einfach ist das auf jeden Fall nicht. inetd ist vom konzept her imho Schrott, zumindest für Programme die mit Sockets umgehen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 15. März 2005, 16:54

Eine möglichkeit ist es vielleicht, inetd nur dazu zu nutzen, der Server zu starten... Das dürfte aber zumindest nicht so ohne weiteres auf dem selben Port geschehen, denn den reserviert ja schon inetd...

Ab wann schließt inetd denn den Socket? Kann man evtl. ganz doof, im Server-Start Skript ein time.sleep() einbauen?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 15. März 2005, 17:06

jens hat geschrieben:Ab wann schließt inetd denn den Socket? Kann man evtl. ganz doof, im Server-Start Skript ein time.sleep() einbauen?
Ich dneke der inetd schließt den Socket, nachdem das Programm das aufgerufen wird ein EOF schickt, bin mir aber nicht sicher.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 15. März 2005, 17:11

Hm! Dann könnte es ja vielleicht so ablaufen, das dem Brower erstmal eine Minimale-HTML-Datei geschickt wird, mit einem http-equiv="refresh"... Danach wird dem inetd ein EOF gesendet und der eigentliche Python CGI-Server gestartet, der dann auf dem gleichen Port läuft...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 15. März 2005, 17:53

Man kann bei inetd auch noch einen stream-typ bestimmen... u.a. gibt es raw Ob dann kein socket benutzt wird?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 15. März 2005, 18:15

jens hat geschrieben:Man kann bei inetd auch noch einen stream-typ bestimmen... u.a. gibt es raw Ob dann kein socket benutzt wird?
The socket-type should be one of ``stream'', ``dgram'', ``raw'', ``rdm'', or ``seqpacket'', depending on whether the socket is a stream, datagram, raw, reliably delivered message, or sequenced packet socket.
-vs-
SOCK_STREAM
SOCK_DGRAM
SOCK_RAW
SOCK_RDM
SOCK_SEQPACKET
These constants represent the socket types, used for the second argument to socket(). (Only SOCK_STREAM and SOCK_DGRAM appear to be generally useful.)
Also ist raw nur eine Unterart der Sockettypen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 15. März 2005, 18:17

Schade :?
Dann bleibt noch die umständliche Browser-Refresh Variante...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 15. März 2005, 18:34

jens hat geschrieben:Dann bleibt noch die umständliche Browser-Refresh Variante...
:idea: Wie wäre es, wenn du inetd gar nicht benutzt? Dann hättest du das Ding vom Hals.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten