diff --git a/hbd b/hbd
index 8926bf2..eefeec7 100755
--- a/hbd
+++ b/hbd
@@ -26,8 +26,8 @@ from subprocess import Popen, STDOUT, PIPE
SEND_EMAIL=False
SEND_PUSHOVER=True
-False = 0
-True = 1
+DEBUG = 0
+
LOGFILE = "/home/andreas/public_html/messages/andreas"
PICKFILE = "/var/tmp/hbd.pick"
AEMAIL = ["andreas@wrede.ca"]
@@ -44,7 +44,7 @@ num = 0
PORT = 50003
TPORT = 50004
THOST = ""
-DEBUG = False
+
verbose = False
INTERVAL = 10
@@ -60,11 +60,11 @@ def handler(signum, frame):
sig = signum
if not running:
if verbose:
- print "NOT runing signal: %s running: %d" % (sig, running)
- return
+ sys.stderr.write("NOT runing signal: %s running: %d" % (sig, running))
+ sys.exit(2)
# signal.signal(sig, handler)
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)
@@ -78,6 +78,12 @@ class NullDevice:
def write(self, s):
pass
+class Addr:
+ def __init__(self, a4, a6):
+ self.a4 = a4
+ self.a6 = a6
+
+
class Host:
up = "up"
@@ -136,11 +142,11 @@ class Host:
vs=""
else:
vs="-"
- r+= "
%s | " % vs
+ r+= '%s | ' % vs
return r
else:
return "(%s) | | | " % (self.doesack)
- return "N/A | | >"
+ return 'N/A | | >'
# set new state, return number of secs in previous state
def newstate(self, state, when=0):
@@ -162,7 +168,7 @@ def email(s, msg):
body = "To: %s\nFrom: %s\nSubject: %s\nDate: %s\n\n%s" % (toaddrs[0], fromaddr, subj, date, msg)
try:
server = smtplib.SMTP(SMTPSERVER)
- if DEBUG:
+ if DEBUG > 0:
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, body)
except smtplib.SMTPRecipientsRefused, errs:
@@ -202,7 +208,17 @@ def nsupdate(hostname, newip):
D['dnsttl'] = '5'
D['newip'] = newip
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 delete %(fqdn)s TXT
update add %(fqdn)s %(dnsttl)s TXT "Created: %(ts)s"
@@ -210,9 +226,10 @@ send
answer
""" % 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"]
-# log("DBG: cmd %s" % cmd)
+ if DEBUG > 0: log("DBG: cmd %s" % cmd)
try:
p = Popen(cmd, shell=False, bufsize=1, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
except OSError, e:
@@ -261,7 +278,7 @@ def addhost(name, addr):
#
def on_exit():
- if DEBUG:
+ if DEBUG > 0:
sys.stderr.write("on_exit\n")
logf.close()
print "exit"
@@ -289,7 +306,7 @@ def checkoverdue():
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"
msgs.append(msg)
if logfmt == "msg":
@@ -319,7 +336,7 @@ def fromaddr(name, addr, boot, interval, acks):
host.addr = addr
htab[addr] = name
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)
if err:
m += ", DNS failed: %s" % err
@@ -350,7 +367,11 @@ def fromaddr(name, addr, boot, interval, acks):
#
def readsock(sock):
global htab
+ if DEBUG > 3:
+ sys.stderr.write("readsock recfrom start")
data, addr = sock.recvfrom(1024)
+ if DEBUG > 2:
+ sys.stderr.write("readsock = %s, %s\n" % (data,addr))
pairs = string.split(data, ';')
boot = 0
shutdown = 0
@@ -434,8 +455,8 @@ def readsock(sock):
log("%s command initiated" % name)
try:
ss=sock.sendto(rmsg, addr)
- if DEBUG:
- log("msg from %s,%s, sent %s bytes back" % (addr[0], addr[1], ss))
+ if DEBUG > 2:
+ print "msg from %s,%s, sent %s bytes back" % (addr[0], addr[1], ss)
except:
pass
@@ -458,7 +479,7 @@ class HtmlHandler(SocketServer.BaseRequestHandler):
if refresh:
res.append("\n" % refresh)
res.append("")
- res.append('')
+ res.append('')
return res
def buildpage(self):
@@ -504,7 +525,10 @@ class HtmlHandler(SocketServer.BaseRequestHandler):
uri = '/unknown'
f = self.request.makefile()
while 1:
- line = string.strip(f.readline())
+ try:
+ line = string.strip(f.readline())
+ except:
+ line = ''
if len(line) == 0:
break
r = line.split()
@@ -517,6 +541,8 @@ class HtmlHandler(SocketServer.BaseRequestHandler):
else:
uarg=string.split(upar[1],"&")
+ if DEBUG > 2:
+ sys.stderr.write("handle = %s\n" % (uri))
code = 200
cause = "OK"
if uri == "/":
@@ -583,23 +609,40 @@ class HtmlHandler(SocketServer.BaseRequestHandler):
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 = ["HTTP/1.0 %s %s\r" % (code, cause)]
for h in headers:
- self.request.send("%s\r\n" % h)
- self.request.send("\r\n")
+ tosend.append("%s\r" % h)
+ 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")
+ tosend += res
try:
- self.request.send(string.join(res, "\n"))
+ self.request.send(string.join(tosend, "\n"))
except:
pass
def saveandrestart():
- sock.close()
- sock6.close()
-# serv.shutdown() #N.B. dont shutdown() as we don't use serv_forever
- serv.server_close()
+ try:
+ sock.close()
+ except:
+ pass
+ try:
+ sock6.close()
+ except:
+ pass
+ try:
+ serv.server_close()
+ except:
+ pass
log("restarting")
+ try:
+ logf.close()
+ except:
+ pass
os.execv(sys.argv[0], [sys.argv[0]]+cmdargs)
@@ -801,7 +844,8 @@ next = int(now)+15 # 15 seconds time to settle after (re-)start
sleep = next - now
while running:
- if DEBUG:
+ sr = None
+ if DEBUG > 2:
sys.stderr.write("about to sleep = %s\n" % (sleep))
try:
sr = select.select(ilist, [], [], sleep)
@@ -816,6 +860,8 @@ while running:
continue
except:
sys.exit(1)
+ if DEBUG > 2:
+ sys.stderr.write("woke from sleep = %s (%s)\n" % (str(sr), str(ilist)))
for fh in sr[0]:
if fh in [sock, sock6]:
readsock(fh)
@@ -841,11 +887,11 @@ while running:
if sleep < 0:
sys.stderr.write("sleep is negaitive! %s next = %s\n" % (sleep, next))
sleep = 0
- if DEBUG:
+ if DEBUG > 2:
sys.stderr.write("sleep = %s next = %s\n" % (sleep, next))
if sig == signal.SIGHUP:
- if DEBUG:
- sys.stderr.write("signal 1 exit\n")
+ if DEBUG > 0:
+ sys.stderr.write("signal 1 saveandrestart\n")
saveandrestart()