1#!/bin/sh
2
3#
4# Copyright (c) 2001-2010 Willem Dijkstra
5# All rights reserved.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions
9# are met:
10#
11#    - Redistributions of source code must retain the above copyright
12#      notice, this list of conditions and the following disclaimer.
13#    - Redistributions in binary form must reproduce the above
14#      copyright notice, this list of conditions and the following
15#      disclaimer in the documentation and/or other materials provided
16#      with the distribution.
17#
18# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29# POSSIBILITY OF SUCH DAMAGE.
30
31# --- user configuration starts here
32INTERVAL=${INTERVAL:-5}
33# default RRA setup:
34# - 2   days of  5 second  samples = 34560 x 5 second samples
35# - 14  days of 30 minutes samples = 672 x 360 x 5 second samples
36# - 50  days of  2 hour    samples = 600 x 1440 x 5 second samples
37# - 600 days of  1 day     samples = 600 x 17280 x 5 second samples
38RRA_SETUP=${RRA_SETUP:-"
39	    RRA:AVERAGE:0.5:1:34560
40	    RRA:AVERAGE:0.5:360:672
41	    RRA:AVERAGE:0.5:1440:600
42	    RRA:AVERAGE:0.5:17280:600
43	    RRA:MAX:0.5:1:34560
44	    RRA:MAX:0.5:360:672
45	    RRA:MAX:0.5:1440:600
46	    RRA:MAX:0.5:17280:600
47	    RRA:MIN:0.5:1:34560
48	    RRA:MIN:0.5:360:672
49	    RRA:MIN:0.5:1440:600
50	    RRA:MIN:0.5:17280:600"}
51# --- user configuration ends here
52create_rrd() {
53    file=$1
54    shift
55    $RRDTOOL create $file $RRD_ARGS $* $RRA_SETUP
56    if [ "$?" = "0" -a -f $file ]; then
57	echo "$file created"
58    else
59	echo "could not create $file"
60    fi
61}
62find_exec() {
63    alternatives=$1`echo :$PATH:$2: | sed "s@:@/$3:@g"`
64    echo $alternatives  | tr ':' '\n' | (
65        while read f; do
66            if [ -n "$f" -a -x "$f" ]; then
67                echo $f
68                return
69            fi
70        done)
71}
72# find rrdtool
73RRDTOOL=`find_exec "$RRDTOOL" /usr/local/bin rrdtool`
74if [ ! -x "$RRDTOOL" ]; then
75    echo "Cannot find rrdtool - add it to \$PATH or \$RRDTOOL"
76    exit 1;
77fi
78# get arguments
79select_interval=""
80for i
81do
82case $i in
83interval)
84    select_interval="yes"
85    ;;
86child)
87    child=1
88    ;;
89oneday)
90    config=$i
91# today only RRA setup:
92# - 1   day  of  5 second  samples = 17280 x 5 second samples
93    RRA_SETUP=" RRA:AVERAGE:0.5:1:17280
94	    RRA:MAX:0.5:1:17280
95	    RRA:MIN:0.5:1:17280"
96    if [ X"$child" = "X" ]; then
97	echo "RRDs will only contain a single day of data"
98    fi
99    ;;
100*)
101    if [ -n "$select_interval" ]; then
102	INTERVAL=$i
103	select_interval=""
104    else
105	args="$args $i"
106    fi
107    ;;
108esac
109done
110
111this=$0
112if [ X"$1$2$3$4$5$6$7$8$9" = "X" ]; then
113    cat <<EOF
114Create rrd files for symux.
115
116Usage: `basename $0` [oneday] [interval <seconds>] [all] \\
117		     <rrd files>
118
119Where:
120oneday       = modify rrds to only contain one day of information
121seconds      = modify rrds for non standard monitoring interval
122all          = run symux -l to determine current configured rrd
123	       files
124<rrd files>  = files ending in rrd that follow symux naming
125
126If rrdtool or symux are not installed in default locations try
127setting \$PATH or \$RRDTOOL, \$SYMUX.
128
129EOF
130    exit 1;
131fi
132
133RRD_ARGS="--step=$INTERVAL --start=now-10"
134
135for i in $args
136do
137
138if [ -f $i ]; then
139    echo "$i exists - ignoring"
140    i="done"
141fi
142
143j=`basename $i`
144case $j in
145
146all)
147    SYMUX=`find_exec "$SYMUX" /usr/libexec:/usr/local/libexec:/usr/local/bin:/usr/local/sbin symux`
148    if [ ! -x "$SYMUX" ]; then
149        echo "Cannot find symux - add it to \$PATH or \$SYMUX"
150        exit 1;
151    fi
152    sh $this interval $INTERVAL child $config `$SYMUX -l`
153    ;;
154
155cpu[0-9]*.rrd)
156    # Build cpu file
157    create_rrd $i \
158	DS:user:GAUGE:$INTERVAL:0:100 \
159	DS:nice:GAUGE:$INTERVAL:0:100 \
160	DS:system:GAUGE:$INTERVAL:0:100 \
161	DS:interrupt:GAUGE:$INTERVAL:0:100 \
162	DS:idle:GAUGE:$INTERVAL:0:100
163    ;;
164
165cpuiow[0-9]*.rrd)
166    # Build cpuiow file
167    create_rrd $i \
168	DS:user:GAUGE:$INTERVAL:0:100 \
169	DS:nice:GAUGE:$INTERVAL:0:100 \
170	DS:system:GAUGE:$INTERVAL:0:100 \
171	DS:interrupt:GAUGE:$INTERVAL:0:100 \
172	DS:idle:GAUGE:$INTERVAL:0:100 \
173	DS:iowait:GAUGE:$INTERVAL:0:100
174    ;;
175
176df_*.rrd)
177    # Build df file
178    create_rrd $i \
179	DS:blocks:GAUGE:$INTERVAL:0:U \
180	DS:bfree:GAUGE:$INTERVAL:0:U \
181	DS:bavail:GAUGE:$INTERVAL:0:U \
182	DS:files:GAUGE:$INTERVAL:0:U \
183	DS:ffree:GAUGE:$INTERVAL:0:U \
184	DS:syncwrites:COUNTER:$INTERVAL:U:U \
185	DS:asyncwrites:COUNTER:$INTERVAL:U:U
186    ;;
187
188sensor_*.rrd)
189    # Build sensor file
190    create_rrd $i \
191	DS:value:GAUGE:$INTERVAL:-U:U
192    ;;
193
194mem.rrd)
195    # Build memory file
196    create_rrd $i \
197	DS:real_active:GAUGE:$INTERVAL:0:U \
198	DS:real_total:GAUGE:$INTERVAL:0:U \
199	DS:free:GAUGE:$INTERVAL:0:U \
200	DS:swap_used:GAUGE:$INTERVAL:0:U \
201	DS:swap_total:GAUGE:$INTERVAL:0:U
202    ;;
203
204if_*.rrd)
205    # Build interface files
206    create_rrd $i \
207	DS:ipackets:COUNTER:$INTERVAL:U:U DS:opackets:COUNTER:$INTERVAL:U:U \
208	DS:ibytes:COUNTER:$INTERVAL:U:U DS:obytes:COUNTER:$INTERVAL:U:U \
209	DS:imcasts:COUNTER:$INTERVAL:U:U DS:omcasts:COUNTER:$INTERVAL:U:U \
210	DS:ierrors:COUNTER:$INTERVAL:U:U DS:oerrors:COUNTER:$INTERVAL:U:U \
211	DS:collisions:COUNTER:$INTERVAL:U:U DS:drops:COUNTER:$INTERVAL:U:U
212    ;;
213
214debug.rrd)
215    # Build debug file
216    create_rrd $i \
217	DS:debug0:GAUGE:$INTERVAL:U:U DS:debug1:GAUGE:$INTERVAL:U:U \
218	DS:debug2:GAUGE:$INTERVAL:U:U DS:debug3:GAUGE:$INTERVAL:U:U \
219	DS:debug4:GAUGE:$INTERVAL:U:U DS:debug5:GAUGE:$INTERVAL:U:U \
220	DS:debug6:GAUGE:$INTERVAL:U:U DS:debug7:GAUGE:$INTERVAL:U:U \
221	DS:debug8:GAUGE:$INTERVAL:U:U DS:debug9:GAUGE:$INTERVAL:U:U \
222	DS:debug10:GAUGE:$INTERVAL:U:U DS:debug11:GAUGE:$INTERVAL:U:U \
223	DS:debug12:GAUGE:$INTERVAL:U:U DS:debug13:GAUGE:$INTERVAL:U:U \
224	DS:debug14:GAUGE:$INTERVAL:U:U DS:debug15:GAUGE:$INTERVAL:U:U \
225	DS:debug16:GAUGE:$INTERVAL:U:U DS:debug17:GAUGE:$INTERVAL:U:U \
226	DS:debug18:GAUGE:$INTERVAL:U:U DS:debug19:GAUGE:$INTERVAL:U:U
227    ;;
228proc_*.rrd)
229    # Build proc file
230    create_rrd $i \
231	DS:number:GAUGE:$INTERVAL:0:U DS:uticks:COUNTER:$INTERVAL:0:U \
232	DS:sticks:COUNTER:$INTERVAL:0:U DS:iticks:COUNTER:$INTERVAL:0:U \
233	DS:cpusec:GAUGE:$INTERVAL:0:U DS:cpupct:GAUGE:$INTERVAL:0:100 \
234	DS:procsz:GAUGE:$INTERVAL:0:U DS:rsssz:GAUGE:$INTERVAL:0:U
235    ;;
236
237pf.rrd)
238    # Build pf file
239    create_rrd $i \
240	DS:bytes_v4_in:DERIVE:$INTERVAL:0:U DS:bytes_v4_out:DERIVE:$INTERVAL:0:U \
241	DS:bytes_v6_in:DERIVE:$INTERVAL:0:U DS:bytes_v6_out:DERIVE:$INTERVAL:0:U \
242	DS:packets_v4_in_pass:DERIVE:$INTERVAL:0:U DS:packets_v4_in_drop:DERIVE:$INTERVAL:0:U \
243	DS:packets_v4_out_pass:DERIVE:$INTERVAL:0:U DS:packets_v4_out_drop:DERIVE:$INTERVAL:0:U \
244	DS:packets_v6_in_pass:DERIVE:$INTERVAL:0:U DS:packets_v6_in_drop:DERIVE:$INTERVAL:0:U \
245	DS:packets_v6_out_pass:DERIVE:$INTERVAL:0:U DS:packets_v6_out_drop:DERIVE:$INTERVAL:0:U \
246	DS:states_entries:GAUGE:$INTERVAL:0:U \
247	DS:states_searches:DERIVE:$INTERVAL:0:U \
248	DS:states_inserts:DERIVE:$INTERVAL:0:U \
249	DS:states_removals:DERIVE:$INTERVAL:0:U \
250	DS:counters_match:DERIVE:$INTERVAL:0:U \
251	DS:counters_badoffset:DERIVE:$INTERVAL:0:U \
252	DS:counters_fragment:DERIVE:$INTERVAL:0:U \
253	DS:counters_short:DERIVE:$INTERVAL:0:U \
254	DS:counters_normalize:DERIVE:$INTERVAL:0:U \
255	DS:counters_memory:DERIVE:$INTERVAL:0:U
256    ;;
257
258pfq_*.rrd)
259    # Build pfq file
260    create_rrd $i \
261	DS:sent_bytes:COUNTER:$INTERVAL:0:U \
262	DS:sent_packets:COUNTER:$INTERVAL:0:U \
263	DS:drop_bytes:COUNTER:$INTERVAL:0:U \
264	DS:drop_packets:COUNTER:$INTERVAL:0:U
265    ;;
266
267mbuf.rrd)
268    # Build mbuf file
269    create_rrd $i \
270	DS:totmbufs:GAUGE:$INTERVAL:0:U DS:mt_data:GAUGE:$INTERVAL:0:U \
271	DS:mt_oobdata:GAUGE:$INTERVAL:0:U DS:mt_control:GAUGE:$INTERVAL:0:U \
272	DS:mt_header:GAUGE:$INTERVAL:0:U DS:mt_ftable:GAUGE:$INTERVAL:0:U \
273	DS:mt_soname:GAUGE:$INTERVAL:0:U DS:mt_soopts:GAUGE:$INTERVAL:0:U \
274	DS:pgused:GAUGE:$INTERVAL:0:U DS:pgtotal:GAUGE:$INTERVAL:0:U \
275	DS:totmem:GAUGE:$INTERVAL:0:U DS:totpct:GAUGE:$INTERVAL:0:100 \
276	DS:m_drops:COUNTER:$INTERVAL:0:U DS:m_wait:COUNTER:$INTERVAL:0:U \
277	DS:m_drain:COUNTER:$INTERVAL:0:U
278    ;;
279
280io_*.rrd)
281    # Build disk files
282    create_rrd $i \
283	DS:rxfer:COUNTER:$INTERVAL:U:U \
284	DS:wxfer:COUNTER:$INTERVAL:U:U \
285	DS:seeks:COUNTER:$INTERVAL:U:U \
286	DS:rbytes:COUNTER:$INTERVAL:U:U \
287	DS:wbytes:COUNTER:$INTERVAL:U:U
288    ;;
289
290io1_*.rrd)
291    # Build disk files
292    create_rrd $i \
293	DS:transfers:COUNTER:$INTERVAL:U:U \
294	DS:seeks:COUNTER:$INTERVAL:U:U \
295	DS:bytes:COUNTER:$INTERVAL:U:U
296    ;;
297
298smart_*.rrd)
299    # Build smart files
300    create_rrd $i \
301        DS:read_error_rate:GAUGE:$INTERVAL:U:U \
302        DS:realloc_sectors:GAUGE:$INTERVAL:U:U \
303        DS:spin_retries:GAUGE:$INTERVAL:U:U \
304        DS:air_flow_temp:GAUGE:$INTERVAL:U:U \
305        DS:temperature:GAUGE:$INTERVAL:U:U \
306        DS:realloc:GAUGE:$INTERVAL:U:U \
307        DS:cur_pending:GAUGE:$INTERVAL:U:U \
308        DS:uncorr:GAUGE:$INTERVAL:U:U \
309        DS:sread_error_rate:GAUGE:$INTERVAL:U:U \
310        DS:gsense_error_rate:GAUGE:$INTERVAL:U:U \
311        DS:temperature2:GAUGE:$INTERVAL:U:U \
312        DS:freefall:GAUGE:$INTERVAL:U:U
313    ;;
314
315load.rrd)
316    # Build load file
317    create_rrd $i \
318	DS:load1:GAUGE:$INTERVAL:0:U \
319	DS:load5:GAUGE:$INTERVAL:0:U \
320	DS:load15:GAUGE:$INTERVAL:0:U
321    ;;
322
323flukso_*.rrd)
324    # Build the flukso file
325    create_rrd $i \
326        DS:watts:GAUGE:$INTERVAL:0:U
327    ;;
328
329"done")
330    # ignore
331    ;;
332*)
333    # Default match
334    echo $i - cannot determine filetype from filename
335    ;;
336esac
337done
338