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
|