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-3O 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 macFinalmente, 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 60Collecting results pass 1 10-01-20.11:32:21sleeping for 60 secondsCollecting results pass 2 10-01-20.11:33:23Port Index : 1048Port name : "X350-48t Port 48"Speed : 1000Administrative Status : up(1) up(1)Operation Status : up(1) up(1)In Octets : 205663121 - 205568072 = 95049In Unicast Packets : 1336981429 - 1336981157 = 272In non-Unicast Packets : 330419202 - 330418397 = 805In Discards : 0 - 0 = 0In Errors : 0 - 0 = 0In Unknown Protocols : 0 - 0 = 0Out Octets : 290040991 - 290003159 = 37832Out Unicast Packets : 1570859994 - 1570859741 = 253Out non-Unicast Packets : 4386374 - 4386362 = 12Out Discards : 0 - 0 = 0Out Errors : 0 - 0 = 0Out 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_parametersSWITCH switch:string,reqID id:string,reqTYPE option(-type),name,allow(int,mac,port),=intCOMMUNITY community:string=publicSLEEP option(-sleep),number,=60&end_parameters&&&if (process_type) = 'batch' &then &doset_ready -format off&echo no_command_lines no_macro_lines no_input_lines&end& && display input argumentsdisplay_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 switchattach_default_output &TEST&snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::sysName.0detach_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_linedisplay_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& secondssleep -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_linedisplay_linedisplay_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 NOSWITCHdisplay_linedisplay_line<span style="font-family: Courier New,monospace;"display_line &SWITCH& is not responding to SNMP queries using &+ the community string &COMMUNITY&&return&&&label NOINTERFACEdisplay_linedisplay_linedisplay_line &INTERFACE_NAME& is not an STCP interface on this module&return&&&&label NOTFOUNDdisplay_linedisplay_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 NOIDXdisplay_linedisplay_linedisplay_line No data found for switch port &IDX& in switch &SWITCH&&&& get_switch_interface_stats.cm ends here |
