#!/usr/bin/python
#
# QOS Report Server
# Doug White
#
# Code mercilessly stolen from qos_server.py
import sys
import os
import string
import re
import time
import asyncore
import event_loop
import http_server
import monitor
import auth_handler
import urllib
import StateDb
import HtmlKit
import downtimer
import entityHeaders
import reportDowntime
import reportData
import reportMultiplot
import reportMultiDowntime
from englishUnits import *
# from reportData import *
global ConfigurationData
http_server_port = 9994
monitor_server_port = 9999
path_regex = re.compile (
# path params query fragment
'\\([^;?#]*\\)\\(;[^?#]*\\)?\\(\\?[^#]*\)?\(#.*\)?'
)
# top level report system page, listing available reports
class ReportHomePage:
def display(self, request):
request['Content-Type'] = 'text/html'
p = HtmlKit.Page()
p.title_('QOS: Reports')
p.append('<H1>QOS: Reports</H1>\n<HR>\n')
t1 = HtmlKit.Panel() # root
t1.title_('Available Reports')
t1t1 = HtmlKit.Table() # subtable
l1 = HtmlKit.Link('/downtime', 'Downtime Report') # link
t1t1r1 = t1t1.newRow() # subtable row
t1t1r1.newColumn(l1)
t1t1r1.newColumn('Calculates downtime over a period')
t1t1r2 = t1t1.newRow()
t1t1r2.newColumn(HtmlKit.Link('/data', 'Data Report'))
t1t1r2.newColumn('Graphs and displays data readings from an entity')
t1t1r3 = t1t1.newRow()
t1t1r3.newColumn(HtmlKit.Link('/multip', 'Multiplot Report'))
t1t1r3.newColumn('Graphs one or more entities')
t1t1r4 = t1t1.newRow()
t1t1r4.newColumn(HtmlKit.Link('/multidt', 'MultiDowntime Report'))
t1t1r4.newColumn('Plot downtime of multiple entities')
t1r1 = t1.content().append(t1t1) # root table row
# insert panel
p.append(t1)
# Notes to our friends
p.append("Entites not showing up?")
p.append(HtmlKit.Link('/reload', 'Reload state database'))
# finish up
request.push(str(p))
request.done()
###########################################################
class ReloadPage:
def display (self, request, url):
SystemState.close()
SystemState.open()
f = open('ConfData.db', 'r')
RawConfigurationData = f.read();
f.close()
p = HtmlKit.Page()
p.title_('QOS: Reports: Database reloaded')
t1 = HtmlKit.Panel()
t1.title_('Database reloaded')
t1.content().append(HtmlKit.Center(HtmlKit.Link('/', 'Return to Reports Main')))
p.append(t1)
request.push(str(p))
request.done()
class rc_handler:
def __init__ (self, root):
self.urlRoot = root
self.last_match = None
# we handle everything
def match (self, request):
return 1
def split_path (self, path):
m = path_regex.match(path)
if not m:
raise ValueError, "bad path"
else:
x = []
for i in range(1,5):
x.append(m.group(i))
return x
# do the hard work
def handle_request (self, request):
if request.uri == '/':
# display static home page...
page = ReportHomePage()
page.display(request)
else:
print 'cgi hit looks like.. [%s]' % request.uri
url = HtmlKit.Url() # Url class doesn't support keywords
url.url_(request.uri)
print 'uri: %s' % url.url()
if url.path() == '/downtime':
rp = reportDowntime.reportDowntime('/downtime', 'Downtime', SystemState, ConfigurationData)
if url.argumentsDict().has_key('dograph'):
rp.displayGraph(request, url)
elif not url.argumentsDict().has_key('agent'):
rp.displayAgent(request, url)
elif not url.argumentsDict().has_key('entity'):
rp.displayEntity(request, url)
elif not url.argumentsDict().has_key('fromdate'):
rp.displayDateRange(request, url)
elif not url.argumentsDict().has_key('summary') and not url.argumentsDict().has_key('detail') and not url.argumentsDict().has_key('reportparams'):
rp.displayOptionsInfo(request, url)
else:
rp.displayReport(request, url)
elif url.path() == '/data':
rp = reportData.reportData('/data', 'Data', SystemState, ConfigurationData)
if not url.argumentsDict().has_key('agent'):
rp.displayAgent(request, url)
elif not url.argumentsDict().has_key('entity'):
rp.displayEntity(request, url)
elif not url.argumentsDict().has_key('column'):
rp.displayColumn(request, url)
elif not url.argumentsDict().has_key('fromdate'):
rp.displayDateRange(request, url)
elif not url.argumentsDict().has_key('summary') and not url.argumentsDict().has_key('detail') and not url.argumentsDict().has_key('reportparams') and not url.argumentsDict().has_key('graph'):
rp.displayOptionsInfo(request, url)
elif url.argumentsDict().has_key('dograph'):
rp.displayGraph(request, url)
else:
rp.displayReport(request, url)
elif url.path() == '/multip':
rp = reportMultiplot.reportMultiplot('/multip', 'Multiplot', SystemState, ConfigurationData)
rp.displayPage(request, url)
elif url.path() == '/multidt':
rp = reportMultiDowntime.reportMultiDowntime('/multidt', 'MultiDowntime', SystemState, ConfigurationData)
rp.displayPage(request, url)
elif url.path() == '/reload':
ReloadPage().display(request, url)
else:
print 'eek! [%s]' % url.path()
if __name__ == '__main__':
try:
f = open('ConfData.db', 'r')
RawConfigurationData = f.read();
f.close()
# Use SystemState DB for entity info
SystemState = StateDb.StateDb()
SystemState.open()
except IOError:
print "The Entities file could not be opened. Exiting."
sys.exit(1)
ConfigurationData = eval(RawConfigurationData)
ms = monitor.monitor_server('127.0.0.1', (monitor_server_port))
hs = http_server.http_server('', http_server_port)
ah = auth_handler.auth_handler(ConfigurationData['Qos']['userpass'], rc_handler('/'))
hs.install_handler(ah)
el = event_loop.event_loop()
el.go(timeout=30.0)