diff --git a/hbd b/hbd index f1ef6c8..349abf1 100755 --- a/hbd +++ b/hbd @@ -4,11 +4,28 @@ # VER = 1.52 -import time, os, string, sys, socket, atexit, select, SocketServer, getopt, signal, cPickle, smtplib, traceback, urllib +import time +import os +import string +import sys +import socket +import atexit +import select +import SocketServer +import getopt +import signal +import cPickle +import smtplib +import traceback +import urllib +import httplib from subprocess import Popen, STDOUT, PIPE +SEND_EMAIL=False +SEND_PUSHOVER=True + False = 0 True = 1 LOGFILE = "/home/andreas/public_html/messages/andreas" @@ -118,31 +135,45 @@ class Host: def email(s, msg): - ret = "OK" - toaddrs = AEMAIL - fromaddr = "aew.heartbeat@wrede.ca" - subj = "Info from %s: %s" % (NAME, s) - date = time.strftime("%a, %d %b %Y %H:%M:%S %z", time.localtime()) - 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: - server.set_debuglevel(1) - server.sendmail(fromaddr, toaddrs, body) - except smtplib.SMTPRecipientsRefused, errs: - log("cannot send email: %s\n" % (errs)) - ret = "Fail" - except: - print("smtp error: "+traceback.format_exc()) - saveandrestart() - try: - server.quit() - except: - pass - return ret + if not SEND_EMAIL: + return + ret = "OK" + toaddrs = AEMAIL + fromaddr = "aew.heartbeat@wrede.ca" + subj = "Info from %s: %s" % (NAME, s) + date = time.strftime("%a, %d %b %Y %H:%M:%S %z", time.localtime()) + 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: + server.set_debuglevel(1) + server.sendmail(fromaddr, toaddrs, body) + except smtplib.SMTPRecipientsRefused, errs: + log("cannot send email: %s\n" % (errs)) + ret = "Fail" + except: + print("smtp error: "+traceback.format_exc()) + saveandrestart() + try: + server.quit() + except: + pass + return ret + + +def pushover(msg): + if not SEND_PUSHOVER: + return + conn = httplib.HTTPSConnection("api.pushover.net:443") + conn.request("POST", "/1/messages.json", + urllib.urlencode({ + "token": "ac7NLX2rPjXFareeDgLpXNoDf4iFmf", + "user": "uDhH33UjQQDYtNzJb1ThRiWb9ingGK", + "message": msg, + }), { "Content-type": "application/x-www-form-urlencoded" }) + conn.getresponse() -# # nsupdate: set the DNS A record for a fqdn # return: None if ok, else error text def nsupdate(hostname, newip): @@ -176,7 +207,6 @@ answer return output -# # def dur(sec): sec = int(sec) @@ -190,7 +220,6 @@ def dur(sec): return "0:%02d" % s -# # def addhost(name, addr): sname = shortname(name) @@ -268,6 +297,7 @@ def checkoverdue(): m = "%s is overdue" % h if h in watchhosts: email("overdue", m) + pushover(m) hosts[h].newstate(Host.overdue, grace) log(m) @@ -383,6 +413,7 @@ def fromaddr(name, addr, boot, interval, acks): log(m) if name in watchhosts: email("address change", m) + pushover(m) host.lastbeat = now if host.getstate() != Host.up and interval > 0: @@ -392,6 +423,7 @@ def fromaddr(name, addr, boot, interval, acks): log(m) if name in watchhosts: email("back", name) + pushover("%s is back" % name) host.upcount += 1 @@ -448,17 +480,21 @@ def readsock(sock): log(m) if name in watchhosts: email("booted", m) + pushover(m) if msg: m = "%s msg: %s" % (name, msg) log(m, service=service) if name in watchhosts: email("msg", m) + pushover(m) + fromaddr(name, addr[0], boot, interval, acks) if shutdown: m = "%s shutdown" % name log(m) if name in watchhosts: email("shutdown", m) + pushover(m) try: hosts[name].newstate(Host.down) except: @@ -472,7 +508,9 @@ def readsock(sock): rmsg="ACK" if len(hosts[name].cmds): rmsg=hosts[name].cmds[0] - email("%s cmd exec" % name, "command '%s' initiated" % hosts[name].cmds[0]) + msg="command '%s' initiated" % hosts[name].cmds[0] + email("%s cmd exec" % name, msg) + pushover(msg) del hosts[name].cmds[0] log("%s command initiated" % name) try: