#
# qosreport.py: Base class for QOS reports.
#
# Doug White
import string
import time
import urllib
import HtmlKit
import normalDate
import entityHeaders
from englishUnits import *
class QOSReport:
# Init: Store the CGI prefix ('/data') and the type name ('Data')
def __init__(self, prefix, typename, SystemState, ConfigFile):
self.prefix = prefix
self.typename = typename
self.SystemState = SystemState
self.ConfigFile = ConfigFile
### Stock query pages
# displayAgent: Display agent requester.
def displayAgent(self, request, url):
request['Content-Type'] = 'text/html'
groups = []
p = HtmlKit.Page()
p.title_('QOS: Reports: %s: Agent' % self.typename)
p.append('<H1>QOS: <a href="/">Reports</a>: <a href="%s">%s</a>: Agent</H1>\n' % (self.prefix, self.typename))
f = HtmlKit.Form(method='GET', action=self.prefix)
p.append(f)
self.preserveState(url.argumentsDict(), f)
t1 = HtmlKit.Panel()
t1.title_('Agent')
if self.ConfigFile.has_key('Groups'):
if self.ConfigFile['Groups'].has_key(self.typename):
groups = self.ConfigFile['Groups'][self.typename].keys()
groups.sort()
ms1 = HtmlKit.Select(name='agent', size=min(20, len(self.SystemState.state.keys())+len(groups)))
for group in groups:
ms1.newOption('QOS_Group_%s' % group)
else:
ms1 = HtmlKit.Select(name='agent', size=20)
ms1.newOption('No Group')
k = self.SystemState.state.keys()
k.sort()
for agent in k:
ms1.newOption(agent)
t1.content().append(ms1)
t1.table().newRow().newColumn(HtmlKit.Button(value="Next >"))
f.append(t1)
# finish up
request.push(str(p))
request.done()
# displayEntity: Display entity requester
def displayEntity(self, request, url):
# agent = url.argumentsDict()['agent']
agent = self.loadVar(url.argumentsDict(), 'agent')
request['Content-Type'] = 'text/html'
#if not agent:
# page = self.displayAgent(request, url)
# return
p = HtmlKit.Page()
p.title_('QOS: Reports: %s: Entity' % self.typename)
p.append('<H1>QOS: <a href="/">Reports</a>: <a href="%s">%s</a>: Entity</H1>\n' % (self.prefix, self.typename) )
f = HtmlKit.Form(method='GET', action=self.prefix)
p.append(f)
self.preserveState(url.argumentsDict(), f)
# hf1 = HtmlKit.Input(type='hidden', name='agent', value=self.loadVar(url.argumentsDict(), 'agent')
# f.append(hf1)
t1 = HtmlKit.Panel()
t1.title_('Entity')
ms1 = HtmlKit.Select(name='entity', size=20)
ek = self.SystemState.state[agent].keys()
ek.sort()
for entity in ek:
sk = self.SystemState.state[agent][entity].keys()
sk.sort()
for subent in sk:
ms1.newOption("%s_%s" % (entity, subent))
t1.content().append(ms1)
t1.table().newRow().newColumn(HtmlKit.Button(value='Next >'))
f.append(t1)
# finish up
request.push(str(p))
request.done()
#displayColumn: Display column requestor.
def displayColumn(self, request, url):
agent = self.loadVar(url.argumentsDict(), 'agent')
entity = self.loadVar(url.argumentsDict(), 'entity')
request['Content-Type'] = 'text/html'
# Split off the entity name and lookup in the entityHeaders table to
# get the column list.
( entname, subent ) = string.split(entity, '_', 1)
collist = entityHeaders.EntityHeaders[entname][:]
collist.sort()
# print collist
p = HtmlKit.Page()
p.title_('QOS: Reports: %s: Column' % self.typename)
p.append('<H1>QOS: <a href="/">Reports</a>: <a href="%s">%s</a>: Column</H1>\n' % (self.prefix, self.typename) )
f = HtmlKit.Form(method='GET', action=self.prefix)
p.append(f)
# hf1 = HtmlKit.Input(type='hidden', name='agent', value=agent)
# hf2 = HtmlKit.Input(type='hidden', name='entity', value=entity)
# f.append(hf1)
# f.append(hf2)
self.preserveState(url.argumentsDict(), f)
t1 = HtmlKit.Panel()
t1.title_('Column')
ms1 = HtmlKit.Select(name='column', size=min(10, len(collist)))
for col in collist:
ms1.newOption(col)
t1.content().append(ms1)
t1.table().newRow().newColumn(HtmlKit.Button(value='Next >'))
f.append(t1)
# finish up
request.push(str(p))
request.done()
# displayDateRange: Date range requester.
def displayDateRange(self, request, url):
# print "DateRange: starting page"
#agent = self.loadVar(url.argumentsDict(), 'agent')
#entity = self.loadVar(url.argumentsDict(), 'entity')
#column = self.loadVar(url.argumentsDict(), 'column')
request['Content-Type'] = 'text/html'
#if not agent or not entity:
# page = ReportDowntimeAgentPage()
# page.display(request)
# return
p = HtmlKit.Page()
p.title_('QOS: Reports: %s: Date Range' % self.typename)
p.append('<H1>QOS: <a href="/">Reports</a>: <a href="%s">%s</a>: Date Range</H1>\n' % (self.prefix, self.typename) )
f = HtmlKit.Form(method='GET', action=self.prefix)
p.append(f)
#hf1 = HtmlKit.Input(type='hidden', name='agent', value=agent)
#hf2 = HtmlKit.Input(type='hidden', name='entity', value=entity)
#hf3 = HtmlKit.Input(type='hidden', name='column', value=column)
#f.append(hf1)
#f.append(hf2)
#f.append(hf3)
self.preserveState(url.argumentsDict(), f)
t1 = HtmlKit.Panel()
t1.title_('Date Range')
st1 = HtmlKit.Table()
st1r1 = st1.newRow()
st1r1c1 = st1r1.newColumn(bgcolor='#eeeeee')
in1 = HtmlKit.Input(type='text', name='fromdate', size='10')
st1r1c1.append('From Date:')
st1r1c1.append(in1)
st1r1c2 = st1r1.newColumn(bgcolor='#eeeeee')
st1r1c2.append('From Time:')
in2 = HtmlKit.Input(type='text', name='fromtime', size='6')
st1r1c2.append(in2)
st1r2 = st1.newRow()
st1r2c1 = st1r2.newColumn(bgcolor='#eeeeee')
st1r2c1.append('To Date:')
in3 = HtmlKit.Input(type='text', name='todate', size='10')
st1r2c1.append(in3)
st1r2c2 = st1r2.newColumn(bgcolor='#eeeeee')
st1r2c2.append('To Time:')
in4 = HtmlKit.Input(type='text', name='totime', size='6')
st1r2c2.append(in4)
t1.content().append(st1)
t1.table().newRow().newColumn(HtmlKit.Button(value='Next >'))
f.append(t1)
# finish up
request.push(str(p))
request.done()
# displayOptions: Display an options page. Options are passed in
# via a dictionary of sections with CGIname/description/defaulted
# triplets.
def displayOptions(self, request, url, optslist):
request['Content-Type'] = 'text/html'
p = HtmlKit.Page()
p.title_('QOS: Reports: %s: Options' % self.typename)
p.append('<H1>QOS: <a href="/">Reports</a>: <a href="%s">%s</a>: Options</H1>\n' % (self.prefix, self.typename))
f = HtmlKit.Form(method='GET', action=self.prefix)
p.append(f)
self.preserveState(url.argumentsDict(), f)
p1 = HtmlKit.Panel()
p1.title_('Options')
# Loop over the list and generate # elements for each.
# line = (CGIname, 'Label text', Boolean(defaulted))
for section in optslist:
t1 = HtmlKit.Table()
t1.newRow().newHeader(section[0])
for line in section[1]:
t1c = t1.newRow().newColumn()
if line[2]:
t1c.append(HtmlKit.Input(type='checkbox', name=line[0], checked='1', value='1'))
else:
t1c.append(HtmlKit.Input(type='checkbox', name=line[0], value='1'))
t1c.append(line[1])
p1.content().append(t1)
f.append(p1)
p1.table().newRow().newColumn(HtmlKit.Button(value='Next >'))
# finish up
request.push(str(p))
request.done()
# displayReport: Override this with the actual report body.
def displayReport(self, request, url):
p = HtmlKit.Page()
p.title_('QOS: Reports: %s: Report' % self.typename)
p.append('<H1>QOS: Reports: %s: Report</H1>\n' % self.typename)
p.append('<HR>')
p.append('Insert your report body here.<p>')
request.push(str(p))
request.done()
### Some useful utility functions.
# preserve_state: Copies CGI query variables into HtmlKit HIDDEN
# input fields.
# parent: HtmlKit object to append INPUT objects to.
# vars: Dictionary of CGI vars to append.
def preserveState(self, qvars, parent):
vars = self.unquoteDict(qvars)
for key in vars.keys():
parent.append(HtmlKit.Input(type='hidden',
name=key,
value=vars[key]
)
)
# load_var: Returns unquoted variable from dictionary.
def loadVar(self, vars, key):
if vars.has_key(key):
return urllib.unquote(vars[key])
else:
return None
# unquoteDict: Run urllib.unquote() against a CGI var dictionary.
def unquoteDict(self, vars):
output = {}
for key in vars.keys():
output[key] = urllib.unquote(vars[key])
return output
# convertDateAndTime: Creates NormalDate objects for rangefinder.
# ripped out of downtimer. Returns a tuple with a NormalDate
# and a UNIX timestamp.
def convertDateAndTime(self, date, btime):
# This is a butt-ugly hack but is due to a bug in FreeBSD libc.
# This feeds the timezone to interpret to strptime so it handles
# daylight/standard time properly. tm->isdst is fed directly into
# the tuple returned by strptime and must be set otherwise all the
# times are interpreted 1 hour off by mktime().
#line = '%s %s %s' % (btime, date, time.strftime("%Z", time.localtime(time.time())))
line = '%s %s' % (btime, date)
#print line
#datetuple = time.strptime(line, "%H:%M %m/%d/%Y %Z")
datetuple = time.strptime(line, "%H:%M %m/%d/%Y")
return (normalDate.ND(datetuple), time.mktime(datetuple))
def entityIsGroup(self, entity):
if entity[0:10] == 'QOS_Group_' and self.ConfigFile['Groups'][self.typename].has_key(string.split(entity, '_', 3)[2]):
return 1
else:
return 0