📄 getrouterinfociscocrs.pl
字号:
#!/usr/local/bin/perl######################### GetRouterInfoCiscoCRS.pl ######################### file type: perl ## basic property: gather cisco CRS performance data ## develop plain: SUN Solaris ## creator: matao <mat@zhong-ying.com> ## date: 2006/01/05 ## modifer: matao <mat@zhong-ying.com> ## content: add CPU use ratio ## date: 2006/01/10 ## ############################################################################use strict;use DBI;use SNMP::MIB::Compiler;use Net::SNMP;use WriteErrLog;use GetSHDir;use TelnetUtil;my $dbh;my $SNMPSess;my @Result;my %DeltaValue;my $i;my $k;my $j;my $Error;my $GatherFileName = "GetRouterInfoCiscoCRS.pl";my $DeviceModelCode = "'DEV_IP_R_CI_CRS'";my $ConItemName = 'B_DEV_RValid';#获取系统安装目录my $SetupDir = GetSHDir('SetupDir');if ( $SetupDir < 0 ) { my $Detail = "Can not open properties file for get SetupDir\n"; WriteErrLog('alarmlog.txt',$dbh,'RES3000',$GatherFileName,'GetSHDir Error',$Detail, "ResPerfLogDir"); $SetupDir = "/slview/nms/";}#功能函数所在文件unshift (@INC,"$SetupDir/lib");require ("OraPub.pl");require ("PerfPub.pl");require ("SnmpUtil.pl");require ("CommonPub.pl");require ("Debug.pl");&Debug("Begin $GatherFileName\n",0);#初始化运行环境,其中关于MIB路径部分需要有改动my ($dbh,$DevTime,$Mib,$GroupNo, $DeviceNum,$DevColInfoRef, #$DeviceIDRef,$LoopAddressRef,$ROCommunityRef, $ExtItemCodesRef,$ExtOidsRef,$ParaOidRef,$ItemTypeRef,$GatherTypeRef, $CurValueRef,$PreValueRef,$PerfRef,$PrePerfRef, $SnmpTimeOut,$SnmpRetry,$PingTimeOut, $DevBPFile,$DevDataFile,$DevAlarmFile,$DevBakFile,$TelnetTimeOut) = PrepareGather($SetupDir,$GatherFileName,$DeviceModelCode,@ARGV);#here list all the oid name needed to getmy @CPUOids = ( '1.3.6.1.4.1.9.9.109.1.1.1.1.8' #CPU Use Ratio);my @MemOids = ( '1.3.6.1.4.1.9.9.48.1.1.1.5', #mem used '1.3.6.1.4.1.9.9.48.1.1.1.6', #mem free);for ( $i = 0; $i < $DeviceNum; $i ++ ) { my %SDevCol = %{$DevColInfoRef->[$i]}; &Debug("Begin $SDevCol{'DeviceID'} $SDevCol{'LoopAddress'} $SDevCol{'SNMPCommunity'}...\n",1); #get ping status and calculate down occur time. my $PingStatus = &GetPingStatus($SDevCol{'LoopAddress'},$PingTimeOut); $PerfRef->{$SDevCol{'DeviceID'}}{'-1'}{'B_PingStatus'} = $PingStatus; if($SDevCol{'ColItems'}{$ConItemName}==1 || $SDevCol{'ColItems'}{'ALL'}==1) { $PerfRef->{$SDevCol{'DeviceID'}}{'-1'}{$ConItemName} = $PingStatus; } $PerfRef->{$SDevCol{'DeviceID'}}{'-1'}{'B_SnmpStatus'} = 0; #通过snmp获得数据 $SNMPSess = &CreateSnmpSession_ext($Mib,\%SDevCol,$SnmpTimeOut,$SnmpRetry,$CurValueRef); if ( !defined($SNMPSess) ) { if ( defined $PrePerfRef->{$SDevCol{'DeviceID'}} ) { %{$PerfRef->{$SDevCol{'DeviceID'}}} = %{$PrePerfRef->{$SDevCol{'DeviceID'}}}; } if ( $PrePerfRef->{$SDevCol{'DeviceID'}}{'-1'}{'B_DownOccurTime'} == 0 ) { $PerfRef->{$SDevCol{'DeviceID'}}{'-1'}{'B_DownOccurTime'} = $DevTime; } $PerfRef->{$SDevCol{'DeviceID'}}{'-1'}{'B_SnmpStatus'} = 0; $PerfRef->{$SDevCol{'DeviceID'}}{'-1'}{'B_PingStatus'} = $PingStatus; if($SDevCol{'ColItems'}{$ConItemName}==1 || $SDevCol{'ColItems'}{'ALL'}==1) { $PerfRef->{$SDevCol{'DeviceID'}}{'-1'}{$ConItemName} = $PingStatus; } my $Detail="Can not get info of $SDevCol{'DeviceID'}: create SNMP session failed,$Error\n"; &Debug($Detail,2); &WriteErrLog('alarmlog.txt',$dbh,'PER0405',$GatherFileName,'SNMP Session Error', $Detail, 'ResLogDir'); $SNMPSess = '';# next; } else { #judge if the device has downed by my $Downed = &DetectDeviceDown($SNMPSess,$Mib,$SDevCol{'DeviceID'},$CurValueRef,$PreValueRef); #get by snmp #get device status ,CPU use ratio if($SDevCol{'ColItems'}{'B_RCPUUseRatio'}==1 || $SDevCol{'ColItems'}{'ALL'}==1) { &Debug("get device status ,CPU use ratio\n", 2); my @Index = (); ($Error, @Result) = &SnmpGetTable($SNMPSess, $Mib, \@Index, @CPUOids); if ( $Error ) { if ( defined $PrePerfRef->{$SDevCol{'DeviceID'}}{'-1'}{'B_RCPUUseRatio'} ) { $PerfRef->{$SDevCol{'DeviceID'}}{'-1'}{'B_RCPUUseRatio'} = $PrePerfRef->{$SDevCol{'DeviceID'}}{'-1'}{'B_RCPUUseRatio'}; } my $Detail = "Can not get info of $SDevCol{'DeviceID'}:$Error\n"; &Debug($Detail, 2); &WriteErrLog('alarmlog.txt', $dbh, 'RES3000', $GatherFileName, 'SNMP Error', $Detail, 'ResLogDir'); } else { $PerfRef->{$SDevCol{'DeviceID'}}{'-1'}{'B_SnmpStatus'} = 1; my $CPURatio = 0; for ( $k = 0; $k < @Index; $k ++ ) { #&Debug ("Result[$k]=$Result[$k].\n", 2); $CPURatio += $Result[0][$k]; } $CPURatio = sprintf("%.2f", $CPURatio); $PerfRef->{$SDevCol{'DeviceID'}}{'-1'}{'B_RCPUUseRatio'} = $CPURatio; &Debug ("CPURatio=$PerfRef->{$SDevCol{'DeviceID'}}{'-1'}{'B_RCPUUseRatio'}\n", 2); } } #get device status ,MEM use ratio if($SDevCol{'ColItems'}{'B_RMEMUseRatio'}==1 || $SDevCol{'ColItems'}{'ALL'}==1) { &Debug("get device status ,MEM use ratio\n", 2); my @Index = (); ($Error,@Result) = &SnmpGetTable($SNMPSess,$Mib,\@Index,@MemOids); if ( $Error ) { if ( defined $PrePerfRef->{$SDevCol{'DeviceID'}}{'-1'}{'B_RMEMUseRatio'} ) { $PerfRef->{$SDevCol{'DeviceID'}}{'-1'}{'B_RMEMUseRatio'} = $PrePerfRef->{$SDevCol{'DeviceID'}}{'-1'}{'B_RMEMUseRatio'}; } my $Detail="Can not get info of $SDevCol{'DeviceID'}:$Error\n"; &Debug($Detail,2); &WriteErrLog('alarmlog.txt',$dbh,'PER0405',$GatherFileName,'SNMP Error', $Detail, 'ResLogDir'); } else { #calculate the perfs my $MemUsed = 0; my $MemFree = 0; $PerfRef->{$SDevCol{'DeviceID'}}{'-1'}{'B_SnmpStatus'} = 1; for ( $j = 0; $j < @Index; $j ++ ) { $MemUsed += $Result[0][$j]; $MemFree += $Result[1][$j]; } my $MemRatio = ($MemUsed + $MemFree) != 0 ? $MemUsed * 100 / ($MemUsed + $MemFree) : 0; $MemRatio = sprintf("%.2f", $MemRatio); $PerfRef->{$SDevCol{'DeviceID'}}{'-1'}{'B_RMEMUseRatio'} = $MemRatio; &Debug ("PerfRef->{$SDevCol{'DeviceID'}}{'-1'}{'B_RMEMUseRatio'} = $MemRatio\n", 2); } } #get ext perf &Debug("get extended perf...\n",0); $Error = &GetExtPerf($dbh,$SDevCol{'DeviceID'},$SNMPSess,$Mib,$CurValueRef,$PreValueRef,$PerfRef,$PrePerfRef,$ExtItemCodesRef,$ExtOidsRef,$ParaOidRef,$ItemTypeRef,$GatherTypeRef); if ( $Error ) { my $Detail = "Can not get info of $SDevCol{'DeviceID'}:$Error\n"; &Debug($Detail,2); &WriteErrLog('alarmlog.txt',$dbh,'PER0405',"$0",'SNMP Error', $Detail, 'ResLogDir'); } if($SDevCol{'ColItems'}{$ConItemName}==1 || $SDevCol{'ColItems'}{'ALL'}==1) { &GetDeviceStatus($SDevCol{'DeviceID'},$PerfRef,$PrePerfRef,$DevTime,$ConItemName); } else { &GetDeviceStatus($SDevCol{'DeviceID'},$PerfRef,$PrePerfRef,$DevTime,''); } if ($SDevCol{'ColItems'}{'B_CardCPUUseRatio'}==1 || $SDevCol{'ColItems'}{'B_CardMEMUseRatio'}==1 || $SDevCol{'ColItems'}{'ALL'}==1){#通过snmp获得数据 &Debug("get card info with snmp\n", 0); my $ret = &GetCardInfoSnmp($SNMPSess,$Mib,$SDevCol{'DeviceID'},\%{$SDevCol{'ColItems'}},$PerfRef,$CurValueRef); if ($ret == -1){ #性能指标取前次值 &GetPreValue($PerfRef,$PrePerfRef,$SDevCol{'DeviceID'},\%SDevCol); } } if ($SNMPSess ne ''){ $SNMPSess->close(); } # $SNMPSess->close(); }#end of else snmpsess}&SaveGatherData($SetupDir,$GroupNo,$dbh,$DevTime,$CurValueRef,$PerfRef,$DevBPFile,$DevDataFile,$DevAlarmFile,$DevBakFile);$dbh->disconnect();&Debug("$GatherFileName succeeded!\n");exit(0);sub GetCardInfoSnmp(){ my ($sess,$mib,$DeviceID,$ColItems,$PerfRef,$CurValueRef) = @_;# print "$ColItems->{'B_CardCPUUseRatio'}\n"; my %PhysicalName;#板卡index与物理名称对应关系 if ($ColItems->{'B_CardCPUUseRatio'} == 1 || $ColItems->{'ALL'}==1){ &Debug("getting cpu info...\n",0); my @Index; my %cpu; my $cpmCPUTotalPhysicalIndex = '1.3.6.1.4.1.9.9.109.1.1.1.1.2'; my $cpmCPUTotal5minRev = '1.3.6.1.4.1.9.9.109.1.1.1.1.8'; my @CPUOids = ($cpmCPUTotalPhysicalIndex,$cpmCPUTotal5minRev); #获取cpu利用率 my ($Error,@Result) = &SnmpGetTable($sess,$mib,\@Index,@CPUOids); if ($Error){ my $Detail="Can not get cpu info of $DeviceID:$Error\n"; &Debug($Detail,2); &WriteErrLog('alarmlog.txt','','PER0405',"$0",'SNMP Error', $Detail, 'ResLogDir'); return -1; } else { for my $k (0..$#Index){ $cpu{$Result[0][$k]} = $Result[1][$k]; } } #通过index找出板卡的物理名称 my $entPhysicalName = '1.3.6.1.2.1.47.1.1.1.1.7'; my @NameOids = ($entPhysicalName); foreach my $NameIndex (keys %cpu){ if ($PhysicalName{$NameIndex} eq ''){ my ($Error,$Result) = &SnmpGet($sess,$mib,$NameIndex,@NameOids); if ($Error){ my $Detail="Can not get cpu info of $DeviceID:$Error\n"; &Debug($Detail,2); &WriteErrLog('alarmlog.txt','','PER0406',"$0",'SNMP Error', $Detail, 'ResLogDir'); return -1; } else { $PhysicalName{$NameIndex} = $Result;# print "PhysicalName{$NameIndex} = $Result\n"; } } $PerfRef->{$DeviceID}{$PhysicalName{$NameIndex}}{'B_CardCPUUseRatio'} = $cpu{$NameIndex}; } } if ($ColItems->{'B_CardMEMUseRatio'} == 1 || $ColItems->{'ALL'}==1){ &Debug("getting mem info...\n",0); my @Index; my (%memPerf,%memValue); my $cempMemPoolName = '1.3.6.1.4.1.9.9.221.1.1.1.1.3'; my $cempMemPoolValid = '1.3.6.1.4.1.9.9.221.1.1.1.1.6'; my $cempMemPoolUsed = '1.3.6.1.4.1.9.9.221.1.1.1.1.7'; my $cempMemPoolFree = '1.3.6.1.4.1.9.9.221.1.1.1.1.8'; my @MEMOids = ($cempMemPoolName,$cempMemPoolValid,$cempMemPoolUsed,$cempMemPoolFree); #获取mem利用率 my ($Error,@Result) = &SnmpGetTable($sess,$mib,\@Index,@MEMOids); if ($Error){ my $Detail="Can not get mem info of $DeviceID:$Error\n"; &Debug($Detail,2); &WriteErrLog('alarmlog.txt','','PER0407',"$0",'SNMP Error', $Detail, 'ResLogDir'); return -1; } else { for my $k (0..$#Index){# print "($Result[0][$k] =~ /Processor/i && $Result[1][$k] == 1)"; if ($Result[0][$k] =~ /Processor/i && $Result[1][$k] == 1){ my ($ind) = split /\./,$Index[$k]; $memValue{$ind}{'CardMemUsed'} = $Result[2][$k]; $memValue{$ind}{'CardMemFree'} = $Result[3][$k]; $memValue{$ind}{'CardMemTotal'} = $Result[2][$k] + $Result[3][$k]; $memPerf{$ind} = ($Result[2][$k] + $Result[3][$k] == 0) ? 0 : int($Result[2][$k] * 10000 / ($Result[2][$k] + $Result[3][$k])) / 100; } } } #通过index找出板卡的物理名称 my $entPhysicalName = '1.3.6.1.2.1.47.1.1.1.1.7'; my @NameOids = ($entPhysicalName); foreach my $NameIndex (keys %memPerf){ if ($PhysicalName{$NameIndex} eq ''){ my ($Error,$Result) = &SnmpGet($sess,$mib,$NameIndex,@NameOids); if ($Error){ my $Detail="Can not get mem info of $DeviceID:$Error\n"; &Debug($Detail,2); &WriteErrLog('alarmlog.txt','','PER0406',"$0",'SNMP Error', $Detail, 'ResLogDir'); return -1; } else { $PhysicalName{$NameIndex} = $Result; } } $PerfRef->{$DeviceID}{$PhysicalName{$NameIndex}}{'B_CardMEMUseRatio'} = $memPerf{$NameIndex}; $CurValueRef->{$DeviceID}{$PhysicalName{$NameIndex}}{'RMemUsed'} = $memValue{$NameIndex}{'CardMemUsed'}; $CurValueRef->{$DeviceID}{$PhysicalName{$NameIndex}}{'RMemFree'} = $memValue{$NameIndex}{'CardMemFree'}; $CurValueRef->{$DeviceID}{$PhysicalName{$NameIndex}}{'RMemTotal'} = $memValue{$NameIndex}{'CardMemTotal'}; } } return 0;}#################################################################### 获取前一次卡信息#sub GetPreValue(){ my ($PerfRef,$PrePerfRef,$DevID,$DevColRef)=@_; #性能指标取前次值 foreach my $outer (keys %{$PrePerfRef->{$DevID}}){ if (defined $PrePerfRef->{$DevID}{$outer}{'B_CardCPUUseRatio'} && ($DevColRef->{'ColItems'}{'B_CardCPUUseRatio'}==1 || $DevColRef->{'ColItems'}{'ALL'}==1)){ $PerfRef->{$DevID}{$outer}{'B_CardCPUUseRatio'} = $PrePerfRef->{$DevID}{$outer}{'B_CardCPUUseRatio'}; } if (defined $PrePerfRef->{$DevID}{$outer}{'B_CardMEMUseRatio'} && ($DevColRef->{'ColItems'}{'B_CardMEMUseRatio'}==1 || $DevColRef->{'ColItems'}{'ALL'}==1)){ $PerfRef->{$DevID}{$outer}{'B_CardMEMUseRatio'} = $PrePerfRef->{$DevID}{$outer}{'B_CardMEMUseRatio'}; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -