pvl/verkko/rrd.py
author Tero Marttila <terom@paivola.fi>
Sun, 20 Jan 2013 18:31:21 +0200
changeset 153 8930f54b59b4
parent 152 33b98b46d8fb
child 154 11df86fd2d67
permissions -rw-r--r--
pvl.verkko.rrd: --rrd is required; fix overview rrd name layout
152
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
# encoding: utf-8
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
"""
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
    http://verkko.paivola.fi/rrd
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
"""
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
import pvl.web.application as web
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
from pvl.web import urls
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
from pvl.web.html import tags as html
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
import pvl.rrd
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
import logging; log = logging.getLogger('pvl.verkko.rrd')
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
# Model
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
import os, os.path
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
class RRDDatabase (object) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
    """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
        A filesystem directory containing .rrd files.
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
    """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
    def __init__ (self, path) :
153
8930f54b59b4 pvl.verkko.rrd: --rrd is required; fix overview rrd name layout
Tero Marttila <terom@paivola.fi>
parents: 152
diff changeset
    23
        if not path :
8930f54b59b4 pvl.verkko.rrd: --rrd is required; fix overview rrd name layout
Tero Marttila <terom@paivola.fi>
parents: 152
diff changeset
    24
            raise ValueError("RRDDatabase: no path given")
8930f54b59b4 pvl.verkko.rrd: --rrd is required; fix overview rrd name layout
Tero Marttila <terom@paivola.fi>
parents: 152
diff changeset
    25
152
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
        log.info("%s", path)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
        self._path = path
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
    def path (self, node=None, *subnodes) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
            Lookup and full filesystem path to the given relative RRD/dir path.
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
            Raises ValueError if invalid path.
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
        
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
        if node :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
            # relative dir (no leading slash) -> absolute path
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
            path = os.path.normpath(os.path.join(self._path, node, *subnodes))
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
        else :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
            path = self._path
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
        log.debug("%s: %s -> %s", self, node, path)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
        # check inside base path
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
        if not path.startswith(self._path) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
            # mask
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
            raise ValueError("%s: Invalid path: %s" % (self, node))
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
        # ok
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
        return path
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
    def tree (self, node=None) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
            Lookup and return RRDTree for given node, or root tree.
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
            Raises ValueError if invalid path, or no such tree.
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
        # lookup fs path
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
        path = self.path(node)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
        # found?
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
        if not os.path.isdir(path) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
            raise ValueError("%s: Invalid tree: %s: %s" % (self, node, path))
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
        return node
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
    def rrd (self, node, tree=None) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
            Lookup and return RRD for given node.
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
        if tree :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
            node = os.path.join(tree, node)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
        node += '.rrd'
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
        
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
        path = self.path(node)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
        if not os.path.isfile(path) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
            raise ValueError("%: Invalid rrd: %s: %s" % (self, node, path))
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
        return node
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
    def list (self, tree) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
            List (trees, rrds) under given tree.
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
        dirs = []
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
        rrds = []
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
        
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
        for name in os.listdir(self.path(tree)) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
            if name.startswith('.') :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
                continue
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
            log.debug("%s: %s: %s", self, tree, name)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
            
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
            path = self.path(tree, name)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
            basename, extname = os.path.splitext(name)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
            if os.path.isdir(path) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
                dirs.append(name)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
            elif extname == '.rrd' :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
                # without the .rrd
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
                rrds.append(basename)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
        # return sorted lists
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
        return sorted(dirs), sorted(rrds)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
    
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
    def graph (self, rrd, style, interval) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   115
            Graph given rrd using given style/interval, returning the opened png data file.
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
        
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
        title = " / ".join(rrd.split('/'))
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
        log.debug("%s: %s: %s/%s", self, rrd, style, interval)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
        
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   122
        # XXX: lookup graph style..
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
        # XXX: collectd
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   124
        # XXX: out=None -> tempfile
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   125
        dimensions, lines, outfile = pvl.rrd.graph.collectd_ifoctets(style, interval, title, self.path(rrd), None)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
        log.debug("%s: %s: %s", self, rrd, outfile)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
        return outfile
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   131
    def __str__ (self) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   132
        return str(self._path)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   133
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   134
# View/Controller
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   135
class Handler (web.Handler) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   136
    CSS = (
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   137
        "/static/rrd.css", 
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   138
    )
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   139
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   140
    def title (self) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   141
        return u"Päivölä Network - Network RRD Traffic Graphs"
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   142
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   143
    def breadcrumb (self, _tree, target=None) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   144
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   145
            Yield (title, url) navigation breadcrumbs
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   146
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   147
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   148
        yield '/', self.url(Index)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   149
        
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   150
        if _tree :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   151
            tree = ''
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   152
            
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   153
            for part in _tree.split('/') :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   154
                tree = os.path.join(tree, part)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   155
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   156
                yield part, self.url(Index, tree=tree)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   157
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   158
        if target :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
            # Target
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   160
            yield target, self.url(Target, tree=tree, target=self.target)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   161
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   162
    def render_breadcrumb (self, tree, target=None) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   163
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   164
            Render breadcrumb -> html.div
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   165
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   166
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
        return html.div(id='breadcrumb')(html(" &raquo; ".join(
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   168
            str(html.a(href=url)(node)) for node, url in self.breadcrumb(tree, target)))
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   169
        )
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   170
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   171
class Index (Handler) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   172
    """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   173
        Browse trees, show overview graphs for targets.
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   174
    """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   175
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   176
    def _title (self) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   177
        if self.tree :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   178
            return html(" &raquo; ".join(self.tree.split('/')))
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   179
        else :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   180
            return ""
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   181
 
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   182
    def url_tree (self, node) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   183
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   184
            Return url for given sub-node.
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   185
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   186
        
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   187
        if self.tree :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   188
            path = os.path.join(self.tree, node)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   189
        else :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   190
            path = node
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   191
        
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192
        return self.url(tree=path)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   193
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   194
    def process (self, tree=None) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   195
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   196
            Lookup path -> self.tree.
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   197
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   198
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   199
        if tree :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   200
            try :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   201
                # XXX: unicode?
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   202
                self.tree = self.app.rrd.tree(tree)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   203
            except ValueError as ex :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   204
                # mask
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   205
                raise web.NotFound(tree)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   206
        else :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   207
            # root
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   208
            self.tree = self.app.rrd.tree()
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   209
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   210
    def render_list (self, items) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   211
        return (
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   212
            html.li(class_=('odd' if idx % 2 else 'even'))(item) for idx, item in enumerate(items)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   213
        )
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   214
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   215
    def render_rrd (self, rrd) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   216
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   217
            Render overview link/image for given rrd.
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   218
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   219
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   220
        target_url = self.url(Target, tree=self.tree, target=rrd)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   221
        graph_url = self.url(Graph, tree=self.tree, target=rrd)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   222
        
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   223
        return html.a(href=target_url)(
153
8930f54b59b4 pvl.verkko.rrd: --rrd is required; fix overview rrd name layout
Tero Marttila <terom@paivola.fi>
parents: 152
diff changeset
   224
                html.h3(rrd),
152
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   225
                html.img(src=graph_url),
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   226
        )
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   227
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   228
    def render (self) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   229
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   230
            Render list of trees/rrds.
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   231
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   232
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   233
        trees, rrds = self.app.rrd.list(self.tree)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   234
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   235
        return self.render_breadcrumb(self.tree), html.div(id='overview')(
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   236
                html.ul(id='tree-list')(
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   237
                    self.render_list(
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   238
                        html.a(href=self.url_tree(subtree))(subtree)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   239
                    for subtree in trees)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   240
                ) if trees else None,
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   241
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   242
                html.hr() if trees and rrds else None,
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   243
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   244
                html.ul(id='rrd-list')(
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   245
                    self.render_list(
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   246
                        self.render_rrd(rrd)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   247
                    for rrd in rrds)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   248
                ) if rrds else None,
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   249
        )
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   250
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   251
class Target (Handler) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   252
    """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   253
        Show graphs for RRD file.
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   254
    """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   255
    
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   256
    def _title (self) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   257
        return html(" &raquo; ".join(self.rrd.split('/')))
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   258
        
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   259
    def process (self, target, tree=None) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   260
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   261
            Lookup tree/target -> self.target
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   262
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   263
        
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   264
        try :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   265
            self.tree = self.app.rrd.tree(tree)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   266
            self.rrd = self.app.rrd.rrd(target, self.tree)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   267
            self.target = target
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   268
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   269
        except ValueError as ex :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   270
            raise web.NotFound(tree, target)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   271
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   272
    def render_interval (self, interval, style='detail') :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   273
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   274
            Render detail link/image.
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   275
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   276
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   277
        graph_url = self.url(Graph, tree=self.tree, target=self.target, style=style, interval=interval)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   278
        
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   279
        return (
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   280
                html.h2(interval.title()),
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   281
                html.img(src=graph_url)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   282
        )
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   283
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   284
    INTERVALS = ('daily', 'weekly', 'yearly')
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   285
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   286
    def render (self) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   287
        return self.render_breadcrumb(self.tree, self.target), html.div(id='detail')(
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   288
                self.render_interval(interval) for interval in self.INTERVALS
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   289
        )
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   290
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   291
from pvl.invoke import merge # XXX
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   292
import werkzeug # wrap_file
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   293
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   294
class Graph (Handler) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   295
    """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   296
        Render graph for RRD.
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   297
    """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   298
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   299
    ARGS = { 'interval': 'daily', 'style': 'overview' }
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   300
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   301
    def process (self, tree, target, style, interval) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   302
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   303
            Return Graph for given options.
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   304
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   305
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   306
        try :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   307
            self.tree = self.app.rrd.tree(tree)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   308
            self.rrd = self.app.rrd.rrd(target, self.tree)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   309
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   310
        except ValueError as ex :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   311
            raise web.NotFound(tree, target)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   312
        
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   313
        self.style = style
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   314
        self.interval = interval
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   315
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   316
    def render_png (self) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   317
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   318
            Return PNG data as a file-like object for our graph.
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   319
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   320
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   321
        return self.app.rrd.graph(self.rrd, self.style, self.interval)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   322
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   323
    def respond (self) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   324
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   325
            Return Response for our request.
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   326
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   327
        
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   328
        # process params+args -> self.graph
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   329
        process = merge(self.params, dict((arg, self.request.args.get(arg, default)) for arg, default in self.ARGS.iteritems()))
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   330
        response = self.process(**process)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   331
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   332
        if response :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   333
            return response
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   334
        
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   335
        # PNG output
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   336
        render = self.render_png()
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   337
        file = werkzeug.wrap_file(self.request.environ, render)
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   338
        
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   339
        # respond with file wrapper
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   340
        return web.Response(file, mimetype='image/png', direct_passthrough=True)        
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   341
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   342
# WSGI
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   343
class Application (web.Application) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   344
    urls = urls.Map((
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   345
        urls.rule('/',                              Index),
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   346
        urls.rule('/<target>',                      Target),
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   347
        urls.rule('/<path:tree>/',                  Index),
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   348
        urls.rule('/<path:tree>/<target>',          Target),
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   349
        urls.rule('/<path:tree>/<target>.png',      Graph),
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   350
    ))
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   351
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   352
    def __init__ (self, rrd) :
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   353
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   354
            Initialize app with given RRDDatabase
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   355
        """
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   356
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   357
        self.rrd = rrd
33b98b46d8fb pvl.verkko.rrd: reimplementation of old rrdweb using pvl.web/rrd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   358