Получение очередей COS juniper

#!/usr/bin/perl
#
#DMiIS (C)Timur Nigamov
#
use strict;
use Net::SNMP qw(:snmp);
my $debug=0;
my $snmp_args;
my $read_config_option='/v0/cacti/scriprts/read_config_options.php';
my $log_path="/v0/cacti/log/query_juniper_cos.log";
my @argv;
foreach my $arg(@ARGV)
{
    next if ($arg eq "query_cos");
    push (@argv,$arg);
}

my $hostname=$argv[0];
&writelog("Host",$hostname);
my $snmp_auth=$argv[1];
my $cmd=$argv[2];
my $query_fields=$argv[3];
my $query_idx=$argv[4];
my $return_data="";
my $result=&query_cos($hostname,$snmp_auth,$cmd,$query_fields,$query_idx);
my %table;
my $request_oid;
my $data;
#
#
#
sub query_cos()
{
my ($hostname,$snmp_auth,$cmd,$query_field,$query_index)=@_;
my ($new,$data,$snmp_community,$snmp_version,$snmp_port,$snmp_timeout,
    $snmp_user,$snmp_pw,$auth_proto,$auth_level,$priv_pass,
    ,$context,$priv_proto,$priv_option);

my @COS_index;
my %oids = (
        "index"         => ".1.3.6.1.2.1.2.2.1.1",
        "ifStatus"      => ".1.3.6.1.2.1.2.2.1.8",
        "ifDescription" => ".1.3.6.1.2.1.2.2.1.2",
        "ifName"        => ".1.3.6.1.2.1.31.1.1.1.1",
        "ifAlias"       => ".1.3.6.1.2.1.31.1.1.1.18",
        "ifType"        => ".1.3.6.1.2.1.2.2.1.3",
        "ifSpeed"       => ".1.3.6.1.2.1.2.2.1.5",
        "ifHWaddress"   => ".1.3.6.1.2.1.2.2.1.6",
        "ifInOctets"    => ".1.3.6.1.2.1.2.2.1.10",
        "ifOutOctets"   => ".1.3.6.1.2.1.2.2.1.16",
        "FcIdName"      => ".1.3.6.1.4.1.2636.3.15.3.1.2",
        "FabricPriority" => ".1.3.6.1.4.1.2636.3.15.3.1.3",
        "jnxCosQstatTotalRedDropPkts"   => ".1.3.6.1.4.1.2636.3.15.4.1.13",
        "jnxCosQstatTailDropPkts"       => ".1.3.6.1.4.1.2636.3.15.4.1.11",
        "jnxCosQstatQedPkts"            => ".1.3.6.1.4.1.2636.3.15.4.1.3",
        "jnxCosQstatQedBytes"           => ".1.3.6.1.4.1.2636.3.15.4.1.5",
        "jnxCosQstatTxedPkts"           => ".1.3.6.1.4.1.2636.3.15.4.1.7",
        "jnxCosQstatTxedBytes"          => ".1.3.6.1.4.1.2636.3.15.4.1.9",
        "jnxCosQstatTotalRedDropBytes"      => ".1.3.6.1.4.1.2636.3.15.4.1.23",
        "ifJnxInQDrops"                 => ".1.3.6.1.4.1.2636.3.3.1.1.11",
        );
my $xml_delimiter          =  "!";
my $snmp_retries   = &read_config_option("snmp_retries");
my @snmp_args = split(':', $snmp_auth);
         $snmp_community = $snmp_args[0];
         $snmp_version   = $snmp_args[1];
         $snmp_port      = $snmp_args[2];
         $snmp_timeout   = $snmp_args[3];
         $snmp_user     = "";
         $snmp_pw     = "";

        if ($snmp_version == 3)
        {
         $snmp_user   = $snmp_args[4];
         $snmp_pw   = $snmp_args[5];
         $auth_proto = $snmp_args[6];
         $priv_pass = "";
         $priv_proto = "";
         $context = "";
        }
if (($priv_pass eq "") or ($priv_proto eq "")) {  $auth_level= '-lauthNoPriv';$priv_option="";}
else { $auth_level= '-lauthPriv'; }
#######################################################################
if ($cmd eq "index") {
        &writelog("Start command:",$cmd);
        # retrieve all indices from target
        $new=$oids{"index"};
        my @return_arr = `snmpbulkwalk -v$snmp_version -u$snmp_user -A$snmp_pw $auth_level $priv_option -a$auth_proto -r$snmp_retries  -t$snmp_timeout $hostname:$snmp_port  $new`;
        foreach my $index(@return_arr)
        {
                chomp($index);
               $index=reverse($index);
                ($index,undef)=split(':',$index);
                $index =~ s/ //g;
                $index=reverse($index);
                $new=$oids{"jnxCosQstatQedPkts"}. "." .$index.".0";
                my $result=get_snmp ($hostname,$snmp_port,$snmp_version,$snmp_timeout,$snmp_retries,$snmp_community,$snmp_user,$snmp_pw,$auth_proto,$priv_pass,$priv_proto,$new);
                $new="";
                if ( $result ne "" )
                {
                        print ("$index\n");
                &writelog("Result",$result);
                }
        }
    }
elsif ($cmd eq "query")
    {
        &writelog("Start command:","$cmd $query_field");
        $new=$oids{"index"};
        my @arr_index = `snmpbulkwalk -v$snmp_version -u$snmp_user -A$snmp_pw $auth_level $priv_option -a$auth_proto -r$snmp_retries  -t$snmp_timeout $hostname:$snmp_port  $new`;
        foreach my $arr_index (@arr_index)
        {
            chomp($arr_index);
            $arr_index=reverse($arr_index);
            ($arr_index,undef)=split(':',$arr_index);
            $arr_index =~ s/ //g;
            $arr_index=reverse($arr_index);
            $new=$oids{"jnxCosQstatQedPkts"}. "." .$arr_index.".0";
            my $COS_get=get_snmp ($hostname,$snmp_port,$snmp_version,$snmp_timeout,$snmp_retries,$snmp_community,$snmp_user,$snmp_pw,$auth_proto,$priv_pass,$priv_proto,$new);
                if ( $COS_get ne "")
                {
                    push (@COS_index, $arr_index);
               }
        }
        if ($query_field =~ m/queued/)
        {
                my $temp=reverse($query_field);
                my ($cosqnpro,undef)=split ('\.',$temp);
                $cosqnpro=reverse($cosqnpro);
                foreach my $arr_index(@COS_index)
                {       my $COS_get="";
                        $new = $oids{"jnxCosQstatQedPkts"}. "." .$arr_index.".".$cosqnpro;
                        $data=$new;
                        &writelog("Get oid ",$data);
                        print "$arr_index".$xml_delimiter;
                        $COS_get= get_snmp ($hostname,$snmp_port,$snmp_version,$snmp_timeout,$snmp_retries,$snmp_community,$snmp_user,$snmp_pw,$auth_proto,$priv_pass,$priv_proto,$new);
                        print "$COS_get\n";
                }


        }
        elsif ($query_field =~ m/dropped/)
        {
                my $temp=reverse($query_field);
                my ($cosqnpro,undef)=split ('\.',$temp);
                $cosqnpro=reverse($cosqnpro);
                foreach my $arr_index(@COS_index)
                {
                        $new = $oids{"jnxCosQstatTotalRedDropPkts"}.".".$arr_index.".". $cosqnpro;
                        $data=$new;
                        &writelog("Get oid ",$data);
                        print "$arr_index".$xml_delimiter;
                        my $red = get_snmp ($hostname,$snmp_port,$snmp_version,$snmp_timeout,$snmp_retries,$snmp_community,$snmp_user,$snmp_pw,$auth_proto,$priv_pass,$priv_proto,$new);
                        chomp ($red);
                        $new = $oids{"jnxCosQstatTailDropPkts"}. "." .$arr_index.".".$cosqnpro;
                        $data=$new;
                        &writelog("Get oid ",$data);
                        my $tail = get_snmp ($hostname,$snmp_port,$snmp_version,$snmp_timeout,$snmp_retries,$snmp_community,$snmp_user,$snmp_pw,$auth_proto,$priv_pass,$priv_proto,$new);
                        chomp ($tail);
                        $result=$red + $tail;
                        print "$result\n";
                }
        }
        else
        {
                foreach my $arr_index(@COS_index)
                {
                        print $arr_index . $xml_delimiter;
                        $new=$oids{$query_field}.".".$arr_index;
                        my $result= get_snmp ($hostname,$snmp_port,$snmp_version,$snmp_timeout,$snmp_retries,$snmp_community,$snmp_user,$snmp_pw,$auth_proto,$priv_pass,$priv_proto,$new);
                        &writelog("Result $arr_index:",$return_data);
                        $result=~s/\!/\-/g;
                        $return_data="";
                        print  "$result\n";
                }
        }
    }
    elsif ($cmd eq "get")
    {
        &writelog("Start command: $cmd","$query_field-$query_index");
        if ($query_field =~ m/queued/)
        {
                my $temp=reverse($query_field);
                my ($cosqnpro,undef)=split ('\.',$temp);
                $cosqnpro=reverse($cosqnpro);
                $new = $oids{"jnxCosQstatQedPkts"}. "." .$query_index.".".$cosqnpro;
                $data=$new;
                &writelog("Get oid ",$data);
                my $result=get_snmp ($hostname,$snmp_port,$snmp_version,$snmp_timeout,$snmp_retries,$snmp_community,$snmp_user,$snmp_pw,$auth_proto,$priv_pass,$priv_proto,$new);
                print "$result\n";
        }
        elsif ($query_field =~ m/qbytes/)
        {
                my $temp=reverse($query_field);
                my ($cosqnpro,undef)=split ('\.',$temp);
                $cosqnpro=reverse($cosqnpro);
                $new = $oids{"jnxCosQstatQedBytes"}. "." .$query_index.".". $cosqnpro;
                $data=$new;
                &writelog("Get oid ",$data);
                my $result=get_snmp ($hostname,$snmp_port,$snmp_version,$snmp_timeout,$snmp_retries,$snmp_community,$snmp_user,$snmp_pw,$auth_proto,$priv_pass,$priv_proto,$new);
                print "$result\n";
        }
        elsif ($query_field =~ m/dropped/)
        {
            &writelog("query field = ",$query_field);
                my $temp=reverse($query_field);
                my ($cosqnpro,undef)=split ('\.',$temp);
                $cosqnpro=reverse($cosqnpro);
                $new = $oids{"jnxCosQstatTotalRedDropPkts"}. "." .$query_index.".".$cosqnpro;
                $data=$new;
                &writelog("Get oid :","$data");
                my $red = get_snmp ($hostname,$snmp_port,$snmp_version,$snmp_timeout,$snmp_retries,$snmp_community,$snmp_user,$snmp_pw,$auth_proto,$priv_pass,$priv_proto,$new);
                &writelog("Get red packets ","$red");
                $new = $oids{"jnxCosQstatTailDropPkts"}. "." .$query_index.".". $cosqnpro;
                $data=$new;
                &writelog("Get oid ","$data");
                my $tail = get_snmp ($hostname,$snmp_port,$snmp_version,$snmp_timeout,$snmp_retries,$snmp_community,$snmp_user,$snmp_pw,$auth_proto,$priv_pass,$priv_proto,$new);
                &writelog("Get tail packets ","$tail");
                my $result=$red + $tail;
                &writelog("red+tail packets ",$result);
                print "$result\n";

        }
        else
        {
                $new = $oids{$query_field}. "." .$query_index;
                my $result=get_snmp ($hostname,$snmp_port,$snmp_version,$snmp_timeout,$snmp_retries,$snmp_community,$snmp_user,$snmp_pw,$auth_proto,$priv_pass,$priv_proto,$new);
                chomp ($result);
                $result=~s/\!/\#/g;
        #       (undef,$result)=split (':',$result);
                print $result."\n";
        }
    }
    else
    {
        print "Invalid use of script query, required parameters:\n\n";
        print "\t<hostname> <community> <version> <snmp_port> <timeout> <user> <pw> <cmd>\n";
    }
}
######################################################
sub writelog ()
{
my ($message,$data)=@_;
    if ($debug != 0)
    {
        open( LOG,'>>',"$log_path");
       print LOG "$message $data\n";
        close(LOG);
}
}
#######################################################
sub read_config_option ()
{
# my $result=`php -q /v0/cacti/scripts/read_config_options.php $_[0]`;
my $result=5;
$result=~ s/\s+//g;
return $result;
}
########################################################

sub get_snmp
{
my ($hostname,$port,$version,$seconds,$count,$community,$username,$authpasswd,$authproto,$privpasswd,$privproto,$oid)=@_;
    my $session = undef;
    my ($error,$text,$error_string);
    my $translate="";
    my $authkey="";
    $seconds=$seconds/100;
    my @request_oid="";
    my $octets="16384";
    my %table="";
    # Create the SNMP session 
    ($session, $error) = Net::SNMP->session(
                           -hostname      => $hostname,
                           -port          => $port,
                           -nonblocking   => 1,
                           -version       => $version,
                           -timeout       => $seconds,
                           -retries       => $count,
                           -maxmsgsize    => $octets,
                           -translate     => $translate,
                           -username      => $username,
                           -authpassword  => $authpasswd,
                           -authprotocol  => $authproto 
    );
    if (!defined($session)) {
        $error_string = sprintf("ERROR in new snmp session: %s.\n", $error);
        &writelog("Create session",$error_string);
        return;
        }
$request_oid=$oid;
my $checkdata=$hostname."- snmpget oid -> "." $oid";
&writelog("1-Start pooling: ", $checkdata);
my $result = $session->get_request(
                    -callback   => \&get_table_callback,
                    -varbindlist => [$request_oid] ,
                    );
    if ( !defined($result) ) {
        $error_string = sprintf("ERROR1: %s.\n\n", $session->error());
        &writelog("Get_table",$error_string);
            }
snmp_dispatcher();
$session->close();
#$data=$result;
&writelog("##Print result","$data");
return $data;
}

sub get_table_callback
{
my ($session)=@_;
my @names = $session->var_bind_names();
my $next= undef;
&writelog("Name =",join ("-",@names));
my $result= $session -> var_bind_list();
$data=$result->{$request_oid};
}






sub oid2string {

    my $oid = shift;

    my @numbers = split(/\./, $oid);
    my @printable;

    # Remove first number
    shift @numbers;

    foreach my $c (@numbers) {

       next if ($c < 32 or $c > 126);

       push @printable, $c;

    }

    my $word = pack("C*", @printable);

    return $word;
}

#end

Комментариев нет:

Отправить комментарий