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.468 ]
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
Criar um Servidor TeamSpeak no Ubuntu Server
Passos essenciais para configurar sua impressora no Linux
Gerencie suas informações através de instruções SQL com selects turbinados (para leigos e experts)
Diferentes áreas de trabalho com diferentes wallpapers
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
Módulos CPAN no Debian e distros GNU/Linux em geral
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
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
Criando uma VPC na AWS via CLI
Multifuncional HP imprime mas não digitaliza
Dica básica para escrever um Artigo.
Como Exibir Imagens Aleatórias no Neofetch para Personalizar seu Terminal
Pq me aparece isso quando fui atualizar o Ubuntu 24.10 no terminal? (1)
como coloco para instalar com esse erro. (13)
Alguém sabe de documentos de texto e /ou vídeo aulas de certificações ... (1)