Filter:   InfoImg
download reportDowntime.py
Language: Python
LOC: 145
Project Info
QOS
Server: SourceForge
Type: cvs
[Show Code]






[Show Code]
...ge\q\qos\qos\qos\qosserver\
   auth_handler.py
   BaseObject.py
   collector.py
   ConfData.db.orig
   config_server.py
   counter.py
   DataLogFile.py
   default_handler.py
   downtimer.py
   englishUnits.py
   entityHeaders.py
   entityProps.py
   event_loop.py
   http_date.py
   http_server.py
   log.py
   logger.py
   m_syslog.py
   medusa_gif.py
   monitor.py
   normalDate.py
   pop.py
   Process.py
   producers.py
   qos.db.seed
   qos_server.py
   qosreport.py
   qosserver.init
   rangefind.py
   report_server.py
   reportData.py
   reportDowntime.py
   reportMultiDowntime.py
   reportMultiplot.py
   rpc_server.py
   sendmail.py
   StateDb.py
   status_handler.py

#!/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 &gt;'))
            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()