summaryrefslogtreecommitdiff
path: root/tools/rrdui-cgi.py
blob: 8b376f5488addc7f97c0d7e9282b4eebb892931e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/usr/bin/python

import os, sys, time
import sets, cgi, shlex
import rrdtool

from rrdui import *

def listGraphs():

    graphs = loadGraphs()
    categories = {}
    for item in graphs:
        if not categories.has_key(item.category):
            categories[item.category] = []
        categories[item.category].append(item)

    groups = categories.keys()
    groups.sort()

    print "Content-Type: text/xml\n"
    print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
    print "<data>"
    for group in groups:
        print "    <category name=\"%s\">" % group
        categories[group].sort()
        for item in categories[group]:
            print "        <graph name=\"%s\" width=\"%d\" height=\"%d\" title=\"%s\"/>" % \
                    (item.name, item.width, item.height, item.title)
        print "    </category>"
    print "</data>"


def displayGraph():

    # print "Content-Type: text/plain"
    print "Content-Type: image/png"
    print ""

    form = cgi.FieldStorage()
    if not form.has_key("category") or not form.has_key("name"):
        raise "Required arguments not specified"

    name = form["name"].value
    category = form["category"].value
    item = GraphDef(category, name)

    # Default to one day display
    end = int(time.time())
    start = end - 86400
    if form.has_key("start"):
        start = int(form["start"].value)
    if form.has_key("end"):
        end = int(form["end"].value)

    # Default to Height and Width in graph
    height = item.height
    width = item.width
    if form.has_key("width"):
        width = int(form["width"].value)
    if form.has_key("height"):
        height = int(form["height"].value)


    args = ["-", "--imgformat=PNG", "--rigid",
            "--start=%d" % start,
            "--end=%d" % end,
            "--title=%s" % item.title,
            "--height=%d" % height,
            "--width=%d" % width ]

    # TODO Check color syntax
    if form.has_key("color"):
        colors = form.getlist("color");
        for color in colors:
            args.append("--color")
            args.append(color.replace(":", "#"))

    commands = item.commands.replace("{START}",
                    time.strftime("%Y-%m-%d %H\\:%M", time.localtime(start)))
    commands = commands.replace("{END}",
                    time.strftime("%Y-%m-%d %H\\:%M", time.localtime(end)))
    commands = commands.replace("{RRD}", item.filedata)
    args.extend(shlex.split(commands))

    args.extend(shlex.split(item.options))

    print >> sys.stderr, str(args)
    rrdtool.graph(*args)


if not os.environ.has_key("PATH_INFO"):
    raise "PATH_INFO not set"

path = os.environ["PATH_INFO"].strip("/")
parts = path.split("/")

method = parts[0]
del parts[0]
if not method:
    method = "list"


if method == "list":
    listGraphs()
elif method == "graph":
    displayGraph()
else:
    raise "Invalid request: %s" % method