Just another problem

Programa para coleta de tráfego usando a ferramenta RRDTOOL

Posted in rrdtool, snmp, tech, traffic by Adriano on 18/01/2006

Programa de coleta em perl:

#!/opt/csw/bin/perl -w
##################################################
# rrdtraf.pl
#
# Trafego de equipamentos Cisco
#
# 2006.01.12 - Adriano P. Carvalho
# $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

Exemplo do arquivo rrdtraf.par

community:10.1.2.3:Comment:FastEthernet0/1:FastEthernet0/2
community:10.1.2.4:Comment:FastEthernet0/1
community:10.1.2.5:Comment:FastEthernet0/1:FastEthernet0/2:FastEthernet0/12:FastEthernet0/18

Programa em PHP para plotar os gráficos:

{!--
##################################################
# rrdgraph.php
#
# Plotagem dos graficos de arquivos rrd
#
# 2006.01.12 - Adriano P. Carvalho
# $Id: $
--}
{?php
$display = $_GET['display'];

if ($display == 'image') {

header ("Content-type: image/png",false);

$display = $_GET['display'];
$rrdtool = "/opt/csw/bin/rrdtool ";
$graph_opt =     "--height 150 --width 550 " .
"--start -172800 ".
"--imgformat PNG ".
"--no-minor ".
"-c BACK#ffffff ".
"-c SHADEA#ffffff ".
"-c SHADEB#ffffff ".
"-c FRAME#ffffff ".
"-v 'bits/seg' -L 8  ";

$arq1="/home/aprado/proj/traf/".$_GET['arq1'];

$graph =
"DEF:in1=$arq1:ifInOctets:AVERAGE ".
"DEF:out1=$arq1:ifOutOctets:AVERAGE ".
"CDEF:in1_bps=in1,8,* ".   #NÃO ESQUECER DE MULTIPLICAR POR 8
"CDEF:out1_bps=out1,8,* ".  #(1 byte = 8 bits)
"HRULE:0#000000:'       ' ".
"AREA:in1_bps#6699cc:'Saida' ".
"LINE2:out1_bps#003399:'Entrada' ";

# function for rrdtool execution
function rrdtool_execute($rrdtool, $command) {
return fpassthru(popen($rrdtool . $command, "r"));
}

$command = $graph_opt . $graph;
return rrdtool_execute($rrdtool, " graph - $command");
}
?}

{HTML}
{HEAD}
{STYLE TYPE="text/css"}
H1 {
font-weight: bold;
font-size: 18pt;
line-height: 18pt;
font-family: arial,helvetica;
font-variant: normal;
font-style: normal;
}
BODY {
color: black;
background-color: white;
font-size: 11pt;
line-height: 12pt;
font-family: arial,helvetica;
font-variant: normal;
font-style: normal;
}
{/STYLE}
{/HEAD}
{BODY}

{CENTER}
{TABLE}
{?php

function graphit($arq1, $descr1) {
print "{tr align='center'}{td}{font color='#003399'}{b}$descr1{/b}{/font}{br}n";
print "{/td}{/tr}n";
print "{tr}{td align='center'}{img xsrc='/traf/rrdgraph.php?display=image&arq1=$arq1' border='0'}";
print "{hr width='100%' size='2'}{/td}{/tr}n";
}

graphit("10.1.2.3_2.rrd","10.1.2.3 - f0/1: Comentario");
graphit("10.1.2.3_3.rrd","10.1.2.3 - f0/2: Comentario");

?}
{/TABLE}
{/CENTER}
{/BODY}
{/HTML}
Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: