chiark / gitweb /
move more stuff
[hippotat] / hippotat / __init__.py
index d25ff06d9a1a6580e8ce9a1888938bbd2b789f5a..6af49b6da754e46f88a3e65b663aec32df46c5bd 100644 (file)
@@ -5,12 +5,22 @@ signal.signal(signal.SIGINT, signal.SIG_DFL)
 
 import twisted
 from twisted.internet import reactor
+from twisted.logger import LogLevel
 
 import ipaddress
 from ipaddress import AddressValueError
 
 import hippotat.slip as slip
 
+from optparse import OptionParser
+from configparser import ConfigParser
+from configparser import NoOptionError
+
+import collections
+
+cfg = ConfigParser()
+optparser = OptionParser()
+
 #---------- packet parsing ----------
 
 def packet_addrs(packet):
@@ -104,3 +114,34 @@ class PacketQueue():
     try: (dummy, packet) = self._pq[0]
     except IndexError: return None
     return packet
+
+#---------- 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))
+
+#---------- startup ----------
+
+def common_startup(defcfg):
+  twisted.logger.globalLogPublisher.addObserver(crash_on_critical)
+
+  optparser.add_option('-c', '--config', dest='configfile',
+                       default='/etc/hippotat/config')
+  (opts, args) = optparser.parse_args()
+  if len(args): optparser.error('no non-option arguments please')
+
+  cfg.read_string(defcfg)
+  cfg.read(opts.configfile)
+
+def common_run():
+  reactor.run()
+  print('CRASHED (end)', file=sys.stderr)