Gerenciando redes com Perl e SNMP
Muitas empresas utilizam softwares de código aberto nas mais diversas atividades. Em minha carreira deparei-me com sistemas de gerência de rede que não atendiam as necessidades do cliente. Minha intenção aqui é demonstrar de forma prática como o SNMP funciona, como entender as MIBs e principalmente, como usar o Perl para melhorar os sistemas de gerência, ou mesmo, criar o seu próprio.
[ Hits: 50.051 ]
Por: Perfil removido em 23/03/2010
1 package SNMPRouter; 2 use strict; 3 use warnings; 4 use Net::SNMP; 5 use Carp qw/croak/;
6 sub new{ 7 8 9 my ($class, $ip, $community) = @_; 10 11 my $self = { 12 IP=>$ip, # Armazena o IP/nome do elemento 13 Session => undef, # Armazena o Objeto SNMP gerado por connect 14 Community => $community, # Armazena a community de segurança 15 SysName => undef, # 16 SysDescription => undef, # 17 NumberOfInterfaces => undef, # Armazena o número de Interfaces 18 InterfaceIndexNames => {}, # Relaciona o número da interface com o nome 19 InterfaceIPAddress => {}, # Relaciona o número da interface com o IP 20 InterfaceAlias => {}, # Relaciona o número da interface com o Alias 21 InterfaceAdminStatus => {}, # 22 InterfaceOperStatus => {}, # 23 24 }; 25 26 bless $self, $class 27 }
28 sub connect{ 29 my $self = shift; 30 $self->{Session} = Net::SNMP->session(Hostname => $self->{IP}, 31 Community => $self->{Community}, 32 ) or croak "Unable to create SNMP Session\n"; 33 }
34 sub query_system_info{ 35 my $self = shift; 36 my $mib2System = '1.3.6.1.2.1.1'; 37 38 my %mibSystemTable = ( 39 Mib2SysName => $mib2System . '.5', 40 Mib2SysDescription => $mib2System . '.1', 41 ); 42 43 my @queryList = values %mibSystemTable; 44 45 my $result = $self->{Session}->get_next_request(Varbindlist => \@queryList); 46 croak "Erro ao tentar receber informações da MIB System\n" unless 47 defined $result; 48 49 foreach my $key(keys %$result){ 50 $self->{SysName} = $result->{$key} if 51 $key =~ /^$mibSystemTable{Mib2SysName}/; 52 $self->{SysDescription} = $result->{$key} if 53 $key =~ /^$mibSystemTable{Mib2SysDescription}/; 54 } 55 }
56 sub create_int_table{ 57 my $self = shift; 58 my $mib2ifNumber = '1.3.6.1.2.1.2.1'; 59 my $mib2ifIndex = '1.3.6.1.2.1.2.2.1.1'; 60 my $mib2ifXMIB = '1.3.6.1.2.1.31.1.1.1'; 61 my $mib2ifName = $mib2ifXMIB . '.1'; 62 63 my $ifNumber = $self->{Session}->get_next_request( 64 Varbindlist => [$mib2ifNumber]); 65 66 $ifNumber = $ifNumber->{"$mib2ifNumber.0"}; 67 68 for(my $i = 1;$i <= $ifNumber; $i++){ 69 my $ifIndex = $self->{Session}->get_request( 70 Varbindlist => ["$mib2ifIndex.$i"]); 71 72 if($ifIndex){ 73 my $ifName = $self->{Session}->get_request( 74 Varbindlist => ["$mib2ifName.$i"]); 75 76 $ifName = $ifName->{"$mib2ifName.$i"}; 77 $self->{InterfaceIndexNames}->{$i} = $ifName; 78 }else{$ifNumber++} 79 } 80 }
81 sub query_int_status{ 82 my $self = shift; 83 84 croak "Tabela de Interfaces não foi criada para este Objeto" 85 unless $self->{InterfaceIndexNames}; 86 87 my $mib2IfAdminStatus = '1.3.6.1.2.1.2.2.1.7'; 88 my $mib2IfOperStatus = '1.3.6.1.2.1.2.2.1.8'; 89 my $mib2ifAlias = '1.3.6.1.2.1.31.1.1.1.18'; 90 my %statusTable = ( 91 1=>'up', 92 2=>'down', 93 3=>'testing', 94 4=>'unknow', 95 5=>'dormant', 96 6=>'notPresent', 97 8=>'lowerLayerDown', 98 ); 99 100 foreach my $key (keys %{$self->{InterfaceIndexNames}}){ 101 my $status = $self->{Session}->get_request( 102 Varbindlist => ["$mib2IfOperStatus.$key", 103 "$mib2IfAdminStatus.$key", 104 "$mib2ifAlias.$key" 105 ]); 106 $self->{InterfaceOperStatus}->{$key} = 107 $statusTable{$status->{"$mib2IfOperStatus.$key"}}; 108 $self->{InterfaceAdminStatus}->{$key} = 109 $statusTable{$status->{"$mib2IfAdminStatus.$key"}}; 110 $self->{InterfaceAlias}->{$key} = $status->{"$mib2ifAlias.$key"}; 111 } 112 }
113 sub query_int_ip{ 114 my $self = shift; 115 my $mib2IpAddrTable = '1.3.6.1.2.1.4.20'; 116 my $mib2IpAddrxIntIndex = '1.3.6.1.2.1.4.20.1.2'; 117 my $hshIpTable = $self->{Session}->get_table(Baseoid=>$mib2IpAddrTable) 118 or croak "Erro ao tentar acessar a mib IpAddrTable"; 119 120 foreach my $key (keys %{$hshIpTable}){ 121 if ($key =~ $mib2IpAddrxIntIndex){ 122 $key =~ s/$mib2IpAddrxIntIndex\.//; 123 my $intIndex = $hshIpTable->{$mib2IpAddrxIntIndex . "." . $key}; 124 $self->{InterfaceIPAddress}->{$intIndex} = $key; 125 126 } 127 } 128 }
1 use strict; 2 use warnings; 3 use lib qw/./; 4 5 use SNMPRouter; 6 7 print "Digite o HOSTNAME ou IP do ROTEADOR: "; 8 chomp(my $host = <STDIN>); 9 my $community = 'public'; #Altere este valor para a sua community ou solicite ao 10 #usuário para informar. 11 my $router = SNMPRouter->new($host,$community); 12 $router->connect(); 13 $router->query_system_info(); 14 15 print "Informações do elemento:\n","#"x80,"\n", 16 $router->{SysDescription},"\n",'#'x80,"\n\n\n"; 17 18 print "\tElemento ",$router->{SysName},"\tIP: ",$router->{IP}, "\n"; 19 print "#"x80,"\n\n"; 20 21 $router->create_int_table(); 22 $router->query_int_status; 23 $router->query_int_ip(); 24 25 foreach (sort{$a<=>$b} keys %{$router->{InterfaceIndexNames}}){ 26 print "$router->{InterfaceIndexNames}->{$_}\t", 27 "$router->{InterfaceOperStatus}->{$_}\t", 28 "$router->{InterfaceAdminStatus}->{$_}\t", 29 ($router->{InterfaceIPAddress}->{$_}||"\t"), 30 "\t",($router->{InterfaceAlias}->{$_}||"\t"), 31 "\n"; 32 }; 33 print '#'x80,"\n\nPressione ENTER para sair\n"; 34 <STDIN>
Digite o HOSTNAME ou IP do ROTEADOR: 10.10.10.1 Informações do elemento: ############################################################ Cisco Internetwork Operating System Software IOS (tm) C2600 Software (C2600-JS-M), Version 12.2(13)T4, RELEASE SOFTWARE (fc2) TAC Support: http://www.cisco.com/tac Copyright (c) 1986-2003 by cisco Systems, Inc. Compiled Thu 01-May-03 03:53 by eaarma ############################################################ Elemento RT01FRODO IP: 10.10.10.1 ############################################################ Fa0/0 up up 10.10.11.254 REDE LOCAL Se0/0 down down RESERVADA Fa0/1 up up 10.10.12.254 REDE LOCAL Se0/1 up up 10.10.13.254 REDE EXTERNA Nu0 up up Lo100 up up 10.10.14.100 INTERFACE ADMINISTRATIVA VoiceOverIpPeer108 up up *** Para ligacoes externas *** VoiceOverIpPeer100 up up *** Para ligacoes DDD *** VoiceEncapPeer6085 up up *** RAMAL do JOAO *** VoiceEncapPeer6086 up up *** RAMAL da ANA *** VoiceEncapPeer6087 up up *** RAMAL do CARLOS *** VoiceEncapPeer6084 up up Vi1 up up Foreign Exchange Station 1/0/0 dormant up Foreign Exchange Station 1/0/1 dormant up Foreign Exchange Station 1/0/2 dormant up ############################################################ Pressione ENTER para sairSe você tiver familiaridade com roteadores CISCO, perceberá que a saída é semelhante a do comando "show interface description". Apesar de otimizado para obter informações de roteadores, como eu disse, o Perl e o SNMP não são preconceituosos. Vamos agora mostrar o que acontece se eu tentar obter informações de um switch de uma concorrente da CISCO, Enterasys:
Digite o HOSTNAME ou IP do ROTEADOR: 10.10.11.1 Informações do elemento: ################################################ Enterasys Networks, Inc. A2H124-24 Rev 02.01.07.0003 ################################################ Elemento SW01SkyWalker IP: 10.10.11.1 ################################################ fe.1.1 up up fe.1.2 down up fe.1.3 down up fe.1.4 down up fe.1.5 down up fe.1.6 down up fe.1.7 down up fe.1.8 down up fe.1.9 down up fe.1.10 down up fe.1.11 down up fe.1.12 up up fe.1.13 up up fe.1.14 down up fe.1.15 up up fe.1.16 down up fe.1.17 up up fe.1.18 down up fe.1.19 up up fe.1.20 down up fe.1.21 up up fe.1.22 up up fe.1.23 up up fe.1.24 down up ge.1.25 up up ge.1.26 up up ge.1.27 down up ge.1.28 down up host up up 10.10.11.1 lag.0.1 down up lag.0.2 down up lag.0.3 down up lag.0.4 down up lag.0.5 down up lag.0.6 down up ################################################ Pressione ENTER para sair
Gerência e criação de módulos do kernel
Pesquisa com slocate, locate e updatedb
Xadrez no Linux - Os melhores programas para jogar e estudar
Básico sobre tratamento de exceções em Python 3.4
Manipulação de sockets em Perl usando o IO::Socket::INET
Instalação de MRTG em ambiente Windows
Enviando notificações do Nagios para o MSN
Script Perl para consultas em base LDAP e/ou Active Directory
Atualizar o macOS no Mac - Opencore Legacy Patcher
Crie alias para as tarefas que possuam longas linhas de comando - bash e zsh
Criando um gateway de internet com o Debian
Configuração básica do Conky para mostrar informações sobre a sua máquina no Desktop
Aprenda a criar músicas com Inteligência Artificial usando Suno AI
Instalando e usando o Dconf Editor, o "regedit" para Linux
Como instalar o navegador TOR no seu Linux
Instalando Zoom Client no Ubuntu 24.04 LTS
É tão difícil assim nos ajudar a te ajudar? (8)
HD SSD inacessível: scsi error badly formed scsi parameters (6)
O jogo Minecraft crasha antes mesmo de iniciar, porem o erro só ocorre... (3)