CGIHTTPServer.py Problem

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
hackbox
User
Beiträge: 3
Registriert: Montag 27. Juni 2005, 14:10

Hallo zusammen,

zum testen meiner cgi-scripte habe ich diesen einfachen http-server, der auf port 8080 läuft installiert:

Code: Alles auswählen

import os
from BaseHTTPServer import HTTPServer
from CGIHTTPServer import CGIHTTPRequestHandler
srvaddr=("" ,8080)
cgisrv=HTTPServer(srvaddr ,CGIHTTPRequestHandler)
cgisrv.serve_forever()
damit er unter linux läuft überschreibt dieses script das modul:

Code: Alles auswählen

 #!/usr/bin/ python2.3

import re

#Pfad zum CGIHTTP-Server Modul
file="/usr/local/lib/python2.3/CGIHTTPServer.py"
replaced=0
data=open(file).readlines()
f=open(file,"w+")
for a in data:
    f.write(a)
    if a.find("have_fork")!=-1 and not replaced:
               f.write(re.search("\s+" ,a) \
               group()+"have_fork=None\n" ) // Syntaxfehler
               replaced=1
wobei in der vorletzten zeile ein syntaxfehler auftaucht, den ich noch nicht finden konnte. (noch python newbee)

starte ich den server ersceint folgende fehlermeldung:

Code: Alles auswählen

File "/usr/lib/python2.3/CGIHTTPServer.py", line 217, in run_cgi
    os.execve(scriptfile, args, os.environ)
OSError: [Errno 13] Permission denied
versuche ich http://localhost/cgi-bin/script.py

wird script.py vom browser nicht ausgeführt sondern als datei erkannt.


wie kann ich das problem lösen?

danke schon mal im voraus

gruss

hackbox

Edit (Leonidas): Code in Tags gesetzt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hä? :shock:

Du überschreibst die Original CGIHTTPServer.py Datei? Warum das denn???

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Gast

Hallo Jens,

ich überschreibe das Modul httpd.py mit correctCGIHTTPServer.py ,damit es unter UNIX funktioniert, d.h. Zeile für Zeile wird geparst, und sobald der String have_fork
zum ersten Mal vorkommt, wird eine Zeile hinzugefügt, die sicherstellen soll, dass das
Skript später funktioniert. (Nur für UNIX nötig)

gruss

hackbox
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Anonymous hat geschrieben:sobald der String have_fork
zum ersten Mal vorkommt, wird eine Zeile hinzugefügt, die sicherstellen soll, dass das
Skript später funktioniert. (Nur für UNIX nötig)
Hast du ein Unix, dass nicht gescheit forken kann?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
hackbox
User
Beiträge: 3
Registriert: Montag 27. Juni 2005, 14:10

Hallo Anonymous,

ich arbeite vorzugsweise mit Linux (Debian Sid und Sarge) doch ich möchte sichergehen dass die scripte auf möglichst allen Unix Derivaten laufen, deshalb das Skript.

Gruss

Hackbox
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

hackbox hat geschrieben:Hallo Anonymous,
Der warst ja wohl du selbst :twisted: SCNR.
hackbox hat geschrieben:ich arbeite vorzugsweise mit Linux (Debian Sid und Sarge) doch ich möchte sichergehen dass die scripte auf möglichst allen Unix Derivaten laufen, deshalb das Skript.
Und die anderen Unix gerivate forken nicht ohne diese Zeile? Dein Vorgehen erscheint mir sonst recht seltsam..

Guck dir mal platform an, vielleicht hilfts dir..
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Anonymous hat geschrieben:ich überschreibe das Modul httpd.py mit correctCGIHTTPServer.py
So wie ich das sehe öffnest du "/usr/local/lib/python2.3/CGIHTTPServer.py" zum lesen und gleich danach zum schreiben ?!?!

Ich weiß nicht was das alles für einen Sinn hat... Auch wenn es nicht die Lösung sein wird, aber vielleicht hilft dir das weiter:

Code: Alles auswählen

#!/usr/bin/ python2.3

import re

#Pfad zum CGIHTTP-Server Modul
infile="/usr/local/lib/python2.3/CGIHTTPServer.py"
outfile="httpd.py"

replaced=0

f = file( infile, "r" )
data = f.readlines()
f.close()

f=file( outfile, "w+" )

for a in data:
    txt = re.search( "\s+" ,a )
    if ("have_fork" in txt) and not replaced:
        f.write( a )
        f.write( "have_fork=None\n" )
        replaced=1

f.close()

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
hackbox
User
Beiträge: 3
Registriert: Montag 27. Juni 2005, 14:10

Hallo Anonymous,

habe soeben deinen code durch den debugger geschickt.

in der Zeile if( "have_fork" in txt) and not replaced


wird eine unhandled exception ausgeworfen.

sie lautet:

Type Error

"iterable argument required"


wie und wo muss ich dieses iterable argument einfügen?


Danke für deine Hilfe.

gruss

hackbox
Johi
User
Beiträge: 22
Registriert: Sonntag 21. November 2004, 20:08

Code: Alles auswählen

f.write(re.search("\s+" ,a) \
               group()+"have_fork=None\n" )
soll das

Code: Alles auswählen

re.search("\s+" ,a).group()
heißen?

Code: Alles auswählen

for a in data:
    f.write(a)
    if [...]:
               f.write([...], a)
soll heißen wenn die Regel Zutrifft wird die Zeile 2mal reingeschrieben, beim 2. mal verändert?
Gast

Hallo Johi,

also ich hab da wohletwas Verwirrung geschaffen.

Mein Problem ist folgendes:

um meine cgi-skripte zu testen hab ich mir einen simplen Http-Server geschrieben
(Code stammt von Martin Uza'k)

Code: Alles auswählen

import os
from BaseHTTPServer import HTTPServer
from CGIHTTPServer import CGIHTTPRequestHandler
srvraddr=("",8080)
cgisrv=HTTPServer(srvraddr,CGIHTTPRequestHandler)
cgisrv.serve_forever()

der aus Sicherheitsgründen auf Port 8080 auf einer Linux-Kiste läuft.

Weil laut Martin bei Verwendung unter Unix ein Fehler im CGIHTTPServer-Modul
der beim forken auftreten soll, bin ich dessen Empfehlung gefolgt und habe ein Skript correctCGIHTTPServer.py verwendert

das jetzt dank deines Tips so aussieht:

Code: Alles auswählen

#!/usr/bin/ python2.3

import re

#Pfad zum CGIHTTP-Server Modul
infile="/usr/local/lib/python2.3/correctCGIHTTPServer.py"
outfile="httpd.py"



replaced=0

f = file( infile, "r" )
data = f.readlines()
f.close()



f=file( outfile, "w+" )


for a in data:
      txt = re.search("\s+" ,a).group()
    
      if ("have_fork" in txt) and not replaced:
               f.write( a )
               f.write( "have_fork=None\n" )
               replaced=1

f.close()

es soll das CGIHTTPServer-Modul entsprechend überschreiben d.h. beim ersten Vorkommen des Strings have_fork eine Zeile hinzufügen, was jedoch nicht zu funktionieren scheint, da ich die cgi-scripte unter
http://localhost:8080/cgi-bin/script-beispiel.py
nicht öffnen kann.

Ich hoffe jetzt wird es klarer was ich möchte.

Vielen Dank nochmals für euere Tipps

Gruss

Uli

Edit (Leonidas): Code in Python-Tags gesetzt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Warum patchst du einfach nicht per Hand die CGIHTTPServer.py ???

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Ich verstehe das ganze Problem ehrlich gesagt auch nicht. Linux kann "forken", wenn CGI also bei Dir nicht funktioniert, dann würde ich erstmal versuchen das wirkliche Problem zu finden, bevor ich einfach eine systemweite Datei "verschlimmbessere".

Wenn es sein muss, dann mach die Änderung besser im Texteditor und schreib einen Kommentar dazu das, und was Du da getan hast.
Antworten