Ir para o conteúdo principal
Ao tentar diagnosticar problemas de rede, uma das perguntas que sempre faço é: “Qual é o status da porta do switch conectada à interface do módulo?” A resposta típica é: “Preciso perguntar ao pessoal de rede”. Agora, usando a magia do Protocolo Simples de Gerenciamento de Rede (SNMP) e a macro de comando anexada, talvez não seja mais necessário perguntar.

 

Todos os switches gerenciáveis (incluindo roteadores que também funcionam como switches) respondem a solicitações SNMP. O protocolo SNMP é protegido por uma senha, conhecida como string de comunidade. Normalmente, há uma senha para leitura e outra para gravação. Eu certamente entendo que o pessoal da rede não queira lhe fornecer a string de comunidade de gravação, mas se você pedir com educação, eles podem lhe dar a string de leitura. Afinal, não há mal nenhum em ler e, se você puder fazer isso sozinho, não precisará incomodá-los. No entanto, antes de perguntar, talvez seja melhor tentar a string padrão, que é “public”. Se funcionar, nem precisará perguntar.

 

Os dados SNMP são organizados por MIBs (Management Information Base). A tabela “Interfaces” está na MIB-II, que é compatível com, ouso dizer, todos os dispositivos que suportam SNMP. A tabela inclui contadores de erros, bytes e pacotes. Não são muitas informações, mas são suficientes para determinar o estado básico da conexão entre a interface do seu módulo e a rede. A MIB de interfaces está documentada na RFC-1213 “Base de Informações de Gerenciamento para Gerenciamento de Rede de redes baseadas em TCP/IP: MIB-II”. Você pode encontrar uma cópia em http://www.ietf.org/rfc/rfc1213.txt.

 

A macro oferece três maneiras de identificar a porta específica do switch a ser consultada. A primeira é pelo nome da interface. A partir desse nome, ela utiliza o comando netstat para determinar o endereço MAC da interface e consulta a tabela de encaminhamento do switch para identificar qual porta está associada a esse endereço MAC.

 

get_switch_interface_stats 172.16.1.222 #sdlmux.m16.11-3
O endereço IP que precede o nome é o endereço IP do switch.
Você também pode fornecer o endereço MAC no formato XX-XX-XX-XX-XX-XX. Essa é uma maneira de verificar a conexão do adaptador em espera com o switch.

 

get_switch_interface_stats 172.16.1.222 00-00-a8-44-52-22 -type mac
Por fim, basta indicar o índice da porta. Dependendo do switch, esse valor pode ser o número real da porta ou algo baseado nesse número. No exemplo a seguir, o número da porta é 48, mas o índice é 1048.

 

get_switch_interface_stats.cm 172.16.1.222 1048 -type port
Na saída do exemplo a seguir, você notará que há um intervalo de pouco mais de 60 segundos entre os carimbos de data/hora da primeira e da segunda passagem. Isso ocorre porque o carimbo de data/hora é exibido antes das consultas serem realizadas, e essas consultas levam algum tempo.

 

Por que há duas passagens? Normalmente, os contadores não são zerados, então um único valor não dá nenhuma ideia da velocidade com que eles estão mudando. A macro exibe tanto o primeiro quanto o segundo valor e faz a subtração para você.

get_switch_interface_stats.cm 172.16.1.222 1048 -type port
172.16.1.222 1048 -type port public -sleep 60

Collecting results pass 1 10-01-20.11:32:21
sleeping for 60 seconds
Collecting results pass 2 10-01-20.11:33:23


Port Index :                1048
Port name :                 "X350-48t Port 48"
Speed :                     1000
Administrative Status :     up(1) up(1)
Operation Status :          up(1) up(1)
In Octets :                 205663121 - 205568072 = 95049
In Unicast Packets :        1336981429 - 1336981157 = 272
In non-Unicast Packets :    330419202 - 330418397 = 805
In Discards :               0 - 0 = 0
In Errors :                 0 - 0 = 0
In Unknown Protocols :      0 - 0 = 0
Out Octets :                290040991 - 290003159 = 37832
Out Unicast Packets :       1570859994 - 1570859741 = 253
Out non-Unicast Packets :   4386374 - 4386362 = 12
Out Discards :              0 - 0 = 0
Out Errors :                0 - 0 = 0
Out Q Length :              0 - 0 = 0

 

Em condições ideais, nunca ocorrem erros ou descartes; portanto, se esses contadores apresentarem valores diferentes de zero, a causa deve ser investigada. As contagens de pacotes dão uma ideia do volume. Se houver um volume excepcionalmente baixo de pacotes de saída (pacotes que vão do switch para a interface), você saberá que pode haver um problema com a conexão do switch ao restante da rede. Uma contagem de pacotes de saída não unicast excepcionalmente alta pode indicar que algum host na rede está sobrecarregando a rede com transmissões de difusão ou multicast. Se a contagem de pacotes de entrada for baixa, você deve questionar por que o(s) aplicativo(s) no módulo não estão transmitindo na taxa esperada. O segredo aqui é saber o que é incomum, e isso requer a criação de uma linha de base.

 

Os únicos valores inequívocos são o status administrativo e o status operacional. Se o status operacional indicar “inativo”, você sabe que há um problema na conexão entre o switch e a interface. Se o status administrativo indicar “inativo”, você sabe que alguém desativou sua conexão de rede.

 

Se o link estiver inativo, como você pode consultar a porta do switch para saber que o link está inativo? Você pode consultar o switch usando o endereço MAC ou o índice da porta de outro módulo. No entanto, se o link estiver inativo há algum tempo, é possível que o endereço MAC tenha sido removido da tabela de encaminhamento do switch. Se for esse o caso, você precisará usar a forma do comando com o índice da porta.

 

Os comandos SNMP estão localizados na biblioteca >system>maint_library. Trata-se de uma adaptação dos comandos NET-SNMP, e a documentação pode ser encontrada em http://www.net-snmp.org/. Observe que não é necessário ter o servidor SNMP (snmpd) em execução no módulo para executar esses comandos no switch.

 

& get_switch_interface_stats.cm begins here
&
& get_switch_interface_stats.cm
& version 1.0 10-01-20
&
&
&begin_parameters
SWITCH switch:string,req
ID id:string,req
TYPE option(-type),name,allow(int,mac,port),=int
COMMUNITY community:string=public
SLEEP option(-sleep),number,=60
&end_parameters
&
&
&if (process_type) = 'batch' &then &do
set_ready -format off
&echo no_command_lines no_macro_lines no_input_lines
&end
&
&
& display input arguments
display_line &SWITCH& &ID& -type &TYPE& &COMMUNITY& -sleep &SLEEP&
&
&
&set_string INTERFACE_NAME ''
&set_string MAC_ADDR ''
&set_string IDX ''
&if &TYPE& = int &then &set_string INTERFACE_NAME &ID&
&if &TYPE& = mac &then &set_string MAC_ADDR &ID&
&if &TYPE& = port &then &set_string IDX &ID&
&
&
&set_string TEST (process_dir)>test
&set_string INTERFACE (process_dir)>interface
&set_string MAC (process_dir)>mac
&set_string INDEX (process_dir)>index
&set_string R1 (process_dir)>r1
&set_string R2 (process_dir)>r2
&
&
& make sure we can get a response from the switch
attach_default_output &TEST&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::sysName.0
detach_default_output
&if (file_info &TEST& blocks_used) = 0 &then &goto NOSWITCH
&
&if (length &IDX&) = 0 &then &do
&if (length &INTERFACE_NAME&) > 0 &then &do
attach_default_output &INTERFACE&
netstat -interface &INTERFACE_NAME&
detach_default_output
&if (file_info &INTERFACE& blocks_used) = 0 &then &goto NOINTERFACE
display &INTERFACE& -match 'MAC Address' -no_header -output_path &MAC&
&set_string MAC_ADDR (substr (contents &MAC& 1) 14)
&end
&if (length &MAC_ADDR&) < 17 &then &goto BADMAC
&set_string OCT1 (decimal (substr &MAC_ADDR& 1 2)x)
&set_string OCT2 (decimal (substr &MAC_ADDR& 4 2)x)
&set_string OCT3 (decimal (substr &MAC_ADDR& 7 2)x)
&set_string OCT4 (decimal (substr &MAC_ADDR& 10 2)x)
&set_string OCT5 (decimal (substr &MAC_ADDR& 13 2)x)
&set_string OCT6 (decimal (substr &MAC_ADDR& 16 2)x)
&
&
& query the forwarding table using the MAC adress to get the switch
& port number. The forwarding table is in the BRIDGE-MIB and is the
& dot1dTpFdbPort
attach_default_output &INDEX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& &+
.1.3.6.1.2.1.17.4.3.1.2.&OCT1&.&OCT2&.&OCT3&.&OCT4&.&OCT5&.&OCT6&
detach_default_output
&set_string TEMP (reverse (contents &INDEX& 1))
&set_string IDX (index (string &TEMP&) ' ')
&set_string IDX (reverse (substr (string &TEMP&) 1 (calc &IDX& - 1)))
& if after all that manipulation IDX is "OID" it means that the
& forwarding table did not contain the MAC address
&if &IDX& = OID &then &goto NOTFOUND
&
& dump the entire interface index table and use the port number from above
& to index into the table to get the port index
attach_default_output &INDEX&
snmpwalk -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifIndex
detach_default_output
&set_string IDX (substr (contents &INDEX& &IDX&) 22)
&set_string IDX (substr (string &IDX&) 1 &+
(calc (index (string &IDX&) ' ') - 1))
&end
&
&
display_line
display_line Collecting results pass 1 (date).(time)
&
&
attach_default_output &R1&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifDescr.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifSpeed.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifAdminStatus.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifOperStatus.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifLastChange.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifInOctets.&IDX&
<snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifInUcastPkts.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifInNUcastPkts.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifInDiscards.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifInErrors.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifInUnknownProtos.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifOutOctets.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifOutUcastPkts.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifOutNUcastPkts.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifOutDiscards.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifOutErrors.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifOutQLen.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifSpecific.&IDX&
<detach_default_output
&
&
& if the last 3 characters of the first line are OID it means that the
& switch does not suppor the query - probably the index is index is wrong.
&if (substr (reverse (contents &R1& 1)) 1 3) = DIO &then &goto NOIDX
&
&
display_line sleeping for &SLEEP& seconds
sleep -seconds &SLEEP&
&
&
display_line Collecting results pass 2 (date).(time)
attach_default_output &R2&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifDescr.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifSpeed.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifAdminStatus.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifOperStatus.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifLastChange.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifInOctets.&IDX&
<snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifInUcastPkts.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifInNUcastPkts.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifInDiscards.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifInErrors.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifInUnknownProtos.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifOutOctets.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifOutUcastPkts.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifOutNUcastPkts.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifOutDiscards.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifOutErrors.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifOutQLen.&IDX&
snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::ifSpecific.&IDX&
detach_default_output
&
&
display_line
display_line
display_line Port Index : '              ' &IDX&

&set LIDX (length &IDX&)

&set START (calc 33 + &LIDX&)
display_line Port name : '               ' (substr (contents &R1& 1) &START&)

&set START (calc 34 + &LIDX&)
display_line Speed : '                   ' &+
(calc (substr (contents &R1& 2) &START&) / 1000000)

&set START (calc 40 + &LIDX&)
display_line Administrative Status : '   ' &+
(substr (contents &R2& 3) &START&) (substr (contents &R1& 3) &START&)

&set START (calc 39 + &LIDX&)
display_line Operation Status : '        ' &+
(substr (contents &R2& 4) &START&) (substr (contents &R1& 4) &START&)

&set START (calc 39 + &LIDX&)
&set V1 (substr (contents &R1& 6) &START&)
&set V2 (substr (contents &R2& 6) &START&)
display_line In Octets : '               ' &V2& - &V1& = (calc &V2& - &V1&)

&set START (calc 42 + &LIDX&)
&set V1 (substr (contents &R1& 7) &START&)
&set V2 (substr (contents &R2& 7) &START&)
display_line In Unicast Packets : '       '&V2& - &V1& = (calc &V2& - &V1&)

&set START (calc 43 + &LIDX&)
&set V1 (substr (contents &R1& 8) &START&)
&set V2 (substr (contents &R2& 8) &START&)
display_line In non-Unicast Packets : '  ' &V2& - &V1& = (calc &V2& - &V1&)

&set START (calc 41 + &LIDX&)
&set V1 (substr (contents &R1& 9) &START&)
&set V2 (substr (contents &R2& 9) &START&)
display_line In Discards : '             ' &V2& - &V1& = (calc &V2& - &V1&)

&set START (calc 39 + &LIDX&)
&set V1 (substr (contents &R1& 10) &START&)
&set V2 (substr (contents &R2& 10) &START&)
display_line In Errors : '               ' &V2& - &V1& = (calc &V2& - &V1&)

&set START (calc 46 + &LIDX&)
< &set V1 (substr (contents &R1& 11) &START&)
&set V2 (substr (contents &R2& 11) &START&)
display_line In Unknown Protocols : '    ' &V2& - &V1& = (calc &V2& - &V1&)

&set START (calc 40 + &LIDX&)
&set V1 (substr (contents &R1& 12) &START&)
&set V2 (substr (contents &R2& 12) &START&)
display_line Out Octets : '              ' &V2& - &V1& = (calc &V2& - &V1&)

&set START (calc 43 + &LIDX&)
&set V1 (substr (contents &R1& 13) &START&)
&set V2 (substr (contents &R2& 13) &START&)
display_line Out Unicast Packets : '     ' &V2& - &V1& = (calc &V2& - &V1&)

&set START (calc 44 + &LIDX&)
&set V1 (substr (contents &R1& 14) &START&)
&set V2 (substr (contents &R2& 14) &START&)
display_line Out non-Unicast Packets : ' ' &V2& - &V1& = (calc &V2& - &V1&)

&set START (calc 42 + &LIDX&)
&set V1 (substr (contents &R1& 15) &START&)
&set V2 (substr (contents &R2& 15) &START&)
display_line Out Discards : '            ' &V2& - &V1& = (calc &V2& - &V1&)

&set START (calc 40 + &LIDX&)
&set V1 (substr (contents &R1& 16) &START&)
&set V2 (substr (contents &R2& 16) &START&)
display_line Out Errors : '              ' &V2& - &V1& = (calc &V2& - &V1&)

&set START (calc 36 + &LIDX&)
&set V1 (substr (contents &R1& 17) &START&)
&set V2 (substr (contents &R2& 17) &START&)
display_line Out Q Length : '            ' &V2& - &V1& = (calc &V2& - &V1&)
&return
&
&label NOSWITCH
display_line
display_line
<span style="font-family: Courier New,monospace;"display_line &SWITCH& is not responding to SNMP queries using &+
the community string &COMMUNITY&
&return
&
&
&label NOINTERFACE
display_line
display_line
display_line &INTERFACE_NAME& is not an STCP interface on this module
&return
&
&
&label BADMAC
display_line
display_line
display_line MAC address &MAC_ADDR& is not in the format of XX:XX:XX:XX:XX:XX
display_line each octet must be 2 characters
&return
&
&
&label NOTFOUND
display_line
display_line
&if (length &INTERFACE_NAME&) > 0 &then &do
display_line MAC address &MAC_ADDR& for interface &INTERFACE_NAME&
display_line not found in switch &SWITCH&
&end
&else &do
display_line MAC address &MAC_ADDR& not found in switch &SWITCH&
&end
&return
&
&
&label NOIDX
display_line
display_line
display_line No data found for switch port &IDX& in switch &SWITCH&
&
&
& get_switch_interface_stats.cm ends here

 

© 2024 Stratus Technologies.