Jau! Hast recht, habe jetzt
log_message() in MyHandler überschrieben bzw. erweitert... Jetzt brauche ich aber nochmal hilfe:
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: ISO-8859-1 -*-
import CGIHTTPServer
import BaseHTTPServer
import os, sys, time
# Verz. in dem CGIs ausgeführt werden sollen. Leer lassen (="") für alle Verz.
cgiVerz = ""
class MyHandler(CGIHTTPServer.CGIHTTPRequestHandler):
"Modifizieren des Ursprünglichen Servers"
def __init__( self, LogFile ):
CGIHTTPServer.CGIHTTPRequestHandler.__init__( self )
self.LogFile = LogFile
print "Lese Verzeichnisbaum für CGI-Ausführung...",
# Liste aller Unetrverzeichnisse erzeugen, damit überall CGIs ausgeführt werden.
cgi_directories = ["/"+i[0].replace("\\","/") for i in os.walk(cgiVerz)]
print "OK",len(cgi_directories),"Verz. gefunden\n"
def is_python(self, path):
"Checkt, ob die Datei ein Python-Skript ist"
head, tail = os.path.splitext(path)
return tail.lower() in (".py", ".pyw", ".cgi")
def is_cgi(self):
"Ausführen eines Python-Skript"
path = self.path
print "self.path:",self.path
print "self.cgi_directories:",self.cgi_directories
for x in self.cgi_directories:
i = len(x)
if path[:i] == x and (path[i+1:] and path[i] == '/'):
self.cgi_info = path[:i], path[i+1:]
print "self.cgi_info:",self.cgi_info
return True
return False
def log_message(self, format, *args):
LogMessage = "%s - - [%s] %s\n" % (self.address_string(),
self.log_date_time_string(),
format%args)
print LogMessage
log = file( self.LogFile, "a" )
log.write( LogMessage )
log.close()
import SocketServer,socket
class MyThreadingServer(SocketServer.ThreadingTCPServer):
"Verbesserung für den Server, damit er mehrere Anfragen parallel bearbeiten kann"
allow_reuse_address = 1 # Seems to make sense in testing environment
def __init__(self, server_address, request_handler, AllowIPs):
SocketServer.ThreadingTCPServer.__init__(self, server_address, request_handler)
self.AllowIPs = [mask.split('.') for mask in AllowIPs]
def server_bind(self):
"""Override server_bind to store the server name."""
SocketServer.ThreadingTCPServer.server_bind(self)
host, port = self.socket.getsockname()[:2]
self.server_name = socket.getfqdn(host)
self.server_port = port
def verify_request(self, dummy, client_address):
"""Checkt ob die IP-Adresse der Anfrage in 'AllowIPs' vorhanden ist"""
def check_ip(mask):
for mask_part, ip_part in zip(mask, ip):
if mask_part != ip_part and mask_part != '*':
return False
return True
ip = client_address[0].split('.')
for mask in self.AllowIPs:
if check_ip(mask):
return True
print "IP [%s] not allowed!" % client_address
# Beugt DOS Attacken vor, in dem die Rückmeldung verzögert und
# somit CPU-Zeit freigegeben wird.
time.sleep(1)
return False
def ServerStart( ListenPort = 80, AllowIPs = ('127.0.0.1'), LogFile = "LogFile.txt" ):
# Umgebungsvariablen setzten, die man in CGI-Skripten abfragen kann und normalerweise
# von einem echten WebServer automatisch gesetzt werden
# Evtl. selber erweitern ;)
os.environ['DOCUMENT_ROOT']=os.getcwd()
os.environ['HTTP_USER_AGENT']="Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7.5) Gecko/20041108 Firefox/1.0"
os.environ['HTTP_HOST']="localhost"
os.environ['REMOTE_ADDR']="localhost"
print "ROOT-Pfad .......................:", os.getcwd()
print "Log-Datei .......................:", os.path.join( os.getcwd(), LogFile )
print "Starte CGI-HTTP-Server auf Port .:", ListenPort
print "Zugelassener IP-Bereich .........:", AllowIPs
print
print "Seiten sind nun unter [http://localhost:%s] erreichbar!\n" % ListenPort
server_address = ("", ListenPort)
httpd = MyThreadingServer( server_address, MyHandler( LogFile ), AllowIPs )
httpd.serve_forever()
if __name__=="__main__":
LogFile = "logs\\LogFile.txt"
ListenPort = 80
AllowIPs = ('127.0.0.1', '192.168.*.*')
ServerStart( ListenPort, AllowIPs, LogFile )
Ich versuche MyHandler mit einem eigenen __init__ zu versehen, um z.B. den Pfad zur Log-Datei (LogFile) mitzugeben...
Ich hab Probleme bei der Zeile
CGIHTTPServer.CGIHTTPRequestHandler.__init__( self ) denn (self) reicht nicht aus, es werden noch andere Parameter benötigt:
Code: Alles auswählen
Traceback (most recent call last):
File "W:\PyAdmin\PyAdminRoutines\PyAdminCGIHTTPServer.py", line 135, in ?
ServerStart( ListenPort, AllowIPs, LogFile )
File "W:\PyAdmin\PyAdminRoutines\PyAdminCGIHTTPServer.py", line 120, in ServerStart
httpd = MyThreadingServer( server_address, MyHandler( LogFile ), AllowIPs )
File "W:\PyAdmin\PyAdminRoutines\PyAdminCGIHTTPServer.py", line 17, in __init__
CGIHTTPServer.CGIHTTPRequestHandler.__init__( self )
TypeError: __init__() takes exactly 4 arguments (1 given)
Aber welche???
Ich denke ich müßte die Parameter vom SocketServer.BaseRequestHandler nehmen, also:
(self, request, client_address, server) Nur die Variablen, hab ich ja in
MyHandler() garnicht zu Verfügung...
denn
CGIHTTPServer.CGIHTTPRequestHandler
erbt von
SimpleHTTPServer.SimpleHTTPRequestHandler
erbt von
BaseHTTPServer.BaseHTTPRequestHandler
erbt von
SocketServer.StreamRequestHandler
erbt von
SocketServer.BaseRequestHandler
Ach, da hab ich noch eine zweite Frage: Ich habe bei verify_request() ein time.sleep() eingebaut, wenn die Anfrage auf einem nicht erleubten IP-Bereich kommt... Ob das bei DOS-Attacken was helfen würde? (Wobei das sowieso unwahrscheinlich ist, das es jemals dazu kommen könnte)