#!/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",
#
#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
Комментариев нет:
Отправить комментарий