/* Author: CodeGrabber
Date: 09-04-2008
Filename:
Description: Retrieve Cisco router traffic statistics using perl and RRDTOOL and PHP
History:
*/
#!/opt/csw/bin/perl -w
##################################################
# rrdtraf.pl
#
# Trafego de equipamentos Cisco
#
# 2006.01.12 - Adriano P.
# $Id: $
######################
require 5.003;
use strict;
use SNMP_Session;
use BER;
use SNMP_util "0.90";
use Time::Local;
use RRDs;
use Getopt::Long;
use Pod::Usage;
##### GLOBAL #####
my %opt;
my @routers;
my $IP_APPEND="::2:2";
my $ERROR;
my %rrd;
##################################################################
sub main {
init();
Options(%opt);
open(PAR, "rrdtraf.par") || die "Problema ao abrir rrdtraf.parn";
Msg("* Coletando dados dos switches");
while () {
next if grep(/^(#)/,$_);
my ($community,$ip,$net,@if) = split /:/;
#$ip = "${community}@${ip}"; #host:port:timeout:retries
LeituraSNMP($community, $ip,@if);
syswrite(STDOUT,'.',1) if (!$opt{verbose} && !$opt{V});
}
close(PAR);
Msg("n","* Fim");
}
main;
exit 0;
##################################################################
sub CriaRRD($) {
my $arquivo = shift;
print "- Criando base de dados:($arquivo) - " if $opt{verbose};
RRDs::create ("$arquivo", "--start", time(),
"--step", "300",
"DS:ifInOctets:COUNTER:600:0:U",
"DS:ifOutOctets:COUNTER:600:0:U",
"RRA:AVERAGE:0.5:1:600", #2 dias, com amostra de 5min
"RRA:AVERAGE:0.5:6:700", #2 semanas, com amostra de 30min
"RRA:AVERAGE:0.5:24:775", #2 meses, com amostra de 2h
"RRA:AVERAGE:0.5:288:400"); #1 ano, com amostra de 1 dia
if ($ERROR = RRDs::error) {
die "$0: unable to graph $arquivo: $ERRORn";
}
print "okn" if $opt{verbose};
}
##################################################################
sub LeituraSNMP($$$) {
my $community = shift;
my $ip = shift;
my (@if) = @_;
my ($idx, $arquivo);
my $ifInBroadcastPkts = "1.3.6.1.2.1.2.2.1.12";
my $ifOutBroadcastPkts = "1.3.6.1.2.1.2.2.1.18";
my @oids = ('ifIndex','ifDescr','ifInOctets','ifOutOctets');
my @stack = &SNMP("${community}@${ip}", @oids);
#$ip =~ s/.*@//;
print "--[ $ip ]-----------n" if $opt{verbose};
foreach $idx (@stack) {
my ($id,$nome) = SNMP_util::Check_OID('ifDescr');
next if (!${$idx}{$id});
# Ignora interfaces nao cadastradas
if( !grep(/^${$idx}{$id}$/,@if) ) {
next;
}
my @dados = ();
$dados[0] = $ip; # 1: ip
@dados[1,2,3,4] = &Dados($idx,@oids);
my $ifIndex = $dados[1];
$arquivo = "${ip}_${ifIndex}.rrd";
if (! -e "$arquivo") {
CriaRRD($arquivo);
}
AtualizaRRD($arquivo, @dados);
}
}
##################################################################
sub AtualizaRRD(@) {
my $arquivo = shift;
my (@dados) = @_;
print "- $dados[0], $dados[1], $dados[2], $dados[3], $dados[4]n" if $opt{verbose};
RRDs::update ($arquivo, "N:$dados[3]:$dados[4]");
}
##################################################################
sub GrafRRD {
my ($start_date,$eqto) = @_;
print "Gerando grafico ($start_date)...";
my @option = ("-s", $start_date, "-w", "600", "-h", "170",
"-e", "now", "--alt-autoscale", "-l 0",
"-x", "HOUR:1:DAY:1:HOUR:2:0:%H");
if ($start_date >= 2) {
######################
# GRAPH 1
RRDs::graph ("$eqto.gif", @option,
"DEF:in=$eqto.gif:ifInOctets:AVERAGE",
"DEF:out=$eqto.gif:ifOutOctets:AVERAGE",
"LINE2:c13#0000aa:Entrada",
"LINE2:c14#ff66ff:Saida");
if ($ERROR = RRDs::error) {
die "$0: unable to graph $eqto.gif: $ERRORn";
}
}
print "okn";
}
##################################################################
sub SNMP($@) {
my $ip = shift;
my @oids = @_;
my $ip_="$ip${IP_APPEND}";
my ($idx,$oid,@stack);
foreach my $tuple (snmpwalk($ip_, @oids)) {
my($var,$counter) = split /:/, $tuple, 2;
$idx = substr($var, rindex($var,'.')+1);
$oid = substr($var, 0, length($var)-length($idx)-1);
#warn "* $vart$countern" if $opt{V};
$stack[$idx]{$oid} = $counter;
}
return @stack;
}
##################################################################
sub Dados($$) {
my $var = shift;
my @oids = @_;
my @dados = ();
for(my $i=0; $i 2) if $$opt{man};
}
##################################################################
sub init {
# queue up reading the MIB file
#&snmpQueue_MIB_File("/home/adr/mibs/IWFG.MIB");
$SNMP_Session::suppress_warnings = 2;
$SNMP_util::Debug = 0;
$= = 1000;
}
#eof