Para quem precisa apenas se conectar em um servidor usando Python e mandar e receber comandos eis uma classe simples que fiz e uso para diversos projetos.

class UserSocket:
    """
    Classe de comunicacao

    Exemplo:
        UserSocket("10.13.97.81", 2100)
    """

    def __init__(self, host, port):
        """
        Construtor do driver de conexao
        """
        self.__host = host
        self.__port = port
        self.connect_server()

    def connect_server(self):
        """
        Realiza a conexao com o servidor
        """
        try:
            self.__soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
            self.__soc.connect((self.__host, self.__port))
        except Exception:
            return False
        return True

    def close_server(self):
        """
        Fecha a conexao com o servidor
        """
        try:
            self.__soc.close()
        except Exception:
            return False
        return True

    def receive_data(self):
        """
        Recebe os dados do buffer do servidor
        """
        data = ''
        chunk = ' '
        while (len(data) < 1) or (chunk != '\n'):
            chunk = self.__soc.recv(1)
            if chunk == '':
                raise RuntimeError, "socket connection broken"
            data = data + chunk
        return data

    def send_data(self, data):
        """
        Envia dados para o servidor
        """
        try:
            self.__soc.sendall(data)
        except Exception:
            return False
        return True

Usando …

>>> s = UserSocket("10.13.97.81", 2100)
>>> data = s.receive_data()
>>> s.send_data("COMANDO")

… você poderá se comunicar com qualquer servidor socket.

Primeiramente deixe-me explicar, imagino que você deve estar se perguntando, “Sendo assim eu sou burro?” ou “Você está me chamando de burro? Seu idiota!!!”, nada disso. Eu estava pensando, nessa semana, o que leva a pessoa a fazer um curso qualquer, seja de reciclagem ou de capacitação em uma determinada área, e percebi que muitas vezes eu mesmo me deparei em alguma sala de aula com alguém falando sobre um determinado tema e eu pouco prestando atenção ou essa pessoa pouco sabia sobre o tema ou tinha segurança sobre o assunto. Claro que há exceções, mas aí nos deparamos com outro problema, muitas vezes a turma em que você está não é, como vamos dizer, tão atenciosa quanto você e isso acaba fazendo com que o instrutor volte assunto, repita conceitos e isso lhe desistimula a continuar com sua atenção alí. Identificou-se com a cena???

Eu tenho o hábito de estudar através de livros, ou até mesmo através de PDFs!, e pude observar que tem sido muito mais proveitoso, econômico e satisfatório. Se seu objetivo é conhecimento, essa é a solução. Existe, como tudo na vida, seus contras, pois um “curso” feito dessa forma exige conhecimento prévio de bons livros, saber sites e referências para consulta e ter uma “base” boa sobre o tema que se deseja estudar, pois é fácil cairmos em livros mal escritos, conteúdo desatualizado ou pior, autores que entendem de administração escrevendo sobre informática (Alguém pode citar um?). Se seu objetivo é certificados (não confundir com certificações) para colocar no currículo, esse não é um bom caminho.

Felizmente, para o leitor desse blog, irei recomendar várias literaturas que poderão embasar consideravelmente seus estudos na área de informática, redes e programação ágil. Todos os livros recomendados aqui são de grande proveito se lidos COMBINADOS! Nenhuma literatura é final e completa, portanto o hábito de consultar várias fontes é sempre bem vindo.

Leitura de base

Abaixo livros para embasar seu conhecimento. Nenhum profissional será bom o suficiente se não conhecer os princípios que solidificam os conhecimentos em informática.


Redes de Computadores - Andrew S. Tanenbaum


Shell Script Profissional - Aurelio Marinho Jargas


Sistemas Distribuídos: Conceitos e Projeto - George Coulouris


Introdução a Estruturas de Dados - Waldemar Celes


Fundamentos Matemáticos para a Ciência da Computação - Judith L. Gersting

Leitura em linux

Livros que descrevem o funcionamento do sistema operacional aberto mais popular que existe. Uma ótima base para entender o linux e seus componentes estão compilados nos livros abaixo.


Certificação Linux Lpi - Nível 1 Exames 101 e 102 - Steven Pritchard


Certificação Linux LPI: Nível 2 Exames 201 e 202 - Steven Pritchard


Manual Completo do Linux: Guia do Administrador - Evi Nemeth


Universidade Linux - Tadeu Carmona

Leitura em redes

Livros específicos para redes e interconexão de computadores, configuração de roteadores, firewalls e demias equipamentos em um ambiente interconectado.


Projeto de Interconexão de Redes - Matthew H. Birkner


Linux Iptables: Guia de Bolso - Grecor N. Purdy


Como Configurar Roteadores Cisco - Allan Leinwand

Leitura em programação

Livros que lhe ajudarão a pensar logicamente e com agilidade, o objetivo de programar é solucionar problemas da forma mais simples possível.


Programação Avançada em Linux - Gleicon Da Silveira Moraes


Profissional Linux Programando - Neil Matthew


Extreme Programming - Vinicius Manhaes Teles


UML Essencial - Grady Booch


Use a Cabeça HTML com CSS e XHTML - Eric Freeman


Use a Cabeça ! : Ajax - Brett Mclaughlin


Use a Cabeça SQL - Lynn Beighley

Bem, essa é uma lista inicial dos livros que já li e gostei, cada um tem seus fortes e fracos também, alguns a tradução não está legal, mas o conteúdo é interessante (principalmente os da série “Use a cabeça”), estou vendo outros livros interessantes que estou interessado em ler, assim que tiver uma opnião positiva sobre eles indico aqui também.

Quem tiver outra indicação pode sugerir nos comentários.

Neste tutorial veremos como configurar a conexão claro 3G no seu desktop Ubuntu 8.04 (Hardy). Embora eu tenha ficado extremamente irritado com os vendedores da Claro que se recusaram a deixar eu testar o modem no Linux alegando incompatibilidade e essas coisas, eu mesmo assim optei por essa opção de Internet, que tem sido minha atual forma de conexão à Internet, devido as suas enormes facilidades e relativa qualidade. É engraçado como pessoas leigas insistem em resistir a qualidade e superioridade dos sistemas UNIXlike e se contentam com a mesmice e subtecnologia oferecida pela Microsoft e seus parceiros, mas isso é outro assunto. Read more

A pedidos, vou passar rapidamente como instalei a minha placa de rede wireless, lembrando que uso o notebook da CCE LPV-D10H120 e minha placa de rede wireless é identificada através do comando…

lshw -C network

como…

  *-network
       description: Wireless interface
       physical id: 1
       logical name: wlan0
       serial: 00:19:db:05:8d:ac
       capabilities: ethernet physical wireless
       configuration: broadcast=yes driver=ndiswrapper+rt73 ...

E pelo comando…

lsusb

como…

Bus 005 Device 003: ID 0db0:6877 Micro Star International

Antes de me “render” ao ndiswrapper já tentei testar todos os drivers disponíveis, deste o RT73 legacy [http://www.ralinktech.com/ralink/Home/Support/Linux.html] (que não é compatível com o comando iwconfig) até o projeto open source, que promete suportar nativamente o adaptador Ralink no Linux, mas ainda instável [http://rt2x00.serialmonkey.com/], pois bem, percebendo que estes drivers não iriam funcionar mesmo resolvi baixar o driver para windows [http://www.ralinktech.com/ralink/Home/Support/Windows.html] e usar o Ndiswrapper como se segue. Read more

Eu tenho uma preferência pessoal por executar meus servidores usando scripts de init, uso sempre o Linux Standard Base (LSB) e suas padronizações para criá-los sempre que necessário. Em geral, o pacote de um servidor como o Apache, já vem com algum modelo ou até mesmo já cria o script de init para você, mas, por algum motivo, no Ubuntu (no Debian também) o script de init responsável por executar o iptables (carregar as regras) não existe, e por isso eu criei um próprio baseado em um monte de exemplos disponíveis na Internet.

O resultado final desse script é

#!/bin/bash

# Este script deve ser usado em Desktops apenas, não possui qualquer
# especialização para uso em servidores de segurança ou ambientes em produção
# oferece apenas o nível básico de proteção, para maiores informações consultar
# a documentação oficial do iptables e sites especializados em segurança
#
# Criado por Allan Garcia
# allan.garcia@gmail.com
# V 1.0

. /lib/lsb/init-functions

IPTABLES=”/sbin/iptables”
IPTABLES_SAVE=”/sbin/iptables-save”
IPTABLES_RESTORE=”/sbin/iptables-restore”
IPTABLES_RULES=”/etc/default/iptables”
SAVE_RESTORE_OPTIONS=”-c”

fillbasicrules() {
${IPTABLES} -F
${IPTABLES} -X
${IPTABLES} -P INPUT DROP
${IPTABLES} -P FORWARD DROP
${IPTABLES} -P OUTPUT DROP
${IPTABLES} -N Ubuntu-Firewall-1-INPUT
${IPTABLES} -A INPUT -j Ubuntu-Firewall-1-INPUT
${IPTABLES} -A FORWARD -j Ubuntu-Firewall-1-INPUT
${IPTABLES} -A OUTPUT -j ACCEPT
${IPTABLES} -A Ubuntu-Firewall-1-INPUT -i lo -j ACCEPT
${IPTABLES} -A Ubuntu-Firewall-1-INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
${IPTABLES} -A Ubuntu-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT
${IPTABLES} -A Ubuntu-Firewall-1-INPUT -j REJECT –reject-with icmp-host-prohibited
}

checkrules() {
if [ ! -f ${IPTABLES_RULES} ]; then
echo -n “There is no rules configured, can I suggest some (y/n) [y]?”
read input
if [ -z $input ] || [ "$input" == "y" ] || [ "$input" == "yes" ] || [ "$input" == "Y" ] || [ "$input" == "YES" ]; then
fillbasicrules
save
else
echo “Not starting iptables. First create some rules then run”
echo “\”/etc/init.d/iptables save\”"
return 1
fi
fi
}

save() {
${IPTABLES_SAVE} ${SAVE_RESTORE_OPTIONS} > ${IPTABLES_RULES}
return $?
}

start() {
checkrules || return 1
${IPTABLES_RESTORE} ${SAVE_RESTORE_OPTIONS} < ${IPTABLES_RULES}
return $?
}

stop() {
for table in `cat /proc/net/ip_tables_names`; do
${IPTABLES} -F -t $table
${IPTABLES} -X -t $table
if [ $table == nat ]; then
${IPTABLES} -t $table -P PREROUTING ACCEPT
${IPTABLES} -t $table -P POSTROUTING ACCEPT
${IPTABLES} -t $table -P OUTPUT ACCEPT
elif [ $table == mangle ]; then
${IPTABLES} -t $table -P PREROUTING ACCEPT
${IPTABLES} -t $table -P INPUT ACCEPT
${IPTABLES} -t $table -P FORWARD ACCEPT
${IPTABLES} -t $table -P OUTPUT ACCEPT
${IPTABLES} -t $table -P POSTROUTING ACCEPT
elif [ $table == filter ]; then
${IPTABLES} -t $table -P INPUT ACCEPT
${IPTABLES} -t $table -P FORWARD ACCEPT
${IPTABLES} -t $table -P OUTPUT ACCEPT
fi
done
}

restart() {
for table in `cat /proc/net/ip_tables_names`; do
${IPTABLES} -F -t $table
${IPTABLES} -X -t $table
done
start
}

case “$1″ in
save)
echo -n “Saving iptables state…”
save
if [ $? -eq 0 ]; then
echo ” ok”
else
echo ” error!”
fi
;;

start)
log_begin_msg “Loading iptables state and starting firewall…”
start
log_end_msg $?
;;

stop)
log_begin_msg “Stopping firewall…”
stop
log_end_msg 0
;;

restart)
log_begin_msg “Stopping firewall…”
restart
log_end_msg $?
;;

*)
echo “Usage: /etc/init.d/iptables {start|stop|restart|save}” >&2
exit 1
;;

esac

exit 0

Para instalar esse script é muito simples, copie ele para a pasta “/etc/init.d/” com o nome “iptables”, certifique-se de que seu proprietário é o root e dê a permissão 755 para ele.

$ sudo cp /tmp/iptables /etc/init.d/

$ sudo cd /etc/init.d/

$ sudo chown root.root iptables

$ sudo chmod 755 iptables

Se você iniciar o iptables sem criar regras, o próprio script irá lhe sugerir um conjunto inicial de regras, caso queira criar seu próprio conjunto de regras, faça-o e depois salve usando o comando

$ sudo /etc/init.d/iptables save

O conjunto de regras sugerido é suficiente para proteger seu computador pessoal, todavia para uma configuração mais avançada recomento uma leitura mais aprofundada na documentação do iptables (man iptables).

Após a regras salvas inicie o iptables usando o comando

$ sudo /etc/init.d/iptables start

Para habilitar a inicialização sempre que o computador ligar execute

$ sudo update-rc.d iptables defaults

Pronto! Seu firewall está configurado para carregar na inicialização do computador

Este será um artigo bem curto, não vou discutir qual é a melhor forma de fazer backup do Subversion, apenas vou mostrar como eu faço! Juntamente com o Subversion eu também faço backup da pasta do Trac.

No meu computador todos os projetos do Subversion encontram-se em “/var/lib/svn/” e os projetos do Trac em “/var/lib/trac/”, portanto fica simples fazer o backup, que no meu caso é para minha pendrive.

O script que eu utilizo é:

#!/bin/bash
PENDIR=”/media/MY FILES/”
BKPDIR=$PENDIR”backup/”
BASEDIR=”/var/lib/”
SVNPATH=$BASEDIR”svn/”
TRACPATH=$BASEDIR”trac/”
SVNCMD=”svnadmin -q”
TARCMD=”tar -czPf”
echo -n -e “\n *** Iniciando o procedimento de backup *** \n\n”
for project in projeto1 projeto2 projeto3; do
echo -n -e ” * Copiando subversion do projeto $project para $BKPDIR…”
$SVNCMD dump “$SVNPATH$project” > “$BKPDIR$project”".svndump”
echo -n -e ” OK!\n”
echo -n -e ” * Copiando trac do projeto $project para $BKPDIR…”
$TARCMD “$BKPDIR$project”"-trac.tar.gz” “$TRACPATH$project”
echo -n -e ” OK!\n”
done
echo -n -e “\n *** Finalizando backup *** \n\n”

Ou seja, o procedimento é simplesmente montar a pendrive na USB, e executar este script, caso você tenha algum dispositivo permanente de backup poderá agendar esse script no cron.

Se você está procurando apenas os comandos para backup use

$ svnadmin dump /var/lib/svn/projeto1 > projeto1.svndump

Para backup do Trac eu prefiro fazer do diretório completo, pois já vem com meus plugins e outras personalizações.

$ tar -czPf projeto1-trac.tar.gz /var/lib/trac/projeto1

Restaurando o backup

Para restaurar o backup do Subversion exige-se duas etapas, a primeira é criar o projeto vazio e depois carregar o dump salvo anteriormente.

$ sudo svnadmin create projeto1

$ sudo svnadmin load projeto1 < projeto1.svndump

Para restaurar o Trac basta descompactar o arquivo na pasta do Trac, que no meu caso é “/var/lib/trac/” e após isso seguir os passos de configuração ditos no meu outro artigo “Instalando o Trac e o Subversion em 12 passos no Ubuntu 7.04 (Feisty Fawn)

Pronto! Seu computador está pronto para o trabalho novamente!

Quem já utiliza o Subversion para gerenciar o desenvolvimento de seus softwares sabe como ele pode agilizar e controlar o processo. Uma função interessante do Subversion é poder “hookar” algumas ações, tais como: Após o commit, Antes do commit, Ao lockar, etc. Neste artigo veremos como fazer para que “após-um-commit” de uma nova revisão, o script feche automaticamente um ticket aberto no Trac.

A forma de utilização será “svn ci” e no log adicionar “(close #ticket-number) ou (refs #ticket-number)” antes do comentário normal da revisão.

Para começar a configuração primeiro devemos entrar na pasta do projeto Subversion, onde iremos configurar o “hook”.

$ cd /var/lib/svn/+projeto+/

Em seguida acessar a pasta “hooks”:

$ cd hooks

$ ls -l

-rw-rw-r– 1 root www-data 1996 2007-09-26 15:19 post-commit.tmpl
-rw-rw-r– 1 root www-data 1673 2007-09-26 15:19 post-lock.tmpl
-rw-rw-r– 1 root www-data 2290 2007-09-26 15:19 post-revprop-change.tmpl
-rw-rw-r– 1 root www-data 1602 2007-09-26 15:19 post-unlock.tmpl
-rw-rw-r– 1 root www-data 2969 2007-09-26 15:19 pre-commit.tmpl
-rw-rw-r– 1 root www-data 2038 2007-09-26 15:19 pre-lock.tmpl
-rw-rw-r– 1 root www-data 2764 2007-09-26 15:19 pre-revprop-change.tmpl
-rw-rw-r– 1 root www-data 1979 2007-09-26 15:19 pre-unlock.tmpl
-rw-rw-r– 1 root www-data 2137 2007-09-26 15:19 start-commit.tmpl

Veja que existem templates para várias ações que podem ser configuradas, recomendo ler mais sobre esse assunto para fazer as demais configurações, para nosso caso o que nos interessa é o “post-commit.tmpl”, devemos renomeá-lo para “post-commit” e torná-lo executável.

$ sudo mv post-commit.tmpl post-commit

$ sudo chmod +x post-commit

Depois editá-lo e adicionar as linhas que irão chamar o script do Trac, conforme abaixo:

$ sudo vim post-commit

— code —

REPOS=”$1″
REV=”$2″
LOG=`/usr/bin/svnlook log -r $REV $REPOS`
AUTHOR=`/usr/bin/svnlook author -r $REV $REPOS`
TRAC_ENV=’/var/lib/trac/+projeto+/’
TRAC_URL=’http://trac/+projeto+/’

/usr/bin/python /usr/share/doc/trac/contrib/trac-post-commit-hook \
-p “$TRAC_ENV” \
-r “$REV” \
-u “$AUTHOR” \
-m “$LOG” \
-s “$TRAC_URL”
— code —

Se você está fazendo essa configuração pela primeira vez, você deve comentar todas as demais linhas deste arquivo, deixando apenas as descritas acima.
Agora vamos habilitar o script do Trac, primeiro devemos acessar o diretório “contrib” do Trac, que no Ubuntu está localizado em:

$ cd /usr/share/doc/trac/contrib/

Caso o arquivo esteja compactado, descompactá-lo usando o comando abaixo:

$ sudo gunzip trac-post-commit-hook.gz

E por fim torná-lo executável

$ sudo chmod +x trac-post-commit-hook

Pronto! Agora quando fizer o commit de uma revisão do seu projeto basta adicionar “(close #N)” para fechar um ticket ou “(refs #N)” para referenciá-lo e desta forma poder ver no futuro as alterações que foram feitas no projeto que estão relacionados a um determinado Ticket.

Sempre tenho dificuldades para lembrar como fiz a configuração do meu computador, e sempre que algo dá errado e eu tenho que formatá-lo tenho que buscar na internet como configurá-lo novamente, tentando lembrar como o personalizei e essas coisas, enfim, agora que eu tenho um blog vou publicar a documentação que eu uso para configurar meu computador e espero que seja útil para mais alguém.

Como uso o Ubuntu, irei usar o aptitude para instalar meus pacotes, ao menos para a maioria dos pacotes, a vantagem é ter o log de toda instalação e desinstalação dos pacotes em /var/log/aptitude*

1. Vou instalar o que geralmente instalo assim que termino a instalação do Ubuntu, todo computador de desenvolvedor tem que ter.

$ sudo aptitude install build-essential python-dev python-profiler python-setuptools

2. Instalar os binários do Subversion, neste pacotes encontram-se o cliente e o servidor também.

$ sudo aptitude install subversion python-subversion

3. Agora os binários do Trac com os módulos Python relacionados

$ sudo aptitude install trac python-docutils python-clearsilver python-pysqlite2 python-roman

4. Por fim instalar o Apache com os módulos necessários para publicar o serviço Webdav do Subversion e para hospedar o Trac usando mod_python (mais rápido do que o cgi)

$ sudo aptitude install apache2 apache2-utils apache2-mpm-worker apache2.2-common libapache2-mod-python libapache2-svn

5. Criar as pastas onde serão colocados os projetos

$ sudo mkdir -p /var/lib/svn/

$ sudo mkdir -p /var/lib/trac/

6. Criar o projeto Subversion

$ cd /var/lib/svn/

$ sudo svnadmin create +projeto+

6.1 Caso esteja restaurando um backup carregar o backup após criar o projeto

$ svnadmin load +projeto+ < +projeto+.svndump

7. Esta configuração é para o Apache poder ler no diretório

$ sudo chgrp -R www-data +projeto+

$ sudo chown -R g+w +projeto+

8. Criar o projeto Trac

$ cd /var/lib/trac/

$ sudo trac-admin +projeto+ initenv

8.1 Caso esteja restaurando um backup pular o passo anterior e executar

$ tar -zxvf +projeto+.tar.gz -C /var/lib/trac/

9. Esta configuração é para o Apache poder ler no diretório do Trac

$ sudo chgrp -R www-data +projeto+

$ sudo chown -R g+w +projeto+

10. Configurar o apache para servir os sites do Subversion, via Webdav e do Trac via mod_python

$ cd /etc/apache2/sites-available/

$ sudo vim svn

— code —
NameVirtualHost *:80

<VirtualHost *:80>
ServerName svn.home.local
ServerAlias svn
ServerAdmin allan.garcia@gmail.com
ErrorLog /var/log/apache2/error_svn_log
CustomLog /var/log/apache2/access_svn_log common

<Location /+projeto+>
DAV svn
SVNPath /var/lib/svn/+projeto+
AuthType Basic
AuthName “+projeto+ Subversion Repository”
AuthUserFile /var/lib/trac/+projeto+/.passwd
Require valid-user
</Location>

</VirtualHost>
— code —

$ sudo vim trac

— code —
<VirtualHost *:80>
ServerName trac.home.local
ServerAlias trac
ServerAdmin allan.garcia@gmail.com
ErrorLog /var/log/apache2/error_trac_log
CustomLog /var/log/apache2/access_trac_log common

<Location /+projeto+>
SetHandler mod_python
PythonHandler trac.web.modpython_frontend
PythonOption TracEnv /var/lib/trac/+projeto+
PythonOption TracUriRoot /+projeto+
AuthType Basic
AuthName “+projeto+ Trac”
AuthUserFile /var/lib/trac/+projeto+/.passwd
Require valid-user
</Location>

</VirtualHost>
— code —

$ sudo a2ensite svn

$ sudo a2ensite trac

Criar o arquivo htpasswd para o projeto

$ cd /var/lib/trac/+projeto+/

$ sudo htpasswd -c .passwd +usuario+

11. Configurar o arquivo hosts para responder para o localhost os nomes configurados no Apache

$ sudo vim /etc/hosts

— code —
127.0.0.1 trac.home.local trac svn.home.local svn
— code —

12. Reiniciar e testar

$ sudo /etc/init.d/apache2 reload

acessar http://svn/+projeto+ para o subversion
acessar http://trac/+projeto+ para o trac