X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=hippotat.git;a=blobdiff_plain;f=hippotatd;h=b08ce6673d9cd9373a7025a7908f0f3ef3fc0a97;hp=e3e42fb18ee6790dfc8125206a720970c2316099;hb=eb6dcb5af291c1c5457c88979ed4b077a4b28367;hpb=2eecd19c0f96d98e599b680447510aac06e8dd86 diff --git a/hippotatd b/hippotatd index e3e42fb..b08ce66 100755 --- a/hippotatd +++ b/hippotatd @@ -25,7 +25,7 @@ # the file AGPLv3+CAFv2. If not, email Ian Jackson # . - +#@ import sys; sys.path.append('@PYBUILD_INSTALL_DIR@') from hippotatlib import * import os @@ -38,7 +38,6 @@ import twisted.internet from twisted.web.server import NOT_DONE_YET import twisted.web.static -import twisted.python.syslog import hippotatlib.ownsource from hippotatlib.ownsource import SourceShipmentPreparer @@ -65,7 +64,7 @@ def route(packet, iface, saddr, daddr): elif daddr == c.vaddr or daddr not in c.vnetwork: lt('inbound') queue_inbound(ipif, packet) - elif daddr == c.relay: + elif daddr == c.vrelay: lt('discard relay') log_discard(packet, iface, saddr, daddr, 'relay') else: @@ -297,7 +296,8 @@ def process_cfg(_opts, putative_servers, putative_clients): global c c = ConfigResults() - c.server = cfg.get('SERVER','server') + try: c.server = cfg.get('SERVER','server') + except NoOptionError: c.server = 'SERVER' cfg_process_common(c, c.server) cfg_process_saddrs(c, c.server) @@ -320,12 +320,21 @@ def process_cfg(_opts, putative_servers, putative_clients): c.vrelay = search break + try: c.ifname = cfg.get(c.server, 'ifname_server', raw=True) + except NoOptionError: pass + cfg_process_ipif(c, [c.server, 'DEFAULT'], (('local','vaddr'), ('peer', 'vrelay'), ('rnets','vnetwork'))) + if opts.printconfig is not None: + try: val = cfg.get(c.server, opts.printconfig) + except NoOptionError: pass + else: print(val) + sys.exit(0) + def catch_termination(): def run_cleanups(): for cleanup in cleanups: @@ -341,7 +350,9 @@ def catch_termination(): raise RuntimeError('did not die due to signal %s !' % name) for sig in (signal.SIGINT, signal.SIGTERM): - signal.signal(sig, partial(signal_handler, sig.name)) + try: signame = sig.name + except AttributeError: signame = "signal %d" % sig + signal.signal(sig, partial(signal_handler, signame)) def daemonise(): global syslogfacility @@ -354,6 +365,7 @@ def daemonise(): facility=facilnum, logoption=syslog.LOG_PID) def emit(event): + if logevent_is_boringtwisted(event): return m = twisted.logger.formatEvent(event) #print(repr(event), m, file=org_stderr) level = event.get('log_level') @@ -363,6 +375,10 @@ def daemonise(): elif level == LogLevel.warn : sl = syslog.LOG_WARNING else : sl = syslog.LOG_INFO syslog.syslog(sl,m) + failure = event.get('log_failure') + if failure is not None: + for l in failure.getTraceback().split('\n'): + syslog.syslog(sl,l) glp = twisted.logger.globalLogPublisher glp.addObserver(emit) log_debug(DBG.INIT, 'starting to log to syslog') @@ -372,6 +388,8 @@ def daemonise(): daemonic_reactor = (twisted.internet.interfaces.IReactorDaemonize .providedBy(reactor)) if daemonic_reactor: reactor.beforeDaemonize() + if opts.pidfile is not None: + pidfile_h = open(opts.pidfile, 'w') rfd, wfd = os.pipe() childpid = os.fork() if childpid: @@ -389,17 +407,16 @@ def daemonise(): grandchildpid = os.fork() if grandchildpid: # we are the intermediate child + if opts.pidfile is not None: + print(grandchildpid, file=pidfile_h) + pidfile_h.close() os._exit(0) - mypid = os.getpid() if opts.pidfile is not None: - pfh = open(opts.pidfile, 'w') - print(mypid, file=pfh) - pfh.close() - + pidfile_h.close() + logger = subprocess.Popen(['logger','-d', - '-t','hippotat(stderr)', - '--id=%d' % mypid, + '-t','hippotat[%d](stderr)' % os.getpid(), '-p',opts.syslogfacility + '.err'], stdin=subprocess.PIPE, stdout=subprocess.DEVNULL, @@ -446,6 +463,12 @@ optparser.add_option('--syslog-facility', default=None, help='log to syslog, with specified facility') +optparser.add_option('--print-config', + nargs=1, type='string',action='store', + metavar='OPTION', dest='printconfig', + default=None, + help='print one config option value and exit') + common_startup(process_cfg) catch_termination() start_http()