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.765 ]
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
Como imprimir diretamente na porta de impressão
Diferentes áreas de trabalho com diferentes wallpapers
Sudoers 1.8.12 - Parte II - Manual
Top 10 melhores jogos FPS para Linux
Capturando seu desktop com uma aplicação feita em kylix
Enviando notificações do Nagios para o MSN
Manipulação de sockets em Perl usando o IO::Socket::INET
Instalação de MRTG em ambiente Windows
Trabalhando com arquivos no Perl
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
Instalar e Configurar o Slackware Linux em 2025
Como configurar os repositórios do apt no Debian 12 em 2025
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Configurando o Conky para iniciar corretamente no sistema
3 configurações básicas que podem melhorar muito a sua edição pelo editor nano
Como colorir os logs do terminal com ccze
Instalação Microsoft Edge no Linux Mint 22
Como configurar posicionamento e movimento de janelas no Lubuntu (Openbox) com atalhos de teclado
Criar perfil temporário no Active Directory samba4-21 (2)
Meu Kubuntu não inicia, além do modo de recuperação (no meu dualboot (1)
Site da gontijo simplesmente não abre, ERR_HTTP2_PRO... (3)