#!/usr/local/bin/python
# reportDowntime.py: Third run at the downtime report,
# this time subclassing QOSReport.
#
# Doug White
import os
import string
import time
import qosreport
import downtimer
import HtmlKit
import urllib
from englishUnits import *
class reportDowntime(qosreport.QOSReport):
def displayOptionsInfo(self, request, url):
optionsinfo = [ [ 'Report Sections', [
('reportparams', 'Report Parameters', 1),
('summary', 'Summary', 1),
('graph', 'Graph', 1),
('detail', 'Detail', 1),
],
],
[ 'Graph Options', [
('xtime', 'Plot X Axis as Dates (unchecked will plot as time)', 1),
],
],
]
self.displayOptions(request, url, optionsinfo)
# main report page
def displayReport(self, request, url):
# load variables
vars = self.unquoteDict(url.argumentsDict())
summary = self.loadVar(url.argumentsDict(), 'summary')
detail = self.loadVar(url.argumentsDict(), 'detail')
reportparams = self.loadVar(url.argumentsDict(), 'reportparams')
# Run the report
dt = downtimer.Downtimer(agent=vars['agent'],
entity=vars['entity'],
startdate=vars['fromdate'],
starttime=vars['fromtime'],
enddate=vars['todate'],
endtime=vars['totime'])
result = dt.run()
p = HtmlKit.Page()
p.title_('QOS: Reports: %s: Report for %s : %s' %
(self.typename, vars['agent'], vars['entity']))
p.append('<H1>QOS: Reports: Downtime Report for %s : %s</H1>\n' %
(vars['agent'], vars['entity']))
f = HtmlKit.Form(method='GET', action=self.prefix)
p.append(f)
self.preserveState(url.argumentsDict(), f)
if reportparams:
### Parameters panel ###
p1 = HtmlKit.Panel()
p1.title_('Report Parameters')
pt1 = HtmlKit.Table()
pt1r1 = pt1.newRow()
pt1r2 = pt1.newRow()
pt1r1.newHeader('Agent')
pt1r2.newColumn(HtmlKit.Center(vars['agent']))
pt1r1.newHeader('Entity')
pt1r2.newColumn(HtmlKit.Center(vars['entity']))
pt1r1.newHeader('From')
pt1r2.newColumn(HtmlKit.Center("%s %s" % (vars['fromdate'], vars['fromtime'])))
pt1r1.newHeader('To')
pt1r2.newColumn(HtmlKit.Center("%s %s" % (vars['todate'], vars['totime'])))
p1.content().append(pt1)
f.append(p1)
f.append("<p>")
if summary:
### Summary panel #####
t1 = HtmlKit.Panel()
t1.title_('Summary')
st1 = HtmlKit.Table()
st1r1 = st1.newRow()
st1r2 = st1.newRow()
st1r1.newHeader('Uptime %')
st1r2.newColumn(HtmlKit.Center("%3.2f%%" % (result[1] * 100)))
st1r1.newHeader('Total Downtime')
st1r2.newColumn(HtmlKit.Center(string.join(english_time(int(result[2])))))
st1r1.newHeader('Longest Downtime')
st1r2.newColumn(HtmlKit.Center(string.join(english_time(int(result[3][1])))))
st1r1.newHeader('Average Downtime')
st1r2.newColumn(HtmlKit.Center(string.join(english_time(int(result[4])))))
st1r1.newHeader('Longest Uptime')
st1r2.newColumn(HtmlKit.Center(string.join(english_time(int(result[5][1])))))
t1.content().append(st1)
# t1.table().newRow().newColumn(HtmlKit.Button(value='Next >'))
f.append(t1)
f.append("<p>")
if vars.has_key('graph'):
f.append(HtmlKit.Center(HtmlKit.Image(src="%s?%s&dograph=1" % (self.prefix, urllib.unquote(url.argumentsString())))))
if detail:
### Detail panel ###
d1 = HtmlKit.Panel()
d1.title_('Detail')
sd1 = HtmlKit.Table(bgcolor="#eeeeee")
sd1r1 = sd1.newRow()
sd1r1.newHeader('Date')
sd1r1.newHeader('Duration')
# loop over downtime reports & display
if len(result[0]) > 0:
for downtime in result[0]:
sdr = sd1.newRow()
sdr.newColumn(time.ctime(downtime[0]))
sdr.newColumn(string.join(english_time(downtime[1])))
d1.content().append(sd1)
f.append(d1)
# finish up
request.push(str(p))
request.done()
def displayGraph(self, request, url):
request['Content-Type'] = 'image/png'
vars = self.unquoteDict(url.argumentsDict())
start = self.convertDateAndTime(vars['fromdate'], vars['fromtime'])
end = self.convertDateAndTime(vars['todate'], vars['totime'])
dt = downtimer.Downtimer(agent=vars['agent'],
entity=vars['entity'],
startdate=vars['fromdate'],
starttime=vars['fromtime'],
enddate=vars['todate'],
endtime=vars['totime'])
result = dt.run()
# Open the pipe to gnuplot and feed it the data.
gppath = self.ConfigFile['Qos'].get('gnuplotPath', '/usr/local/bin/gnuplot')
(gin, gout) = os.popen2(gppath)
if vars.has_key('xtime'):
xlabelstring = 'Date'
else:
xlabelstring = 'Time'
xtlrangedata = string.split(vars['fromtime'], ':')
xturangedata = string.split(vars['totime'], ':')
xdlrangedata = string.split(vars['fromdate'], '/')
xdurangedata = string.split(vars['todate'], '/')
xlrange = ('%s/%s %s:%s' % (xdlrangedata[0], xdlrangedata[1], xtlrangedata[0], xtlrangedata[1]))
xurange = ('%s/%s %s:%s' % (xdurangedata[0], xdurangedata[1], xturangedata[0], xturangedata[1]))
gin.write('set terminal png small color\n')
gin.write('set output\n')
gin.write('set size 1.1,0.2\n')
gin.write('set key below\n')
gin.write('set xdata time\n')
if vars.has_key('xtime'):
gin.write('set format x "%m/%d"\n')
else:
gin.write('set format x "%H:%M"\n')
gin.write('set timefmt "%m/%d %H:%M"\n')
gin.write('set xlabel "%s"\n' % xlabelstring)
gin.write('set xrange ["%s":"%s"]\n' % (xlrange, xurange))
gin.write('set noautoscale y\n')
gin.write('set nokey\n')
gin.write('set ytics ("%s" 1)\n' % (string.join([vars['agent'], vars['entity']], '_')))
plotline = "plot '-' using 1:3 title '%s' with linespoints pt 2" % vars['entity']
gin.write(plotline + "\n")
for line in result[0]:
gin.write('%s 1\n' % (time.strftime('%m/%d %H:%M', time.localtime(line[0]))))
gin.write('%s 1\n' % (time.strftime('%m/%d %H:%M', time.localtime(line[0]+line[1]))))
gin.write('\n')
gin.close()
request.push(gout.read())
request.done()