3 from twisted.web.server import Site
4 from twisted.web.resource import Resource
5 from twisted.web.server import NOT_DONE_YET
6 from twisted.internet import reactor
17 r = ipaddress.IPv4Address(input)
18 except AddressValueError:
19 r = ipaddress.IPv6Address(input)
24 r = ipaddress.IPv4Network(input)
25 except NetworkValueError:
26 r = ipaddress.IPv6Network(input)
36 max_batch_down: 262144
41 def route(packet. daddr):
42 try: client = clients[daddr]
43 except KeyError: dclient = None
44 if dclient is not None:
45 dclient.queue_outbound_data(packet)
46 else if daddr = server or daddr not in network:
47 queue_inbound_data(packet)
49 syslog.syslog(syslog.LOG_DEBUG, 'no client for %s' % daddr)
52 def __init__(self, ip, cs):
53 # instance data members
56 self.pw = cfg.get(cs, 'password')
61 for k in ('max_batch_down','max_queue_time','max_request_time'):
62 req = cfg.getint(cs, k)
63 limit = cfg.getint('global',k)
64 self.__dict__[k] = min(req, limit)
66 def process_arriving_data(self, d):
67 for packet in slip_decode(d):
68 (saddr, daddr) = ip_64_addrs(packet)
70 raise ValueError('wrong source address %s' % saddr)
73 def _req_cancel(self, request):
76 def _req_error(self, err, request):
77 self._req_cancel(request)
79 def http_request(self, request):
80 request.setHeader('Content-Type','application/octet-stream')
81 reactor.callLater(self.max_request_time, self._req_cancel, request)
82 request.notifyFinish().addErrback(self._req_error, request)
88 network = ipnetwork(cfg.get('virtual','network'))
90 ourself = cfg.get('virtual','server')
91 except ConfigParser.NoOptionError:
92 ourself = network.hosts().next()
94 for cs in cfg.sections():
95 if not (':' in cs or '.' in cs): continue
98 raise ValueError('client %s not in network' % ci)
100 raise ValueError('multiple client cfg sections for %s' % ci)
101 clients[ci] = Client(ci, cs)
103 class FormPage(Resource):
104 def render_POST(self, request):
105 # find client, update config, etc.
106 ci = ipaddress(request.args['i'])
108 pw = request.args['pw']
109 if pw != c.pw: raise ValueError('bad password')
112 for r, w in (('mbd', 'max_batch_down'),
113 ('mqt', 'max_queue_time'),
114 ('mrt', 'max_request_time')):
115 try: v = request.args[r]
116 except KeyError: continue
120 try: d = request.args['d']
121 except KeyError: d = ''
123 c.process_arriving_data(d)
124 c.new_request(request)