use RRDs;
use SNMP 1.8;
do "/data/prog/cyrus/cyrusrc";
get_data();
sub get_data{
foreach $hname (keys %HOSTS){
$MAX = 0;
%walk=snmp_walk($hname, $HOSTS{$hname}, $MASTER);
foreach $OID (sort keys %walk){
@O = split /\./, $OID;
$RVAL=$walk{$OID};
chomp $RVAL;
if($O[-1] > $MAX){
$MAX = $O[-1];
}
$STUFF{"$O[$#O-1]-$O[$#O]"} = $RVAL;
}
for($i=1; $i<=$MAX; $i++){
$blah[0]=$STUFF{"3-$i"};
$blah[1]=$STUFF{"2-$i"};
$blah[2]=$STUFF{"1-$i"};
print "$hname:$blah[0]: $blah[2], $blah[1]\n";
populate_dbs();
} } }
sub populate_dbs{
if(open(DB, "< $DPTH/$hname:$blah[0].rrd")){
close(DB);
} else {
print("Making $DPTH/$hname:$blah[0]:daily.rrd\n");
RRDs::create("$DPTH/$hname:$blah[0].rrd","-s 1",
"DS:current:GAUGE:300:U:U",
"DS:total:COUNTER:300:U:U",
"RRA:MAX:0.5:300:4320",
"RRA:MAX:0.5:1800:336",
"RRA:MAX:0.5:14400:168",
"RRA:MAX:0.5:86400:364");
$ERROR=RRDs::error;
print $ERROR if $ERROR;
}
RRDs::update("$DPTH/$hname:$blah[0].rrd", "N:$blah[1]:$blah[2]");
}
sub snmp_walk{
my ($server, $comm, $rootoid) = @_;
my %walk=();
my $sess = new SNMP::Session ( DestHost => $server,
Community => $comm,
UseNumeric => 1,
UseLongNames => 1
);
my @orig=split /\./, $rootoid;
my $var = new SNMP::Varbind(["$rootoid"]);
my $val = $sess->getnext($var);
my $name = $var->[$SNMP::Varbind::tag_f];
$name .= ".$var->[$SNMP::Varbind::iid_f]" if $var->[$SNMP::Varbind::iid_f];
my @current=split /\./, $name;
while (!$sess->{ErrorStr} && $orig[$ && $ my $value=$var->[$SNMP::Varbind::val_f];
$walk{"$name"} = $value;
$val = $sess->getnext($var);
$name=$var->[$SNMP::Varbind::tag_f];
$name .= ".$var->[$SNMP::Varbind::iid_f]" if $var->[$SNMP::Varbind::iid_f];
@current=split /\./, $name;
}
print("$sess->{ErrorStr}\n") if $sess->{ErrorStr};
return(%walk);
}