/
wsserver.py
executable file
·70 lines (56 loc) · 1.67 KB
/
wsserver.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
#!/usr/bin/env python2
from gevent import monkey; monkey.patch_all()
from geventwebsocket import WebSocketServer, WebSocketApplication, Resource
from gevent import os
import argparse
import gevent
import tuntap
import sys
p = argparse.ArgumentParser(description='Send and receive data from a websocket server')
p.add_argument('-d', '--src',
type=str,
default='127.0.0.1',
help='host to listen on')
p.add_argument('-p', '--port',
type=int,
default=8080,
help='port number to listen on')
p.add_argument('-l', '--loc',
type=str,
default='/',
help='path to request from server')
p.add_argument('-t', '--tuntap',
type=str,
default="",
help='\'tap\' for tap mode or interface to use'
)
args = p.parse_args()
class server(WebSocketApplication):
tuntap = None
def read_fd(self):
while True:
try:
msg = os.tp_read(self.tuntap.fd, 1500)
if not msg:
break
except IOError:
break
if self.ws.closed:
break
self.ws.send(msg, True)
def on_open(self):
self.reader = gevent.spawn(self.read_fd)
def on_close(self, reason):
if (hasattr(self, 'reader')):
self.reader.kill()
def on_message(self, msg):
if not msg:
return
os.tp_write(self.tuntap.fd, msg)
if __name__ == "__main__":
server.tuntap = tuntap.tuntap(args.tuntap)
wss = WebSocketServer((args.src, args.port), Resource({args.loc: server}))
try:
wss.serve_forever()
except KeyboardInterrupt:
wss.close()