diff --git a/hbc b/hbc index e3c0510..5d93134 100755 --- a/hbc +++ b/hbc @@ -33,9 +33,9 @@ import syslog PORT = 50003 INTERVAL = 10 PIDFILE = '/tmp/hbc.pid' -DBG = False +DBG = True -sock = None +socks = None up = True ackcount = 0 @@ -52,68 +52,81 @@ def syslogtrace(note): def getsock(host): try: - r=socket.getaddrinfo(host, 50001, 0, 0, socket.SOL_UDP) + rs=socket.getaddrinfo(host, 50001, 0, 0, socket.SOL_UDP) except socket.gaierror: logm = '%s hbc died: \n%s' % ('getsock', traceback.format_exc()) if DBG: print logm return None - if r[0][0] in [10, 28, 30]: - af_type=socket.AF_INET6 - elif r[0][0] == 2: - af_type=socket.AF_INET - else: - print "dont know this net type: %s" % r[0][0] - sys.exit(1) - if verbose: - syslog.syslog("socktype: %s" % af_type) - sock=socket.socket(af_type, socket.SOCK_DGRAM) - sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, \ - sock.getsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR) | 1) - if verbose: syslog.syslog("get socket %s" % sock) + socks = [] + for r in rs: + if DBG: print "address %s" % str(r) + if r[0] in [10, 28, 30]: + af_type=socket.AF_INET6 + elif r[0] == 2: + af_type=socket.AF_INET + else: + print "dont know this net type: %s" % r[0][0] + sys.exit(1) + if verbose: + syslog.syslog("socktype: %s" % af_type) + sock=socket.socket(af_type, socket.SOCK_DGRAM) + sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, \ + sock.getsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR) | 1) + if verbose: syslog.syslog("get socket %s" % sock) + socks.append(sock) - return sock + return socks def socksend(msg, tohost): - global sock + global socks - if sock == None: - sock=getsock(tohost[0]) - if DBG: print "socksend: sending msg=%s on socket=%s" % (msg, sock) - sock.sendto(msg, tohost) + if socks == None: + socks = getsock(tohost[0]) + for sock in socks: + if DBG: print "socksend: sending msg=%s on socket=%s" % (msg, sock) + sock.sendto(msg, tohost) if verbose: syslog.syslog("msg %s sent" % msg) def process(): - global up, sock, ackcount + global up, socks, ackcount - if sock == None: - sock=getsock(tohost[0]) + if socks == None: + socks=getsock(tohost[0]) ackcount=0 lastT=time.time() + ifiles = [] + for sock in socks: + ifles.append(sock.fileno()) while up: sleep=(lastT+interval) - time.time() if verbose: syslog.syslog("sleep %s" % sleep) if sleep > 0: try: - r=select.select([sock.fileno()],[],[],sleep) + r=select.select(ifiles,[],[],sleep) except: if up: syslogtrace('select') break if verbose: syslog.syslog("r is %s" % str(r)) - if sock.fileno() in r[0]: - data, addr = sock.recvfrom(1024) - if data == "ACK": - ackcount+=1 - else: - try: - os.system(data) - except: - syslogtrace('System') - pass - continue + cont = False + for sock in socks: + if sock.fileno() in r[0]: + data, addr = sock.recvfrom(1024) + if data == "ACK": + ackcount+=1 + else: + try: + os.system(data) + except: + syslogtrace('System') + pass + cont = True + continue + if cont: + continue lastT=time.time() for hb_host in hb_hosts: try: @@ -127,7 +140,7 @@ def process(): def cleanup(a, b): - global up, sock, ackcount + global up, socks, ackcount up = False syslog.syslog('exit a=%s b=%s' % (str(a), str(b))) msg="shutdown=1;name=%s;acks=%s" % (iam, ackcount) @@ -135,7 +148,8 @@ def cleanup(a, b): if verbose: syslog.syslog("hbc: sock.send('%s', (%s, %s))" % (msg, hb_host, hb_port)) socksend(msg, (hb_host, hb_port)) time.sleep(1) - sock.close() + for sock in socks: + sock.close() msgonly=False @@ -311,7 +325,9 @@ if fdaemon: # signal.SIGUSR1: reload_program_config, } - context.files_preserve = [sock, sock.fileno()] + context.files_preseve = [] + for sock in socks: + context.files_preserve += [sock, sock.fileno()] with context: syslog.syslog('starting heartbeat to %s' % ','.join(hb_hosts)) up = True