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
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