+
+#---------- 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)