chiark / gitweb /
move more stuff
[hippotat.git] / hippotat / __init__.py
index c1ce08511aae7f43f9113512c1263ff7b54f5666..6af49b6da754e46f88a3e65b663aec32df46c5bd 100644 (file)
@@ -1,13 +1,26 @@
 # -*- python -*-
 
+import signal
+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):
@@ -101,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)