1#!/bin/sh
2
3if [ $# -ne 2 ]
4then
5    echo "usage: $0 rrdname pngname"
6    exit 1
7fi
8rrdname="${1}"
9pngname="${2}"
10
11# Prefixes for rrd and png files. Note that if the prefix is a directory, it must incldue the trailing slash
12# If no value is set, the files are located in the current directory when the cgi script runs
13rrdprefix=
14pngprefix=/tmp/
15
16
17# Graph dimensions
18#graph_height=240
19#graph_width=720
20graph_height=280
21graph_width=840
22
23# Preferred font
24font="DejaVuSansMono"
25
26# Latency breakpoints in milliseconds
27latency_s0=20
28latency_s1=40
29latency_s2=80
30latency_s3=160
31latency_s4=320
32
33# Latency colors
34latency_c0="dddddd"
35latency_c1="ddbbbb"
36latency_c2="d4aaaa"
37latency_c3="cc9999"
38latency_c4="c38888"
39latency_c5="bb7777"
40
41# Standard deviation color & opacity
42stddev_c="55333355"
43
44# Loss color
45loss_c="ee0000"
46
47
48gen_graph()
49{
50    png=$1
51    rrd=$2
52    start=$3
53    end=$4
54    step=$5
55    description=$6
56
57    echo "<RRD::GRAPH \"${png}\""
58        echo "--lazy"
59        echo "--start \"${start}\" --end \"${end}\" --step \"${step}\""
60        echo "--height ${graph_height} --width ${graph_width}"
61        echo "--title \"Average Latency and Packet Loss - ${description}\""
62        echo "--disable-rrdtool-tag"
63        echo "--color BACK#ffffff"
64        echo "--font DEFAULT:9:\"${font}\""
65        echo "--font AXIS:8:\"${font}\""
66
67        echo "DEF:latency_us=\"${rrd}\":latency:AVERAGE:step=\"${step}\""
68        echo "CDEF:latency=latency_us,1000,/"
69        echo "CDEF:latency_s0=latency,${latency_s0},MIN"
70        echo "CDEF:latency_s1=latency,${latency_s1},MIN"
71        echo "CDEF:latency_s2=latency,${latency_s2},MIN"
72        echo "CDEF:latency_s3=latency,${latency_s3},MIN"
73        echo "CDEF:latency_s4=latency,${latency_s4},MIN"
74        echo "VDEF:latency_min=latency,MINIMUM"
75        echo "VDEF:latency_max=latency,MAXIMUM"
76        echo "VDEF:latency_avg=latency,AVERAGE"
77        echo "VDEF:latency_last=latency,LAST"
78
79        echo "DEF:stddev_us=\"${rrd}\":stddev:AVERAGE:step=\"${step}\""
80        echo "CDEF:stddev=stddev_us,1000,/"
81        echo "VDEF:stddev_min=stddev,MINIMUM"
82        echo "VDEF:stddev_max=stddev,MAXIMUM"
83        echo "VDEF:stddev_avg=stddev,AVERAGE"
84        echo "VDEF:stddev_last=stddev,LAST"
85
86        echo "DEF:loss=\"${rrd}\":loss:AVERAGE:step=\"${step}\""
87        echo "CDEF:loss_neg=loss,-1,*"
88        echo "VDEF:loss_min=loss,MINIMUM"
89        echo "VDEF:loss_max=loss,MAXIMUM"
90        echo "VDEF:loss_avg=loss,AVERAGE"
91        echo "VDEF:loss_last=loss,LAST"
92
93        echo "COMMENT:\"                         Min              Max              Avg             Last\n\""
94
95        echo "COMMENT:\"     \""
96        echo "AREA:latency#${latency_c5}"
97        echo "AREA:latency_s4#${latency_c4}"
98        echo "AREA:latency_s3#${latency_c3}"
99        echo "AREA:latency_s2#${latency_c2}"
100        echo "AREA:latency_s1#${latency_c1}"
101        echo "AREA:latency_s0#${latency_c0}"
102        echo "LINE1:latency#000000:\"Latency  \""
103        echo "GPRINT:\"latency_min:%8.3lf ms\t\""
104        echo "GPRINT:\"latency_max:%8.3lf ms\t\""
105        echo "GPRINT:\"latency_avg:%8.3lf ms\t\""
106        echo "GPRINT:\"latency_last:%8.3lf ms\n\""
107
108        echo "COMMENT:\"     \""
109        echo "LINE1:stddev#${stddev_c}:\"Stddev   \""
110        echo "GPRINT:\"stddev_min:%8.3lf ms\t\""
111        echo "GPRINT:\"stddev_max:%8.3lf ms\t\""
112        echo "GPRINT:\"stddev_avg:%8.3lf ms\t\""
113        echo "GPRINT:\"stddev_last:%8.3lf ms\n\""
114
115        echo "COMMENT:\"     \""
116        echo "AREA:loss_neg#${loss_c}:\"Loss         \""
117        echo "GPRINT:\"loss_min:%4.1lf %%\t\t\""
118        echo "GPRINT:\"loss_max:%4.1lf %%\t\t\""
119        echo "GPRINT:\"loss_avg:%4.1lf %%\t\t\""
120        echo "GPRINT:\"loss_last:%4.1lf %%\n\""
121        echo "COMMENT:\" \n\""
122        echo "GPRINT:\"latency_last:Ending at %H\\:%M on %B %d, %Y\\r:strftime\""
123
124        echo ">"
125        echo "<p>"
126}
127
128(
129    echo "#!/usr/bin/rrdcgi"
130    echo "<html> <head> <title>Latency Statistics for ${rrdname}</title> </head> <body>"
131
132    gen_graph "${pngprefix}${pngname}-1.png" "${rrdprefix}${rrdname}.rrd" "now-8h" "now" "60" "Last 8 hours - 1 minute intervals"
133    gen_graph "${pngprefix}${pngname}-2.png" "${rrdprefix}${rrdname}.rrd" "now-36h" "now" "300" "Last 36 hours - 5 minute intervals"
134    gen_graph "${pngprefix}${pngname}-3.png" "${rrdprefix}${rrdname}.rrd" "now-8d" "now" "1800" "Last 8 days - 30 minute intervals"
135    gen_graph "${pngprefix}${pngname}-4.png" "${rrdprefix}${rrdname}.rrd" "now-60d" "now" "14400" "Last 60 days - 4 hour intervals"
136    gen_graph "${pngprefix}${pngname}-5.png" "${rrdprefix}${rrdname}.rrd" "now-1y" "now" "86400" "Last 1 year - 1 day intervals"
137    gen_graph "${pngprefix}${pngname}-6.png" "${rrdprefix}${rrdname}.rrd" "now-4y" "now" "86400" "Last 4 years - 1 day intervals"
138
139    echo "</body> </html>"
140) > "${pngname}.cgi"
141