#!/usr/bin/perl -w use strict; use warnings; use RRDs; my ($rrdfile, $srcrra, @dstrras) = @ARGV; if (!defined $rrdfile) { die "usage: $0 [ ... ]\n" . "e.g. to add both the MIN and AVERAGE rra to /var/db/eth0.rrd and " . "using the MAX rra as template::\n" . "$0 /var/db/eth0.rrd MAX MIN AVERAGE"; } my $tmpfile = $rrdfile . ".xml"; my $tmpfile2 = $rrdfile . "2.xml"; RRDs::dump($rrdfile, $tmpfile); my $err = RRDs::error; die "cannot dump $rrdfile: $err" if $err; open(SRC, $tmpfile) || die "cannot open $tmpfile: $!"; open(DST, ">$tmpfile2") || die "cannot open $tmpfile2: $!"; my $state = 0; my @buffer; while () { print DST; push @buffer, $_ if ($state == 2); $state = 2 if ($state && /\$srcrra\<\/cf\>/); $state = 1 if /\/; if (/\<\/rra\>/) { if ($state == 2) { foreach my $line(@dstrras) { print DST '', $line, ''; foreach (@buffer) { print DST; } } } $state = 0; @buffer = (); } } close(DST); close(SRC); rename($rrdfile, "$rrdfile.old") || die "cannot rename $rrdfile to $rrdfile.old: $!"; RRDs::restore($tmpfile2, $rrdfile); $err = RRDs::error; die "cannot restore $rrdfile from $tmpfile2: $err" if $err; foreach ($tmpfile, $tmpfile2) { unlink($_) || warn "cannot remove $_: $!"; }