Skip to content

Monthly Archives: March 2008

Modulo python para o modem D-Link 500G

11-Mar-08

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

Acessando seu modem D-Link 500G pelo console

09-Mar-08

Quem tem modems da marca D-Link e modelo 500G já está acostumado a acessar sua interface web sempre que precisa acertar alguma configuração ou mesmo reiniciar o aparelho. Porém o que muita gente não sabe é que o mesmo modem também disponibiliza uma interface em modo texto (aka CLI) respondendo na porta 23, podendo ser acessada tanto pelo Windows como pelo Linux via telnet.

Em geral o modem vem configurado para responder no endereço 10.0.0.1, mas eu alterei a minha máscara de rede aqui em casa e utilizo o endereço 192.168.0.1. Portanto talvez você tenha que alterar os exemplos abaixo para conseguir conectar no seu modem.


$ telnet 192.168.0.1 23
    ...
login: <USUARIO>
password: <SENHA>
Login Successful
$

Caso você não saiba o usuário e senha do seu modem, o padrão é usuário admin e senha admin.
Depois de conectado, você tem acesso ao help que ajuda a enteder um pouco como funciona a aplicação:


$ telnet 192.168.0.1 23
    ...
login: <USUARIO>
password: <SENHA>
Login Successful
$ help
Command        Description
-------        -----------
alias          To Alias a command
apply          Apply configuration/image file
commit         Commit the active config to the flash
create         Create a new entry of specified type
delete         Delete the specified entry
download       Download a file on to the Device
exit           To exit the CLI shell
get            Display info for the search
help           Provides help
list           List files
modify         Modify information for specified entry
passwd         To modify user password
ping           The normal ping command
prompt         Change the user prompt
reboot         Reboot the device
remove         Remove file
reset          Reset info for the specified entry
size           ATM Sizing Information
traceroute     The normal traceroute command
trigger        To set trigger
unalias        To undefine previously defined alias
verbose        Switch ON/OFF the verbose mode

Quer saber como reiniciar o seu modem?


$ telnet 192.168.0.1 23
    ...
login: <USUARIO>
password: <SENHA>
Login Successful
$ reboot

E é isso ae… Agora brinquem com seus modems. :)

UPDATE1: Por fim eu acabei criando um módulo python para facilitar o gerenciamento do modem.

UPDATE2: Para aqueles que são clientes da Telemar, o Israel Pereira Costa disponibilizou nos comentários deste post algumas informações importantes sobre como acessar seu modem.