make work on linux
This commit is contained in:
@@ -33,7 +33,7 @@ import syslog
|
|||||||
PORT = 50003
|
PORT = 50003
|
||||||
INTERVAL = 10
|
INTERVAL = 10
|
||||||
PIDFILE = '/tmp/hbc.pid'
|
PIDFILE = '/tmp/hbc.pid'
|
||||||
DBG = True
|
DBG = False
|
||||||
|
|
||||||
sock = None
|
sock = None
|
||||||
up = True
|
up = True
|
||||||
@@ -54,13 +54,16 @@ def getsock(host):
|
|||||||
try:
|
try:
|
||||||
r=socket.getaddrinfo(host, 50001, 0, 0, socket.SOL_UDP)
|
r=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())
|
||||||
|
if DBG: print logm
|
||||||
return None
|
return None
|
||||||
if r[0][0] == 28:
|
if r[0][0] in [10, 28, 30]:
|
||||||
af_type=socket.AF_INET6
|
af_type=socket.AF_INET6
|
||||||
elif r[0][0] == 2:
|
elif r[0][0] == 2:
|
||||||
af_type=socket.AF_INET
|
af_type=socket.AF_INET
|
||||||
else:
|
else:
|
||||||
return None
|
print "dont know this net type: %s" % r[0][0]
|
||||||
|
sys.exit(1)
|
||||||
if verbose:
|
if verbose:
|
||||||
syslog.syslog("socktype: %s" % af_type)
|
syslog.syslog("socktype: %s" % af_type)
|
||||||
sock=socket.socket(af_type, socket.SOCK_DGRAM)
|
sock=socket.socket(af_type, socket.SOCK_DGRAM)
|
||||||
@@ -76,6 +79,7 @@ def socksend(msg, tohost):
|
|||||||
|
|
||||||
if sock == None:
|
if sock == None:
|
||||||
sock=getsock(tohost[0])
|
sock=getsock(tohost[0])
|
||||||
|
if DBG: print "socksend: sending msg=%s on socket=%s" % (msg, sock)
|
||||||
sock.sendto(msg, tohost)
|
sock.sendto(msg, tohost)
|
||||||
if verbose: syslog.syslog("msg %s sent" % msg)
|
if verbose: syslog.syslog("msg %s sent" % msg)
|
||||||
|
|
||||||
@@ -117,6 +121,8 @@ def process():
|
|||||||
if verbose: syslog.syslog("sock.send('%s', (%s, %s))" % (msg, hb_host, hb_port))
|
if verbose: syslog.syslog("sock.send('%s', (%s, %s))" % (msg, hb_host, hb_port))
|
||||||
socksend(msg, (hb_host, hb_port))
|
socksend(msg, (hb_host, hb_port))
|
||||||
except:
|
except:
|
||||||
|
logm = '%s hbc died: \n%s' % ('socksend', traceback.format_exc())
|
||||||
|
if DBG: print logm
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@@ -241,6 +247,7 @@ if not msgonly:
|
|||||||
msgboot.append("interval=%s" % interval)
|
msgboot.append("interval=%s" % interval)
|
||||||
|
|
||||||
if len(msgboot) > 0:
|
if len(msgboot) > 0:
|
||||||
|
if DBG: print "on boot"
|
||||||
msgboot.append("name=%s" % iam)
|
msgboot.append("name=%s" % iam)
|
||||||
msgboot.append("time=%s" % time.time())
|
msgboot.append("time=%s" % time.time())
|
||||||
msgboot.append("acks=0")
|
msgboot.append("acks=0")
|
||||||
@@ -249,9 +256,11 @@ if len(msgboot) > 0:
|
|||||||
fail=0
|
fail=0
|
||||||
for hb_host in hb_hosts:
|
for hb_host in hb_hosts:
|
||||||
try:
|
try:
|
||||||
if verbose: print "sock.send('%s', (%s, %s))" % (msg, hb_host, hb_port)
|
if DBG: print "sock.send('%s', (%s, %s))" % (msg, hb_host, hb_port)
|
||||||
socksend(msg, (hb_host, hb_port))
|
socksend(msg, (hb_host, hb_port))
|
||||||
except:
|
except:
|
||||||
|
logm = '%s hbc died: \n%s' % ('socksend2', traceback.format_exc())
|
||||||
|
if DBG: print logm
|
||||||
fail=1
|
fail=1
|
||||||
if fail:
|
if fail:
|
||||||
time.sleep(10)
|
time.sleep(10)
|
||||||
@@ -293,6 +302,7 @@ if fdaemon:
|
|||||||
working_directory='/tmp',
|
working_directory='/tmp',
|
||||||
umask=0o002,
|
umask=0o002,
|
||||||
pidfile=pidfile,
|
pidfile=pidfile,
|
||||||
|
initgroups=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
context.signal_map = {
|
context.signal_map = {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
# $Id: hbd,v 1.38 2013/07/14 02:25:05 andreas Exp $
|
# $Id: hbd,v 1.38 2013/07/14 02:25:05 andreas Exp $
|
||||||
# Wait for heartbeat messages and act on them (or their absence)
|
# Wait for heartbeat messages and act on them (or their absence)
|
||||||
#
|
#
|
||||||
VER = 1.62
|
VER = 2.00
|
||||||
|
|
||||||
import time
|
import time
|
||||||
import os
|
import os
|
||||||
@@ -12,6 +12,7 @@ import socket
|
|||||||
import atexit
|
import atexit
|
||||||
import select
|
import select
|
||||||
import SocketServer
|
import SocketServer
|
||||||
|
import BaseHTTPServer
|
||||||
import getopt
|
import getopt
|
||||||
import signal
|
import signal
|
||||||
import cPickle
|
import cPickle
|
||||||
@@ -19,6 +20,8 @@ import smtplib
|
|||||||
import traceback
|
import traceback
|
||||||
import urllib
|
import urllib
|
||||||
import httplib
|
import httplib
|
||||||
|
import threading
|
||||||
|
import Queue
|
||||||
|
|
||||||
from subprocess import Popen, STDOUT, PIPE
|
from subprocess import Popen, STDOUT, PIPE
|
||||||
|
|
||||||
@@ -26,8 +29,8 @@ from subprocess import Popen, STDOUT, PIPE
|
|||||||
SEND_EMAIL=False
|
SEND_EMAIL=False
|
||||||
SEND_PUSHOVER=True
|
SEND_PUSHOVER=True
|
||||||
|
|
||||||
False = 0
|
DEBUG = 0
|
||||||
True = 1
|
|
||||||
LOGFILE = "/home/andreas/public_html/messages/andreas"
|
LOGFILE = "/home/andreas/public_html/messages/andreas"
|
||||||
PICKFILE = "/var/tmp/hbd.pick"
|
PICKFILE = "/var/tmp/hbd.pick"
|
||||||
AEMAIL = ["andreas@wrede.ca"]
|
AEMAIL = ["andreas@wrede.ca"]
|
||||||
@@ -44,7 +47,7 @@ num = 0
|
|||||||
PORT = 50003
|
PORT = 50003
|
||||||
TPORT = 50004
|
TPORT = 50004
|
||||||
THOST = ""
|
THOST = ""
|
||||||
DEBUG = False
|
|
||||||
verbose = False
|
verbose = False
|
||||||
|
|
||||||
INTERVAL = 10
|
INTERVAL = 10
|
||||||
@@ -60,13 +63,10 @@ def handler(signum, frame):
|
|||||||
sig = signum
|
sig = signum
|
||||||
if not running:
|
if not running:
|
||||||
if verbose:
|
if verbose:
|
||||||
print "NOT runing signal: %s running: %d" % (sig, running)
|
sys.stderr.write("NOT runing signal: %s running: %d" % (sig, running))
|
||||||
return
|
sys.exit(2)
|
||||||
# signal.signal(sig, handler)
|
|
||||||
if verbose:
|
if verbose:
|
||||||
print "signal: %s running: %s frame: %s" % (sig, running, frame)
|
sys.stderr.write("signal: %s running: %s frame: %s" % (sig, running, frame))
|
||||||
running = False
|
|
||||||
# sys.exit(0)
|
|
||||||
|
|
||||||
|
|
||||||
def shortname(name):
|
def shortname(name):
|
||||||
@@ -78,6 +78,12 @@ class NullDevice:
|
|||||||
def write(self, s):
|
def write(self, s):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
class Addr:
|
||||||
|
def __init__(self, a4, a6):
|
||||||
|
self.a4 = a4
|
||||||
|
self.a6 = a6
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Host:
|
class Host:
|
||||||
up = "up"
|
up = "up"
|
||||||
@@ -136,11 +142,11 @@ class Host:
|
|||||||
vs=""
|
vs=""
|
||||||
else:
|
else:
|
||||||
vs="-"
|
vs="-"
|
||||||
r+= "<td>%s</td>" % vs
|
r+= '<td align="right">%s</td>' % vs
|
||||||
return r
|
return r
|
||||||
else:
|
else:
|
||||||
return "<td>(%s)</td><td></td><td></td>" % (self.doesack)
|
return "<td>(%s)</td><td></td><td></td>" % (self.doesack)
|
||||||
return "<td>N/A</td><td></td<td></td>>"
|
return '<td align="right">N/A</td><td></td<td></td>>'
|
||||||
|
|
||||||
# set new state, return number of secs in previous state
|
# set new state, return number of secs in previous state
|
||||||
def newstate(self, state, when=0):
|
def newstate(self, state, when=0):
|
||||||
@@ -162,8 +168,7 @@ def email(s, msg):
|
|||||||
body = "To: %s\nFrom: %s\nSubject: %s\nDate: %s\n\n%s" % (toaddrs[0], fromaddr, subj, date, msg)
|
body = "To: %s\nFrom: %s\nSubject: %s\nDate: %s\n\n%s" % (toaddrs[0], fromaddr, subj, date, msg)
|
||||||
try:
|
try:
|
||||||
server = smtplib.SMTP(SMTPSERVER)
|
server = smtplib.SMTP(SMTPSERVER)
|
||||||
if DEBUG:
|
if DEBUG > 0: server.set_debuglevel(1)
|
||||||
server.set_debuglevel(1)
|
|
||||||
server.sendmail(fromaddr, toaddrs, body)
|
server.sendmail(fromaddr, toaddrs, body)
|
||||||
except smtplib.SMTPRecipientsRefused, errs:
|
except smtplib.SMTPRecipientsRefused, errs:
|
||||||
log("cannot send email: %s\n" % (errs))
|
log("cannot send email: %s\n" % (errs))
|
||||||
@@ -202,7 +207,17 @@ def nsupdate(hostname, newip):
|
|||||||
D['dnsttl'] = '5'
|
D['dnsttl'] = '5'
|
||||||
D['newip'] = newip
|
D['newip'] = newip
|
||||||
D['ts'] = time.strftime('%Y-%m-%d.%H:%M:%S', time.gmtime())
|
D['ts'] = time.strftime('%Y-%m-%d.%H:%M:%S', time.gmtime())
|
||||||
nsup = """update delete %(fqdn)s A
|
if newip.find(":") > 0:
|
||||||
|
nsup = """update delete %(fqdn)s AAAA
|
||||||
|
update add %(fqdn)s %(dnsttl)s AAAA %(newip)s
|
||||||
|
update delete %(fqdn)s TXT
|
||||||
|
update add %(fqdn)s %(dnsttl)s TXT "Created: %(ts)s"
|
||||||
|
send
|
||||||
|
answer
|
||||||
|
|
||||||
|
""" % D
|
||||||
|
else:
|
||||||
|
nsup = """update delete %(fqdn)s A
|
||||||
update add %(fqdn)s %(dnsttl)s A %(newip)s
|
update add %(fqdn)s %(dnsttl)s A %(newip)s
|
||||||
update delete %(fqdn)s TXT
|
update delete %(fqdn)s TXT
|
||||||
update add %(fqdn)s %(dnsttl)s TXT "Created: %(ts)s"
|
update add %(fqdn)s %(dnsttl)s TXT "Created: %(ts)s"
|
||||||
@@ -210,9 +225,10 @@ send
|
|||||||
answer
|
answer
|
||||||
|
|
||||||
""" % D
|
""" % D
|
||||||
# log("DBG: nsup %s" % nsup)
|
|
||||||
|
if DEBUG > 0: log("DBG: nsup %s" % nsup)
|
||||||
cmd = ["/usr/local/bin/nsupdate", "-k", "/etc/dhcpc/K%(domain)s.+157+00000." % D, "-v"]
|
cmd = ["/usr/local/bin/nsupdate", "-k", "/etc/dhcpc/K%(domain)s.+157+00000." % D, "-v"]
|
||||||
# log("DBG: cmd %s" % cmd)
|
if DEBUG > 0: log("DBG: cmd %s" % cmd)
|
||||||
try:
|
try:
|
||||||
p = Popen(cmd, shell=False, bufsize=1, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
|
p = Popen(cmd, shell=False, bufsize=1, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
|
||||||
except OSError, e:
|
except OSError, e:
|
||||||
@@ -261,9 +277,11 @@ def addhost(name, addr):
|
|||||||
|
|
||||||
#
|
#
|
||||||
def on_exit():
|
def on_exit():
|
||||||
if DEBUG:
|
if DEBUG > 0: sys.stderr.write("on_exit\n")
|
||||||
sys.stderr.write("on_exit\n")
|
try:
|
||||||
logf.close()
|
logf.close()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
print "exit"
|
print "exit"
|
||||||
|
|
||||||
|
|
||||||
@@ -289,7 +307,7 @@ def checkoverdue():
|
|||||||
|
|
||||||
|
|
||||||
def log(m, service="heartbeat"):
|
def log(m, service="heartbeat"):
|
||||||
if DEBUG: print "Log: %s" % m
|
if DEBUG > 0: print "Log: %s" % m
|
||||||
msg = time.strftime("%b %d %H:%M:%S", time.localtime(time.time()))+": "+m+"\n"
|
msg = time.strftime("%b %d %H:%M:%S", time.localtime(time.time()))+": "+m+"\n"
|
||||||
msgs.append(msg)
|
msgs.append(msg)
|
||||||
if logfmt == "msg":
|
if logfmt == "msg":
|
||||||
@@ -301,6 +319,19 @@ def log(m, service="heartbeat"):
|
|||||||
pickleit()
|
pickleit()
|
||||||
|
|
||||||
|
|
||||||
|
def dnsupdatethread():
|
||||||
|
while True:
|
||||||
|
name, addr = dnsQ.get()
|
||||||
|
m = "%s changed address to %s" % (name, addr)
|
||||||
|
err = nsupdate(name, addr)
|
||||||
|
if err:
|
||||||
|
m += ", DNS failed: %s" % err
|
||||||
|
email("error: nsupdate failed", m)
|
||||||
|
else:
|
||||||
|
m += ", DNS updated."
|
||||||
|
dnsQ.task_done()
|
||||||
|
log(m)
|
||||||
|
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
def fromaddr(name, addr, boot, interval, acks):
|
def fromaddr(name, addr, boot, interval, acks):
|
||||||
@@ -319,14 +350,10 @@ def fromaddr(name, addr, boot, interval, acks):
|
|||||||
host.addr = addr
|
host.addr = addr
|
||||||
htab[addr] = name
|
htab[addr] = name
|
||||||
m = "%s changed address to %s" % (host.name, addr)
|
m = "%s changed address to %s" % (host.name, addr)
|
||||||
if name in dyndnshosts:
|
if name in dyndnshosts and not ":" in addr: # don't try and cat ptr to IPv6 addr
|
||||||
err = nsupdate(name, addr)
|
dnsQ.put((name, addr))
|
||||||
if err:
|
else:
|
||||||
m += ", DNS failed: %s" % err
|
log(m)
|
||||||
email("error: nsupdate failed", m)
|
|
||||||
else:
|
|
||||||
m += ", DNS updated."
|
|
||||||
log(m)
|
|
||||||
if name in watchhosts:
|
if name in watchhosts:
|
||||||
email("address change", m)
|
email("address change", m)
|
||||||
pushover(m)
|
pushover(m)
|
||||||
@@ -350,7 +377,9 @@ def fromaddr(name, addr, boot, interval, acks):
|
|||||||
#
|
#
|
||||||
def readsock(sock):
|
def readsock(sock):
|
||||||
global htab
|
global htab
|
||||||
|
if DEBUG > 3: sys.stderr.write("readsock recfrom start")
|
||||||
data, addr = sock.recvfrom(1024)
|
data, addr = sock.recvfrom(1024)
|
||||||
|
if DEBUG > 2: sys.stderr.write("readsock = %s, %s\n" % (data,addr))
|
||||||
pairs = string.split(data, ';')
|
pairs = string.split(data, ';')
|
||||||
boot = 0
|
boot = 0
|
||||||
shutdown = 0
|
shutdown = 0
|
||||||
@@ -434,20 +463,32 @@ def readsock(sock):
|
|||||||
log("%s command initiated" % name)
|
log("%s command initiated" % name)
|
||||||
try:
|
try:
|
||||||
ss=sock.sendto(rmsg, addr)
|
ss=sock.sendto(rmsg, addr)
|
||||||
if DEBUG:
|
if DEBUG > 2: print "msg from %s,%s, sent %s bytes back" % (addr[0], addr[1], ss)
|
||||||
log("msg from %s,%s, sent %s bytes back" % (addr[0], addr[1], ss))
|
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
class HtmlServer(SocketServer.TCPServer):
|
|
||||||
allow_reuse_address = True
|
|
||||||
#
|
|
||||||
#
|
|
||||||
class HtmlHandler(SocketServer.BaseRequestHandler):
|
|
||||||
|
|
||||||
|
#class HttpServer(BaseHTTPServer.HTTPServer):
|
||||||
|
class HttpServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
|
||||||
|
allow_reuse_address = True
|
||||||
|
def threaded():
|
||||||
|
pass
|
||||||
|
#
|
||||||
|
#
|
||||||
|
class HttpHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
||||||
|
|
||||||
|
|
||||||
|
def do_HEAD(self):
|
||||||
|
self.send_response(200)
|
||||||
|
self.send_header("Last-Modified", time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime(now)))
|
||||||
|
# self.send_header("Accept-Ranges","bytes")
|
||||||
|
# self.send_header("Connection","close")
|
||||||
|
self.send_header("Content-Type","text/html; charset = ISO-8859-1")
|
||||||
|
self.end_headers()
|
||||||
|
|
||||||
|
|
||||||
def buildhead(self, title="Heartbeat", refresh=None):
|
def buildhead(self, title="Heartbeat", refresh=None):
|
||||||
res=[]
|
res=[]
|
||||||
@@ -458,12 +499,13 @@ class HtmlHandler(SocketServer.BaseRequestHandler):
|
|||||||
if refresh:
|
if refresh:
|
||||||
res.append("<meta http-equiv = Refresh content = %d>\n" % refresh)
|
res.append("<meta http-equiv = Refresh content = %d>\n" % refresh)
|
||||||
res.append("</head>")
|
res.append("</head>")
|
||||||
res.append('<body BGCOLOR = "#FFFFFF" LINK = "#008000" VLINK = "#008000" BACKGROUND = "/~andreas/images/tile.marble.gif">')
|
res.append('<body BGCOLOR = "#FFFFFF" LINK = "#008000" VLINK = "#008000">')
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
def buildpage(self):
|
def buildpage(self):
|
||||||
res=self.buildhead(refresh=60)
|
res=self.buildhead(refresh=60)
|
||||||
res.append("<H2>Heartbeat status</h2><h4> %s (%s)</H4>" % (time.strftime("%H:%M:%S", time.localtime(now)), os.environ.get('TZ', 'CET-1CDT')))
|
res.append("<H2>Heartbeat status %s</h2><h4> %s (%s)</H4>" % (VER, time.strftime("%H:%M:%S", time.localtime(now)), os.environ.get('TZ', 'CET-1CDT')))
|
||||||
res.append("<table>")
|
res.append("<table>")
|
||||||
res.append("<tr><th>Host</th><th>State</th><th>Hr</th><th>Dy</th><th>Wk</th><th>IP Addr</th><th>Last change</th></tr>\n")
|
res.append("<tr><th>Host</th><th>State</th><th>Hr</th><th>Dy</th><th>Wk</th><th>IP Addr</th><th>Last change</th></tr>\n")
|
||||||
hosts_sorted = hosts.keys()
|
hosts_sorted = hosts.keys()
|
||||||
@@ -487,36 +529,26 @@ class HtmlHandler(SocketServer.BaseRequestHandler):
|
|||||||
res.append('<h1>%s</h1>' % (cause))
|
res.append('<h1>%s</h1>' % (cause))
|
||||||
res.append('<p>%s</p>' % lcause)
|
res.append('<p>%s</p>' % lcause)
|
||||||
res.append('<hr>')
|
res.append('<hr>')
|
||||||
res.append('<address>hbd (Unix) Server at %s Port %s</address>' % (hbd_host, hbd_port))
|
res.append('<address>hbd (Unix) Server at %s:%s</address>' % (hbd_host, hbd_port))
|
||||||
res.append('</body></html>')
|
res.append('</body></html>')
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def handle(self):
|
|
||||||
global sig, running
|
|
||||||
headers=[]
|
|
||||||
headers.append("Date: %s" % time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime(now)))
|
|
||||||
headers.append("Server: hbd")
|
|
||||||
headers.append("Last-Modified: %s" % time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime(now)))
|
|
||||||
headers.append("Accept-Ranges: bytes")
|
|
||||||
headers.append("Connection: close")
|
|
||||||
headers.append("Content-Type: text/html; charset = ISO-8859-1")
|
|
||||||
|
|
||||||
uri = '/unknown'
|
def do_GET(self):
|
||||||
f = self.request.makefile()
|
global sig
|
||||||
while 1:
|
xsig = 0
|
||||||
line = string.strip(f.readline())
|
self.do_HEAD()
|
||||||
if len(line) == 0:
|
headers=[]
|
||||||
break
|
|
||||||
r = line.split()
|
if DEBUG > 2: sys.stderr.write("handle\n")
|
||||||
if r[0] == "GET":
|
uri = self.path
|
||||||
uri = r[1]
|
|
||||||
html = r[2]
|
|
||||||
upar=string.split(uri,"?")
|
upar=string.split(uri,"?")
|
||||||
if len(upar) == 1:
|
if len(upar) == 1:
|
||||||
uarg=[]
|
uarg=[]
|
||||||
else:
|
else:
|
||||||
uarg=string.split(upar[1],"&")
|
uarg=string.split(upar[1],"&")
|
||||||
|
|
||||||
|
if DEBUG > 2: sys.stderr.write("handle = %s\n" % (uri))
|
||||||
code = 200
|
code = 200
|
||||||
cause = "OK"
|
cause = "OK"
|
||||||
if uri == "/":
|
if uri == "/":
|
||||||
@@ -573,8 +605,7 @@ class HtmlHandler(SocketServer.BaseRequestHandler):
|
|||||||
elif upar[0] == "/r": # restart
|
elif upar[0] == "/r": # restart
|
||||||
res=self.buildhead()
|
res=self.buildhead()
|
||||||
res.append("restart request")
|
res.append("restart request")
|
||||||
sig=signal.SIGHUP
|
xsig=signal.SIGHUP
|
||||||
running=False
|
|
||||||
log("restart request")
|
log("restart request")
|
||||||
|
|
||||||
else:
|
else:
|
||||||
@@ -583,24 +614,67 @@ class HtmlHandler(SocketServer.BaseRequestHandler):
|
|||||||
res=self.builderror(code, cause, "The requested URL was not found on this server.")
|
res=self.builderror(code, cause, "The requested URL was not found on this server.")
|
||||||
|
|
||||||
|
|
||||||
self.request.send("HTTP/1.0 %s %s\r\n" % (code, cause))
|
tosend = []
|
||||||
for h in headers:
|
for h in headers:
|
||||||
self.request.send("%s\r\n" % h)
|
tosend.append("%s\r" % h)
|
||||||
self.request.send("\r\n")
|
tosend.append("\r")
|
||||||
|
# self.request.send("HTTP/1.0 %s %s\r\n" % (code, cause))
|
||||||
|
# for h in headers:
|
||||||
|
# self.request.send("%s\r\n" % h)
|
||||||
|
# self.request.send("\r\n")
|
||||||
|
|
||||||
try:
|
tosend += res
|
||||||
self.request.send(string.join(res, "\n"))
|
self.wfile.write(string.join(tosend, "\n"))
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
if xsig:
|
||||||
|
sig = xsig
|
||||||
|
|
||||||
|
def setrunning(new):
|
||||||
|
global running
|
||||||
|
if DEBUG > 0: sys.stderr.write("running is now = %s\n" % (new))
|
||||||
|
running = new
|
||||||
|
|
||||||
|
|
||||||
|
def closeup():
|
||||||
|
setrunning(False)
|
||||||
|
try:
|
||||||
|
sock.close()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
sock6.close()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
if DEBUG > 0: sys.stderr.write("asking http server to stop\n")
|
||||||
|
|
||||||
|
try:
|
||||||
|
serv.shutdown()
|
||||||
|
if DEBUG > 0: sys.stderr.write("http server stopped\n")
|
||||||
|
except Exception as e:
|
||||||
|
if DEBUG > 0: sys.stderr.write("http server did NOT stop: %s\n" % str(e))
|
||||||
|
try:
|
||||||
|
serv.server_close()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
log("restarting")
|
||||||
|
try:
|
||||||
|
logf.close()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# signal.signal(signal.SIGTERM, 0)
|
||||||
|
signal.signal(signal.SIGHUP, 0)
|
||||||
|
|
||||||
|
|
||||||
|
def restart():
|
||||||
|
print "execv %s %s" % (sys.argv[0], [sys.argv[0]]+cmdargs)
|
||||||
|
os.execv(sys.argv[0], [sys.argv[0]]+cmdargs)
|
||||||
|
print "should not be here"
|
||||||
|
|
||||||
def saveandrestart():
|
def saveandrestart():
|
||||||
sock.close()
|
closeup()
|
||||||
sock6.close()
|
restart()
|
||||||
# serv.shutdown() #N.B. dont shutdown() as we don't use serv_forever
|
|
||||||
serv.server_close()
|
|
||||||
log("restarting")
|
|
||||||
os.execv(sys.argv[0], [sys.argv[0]]+cmdargs)
|
|
||||||
|
|
||||||
|
|
||||||
def pickleit():
|
def pickleit():
|
||||||
@@ -643,8 +717,8 @@ for o, a in optlist:
|
|||||||
verbose = True
|
verbose = True
|
||||||
cmdargs += [o]
|
cmdargs += [o]
|
||||||
elif o == '-x':
|
elif o == '-x':
|
||||||
DEBUG = True
|
DEBUG += 1
|
||||||
|
cmdargs += [o]
|
||||||
|
|
||||||
if helpflag:
|
if helpflag:
|
||||||
print "hbc HeartBeatDaemon"
|
print "hbc HeartBeatDaemon"
|
||||||
@@ -655,7 +729,7 @@ if helpflag:
|
|||||||
print " -f run in foreground"
|
print " -f run in foreground"
|
||||||
print " -h this help"
|
print " -h this help"
|
||||||
print " -v verbose"
|
print " -v verbose"
|
||||||
print " -x debug"
|
print " -x increase debug lvl"
|
||||||
print
|
print
|
||||||
print """ config file can contain
|
print """ config file can contain
|
||||||
logfile = /var/log/heartbeat.log
|
logfile = /var/log/heartbeat.log
|
||||||
@@ -688,7 +762,7 @@ try:
|
|||||||
if verbose:
|
if verbose:
|
||||||
print "notice: using config file %s" % configfile
|
print "notice: using config file %s" % configfile
|
||||||
except:
|
except:
|
||||||
print "warning: running without conifig file: %s" % configfile
|
print "warning: running without config file: %s" % configfile
|
||||||
f = None
|
f = None
|
||||||
|
|
||||||
if f:
|
if f:
|
||||||
@@ -771,8 +845,12 @@ sock6.bind(("", hb_port))
|
|||||||
ilist.append(sock6)
|
ilist.append(sock6)
|
||||||
|
|
||||||
|
|
||||||
serv = HtmlServer((hbd_host, hbd_port), HtmlHandler)
|
serv = HttpServer((hbd_host, hbd_port), HttpHandler)
|
||||||
ilist.append(serv.fileno())
|
servthread = threading.Thread(target=serv.serve_forever)
|
||||||
|
servthread.daemon = True
|
||||||
|
servthread.start()
|
||||||
|
|
||||||
|
#ilist.append(serv.fileno())
|
||||||
|
|
||||||
if not forground:
|
if not forground:
|
||||||
pid = os.fork()
|
pid = os.fork()
|
||||||
@@ -792,37 +870,49 @@ if not forground:
|
|||||||
os.setsid()
|
os.setsid()
|
||||||
os.umask(0)
|
os.umask(0)
|
||||||
|
|
||||||
|
dnsQ = Queue.Queue()
|
||||||
|
dnsT = threading.Thread(target=dnsupdatethread)
|
||||||
|
dnsT.daemon = True
|
||||||
|
dnsT.start()
|
||||||
|
|
||||||
running = True
|
running = True
|
||||||
sig = 0
|
sig = 0
|
||||||
signal.signal(signal.SIGTERM, handler)
|
#signal.signal(signal.SIGTERM, handler)
|
||||||
signal.signal(signal.SIGHUP, handler)
|
signal.signal(signal.SIGHUP, handler)
|
||||||
|
|
||||||
next = int(now)+15 # 15 seconds time to settle after (re-)start
|
next = int(now)+15 # 15 seconds time to settle after (re-)start
|
||||||
sleep = next - now
|
sleep = 1
|
||||||
while running:
|
firstcheck = int(now) + 15
|
||||||
|
|
||||||
if DEBUG:
|
while running:
|
||||||
sys.stderr.write("about to sleep = %s\n" % (sleep))
|
sr = None
|
||||||
|
if DEBUG > 2: sys.stderr.write("about to sleep = %s\n" % (sleep))
|
||||||
try:
|
try:
|
||||||
sr = select.select(ilist, [], [], sleep)
|
sr = select.select(ilist, [], [], sleep)
|
||||||
now = time.time()
|
now = time.time()
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
sys.exit(0)
|
sys.stderr.write("Keyboard Interrupt!\n")
|
||||||
|
running = False
|
||||||
|
closeup()
|
||||||
|
continue
|
||||||
except select.error, value:
|
except select.error, value:
|
||||||
if value[0] != 4: # interrupted system call
|
if value[0] != 4: # interrupted system call
|
||||||
print select.error, value
|
sys.stderr.write("select err %s %s" % (select.error, value))
|
||||||
#raise os.error, value
|
#raise os.error, value
|
||||||
continue
|
continue
|
||||||
continue
|
continue
|
||||||
except:
|
except Exception as e:
|
||||||
|
if DEBUG > 2: sys.stderr.write("select exception %s\n" % (str(e)))
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
if DEBUG > 2: sys.stderr.write("woke from sleep = %s (%s)\n" % (str(sr), str(ilist)))
|
||||||
for fh in sr[0]:
|
for fh in sr[0]:
|
||||||
if fh in [sock, sock6]:
|
if fh in [sock, sock6]:
|
||||||
readsock(fh)
|
readsock(fh)
|
||||||
elif fh == serv.fileno():
|
# elif fh == serv.fileno():
|
||||||
serv.handle_request()
|
# serv.handle_request()
|
||||||
else:
|
else:
|
||||||
print("what happend just now")
|
sys.stderr.write("what happend just now?\n")
|
||||||
|
if DEBUG > 2: sys.stderr.write("done handling, running is %s, sig is %s\n" % (running, sig))
|
||||||
|
|
||||||
# check hour/day/week
|
# check hour/day/week
|
||||||
for v in xrange(3):
|
for v in xrange(3):
|
||||||
@@ -833,19 +923,21 @@ while running:
|
|||||||
for h in hosts.keys():
|
for h in hosts.keys():
|
||||||
hosts[h].hdwcounts[v] = [hosts[h].doesack, hosts[h].upcount]
|
hosts[h].hdwcounts[v] = [hosts[h].doesack, hosts[h].upcount]
|
||||||
|
|
||||||
if now >= next:
|
if now >= next and now >= firstcheck:
|
||||||
next = now+1
|
next = now+1
|
||||||
checkoverdue()
|
checkoverdue()
|
||||||
|
|
||||||
sleep = next-now
|
sleep = next-now
|
||||||
if sleep < 0:
|
if sleep < 0:
|
||||||
sys.stderr.write("sleep is negaitive! %s next = %s\n" % (sleep, next))
|
sys.stderr.write("sleep is negative! %s next = %s\n" % (sleep, next))
|
||||||
sleep = 0
|
sleep = 0
|
||||||
if DEBUG:
|
if DEBUG > 2: sys.stderr.write("sleep = %s next = %s\n" % (sleep, next))
|
||||||
sys.stderr.write("sleep = %s next = %s\n" % (sleep, next))
|
|
||||||
|
if sig != 0:
|
||||||
|
setrunning(False)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if sig == signal.SIGHUP:
|
if sig == signal.SIGHUP:
|
||||||
if DEBUG:
|
if DEBUG > 0: sys.stderr.write("signal 1 saveandrestart\n")
|
||||||
sys.stderr.write("signal 1 exit\n")
|
|
||||||
saveandrestart()
|
saveandrestart()
|
||||||
|
|||||||
Reference in New Issue
Block a user