chiark / gitweb /
introduce c. etc.
[hippotat.git] / server
diff --git a/server b/server
index db13f25954d01ff4ad24fe6fbd6bb4305e0d2995..f1b9ca4ff7b8de0a6db27e74e05b9f44680c35e3 100755 (executable)
--- a/server
+++ b/server
@@ -1,7 +1,6 @@
 #!/usr/bin/python3
 
-import signal
-signal.signal(signal.SIGINT, signal.SIG_DFL)
+from hippotat import *
 
 import sys
 import os
@@ -9,21 +8,12 @@ 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
 
-from hippotat import *
-
 clients = { }
 
 defcfg = '''
@@ -51,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):
@@ -75,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:
@@ -218,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()