All pastes #925395 Raw Edit

mDNSexporter

public python v1 · immutable
·published 2008-03-02 23:48 UTC
rendered paste body
#!/usr/bin/env pythonimport os, sys, re, logging, signal, time, threadingROOT = '/q/public/mdnsexporter'HOSTNAME = 'fleet'SVC_PATH = '/etc/avahi/services'QUIT = FalsePID_FILE = os.path.join(ROOT, 'var', 'mdnsexporter.pid')LOG_FILE = os.path.join(ROOT, 'log', 'mdnsexporter.log')logging.basicConfig(    level=logging.DEBUG,    format='%(asctime)s %(levelname)s %(message)s',    filename=LOG_FILE,    filemode='a')def handler(signum, sigframe):    if os.path.exists(PID_FILE):        os.unlink(PID_FILE)        globals()['QUIT'] = Truesignal.signal(signal.SIGTERM, handler)signal.signal(signal.SIGINT, handler)class DNSSDRunner(threading.Thread):    def __init__(self, file, svc):        self.svc_name, self.svc_type, self.svc_port, self.svc_text = svc        self.file = file        threading.Thread.__init__(self)    def run(self):        pid = os.fork()        if pid:            while not QUIT and self.file in svcs().keys():                time.sleep(1)                pass            logging.info('killing %s' % self.file)            os.kill(pid, 15)        else:            os.execlp(                'dns-sd', 'dns-sd', '-R',                '"%s"' % self.svc_name,                self.svc_type,                '.',                self.svc_port,                self.svc_text,            )def svcs():    svcs = {}    for file in os.listdir(SVC_PATH):        try:            data = open(os.path.join(SVC_PATH, file), 'r').read()            m = re.search(r'<name[^>]*>(.*?)</name>', data)            svc_name = m.group(1)            if '%h' in svc_name:                svc_name = svc_name.replace('%h', HOSTNAME)            m = re.search(r'<type>(.*?)</type>', data)            svc_type = m.group(1)            m = re.search(r'<port>(.*?)</port>', data)            svc_port = m.group(1)            m = re.search(r'<txt-record>(.*?)</txt-record>', data)            svc_text = m.group(1)            svcs[file] = (svc_name, svc_type, svc_port, svc_text)        except:            pass    return svcsthreads = []spawned = {}pid = os.fork()if pid:    sys.exit(0)os.chdir('/')os.setsid()os.umask(0)pid = os.fork()if pid:    sys.exit(0)open(PID_FILE, 'w').write(str(os.getpid()))while not QUIT:    sv = svcs()    delete = []    for sp_file, sp_svc in spawned.iteritems():        if sp_file not in sv.keys():            delete.append(sp_file)    for d in delete:        logging.debug('removing %s' % d)        del spawned[d]    for file, svc in sv.iteritems():        svc_name, svc_type, svc_port, svc_text = svc        if file not in spawned.keys():            logging.info('spawning %s' % svc_name)            t = DNSSDRunner(file, svc)            t.start()            threads.append(t)            spawned[file] = svc    time.sleep(1)logging.info('quitting')for t in threads:    t.join()