index 06444ece0b627a015564ec05fdd6c726694083f5..bf2abe8c438473ffbd809d635d2512c6f885269c 100644 (file)
$status = B<RRD::end>
-B<$RRDp::user>, B<$RRDp::sys>, B<$RRDp::real>
+B<$RRDp::user>, B<$RRDp::sys>, B<$RRDp::real>, B<$RRDp::error_mode>, B<$RRDp::error>
=head1 DESCRIPTION
=item B<RRDp::cmd> I<rrdtool commandline>
-pass commands on to RRDtool. check the RRDtool documentation for
+pass commands on to RRDtool. Check the RRDtool documentation for
more info on the RRDtool commands.
+B<Note>: Due to design limitations, B<RRDp::cmd> does not support the
+C<graph -> command - use C<graphv -> instead.
+
=item $answer = B<RRDp::read>
read RRDtool's response to your command. Note that the $answer variable will
is the total time RRDtool has been running.
The difference between user + system and real is the time spent
-waiting for things like the hard disk and new input from the perl
+waiting for things like the hard disk and new input from the Perl
script.
+=item B<$RRDp::error_mode> and B<$RRDp::error>
+
+If you set the variable $RRDp::error_mode to the value 'catch' before you run RRDp::read a potential
+ERROR message will not cause the program to abort but will be returned in this variable. If no error
+occurs the variable will be empty.
+
+ $RRDp::error_mode = 'catch';
+ RRDp::cmd qw(info file.rrd);
+ print $RRDp::error if $RRDp::error;
+
=back
=head1 AUTHOR
-Tobias Oetiker <oetiker@ee.ethz.ch>
+Tobias Oetiker <tobi@oetiker.ch>
=cut
+
#' this is to make cperl.el happy
use strict;
sub end ();
sub read ();
-$VERSION=1.199908;
+$VERSION=1.4003;
sub start ($){
croak "rrdtool is already running"
sub read () {
croak "RRDp::read can only be called after RRDp::cmd"
unless $Sequence eq 'C';
+ $RRDp::error = undef;
$Sequence = 'R';
my $inmask = 0;
my $srbuf;
my $buffer;
my $nfound;
my $timeleft;
- my $ERR = 0;
vec($inmask,fileno(RRDreadHand),1) = 1; # setup select mask for Reader
while (1) {
my $rout;
$minibuf .= $srbuf;
while ($minibuf =~ s|^(.+?)\n||s) {
my $line = $1;
- # print $line,"\n";
- if ($line =~ m|^ERROR|) {
- croak $line;
- $ERR = 1;
+ # print $line,"\n";
+ $RRDp::error = undef;
+ if ($line =~ m|^ERROR|) {
+ $RRDp::error_mode eq 'catch' ? $RRDp::error = $line : croak $line;
+ $RRDp::sys = undef;
+ $RRDp::user = undef;
+ $RRDp::real = undef;
+ return undef;
}
- elsif ($line =~ m|^OK u:([\d\.]+) s:([\d\.]+) r:([\d\.]+)|){
+ elsif ($line =~ m|^OK(?: u:([\d\.]+) s:([\d\.]+) r:([\d\.]+))?|){
($RRDp::sys,$RRDp::user,$RRDp::real)=($1,$2,$3);
- return $ERR == 1 ? undef : \$buffer;
+ return \$buffer;
} else {
$buffer .= $line. "\n";
}
}
$cmd =~ s/\n/ /gs;
$cmd =~ s/\s/ /gs;
+
+ # The generated graphs aren't necessarily terminated by a newline,
+ # causing RRDp::read() to wait for a line matching '^OK' forever.
+ if ($cmd =~ m/^\s*graph\s+-\s+/) {
+ croak "RRDp does not support the 'graph -' command - "
+ . "use 'graphv -' instead";
+ }
print RRDwriteHand "$cmd\n";
}