diff options
author | Toni Uhlig <matzeton@googlemail.com> | 2017-03-19 19:36:03 +0100 |
---|---|---|
committer | Toni Uhlig <matzeton@googlemail.com> | 2017-03-19 19:36:03 +0100 |
commit | ea8d55a5d5e1b44f9a7f038ab4b9b6cf04b25c47 (patch) | |
tree | 28d67db4ac322c1908066b314a6e64826816d6d2 | |
parent | 9ce156003ad04f751b631975210ba199d23daa96 (diff) |
portal checker
-rwxr-xr-x | portalcheck.py | 78 |
1 files changed, 68 insertions, 10 deletions
diff --git a/portalcheck.py b/portalcheck.py index 283e6e5..1d2d7ff 100755 --- a/portalcheck.py +++ b/portalcheck.py @@ -13,6 +13,22 @@ CONFIG_DBFILE = '/var/lib/portalcheck/shelvedb' CONFIG_CHECKURL = 'https://portal.imn.htwk-leipzig.de' CONFIG_DICTMAX = 10 +CONFIG_MAIL_FROM = 'toni.uhlig@stud.htwk-leipzig.de' +CONFIG_MAIL_TO = 'toni.uhlig@stud.htwk-leipzig.de' +CONFIG_MAIL_CC = [ 'toni.uhlig@stud.htwk-leipzig.de' ] +CONFIG_MAIL_HOST = 'localhost' + +CONFIG_MAIL_SUBJ = 'Portal state changed: %s' +CONFIG_MAIL_OFF = ''+ \ + 'Dies ist eine automatisch generierte E-Mail.\n\n'+ \ + 'Die URI %s ist seit dem %s nicht mehr erreichbar.\n'+ \ + 'Letzter HTTP response code: %s\n\n'+ \ + 'Sie werden benachrichtigt, wenn das Portal wieder erreichbar ist.\n' +CONFIG_MAIL_ON = ''+ \ + 'Dies ist eine automatisch generierte E-Mail.\n\n'+ \ + 'Die URI %s ist seit %s wieder erreichbar.\n'+ \ + 'Offline Dauer: %s\n' + TYPE_ONLINE = 0 TYPE_ONLINE_AGAIN = 1 TYPE_OFFLINE = 2 @@ -32,6 +48,7 @@ class PortalObject(object): class PortalCheck(object): + DATETIME_FMT = '%02d.%02d.%04d - %02d:%02d:%02d' DICT_LAST = 'last' DICT_CURRENT_TYPE = 'cur_type' DICT_CURRENT_INDEX = 'cur_index' @@ -57,6 +74,49 @@ class PortalCheck(object): def cleanup(self): self.shelvedb.close() + def doTimeFormat(self, tm): + lt = time.localtime(tm); + return '%02d.%02d.%04d - %02d:%02d:%02d' % (lt.tm_mday, lt.tm_mon, lt.tm_year, lt.tm_hour, lt.tm_min, lt.tm_sec) + + def sendMail(self): + typ = self.loadType() + typstr = 'UNKNOWN' + mailcon = 'EMPTY' + last = self.loadLast() + tdstr = self.doTimeFormat(last.timestamp) + if typ == TYPE_ONLINE or typ == TYPE_ONLINE_AGAIN: + typstr = 'ONLINE' + ind = self.loadIndex() + forelast = self.loadObject(ind - 1) + offdays = divmod(last.timestamp - forelast.timestamp, 86400) + offhrs = divmod(offdays[1], 3600) + offmins = divmod(offhrs[1], 60) + offsecs = offmins[1] + offstr = '%d Tag%c, %d Stunde%c, %d Minute%c, %d Sekunde%c' % \ + (offdays[0], 'e' if offdays[0] != 1 else ' ', \ + offhrs[0], 'n' if offhrs[0] != 1 else ' ', \ + offmins[0], 'n' if offmins[0] != 1 else ' ', \ + offsecs, 'n' if offsecs != 1 else ' ') + mailcon = CONFIG_MAIL_ON % (self.uri, tdstr, offstr) + elif typ == TYPE_OFFLINE or typ == TYPE_OFFLINE_AGAIN: + typstr = 'OFFLINE' + httpresp = str(last.httpresp) if last.httpresp != -1 else 'connection error (' + str(last.errstr) + ')' + mailcon = CONFIG_MAIL_OFF % (self.uri, tdstr, httpresp) + else: + return + subj = CONFIG_MAIL_SUBJ % (typstr) + dbg(str(subj)) + dbg(str(mailcon)) + import smtplib + from email.mime.text import MIMEText + msg = MIMEText(str(mailcon)) + msg['Subject'] = str(subj) + msg['From'] = CONFIG_MAIL_FROM + msg['To'] = CONFIG_MAIL_TO + msg['Cc'] = ', '.join(CONFIG_MAIL_CC) + s = smtplib.SMTP(CONFIG_MAIL_HOST) + s.sendmail(CONFIG_MAIL_FROM, [CONFIG_MAIL_TO]+CONFIG_MAIL_CC, msg.as_string()) + def doCheck(self): sock = urllib.urlopen(str(self.uri)) resp = sock.getcode() @@ -69,14 +129,11 @@ class PortalCheck(object): self.shelvedb[self.DICT_LAST] = portalObject def loadObject(self, index): - return self.shelvedb[str(index)] + return self.shelvedb[str( (int(index) % CONFIG_DICTMAX) )] def storeObject(self, portalObject): ind = self.loadIndex() self.shelvedb[str(ind)] = portalObject - if ind + 1 == CONFIG_DICTMAX: - ind = 0 - else: - ind = ind + 1 + ind = (ind + 1) % CONFIG_DICTMAX self.storeIndex(ind) def loadType(self): @@ -85,15 +142,14 @@ class PortalCheck(object): self.shelvedb[self.DICT_CURRENT_TYPE] = int(onlineType) def loadIndex(self): - return int(self.shelvedb[self.DICT_CURRENT_INDEX]) + return int(self.shelvedb[self.DICT_CURRENT_INDEX] % CONFIG_DICTMAX) def storeIndex(self, index): - self.shelvedb[self.DICT_CURRENT_INDEX] = index + self.shelvedb[self.DICT_CURRENT_INDEX] = (index % CONFIG_DICTMAX) def listObjects(self): for (key, value) in sorted(self.shelvedb.iteritems()): if type(value) == PortalObject: - td = time.localtime(value.timestamp) - outdate = '%02d.%02d.%04d - %02d:%02d:%02d' % (td.tm_mday, td.tm_mon, td.tm_year, td.tm_hour, td.tm_min, td.tm_sec) + outdate = self.doTimeFormat(value.timestamp) outval = outdate + ' ' + rjust(str(value.httpresp), 3, ' ') else: outval = str(value) @@ -107,7 +163,7 @@ class PortalCheck(object): httpresp = -1 errstr = str(err) curtime = time.time() - po = PortalObject(curtime, httpresp) + po = PortalObject(curtime, httpresp, errstr) ct = self.loadType() if httpresp is 200: dbg('Ok') @@ -118,6 +174,7 @@ class PortalCheck(object): last = self.loadLast() self.storeObject(last) self.storeLast(po) + self.sendMail() self.shelvedb.sync() else: dbgstr = str() @@ -130,6 +187,7 @@ class PortalCheck(object): last = self.loadLast() self.storeObject(last) self.storeLast(po) + self.sendMail() if __name__ == '__main__': |