#! /usr/bin/python

import os
import re
import time
import cgitb; cgitb.enable()

hosts = [ 'plus','minus' ]
urls = { 'plus' : 'http://ftp.arl.army.mil/ftp/historic-computers/gif/eniac1.gif',
         'minus' : 'http://ftp.arl.army.mil/ftp/historic-computers/gif/eniac2.gif',
         'red' : 'http://ftp.arl.army.mil/ftp/historic-computers/gif/eniac3.gif',
         'blue' : 'http://ftp.arl.army.mil/ftp/historic-computers/gif/eniac4.gif' }
        
domain = 'seas.upenn.edu'
fields = ('Server', 'Arch', 'OS', 'Up', 'Users', 'Load', 'Mem', 'Free')

def htmlrow(fields, tag = 'td'):
    return ''.join(['<tr>'] + ['<' + tag + '>' + field + '</' + tag + '>' for field in fields] + ['</tr>'])
def row(dict, missing = None):
    return tuple([dict.get(fields[i], missing) for i in range(len(fields))])
def addurl(server):
    if urls.has_key(server):
        return '<a href="%s" target="_blank">%s</a>' % (urls[server], server)
    else:
        return server

class Uptime:
    uptpat = re.compile(r".*up\s+(?P<Up>.*),\s+(?P<Users>\d+)\s+user.*average:\s*(?P<Load>\d+\.\d+).*")
    mempat = re.compile(r"\D+(?P<Mem>\d+)\s+\d+\s+(?P<Free>\d+).*")
    def __init__(self, hosts, domain):
        self.servers = [ (host, domain) for host in hosts ]
    def probe(self, server):
        dict = {'Server': addurl(server[0])}
        try:
            pipe = os.popen('ssh %s.%s arch' % server)
            dict['Arch'] = pipe.read()
            pipe.close()
            pipe = os.popen('ssh %s.%s uname' % server)
            dict['OS'] = pipe.read()
            pipe.close()
            pipe = os.popen('ssh %s.%s uptime' % server)
            dict.update(self.uptpat.match(pipe.read()).groupdict())
            pipe.close()
            pipe = os.popen('ssh %s.%s free -m' % server)
            pipe.readline()
            dict.update(self.mempat.match(pipe.readline()).groupdict())
            pipe.close()
            return row(dict)
        except Exception:
            return row(dict, '-')
    def refresh(self):
        self.reports = [ self.probe(server) for server in self.servers ]
    def html(self):
        return '\n'.join(['<table border="1">\n'] + [htmlrow(fields, 'th')] + \
                         [htmlrow(report) for report in self.reports] + \
                         ['</table>'])
    def __str__(self):
        return '\n'.join(['%s:\n%s\n' % report for report in self.reports ])
                
if __name__ == '__main__':
    uptime = Uptime(hosts, domain)
    uptime.refresh()
    print '<html><head><title>Server status report</title></head><body>'
    print '<h2>Server status at %s</h2>' % time.asctime()
    print uptime.html()
    print '</body></html>'





