chiark / gitweb /
new ipif interpolation
[hippotat.git] / server
diff --git a/server b/server
index 29321e9435bab3f8deff72824246a0ff849f24de..a34cc3cf3082ab6047cf0a6463b8fde2a6528f2d 100755 (executable)
--- 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 = { }
@@ -29,6 +22,7 @@ max_batch_down = 65536
 max_queue_time = 10
 max_request_time = 54
 target_requests_outstanding = 3
+ipif = userv root ipif %(local)s,%(peer)s,%(mtu)s,slip %(rnets)s
 
 [virtual]
 mtu = 1500
@@ -37,7 +31,6 @@ mtu = 1500
 # [relay]
 
 [server]
-ipif = userv root ipif %(host)s,%(relay)s,%(mtu)s,slip %(network)s
 addrs = 127.0.0.1 ::1
 port = 8099
 
@@ -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,47 @@ 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')
-
-  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)
+  for d, s in (('local', 'host'),
+               ('peer','relay'),
+               ('rnets','network')):
+    try: v = getattr(c, s)
+    except KeyError: pass
+    setattr(c, d, v)
 
-  cfg = ConfigParser()
-  cfg.read_string(defcfg)
-  cfg.read(opts.configfile)
-  process_cfg()
+  print(repr(c))
 
-  start_ipif(ipif_command, route)
-  start_http()
+  c.ipif_command = cfg.get('server','ipif', vars=c.__dict__)
 
-startup()
-reactor.run()
-print('CRASHED (end)', file=sys.stderr)
+common_startup(defcfg)
+process_cfg()
+start_ipif(c.ipif_command, route)
+start_http()
+common_run()