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: 51.457 ]
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
LogBook: Documentação de implementação e manutenção
Instalando o antivírus BitDefender no Linux
FwLogWatch - Analisando Registros do IPtables
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
Introdução a CGI com a RFC 3875
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Instalação dualboot Windows 11 e Debian 13 (12)
Ubunto não reconhece rede ethernet (0)









