X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=server;h=f1b9ca4ff7b8de0a6db27e74e05b9f44680c35e3;hb=87a7c0c717c2bd9380e93e4ab25baebbc1e3aa6a;hp=29321e9435bab3f8deff72824246a0ff849f24de;hpb=37ab4cdc9ad97c3d1b2e85483bd0d9e8ed1d78c2;p=hippotat.git diff --git a/server b/server index 29321e9..f1b9ca4 100755 --- a/server +++ b/server @@ -8,17 +8,10 @@ import os import twisted.internet import twisted.internet.endpoints from twisted.web.server import NOT_DONE_YET -from twisted.logger import LogLevel #import twisted.web.server import Site #from twisted.web.resource import Resource -from optparse import OptionParser -from configparser import ConfigParser -from configparser import NoOptionError - -import collections - import syslog clients = { } @@ -48,20 +41,6 @@ max_request_time = 121 target_requests_outstanding = 10 ''' -#---------- error handling ---------- - -def crash(err): - print('CRASH ', err, file=sys.stderr) - try: reactor.stop() - except twisted.internet.error.ReactorNotRunning: pass - -def crash_on_defer(defer): - defer.addErrback(lambda err: crash(err)) - -def crash_on_critical(event): - if event.get('log_level') >= LogLevel.critical: - crash(twisted.logger.formatEvent(event)) - #---------- "router" ---------- def route(packet, saddr, daddr): @@ -72,7 +51,7 @@ def route(packet, saddr, daddr): dclient.queue_outbound(packet) elif saddr.is_link_local or daddr.is_link_local: log_discard(packet, saddr, daddr, 'link-local') - elif daddr == host or daddr not in network: + elif daddr == c.host or daddr not in c.network: print('TRACE INBOUND ', saddr, daddr, packet) queue_inbound(packet) elif daddr == relay: @@ -215,66 +194,44 @@ def start_http(): #---------- config and setup ---------- def process_cfg(): - global network - global host - global relay - global ipif_command + process_cfg_common_always() - network = ipnetwork(cfg.get('virtual','network')) - if network.num_addresses < 3 + 2: + c.network = ipnetwork(cfg.get('virtual','network')) + if c.network.num_addresses < 3 + 2: raise ValueError('network needs at least 2^3 addresses') try: - host = cfg.get('virtual','host') + c.host = cfg.get('virtual','host') except NoOptionError: - host = next(network.hosts()) + c.host = next(c.network.hosts()) try: - relay = cfg.get('virtual','relay') + c.relay = cfg.get('virtual','relay') except NoOptionError: - for search in network.hosts(): - if search == host: continue - relay = search + for search in c.network.hosts(): + if search == c.host: continue + c.relay = search break for cs in cfg.sections(): if not (':' in cs or '.' in cs): continue ci = ipaddr(cs) - if ci not in network: + if ci not in c.network: raise ValueError('client %s not in network' % ci) if ci in clients: raise ValueError('multiple client cfg sections for %s' % ci) clients[ci] = Client(ci, cs) - global mtu - mtu = cfg.get('virtual','mtu') + print(repr(c)) iic_vars = { } for k in ('host','relay','mtu','network'): - iic_vars[k] = globals()[k] - - ipif_command = cfg.get('server','ipif', vars=iic_vars) - -def startup(): - global cfg - - op = OptionParser() - op.add_option('-c', '--config', dest='configfile', - default='/etc/hippottd/server.conf') - global opts - (opts, args) = op.parse_args() - if len(args): op.error('no non-option arguments please') - - twisted.logger.globalLogPublisher.addObserver(crash_on_critical) - - cfg = ConfigParser() - cfg.read_string(defcfg) - cfg.read(opts.configfile) - process_cfg() + iic_vars[k] = getattr(c,k) - start_ipif(ipif_command, route) - start_http() + c.ipif_command = cfg.get('server','ipif', vars=iic_vars) -startup() -reactor.run() -print('CRASHED (end)', file=sys.stderr) +common_startup(defcfg) +process_cfg() +start_ipif(c.ipif_command, route) +start_http() +common_run()