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
Pingback: Monitorando os níveis de sinal do cable modem! | Blog do Eduardo Nunes