make hbc two protocol aware
This commit is contained in:
@@ -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,14 +52,17 @@ 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]:
|
||||
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][0] == 2:
|
||||
elif r[0] == 2:
|
||||
af_type=socket.AF_INET
|
||||
else:
|
||||
print "dont know this net type: %s" % r[0][0]
|
||||
@@ -70,39 +73,46 @@ def getsock(host):
|
||||
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 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))
|
||||
cont = False
|
||||
for sock in socks:
|
||||
if sock.fileno() in r[0]:
|
||||
data, addr = sock.recvfrom(1024)
|
||||
if data == "ACK":
|
||||
@@ -113,6 +123,9 @@ def process():
|
||||
except:
|
||||
syslogtrace('System')
|
||||
pass
|
||||
cont = True
|
||||
continue
|
||||
if cont:
|
||||
continue
|
||||
lastT=time.time()
|
||||
for hb_host in hb_hosts:
|
||||
@@ -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,6 +148,7 @@ 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)
|
||||
for sock in socks:
|
||||
sock.close()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user