Ao tentar diagnosticar problemas na rede, uma das perguntas que sempre faço é "Qual é o status da porta do switch que está conectada à interface do módulo"? A resposta típica é "Eu preciso perguntar ao pessoal da rede". Agora usando a magia do Protocolo de Gerenciamento de Rede Simples (SNMP) e a macro de comando anexada, pode não ser necessário perguntar.
Todos os switches gerenciáveis (e isto inclui roteadores que também atuam como switches) respondem às solicitações SNMP. O protocolo SNMP é protegido por uma senha, conhecida como a cadeia de caracteres comunitária. Normalmente, há uma senha para leitura e outra para escrita. Eu posso certamente entender que as pessoas de sua rede não queiram lhe dar a seqüência de caracteres da comunidade de escrita, mas se você pedir gentilmente, elas podem lhe dar a seqüência de caracteres de leitura. Afinal, não deve haver mal nenhum na leitura e se você mesmo puder fazer isso, não precisa incomodá-los. Entretanto, antes de pedir, talvez você queira tentar a corda padrão, que é "pública". Se funcionar, não é preciso nem mesmo perguntar.
Os dados SNMP são organizados por MIBs (Management Information Base). A tabela "Interfaces" está na MIB-II MIB que é suportada por, ouso dizer, todos os dispositivos que suportam SNMP. A tabela inclui erros, bytes e contadores de pacotes. Não é muita informação, mas é suficiente para determinar a saúde básica da conexão entre a interface do seu módulo e a rede. As interfaces MIB estão documentadas no RFC-1213 "Management Information Base for Network Management of TCP/IP-based internets": MIB-II" Você pode encontrar uma cópia em http://www.ietf.org/rfc/rfc1213.txt.
A macro lhe dá três maneiras de identificar a porta individual no switch para consulta. A primeira é pelo nome da interface. Usando o nome ele usa o comando netstat para determinar o endereço MAC da interface e consulta a tabela de encaminhamento do switch para determinar qual porta está associada com o 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 formulário XX-XX-XX-XX-XX-XX-XX. Esta é uma maneira de ver a conexão do switch do adaptador de espera.
get_switch_interface_stats 172.16.1.222 00-00-a8-44-52-22 -type mac
Finalmente, você pode apenas fornecer o índice do porto. Dependendo do interruptor, este pode ser o número real da porta ou algo baseado no número da porta. 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
No exemplo a seguir, você notará que os carimbos de tempo entre a primeira e a segunda passagens estão com pouco mais de 60 segundos de intervalo. Isto porque o carimbo da hora é impresso antes das consultas serem feitas e as consultas levam tempo.
Por que existem dois passes? Os balcões normalmente não são limpos, então um único valor não lhe dá nenhuma idéia de quão rápido os balcões estão mudando. A macro exibe tanto o primeiro como 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 circunstâncias ideais, nunca há erros ou descartes, portanto, se esses contadores não forem zero, a causa deve ser investigada. A contagem dos pacotes lhe dá uma idéia do volume. Se houver um volume anormalmente baixo de pacotes de saída (pacotes que vão do switch para a interface) você sabe que pode haver um problema com a conexão do switch com o resto da rede. Uma contagem invulgarmente alta de pacotes de saída nãounicast pode indicar que algum host na rede está inundando a rede com transmissões ou multicasts. Se a contagem de pacotes de entrada for baixa, é necessário perguntar por que a(s) aplicação(ões) no módulo não está(ão) transmitindo na taxa esperada. A chave 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 operacional. Se o status operacional for mostrado abaixo, você sabe que há um problema com a conexão entre o switch e a interface. Se o status administrativo for mostrado abaixo, você sabe que alguém desativou sua conexão de rede.
Se o link estiver em baixo, como você pode consultar a porta de interruptor para saber que o link está em baixo? Você pode consultar o switch usando o endereço MAC ou o índice de porta de outro módulo. Entretanto, se o link estiver em baixo há algum tempo, é possível que o endereço MAC tenha sido purgado da tabela de encaminhamento do switch. Se este for o caso, você precisará usar a forma de índice de porta do comando.
Os comandos SNMP são encontrados no >system>maint_library. Eles são uma porta dos comandos NET-SNMP e a documentação pode ser encontrada em http://www.net-snmp.org/. Note que não é necessário estar executando o servidor SNMP (snmpd) no módulo para executar estes comandos contra o 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 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 |