Python script to check uptime

Below is a python version of the Bash script to check uptime.

Like the bash version, it is designed to be run by cron every minute and will email when the new uptime is lower than the uptime from the last run.

The tmpfile /tmp/uptime.txt must exist and contain a number for the script to work.

#!/usr/bin/env python
#
# uptime-check.py
# Check uptime and mail if uptime is less than it was when script last ran
# http://linux-101.org
#
 
import os, smtplib, traceback, subprocess
 
# recipient(s) MUST be a list
recipient = ["user@example.com"]
sender = "uptime@example.com"
tmp = "/var/tmp/uptime.txt"
 
class Server:
    def __init__(self):
        self.hostname = "unknown server"
        self.uptimeold = None
        self.uptimenew = None
 
    def sendMail(self, sender, recipient, data):
        mailserver = smtplib.SMTP('mail.uplinkzero.com')
        mailserver.set_debuglevel(0)
        mailserver.sendmail(sender, recipient, data)
        mailserver.quit()
 
 
def main():
    myserver = Server()
    cmd = subprocess.Popen("hostname", shell=True, stdout=subprocess.PIPE)
    out = cmd.stdout.readlines()
    myserver.hostname = out[0].rstrip("\n")
 
    tmpfile = open(tmp,"r")
    oldupstr = tmpfile.read()
    myserver.uptimeold = float(oldupstr.rstrip("\n"))
    tmpfile.close()
 
    uptimef = open("/proc/uptime", "r")
    newupstr = uptimef.read()
    newuplst = newupstr.split()
    myserver.uptimenew = float(newuplst[0])
    uptimef.close()
 
    print "Hostname = %s" %(myserver.hostname)
    print "Old uptime = %s" %(myserver.uptimeold)
    print "New uptime = %s" %(myserver.uptimenew)
 
    if myserver.uptimenew <= myserver.uptimeold:
        data = """Subject: %s has been rebooted
Hostname = %s
Old uptime = %s
New uptime = %s""" %(myserver.hostname, myserver.hostname, myserver.uptimeold, myserver.uptimenew)
        try:
            myserver.sendMail(sender, recipient, data)
            print "Email sent"
        except:
            print "Email sending failed"
        tmpfile = open(tmp, "w")
        tmpfile.write(str(myserver.uptimenew))
        tmpfile.close()
    else:
        tmpfile = open(tmp, "w")
        tmpfile.write(str(myserver.uptimenew))
        tmpfile.close()
 
if __name__ == "__main__":
    try:
        main()
    except Exception, e:
        print str(e)
        traceback.print_exc()
        os._exit(1)

Micro Banner Micro Banner Micro Banner Micro Banner Micro Banner Micro Banner