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.461 ]
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
Relato I Fórum da Revista Espírito Livre
Instalação e configuração do fluxbox-devel
Bodhi Linux com o belíssimo Enlightnment
Atualizando o kernel do Slackware de forma segura, sem o famoso "kernel panic"
Enviando notificações do Nagios para o MSN
Instalação de MRTG em ambiente Windows
Manipulação de sockets em Perl usando o IO::Socket::INET
Módulos CPAN no Debian e distros GNU/Linux em geral
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
É cada coisa que me aparece! - não é só 3% (3)
Melhorando a precisão de valores flutuantes em python[AJUDA] (5)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta