Skip to content

Modulo python para o modem D-Link 500G

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

32 Comments

  1. Só falta agora alguém fazer uma interface em pygtk :)

    Posted on 11-Mar-08 at 8:12 am | Permalink
  2. Gonçalo wrote:

    Sem querer ser muito chato… Adaptei o teu script ao meu modem mas há um problema! Não sei como correr scripts python
    :-#

    Posted on 11-Mar-08 at 10:35 pm | Permalink
  3. Gonçalo wrote:

    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”

    Posted on 11-Mar-08 at 10:36 pm | Permalink
  4. 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.

    Posted on 11-Mar-08 at 10:37 pm | Permalink
  5. Gonçalo wrote:

    Maravilha, Afinal funciona mesmo :))
    Obrigado pela ajuda! E desculpa ser chato

    Posted on 11-Mar-08 at 10:38 pm | Permalink
  6. Diogo Agra wrote:

    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

    Posted on 12-Mar-08 at 3:28 am | Permalink
  7. 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.

    Posted on 13-Mar-08 at 9:36 am | Permalink
  8. Cara, esse é o PRIMEIRO código em Python que vejo usando atributos privados (”__”). Nunca achei que alguém iria além dos internos (”_”).

    Posted on 14-Mar-08 at 12:00 am | Permalink
  9. 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.

    Posted on 14-Mar-08 at 12:21 am | Permalink
  10. 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.

    Posted on 19-Mar-08 at 11:27 pm | Permalink
  11. 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!

    Posted on 17-Apr-08 at 10:07 am | Permalink
  12. 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! =/

    Posted on 23-Apr-08 at 2:06 am | Permalink
  13. Victor Schulz wrote:

    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.

    Posted on 16-May-08 at 9:28 pm | Permalink
  14. Victor Schulz:
    Você poderia testar e depois contar qual foi o resultado. :)

    Posted on 16-May-08 at 10:24 pm | Permalink
  15. 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..

    Posted on 17-May-08 at 12:12 am | Permalink
  16. 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.

    Posted on 17-May-08 at 3:59 pm | Permalink
  17. AFFFFFE wrote:

    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

    Posted on 17-May-08 at 9:00 pm | Permalink
  18. 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.

    Posted on 18-May-08 at 3:35 pm | Permalink
  19. 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.

    Posted on 19-May-08 at 2:26 pm | Permalink
  20. 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

    Posted on 23-May-08 at 10:06 am | Permalink
  21. Fernando Pinheiro:
    Você conseguiu conectar via SSH no 500G? Eu testei isso aqui e não consegui…

    Posted on 26-May-08 at 11:46 pm | Permalink
  22. Thiago wrote:

    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!

    Posted on 27-May-08 at 10:26 am | Permalink
  23. 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.

    Posted on 27-May-08 at 1:15 pm | Permalink
  24. Thiago wrote:

    e sabe como resolver isso? porque precisava que fosse reiniciado o modem e meu script continuasse a execução, valeu!

    Posted on 27-May-08 at 2:00 pm | Permalink
  25. 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.

    Posted on 02-Jun-08 at 12:15 am | Permalink
  26. Thiago wrote:

    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!

    Posted on 02-Jun-08 at 11:43 am | Permalink
  27. 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”. :)

    Posted on 02-Jun-08 at 10:53 pm | Permalink
  28. bruce wrote:

    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.

    Posted on 11-Jun-08 at 10:53 pm | Permalink
  29. Bruce:
    Acho difícil você consegui reaver essa senha, talvez entrando em contato com o fornecedor.

    Posted on 11-Jun-08 at 11:21 pm | Permalink
  30. evandrofisico wrote:

    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 :).

    Posted on 04-Jul-08 at 8:14 am | Permalink
  31. lord wrote:

    sou meio leigo nisso tudo como uso o python?
    se puder me ajudar agradeço muito

    Posted on 06-Jul-08 at 11:07 pm | Permalink
  32. lord
    Se você estiver no Linux, você já tem o Python instalado na máquina e portanto você pode utilizá-lo diretamente pelo terminal:

    
    $ python seu_script.py
    
    Posted on 07-Jul-08 at 9:50 pm | Permalink

2 Trackbacks/Pingbacks

  1. Arthur via Rec6 on 11-Mar-08 at 2:24 am

    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….

  2. [...] Por fim eu acabei criando um módulo python para facilitar o gerenciamento do modem. [...]

Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*