Monitorando o seu Cable Modem.

Os cable modems que temos em nossas casas e empresas para acessar a internet utilizam uma tecnologia de gerenciamento chamada SNMP, essa tecnologia nos permite consultar e analisar diversas informações de dispositivos para fins de diagnóstico ou curiosidade mesmo!

[Atualizado 21/07/2010] Para o Windows eu desenvolvi um software que nos permite visualizar os parâmetros de conexão do cable modem de maneira simples e eficiente. O download pode ser efetuado em meu Live! SkyDrive 😀

Para o Linux eu desenvolvi um shell script simples, que permite visualizar de maneira prática as informações mais importantes sobre o cable modem, como velocidade, freqüências de sincronia, potência e possíveis erros ocorridos.

Pré-requisitos: snmp-utils e bc.

Para executar em loop, basta fornecer o parâmetro -f (exemplo: script.sh -f

Versão 1.01, 19/06/2010:
+ Alterado snmpget e OIDs de velocidade de Upload e Downloads para snmpgetnext.
+ Detecção automática do snmpget/snmpgetnext/bc
+ Opção de executar em loop (parâmetro -f) ou consulta simples.

Versão 1.02, 20/07/2010:
+ Adicionado código de cores para facilitar o diagnóstico de qualidade.

Versão 1.03, 06/06/2012:
+ Correção das cores no SNR.

#!/bin/sh
# Modem Watcher 1.03, por Eduardo Nunes, http://blog.eduardo.nunes.net.br.
## Informações do Modem
IPModem="192.168.100.1"
SenhaSNMP="public"
## Busca pelas dependências
if [ -z "`which snmpget`" ]; then exit; fi;
if [ -z "`which snmpgetnext`" ]; then exit; fi;
if [ -z "`which bc`" ]; then exit; fi;
## Software Matemático
bc="`which bc`"
## Definições de SNMP
snmp="`which snmpget` -v2c -O qvU -c $SenhaSNMP $IPModem"
snmpn="`which snmpgetnext` -v2c -O qvU -c $SenhaSNMP $IPModem"
## OIDs Pesquisadas
oid_fd=".1.3.6.1.2.1.10.127.1.1.1.1.2.3"
oid_pd=".1.3.6.1.2.1.10.127.1.1.1.1.6.3"
oid_fu=".1.3.6.1.2.1.10.127.1.1.2.1.2.4"
oid_pu=".1.3.6.1.2.1.10.127.1.2.2.1.3.2"
oid_cu=".1.3.6.1.2.1.10.127.1.1.2.1.1.4"
oid_snr=".1.3.6.1.2.1.10.127.1.1.4.1.5.3"
oid_err=".1.3.6.1.2.1.2.2.1.14.3"
oid_vd=".1.3.6.1.2.1.10.127.1.1.3.1.5"
oid_vu=".1.3.6.1.2.1.10.127.1.1.3.1.3"
oid_ut=".1.3.6.1.2.1.1.3.0"
## Início do Programa
echo 'Iniciando o aplicativo, por gentileza, aguarde!'
loop=true
while $loop
do
cu="`$snmp $oid_cu`"
if [ "$cu" = "No Such Object available on this agent at this OID" ] || [ -z "$cu" ]
  then
  clear
  echo -en '\n                               Modem Watcher 1.03\n\n'
  echo -en '                             Modem não inicializado\n\n'
  sleep 5
else
  fd="`$snmp $oid_fd`"
  pd="`$snmp $oid_pd`"
  fu="`$snmp $oid_fu`"
  pu="`$snmp $oid_pu`"
  snr="`$snmp $oid_snr`"
  err="`$snmp $oid_err`"
  vd="`$snmpn $oid_vd`"
  vu="`$snmpn $oid_vu`"
  ut="`$snmp $oid_ut`"
  clear
  echo -en '\n                               Modem Watcher 1.03\n\n'
  echo -en '                          Frequências      Canal    Potências\n'
  echo -en '\n              Downstream:   '
  echo -en "\E[1;34m$fd"
  echo -en " Hz\E[0m            "
  pot="`echo "$pd * 0.1" | $bc`"
  if [ "`echo "$pot < 10" | $bc`" = "1" ] && [ "`echo "$pot >= 0" | $bc`" = "1" ]; then
    pot=" $pot"
  fi
  if [ "`echo "$pot < 5" | $bc`" = "1" ] && [ "`echo "$pot > -5" | $bc`" = "1" ]; then
    pot="\E[1;32m$pot\E[0m"
  else if [ "`echo "$pot < 10" | $bc`" = "1" ] && [ "`echo "$pot > -10" | $bc`" = "1" ]
    then
    pot="\E[1;33m$pot\E[0m"
  else if [ "`echo "$pot < 15" | $bc`" = "1" ] && [ "`echo "$pot > -15" | $bc`" = "1" ]
    then
    pot="\E[1;31m$pot\E[0m"
  fi  fi
  fi
  echo -en $pot
  echo -en ' dBmV\n'
  echo -en '              Upstream:      '
  echo -en "\E[1;34m$fu"
  echo -en " Hz\E[0m     "
  echo -en "\E[1;36m$cu"
  echo -en '      '
  pot="`echo "$pu * 0.1" | $bc`"
  if [ "`echo "$pot < 8" | $bc`" = "1" ]; then
    pot="\E[1;31m$pot\E[0m"
  else if [ "`echo "$pot < 45" | $bc`" = "1" ]; then
    pot="\E[1;32m$pot\E[0m"
  else if [ "`echo "$pot < 50" | $bc`" = "1" ]; then
    pot="\E[1;33m$pot\E[0m"
  else
    pot="\E[1;31m$pot\E[0m"
  fi
  fi
  fi
  echo -en $pot
  echo -en ' dBmV\n\n\n'
  echo -en '            Índice de Sinal em ruído: '
  snr="`echo "$snr * 0.1" | $bc`"
  if [ "`echo "$snr > 45" | $bc`" = "1" ]; then
    snr="\E[1;31m$snr\E[0m"
  else if [ "`echo "$snr > 35" | $bc`" = "1" ]; then
    snr="\E[1;33m$snr\E[0m"
  else
    snr="\E[1;32m$snr\E[0m"
  fi
  fi
  echo -en $snr
  echo -en ' dB'
  echo -en '      Erros: '
  dias="`echo $ut | awk -F: '{ print $1 }'`"
  if [ "`echo "$err/($dias+1)<2500" | bc`" = "1" ]; then
    err="\E[1;32m$err\E[0m"
  else if [ "`echo "$err/($dias+1)<5000" | bc`" = "1" ]; then
    err="\E[1;33m$err\E[0m"
  else
    err="\E[1;31m$err\E[0m"
  fi
  fi
  echo -en $err
  echo -en '\n\n\n                          Velocidades\n'
  echo -en '\n              Downstream:   '
  echo -n $vd
  if [ `expr $vd / 1048576` = 0 ]; then
    echo -n ' ('
    echo -n `echo "scale=1; $vd /1024" | $bc`
    echo -n ' KB)'
  else
    echo -n ' ('
    echo -n `echo "scale=1; $vd /1048576" | $bc`
    echo -n ' MB)'
  fi
  echo -en '\n              Upstream:     '
  echo -n $vu
  if [ `expr $vu / 1048576` = 0 ]; then
    echo -n ' ('
    echo -n `echo "scale=1; $vu /1024" | $bc`
    echo -n ' KB)'
  else
    echo -n ' ('
    echo -n `echo "scale=1; $vu /1048576" | $bc`
    echo -n ' MB)'
  fi
  echo -en '\n\n\n            Modem ativo por '
  echo -n `echo $ut | sed 's/.00//g' | \
           awk -F: '{ print $1 " dias " $2 "  horas " $3 " minutos " $4 " segundos " }'`
  echo -en '\n              Legenda da qualidade do sinal: '
  echo -en '\E[1;32mBOM\E[0m, \E[1;33mRAZOÁVEL\E[0m, \E[1;31mRUIM\E[0m.\n\n\n'
  if [ "$1" = "-f" ]; then
    sleep 2
  else
    loop=false
  fi
fi
done

Uma ideia sobre “Monitorando o seu Cable Modem.

  1. Pingback: Monitorando os níveis de sinal do cable modem! | Blog do Eduardo Nunes

Escreva seu comentário: