#!/usr/bin/perl

# replace unwanted numeric data in an rrd file with NaN values
# from Ed Ravin, eravin@panix.com, May 2002.  License is GPL.

use strict;
use Date::Parse;

#################### user-configurable stuff
my $RRDTOOL=  "rrdtool";                 # location of rrdtool
my $TEMPFILE= "/tmp/rrdcut.$$.xml";
#################### end user-configurable stuff

my $usage= "Cut rows out of an RRD database based on date and time.  Usage:

rrdcut -starttime 'DATE' -endtime 'DATE' rrdfile [...]

'DATE' format is anything accepted by Date::Parse str2time()
All rows in all datasources dated BETWEEN the start and end times will be
replaced with NaN values.
";


my $starttime;
my $endtime;

die $usage unless @ARGV > 1;

while (1)
{
	die $usage unless @ARGV >= 1;

	if ($ARGV[0] =~ /^-?-(start|end)time$/)
	{
		my $whichend= $1 . "time";
		shift @ARGV;
		my $thetime= str2time($ARGV[0]) ||
			die "$0: unable to parse -$whichend option value\n";
		$starttime= $thetime if ($whichend eq "starttime");
		$endtime=   $thetime if ($whichend eq "endtime");
	}
	elsif ($ARGV[0] =~/^-/)
	{
		die "$0: unknown option $ARGV[0]\n";
	}
	elsif ($ARGV[0] !~ /^-/)
	{
		last;
	}
	shift @ARGV;
}

die $usage unless $starttime and $endtime;

# sample row
#  we want the ctime value:       vvvvvvvvvv
#  <!-- 2002-05-03 20:00:00 EDT / 1020470400 --> <row><v> 1.2338352416e+07 </v><v> 8.0156175954e+06 </v><v> 0.0000000000e+00 </v><v> 1.4221113929e+07 </v></row>


foreach my $file (@ARGV)
{
	open(RRDXML, "$RRDTOOL dump $file|") ||
		die "$0: cannot rrddump $file: $!\n";
	open(TEMP, ">$TEMPFILE") ||
		die "$0: cannot open temp file $TEMPFILE for output: $!\n";
	while(<RRDXML>)
	{
		if (m@^\s* <!-- \s* \d\d\d\d-\d\d-\d\d \s* \d\d:\d\d:\d\d \s* [^/]*  \s* / \s* (\d+) \s* --> \s* <row>@ix )
		{
			my $rowtime= $1;
			if ($starttime <= $rowtime and $rowtime <= $endtime)
			{
				s@<v> \s* \S+ \s* </v>@<v> NaN </v>@ixg;
			}
		}
		print TEMP $_;
	}
	close TEMP || die "$0: failure closing temp file $TEMPFILE: $!\n";
	rename ($file, "$file.old") || die "$0: failure renaming $file: $!\n";
	my $rc= system "$RRDTOOL restore $TEMPFILE $file";
	warn "$0: WARNING: rrdrestore fails, status $rc.  $file may be corrupt.\n"
		if $rc;
}

unlink $TEMPFILE unless
	exists($ENV{"RRDCUT_DEBUG"}) and $ENV{"RRDCUT_DEBUG"} eq "YES";