make hbc two protocol aware

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