J'ai un cgi-script python qui vérifie si un processus est actif, et le lance si ce processus est introuvable. Le processus lui-même est un serveur web (basé sur web.py). Après m'être assuré que le processus est en cours d'exécution, j'essaie de faire une demande d'URL. L'idée est de rediriger les résultats de cette requête vers le demandeur de mon script cgi, fondamentalement je veux rediriger une requête vers un serveur web local qui écoute un port différent.Appel d'urlopen à partir du script cgi, erreur 'connection refused'
Ce code fonctionne correctement si j'ai démarré le serveur en premier (findImgServerProcess renvoie True), à partir d'un shell, sans utiliser les requêtes cgi. Mais si j'essaie de démarrer le processus via le script cgi ci-dessous, j'arrive aussi loin que l'appel urllib2.urlopen, ce qui jette une exception que la connexion est refusée. Je ne comprends pas pourquoi? Si j'imprime la liste des processus (r
dans findImgServerProcess()
) Je peux voir le processus est là, mais pourquoi urllib2.urlopen lance une exception? J'ai le serveur web apache2 configuré pour utiliser suexec.
Voici le code:
#!/usr/bin/python
import cgi, cgitb
cgitb.enable()
import os, re
import sys
import subprocess
import urllib2
urlbase = "http://localhost:8080/getimage"
imgserver = "/home/martin/public_html/cgi-bin/stlimgservermirror.py" # this is based on web.py
def findImgServerProcess():
r = subprocess.Popen(["ps", "aux"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()[0]
return re.match(".*%s" % os.path.split(imgserver)[-1], r, re.DOTALL)
def ensureImgServerProcess():
if findImgServerProcess():
return True
os.environ['LD_LIBRARY_PATH'] = '/home/martin/lib'
fout = open("/dev/null", "w")
ferr = fout
subprocess.Popen([sys.executable, imgserver], stdout=fout, stderr=subprocess.STDOUT)
# now try and find the process
return findImgServerProcess() != None
def main():
if not ensureImgServerProcess():
print "Content-type: text/plain\n"
print "image server down!"
return
form = cgi.FieldStorage()
if form.has_key("debug"):
print "Content-type: text/plain\n"
print os.environ['QUERY_STRING']
else:
try:
img = urllib2.urlopen("%s?%s" % (urlbase, os.environ['QUERY_STRING'])).read()
except Exception, e:
print "Content-type: text/plain\n"
print e
sys.exit()
print "Content-type: image/png\n"
print img
if __name__ == "__main__":
main()