make hbc two protocol aware
This commit is contained in:
@@ -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,67 +52,80 @@ 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:
|
||||||
|
syslogtrace('System')
|
||||||
|
pass
|
||||||
|
cont = True
|
||||||
|
continue
|
||||||
|
if cont:
|
||||||
continue
|
continue
|
||||||
lastT=time.time()
|
lastT=time.time()
|
||||||
for hb_host in hb_hosts:
|
for hb_host in hb_hosts:
|
||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user