Never been to DZone Snippets before?

Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

Retrieve Cisco router traffic statistics using perl and RRDTOOL and PHP (See related posts)

Traffic retrieving perl script:
    #!/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


rrdtraf.par - sample file
    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


PHP script to plot the traffic graph:
    {!--
    ##################################################
    # rrdgraph.php
    #
    # Plotagem dos graficos de arquivos rrd
    #
    # 2006.01.12 - Adriano P.
    # $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}


Comments on this post

asil posts on Oct 23, 2009 at 16:03
Thank you for sharing and technical informations. This article I want to share with my other friends. Regards.

- - - - - - - - - - - - - - - - - - - - - - - -
Eglence icin Chat, Sohbet deneyin.
ohyeah posts on Nov 03, 2009 at 09:49
Sounds good! I wonder if you like the basketball games? Im the sneaker collector, and I like Basketball Shoes so much. That’s why you saw me here. Also, my sister ask me to find some UGG Boots useful news, can you help me? Thanks!
cairan posts on Nov 05, 2009 at 10:14

Anybody knows the numbers ofin replica handbags
replica bags
ed hardy
ed hardy clothing
ralph lauren polo
juicy couture, I need to call them and get my bag repaired.

You need to create an account or log in to post comments to this site.


Click here to browse all 7307 code snippets

Related Posts