forked from mushorg/glastopf
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwebserver.py
127 lines (98 loc) · 3.68 KB
/
webserver.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import sys
import logging
import os
from ConfigParser import ConfigParser
from evnet import loop, unloop, listenplain
from evnet.util import EventGen
from evnet.promise import Promise
import glastopf
import logging
import os
logger = logging.getLogger()
# WebSocketListener based on Mark Schloessers evnet
# example https://github.com/rep/evnet
class WebSockListener(EventGen):
def __init__(self, host, port):
EventGen.__init__(self)
try:
self.l = listenplain(host=host, port=port)
except Exception, e:
if e.errno == 13:
info = "Permission denied. Run as root!"
if e.errno == 98:
info = "Port " + str(port) + " already bound. Stop running service on port " + str(port) + " first."
else:
info = "[ Errno " + str(e.errno) + "]", e.strerror
logger.exception("Unable to bind socket: {0}".format(info))
sys.exit(1)
else:
logger.info("Webserver running on: {0}:{1} waiting for connections.".format(host, str(port)))
self.l._on('connection', self.connection)
self.glastopf_honeypot = glastopf.GlastopfHoneypot()
def connection(self, c, addr):
self._event('connection', WebSock(c, addr, self.glastopf_honeypot))
class WebSock(EventGen):
def __init__(self, c, addr, glastopf):
EventGen.__init__(self)
self.glastopf_honeypot = glastopf
self.c, self.addr = c, addr
self.c._on('ready', self.ready)
self.c._on('close', self.closed)
self.c._on('read', self.read)
self.c._on('allsent', self.close)
def ready(self):
self._event('ready')
def closed(self, e):
self._event('close', e)
def read(self, d):
#print 'read', repr(d)
response = self.glastopf_honeypot.handle_request(d, self.addr, self.c)
self.send(response)
def send(self, s):
self.c.write(s)
def close(self):
self.c.close()
def setup_logging(logconsole, logfile):
logger.setLevel(logging.DEBUG)
if not os.path.isdir('log'):
os.mkdir('log')
formatter = logging.Formatter('%(asctime)-15s (%(name)s) %(message)s')
root_logger = logging.getLogger()
if logconsole:
console_log = logging.StreamHandler()
console_log.setLevel(logging.DEBUG)
console_log.setFormatter(formatter)
root_logger.addHandler(console_log)
if logfile != None:
file_log = logging.handlers.TimedRotatingFileHandler(
logfile,
when="midnight",
backupCount=31)
file_log.setLevel(logging.DEBUG)
file_log.setFormatter(formatter)
root_logger.addHandler(file_log)
if __name__ == '__main__':
conf_parser = ConfigParser()
if not os.path.isfile("glastopf.cfg"):
sys.exit("Could not find configuration file: glastopf.cfg")
conf_parser.read("glastopf.cfg")
if conf_parser.getboolean("logging", "filelog_enabled"):
logfile = conf_parser.get("logging", "logfile")
else:
logfile = None
logconsole = conf_parser.getboolean("logging", "consolelog_enabled")
setup_logging(logconsole, logfile)
host = conf_parser.get("webserver", "host")
port = conf_parser.getint("webserver", "port")
a = WebSockListener(host, port)
def new_conn(c):
def onready():
def dbgprint(r):
print 'dbgprint', r
def closed(e):
pass
#print e
c._on('ready', onready)
c._on('close', closed)
a._on('connection', new_conn)
loop()