No meu último post eu falei sobre como acessar via telnet a interface modo texto (aka CLI) do modem D-Link 500G. Para quem gosta de trabalhar no terminal só isso já é uma maravilha, porém essa descoberta tem algumas outras vantagens…
E se nós pudéssemos controlar/manipular o modem através de scripts? Isso sim seria legal… Mas como criar um shell script para interagir com telnet é um tanto quanto chato, eu criei um módulo python para fazer isso. Então seguindo os exemplos do posts passado, vamos ver como fazer a mesma coisa porém dessa vez através do módulo Python:
Imprimir o help
Observe que foram criadas constantes para os valores padrão de configuração do modem, portanto se você usa o aparelho da maneira como ele lhe foi entregue, provavelmente não precisará alterar nada no códgo abaixo.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from dlink500g import *
try:
modem = DLink500G(DEFAULT_ADDRESS, DEFAULT_PORT)
modem.connect(DEFAULT_USERNAME, DEFAULT_PASSWORD)
print modem.command('help')
modem.command('quit')
except Exception, ex:
print 'Error:', str(ex)
Reiniciar o modem
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from dlink500g import *
try:
modem = DLink500G(DEFAULT_ADDRESS, DEFAULT_PORT)
modem.connect(DEFAULT_USERNAME, DEFAULT_PASSWORD)
modem.command('reboot')
except Exception, ex:
print 'Error:', str(ex)
Código fonte
Abaixo está o conteúdo da primeira versão deste módulo, que provavelmente sofrerá alterações e/ou bugfixes, portanto para se você deseja obter uma versão mais atualizada acesse o código fonte disponível no meu repositório svn do Google Code.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# This module provides a python interface to D-Link 500G CLI.
#
# written by Arthur Furlan <arthur.furlan@gmail.com>
import re, telnetlib
# default configuration
DEFAULT_ADDRESS = '10.0.0.1'
DEFAULT_PORT = 23
DEFAULT_USERNAME = 'admin'
DEFAULT_PASSWORD = 'admin'
class DLink500G:
def __init__(self, address, port):
self.address = address
self.port = port
self.connected = False
def __del__(self):
if self.connected:
self.command('quit')
self.telnet.close()
def connect(self, username, password):
self.telnet = telnetlib.Telnet(self.address, self.port)
self.telnet.read_until('login: ')
self.telnet.write("%s\n" % username)
self.telnet.read_until('password: ')
self.telnet.write("%s\n" % password)
response = self.telnet.expect(['\$'], 5)
if response[0] == -1:
raise Exception('Login failed.')
self.connected = True
def command(self, cmd):
if not self.connected:
raise Exception('Not logged in.')
self.telnet.write("%s\n" % cmd)
self.connected = not (cmd == 'quit')
if self.connected:
response = self.telnet.read_until('$').replace('\r', '').split('\n')
if re.match('^Error: ', response[1]):
raise Exception(re.sub('^Error: ', '', response[1]))
return '\n'.join(response[1:len(response)-1])
Sinta-se a vontade para enviar-me crítricas e/ou sugestões. :)
UPDATE1: Seguindo o “conselho” do Eduardo Willians, alterei a visibilidade dos atributos para público.
UPDATE2: Aproveitei o embalo para criar um projeto no Google Code, cuja a intenção é criar um pacote com módulos para vários dispositivos da D-Link que seguem a mesma linha. Lá você poderá encontrar as versões mais recentes desse módulo.
UPDATE3: Notícia divulgada também no br-linux.org



33 Comments
Só falta agora alguém fazer uma interface em pygtk :)
Sem querer ser muito chato… Adaptei o teu script ao meu modem mas há um problema! Não sei como correr scripts python
:-#
Já resolvi o problema de correr o script, era facil. Mas o script têm 1 erro. Ele encrava aqui:
“Traceback (most recent call last):
File “./modem.py”, line 9, in
modem.command(’reboot’)
File “/home/gsc/smartax.py”, line 44, in command
response = self.__telnet.read_until(’$').replace(’\r’, ”).split(’\n’)
File “/usr/lib/python2.5/telnetlib.py”, line 316, in read_until
while not self.eof and select.select(*s_args) == s_reply:
KeyboardInterrupt”
Gonçalo:
O seu problema parece ser com a sintaxe e provavelmente ocorreu porque você deve ter copiado o código diretamente do meu blog.
O Wordpress tem o péssimo costume de alterar caracteres como "e;, portanto o ideal é que você baixe o código-fonte que está disponível no meu repositório svn.
Maravilha, Afinal funciona mesmo :))
Obrigado pela ajuda! E desculpa ser chato
Tocando neste assunto sobre modem. Eu gostaria de deixar a questão no ar… É possivel acessar internet atravéz da entrada USB do modem no Ubuntu? Se sim, como?
ps: modem speedstream 4200
Diogo Agra:
Eu acredito que seja possível, porém não conheço esse modem que você utiliza e não tenho como dar uma informação mais precisa.
Cara, esse é o PRIMEIRO código em Python que vejo usando atributos privados (”__”). Nunca achei que alguém iria além dos internos (”_”).
Eduardo Willians:
Você acha isso ruim?
Eu estou “começando agora” no Python… Eu programei muito tempo em C# e C++ (ainda programo) e acho que trouxe esse costume de manter privado tudo o que for possível dessas linguagens. Ainda não me acostumei com o jeito Python de programar. :)
UPDATE: Segui seu “conselho”, alterei a visibilidade dos atributos para público.
Opa Arthur, valeu pela citação.
Se eu fosse sugerir, sugeriria o uso do atributo interno (”_”) para atributos e métodos que poderiam ser do tipo não-públicos. Eu me espantei com o uso do “__” (privado) pq nunca tinha visto alguém usar até então.
Valeu.
Será que alguém estaria desenvolvendo um para o d-link 500b?
Pessolamente descobri que dentro destes modens tem um linux, isso mesmo!! Para ver com seus próprios olhos acesse o modem (exemplo):
telnet 10.1.1.1
usuario
senha
sh …………… entra no shell do bicho
veja que o pronpt muda de > para #
echo * …….. eles não colocaram o comando ls lá para dificultar as coisas
iptables -L -n ……………. veja as regras do firewall do modem, a essa altura você deve estar se perguntando, será que estas regras não são do meu linux? Aí eu te mando mais esta,
cat /proc/version
Para ir mais além dá uma visitada no /etc/
Depois de mergulhar no d-link faça-me um favor, como faço para liberar minha porta 22 ou 2221, algo parecido.
chegeui a acreditar que a culpa era da Telemar, mas colocando o modem speedstream consegui liberar a porta, gostaria de saber que rotas coloco dentro do d-link.
Para ser mais preciso necessitamso de um wiki para compilar estas dicas já que todos nós dependemos desses danados para administrar sistemas remotamente.
alguns comandos que citei aqui podem ser lidos no meu blog
neste post:
http://vivaotux.blogspot.com/2008/04/hackeando-os-modem-d-link.html
Valeu pelo artigo!
Sérgio Luiz A. Silva:
Puts, que inveja! Eu tenho o DLink 500G e nessa versão não é possível entrar no shell do modem, pelo menos não existe uma opção para isso! =/
Não sei se funcionaria com o meu, visto que coloquei um firmware de um Jetspeed 520 nele, que resolveu alguns problemas de acesso desse modem pelo firefox, além de disponibilizar algumas novas funções, como UPNP, que não existem nos D-link.
Victor Schulz:
Você poderia testar e depois contar qual foi o resultado. :)
humm..
funciona, mas cá entre nós, é inútil né? Imprimir ajuda e reiniciar é muito pouco. Claro que o firmware do modem não ajuda muito, mas acredito que um módulo que trabalhe com a interface web abra um leque com mais possibilidades..
rataodopado:
Na verdade, reiniciar o modem era o que eu precisava e um dos exemplos que eu dei… Há muitas outras funções que podem ser executadas, e várias delas nem mesmo estão listadas na função “help”.
Eu descobri sobre a conexão telnet do modem vendo um tecnico do meu provedor de internet configurar o modem aqui em casa. Ele fez tudo através da interface telnet e usou vários comandos que não estão listados ali.
E eu achando que era o “O SCRIPT” para o modem… nao fez nada de diferente… deveria pelo menos ter explorado mais o modem e ter feito um script massa, tipo trocar a DMZ, bloquear certas portas e etc
[]z
AFFFFFE:
Acho que é mais ou menos o que eu falei no meu último comentário. Ali no “help” estão listadas somente as funções básicas do modem, existem muitas outras que não estão contidas ali. Existem ainda outros modems (como o 500B, por exemplo) que permitem a você acessar o shell do linux instalado no dispositivo e editar o iptables na mão, o que então permitiria você fazer tudo o que você deseja. Infelizmente, no caso do 500G, ficamos restritos a limitação do firmware.
Creio que em todos estes modems ADSL atuais o SO seja alguma distro Linux. No 500G eu conectei via SSH, se bem me lembro. Todas as regras de firewall são no Netfilter, via iptables. Inclusive sofri para configurar VPN com ele. Só por shell mesmo, no meu caso.
No mais, parabéns pelo script, Arthur.
Então gente, eu procurei como fazer modificações via command line e acho que a única solução nesse caso, tanto que usei assim, é conectar no modem pelo console abrindo a interface web dele pelo LINKS2.
Instalei o links2 e abri: links2 10.1.1.1
Fernando Pinheiro:
Você conseguiu conectar via SSH no 500G? Eu testei isso aqui e não consegui…
Arthur, toda vez que dou um reboot no meu modem ele trava o telnet (ou o python msm) e nao me retorna nada, sabe o pq disso?!?! valeu!
Thiago:
Isso é normal… Acontece porque a sua máquina tenta reaver a conexão que foi perdida com o desligamento do modem. Como o modem ainda está inicializando, ele não responde as suas mensagens, causando o “travamento” do console.
Isso acontece também na interface web.
e sabe como resolver isso? porque precisava que fosse reiniciado o modem e meu script continuasse a execução, valeu!
Thiago:
Acabei de corrigir esse problema. Agora quando você executa o comando “reboot” o script fecha a conexão com o modem (que seria perdida de qualquer forma) e continua a execução.
Você pode obter a nova versão do código no site do projeto no Google Code.
Poisé eu tinha dado um jeito aqui também e feito a mesma coisa de uma maneira diferente, mas de qualquer forma valeu a força, esta sendo bem util o teu script pra mim!
Thiago:
Se você já tinha implementado ou se implementou de uma forma melhor… Posta aqui a sua solução, se for legal que altero na “versão oficial”. :)
gente me ajudem, tenho um modem 500g mudei a senha dele e agora não consigo mais acessar, nem dar reset esta adiantando tem como descobrir isso.
Bruce:
Acho difícil você consegui reaver essa senha, talvez entrando em contato com o fornecedor.
Então cara, quer extender um pouco seu script? o dlink 500g na verdade permite verificar e setar MUITOS parametros via linha de comando, mas não há em nenhum canto (pelo menos que eu tenha achado) documentação. Fuçando num dia de internet com problemas, encontrei dentro da pasta ftp do modem alguns arquivos que listam as funçoes disponiveis. Assim, por exemplo, para verificar o status de ppp é só executar:
$get ppp lstatus
If-name : ppp-0 Lower-If : aal5-0
Local MRU : 1492 Remote MRU : 1492
L2R Protocol Comp : Disable R2L Protocol Comp: Disable
L2R AC Comp : Disable R2L AC Comp : Disable
Operational Status : Up Last Fail Cause : Unknown
e assim por diante. Da mesma forma é possivle setar uma série de parametros de funcionamento a partir da linha de comando. Assim o seu script ganha funcionalidade, já que só rebootar quando se tem todo um script com estrutura pra fazer mais é um desperdicio :).
sou meio leigo nisso tudo como uso o python?
se puder me ajudar agradeço muito
lord
Se você estiver no Linux, você já tem o Python instalado na máquina e portanto você pode utilizá-lo diretamente pelo terminal:
Afinal, de qual 500G vc está falando? Porque, até onde eu sei, exite o GenerationII e o IV. O 500G GII usa um chipset da GlobespanVirata, conhecido como “Viking” que foi, muito provavelmente, o chipset ADSL mais usado no mundo por integradores.
Tenho um 500G II há 5 anos, operando com o ultimo firmware disponibilizado pela Solwise.co.uk, e era excelente: Syslog, DDNS, access control, nunca travou, era realmente completo. Digo “era” pois acabei de “brickar” o bendito após um update de firmware mal-sucedido. :(
Tenho alguns PDFs da Solwise com *muitos* detalhes sobre o modem, inclusive sobre criação de scripts. Detalhe: não me parece que o OS é baseado em *nix, creio que é uma solução proprietaria da GlobespanVirata mesmo. Caso alguem queira, mande e-mail.
2 Trackbacks/Pingbacks
Modulo python para o modem D-Link 500G…
Depois de mostrar como é possível acessar o seu modem D-Link 500G pelo console, eu desenvolvi um módulo python que manipula o modem. Tornando possível controlar o aparelho através de scripts, etc….
[...] Por fim eu acabei criando um módulo python para facilitar o gerenciamento do modem. [...]
Post a Comment