Debian - Repositórios Volatile e Sloppy

O tempo entre os releases de duas versões do Debian costuma ser relativamente alto. Entre a liberação das verões Sarge (3.0) e Etch (4.0) passaram-se aproximadamente 21 meses. Da versão Etch para a atual Lenny (5.0) foram mais 22 meses. Alguns projetos mudam pouco nesse intervalo (como o postfix e o squid), porém outros, mais dinâmicos por natureza (como antivírus e filtros de spam) costumam lançar melhorias consideráveis nesse intervalo de tempo. O clamav por exemplo mudou completamente (a versão do clamav no Debian Etch simplesmente fica carregando o banco de dados de vírus indefinidamente ...). Para solucionar problemas desse tipo, o Debian criou o Projeto Volatile, que em suas próprias palavras "contém apenas as alterações necessárias em programas estáveis para deixá-los funcionais". Os pacotes presentes nos repositórios Volatile não demandam alterações em arquivos de configuração, basta instalar e continuar utilizando o arquivo de configuração anterior. Pacotes em que isso não é possível, e que podem gerar alguma dor-de-cabeça na instalação ficam na seção volatile-sloppy dos repositórios.

Instalação:
Nada mais simples: basta acrescentar as entradas correspondentes no seu arquivo /etc/apt/sources.list


Os servidores principais são estes (prontos para serem colados no sources.list):

#Etch
deb http://volatile.debian.org/debian-volatile etch/volatile main contrib non-free
deb http://volatile.debian.org/debian-volatile etch/volatile-sloppy main contrib non-free

#Lenny
deb http://volatile.debian.org/debian-volatile lenny/volatile main contrib non-free
deb http://volatile.debian.org/debian-volatile lenny/volatile-sloppy main contrib non-free

E também existem os mirrors brasileiros:

#Etch
deb http://sft.if.usp.br/debian-volatile etch/volatile main contrib non-free
deb http://sft.if.usp.br/debian-volatile etch/volatile-sloppy main contrib non-free

#Lenny
deb http://sft.if.usp.br/debian-volatile lenny/volatile main contrib non-free
deb http://sft.if.usp.br/debian-volatile lenny/volatile-sloppy main contrib non-free

Após instalar os repositórios, atualize o pacote debian-archive-keyring, que possui a chave utilizada pelos repositórios
aptitude install debian-archive-keyring
A chave para o Etch não está contida neste arquivo, e deve ser instalada da seguinte maneira:
wget http://www.debian.org/volatile/etch-volatile.asc
apt-key add etch-volatile.asc
Após isso, basta rodar o aptitude update (ou apt-get update) e começar a atualizar os programas. Apesar de confiar na equipe do Debian, eu recomendo que você atualize um programa de cada vez, prestando bastante atenção no processo, para evitar surpresas desagradáveis.

Dica de segurança: Desabilitando o IPv6

O protocolo IPv6 possui diversas vantagens sobre o seu irmão mais novo velho IPv4, atualmente em uso. No entanto, atualmente a sua presença pode tornar-se um incômodo: algumas pessoas reportam problemas na resolução de nomes (DNS) quando o protocolo está ativo. Além disso, ele ainda pode tornar-se uma falha de segurança:

Imagine que você configurou o seu firewall, utilizando o iptables. Suponha que você bloqueou o acesso a pings na sua máquina, com o comando
iptables -A INPUT -p icmp -j DROP 
Até aqui tudo certo. Agora, verifique o endereço IPv6 da sua placa de rede.
debian:~# ifconfig eth0
eth0   Encapsulamento do Link: Ethernet  Endereço de HW 00:0C:29:58:2A:F7
          inet end.: 192.168.0.1  Bcast:192.168.0.255  Masc:255.255.255.0
          endereço inet6: fe80::20d:88ff:fefc:da1b/64 Escopo:Link
          UP BROADCASTRUNNING MULTICAST  MTU:1500  Métrica:1
          RX packets:231001053 errors:0 dropped:0 overruns:0 frame:0
          TX packets:213003406 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000
          RX bytes:2227548162 (2.0 GiB)  TX bytes:3267118860 (3.0 GiB)
          IRQ:217 Endereço de E/S:0x2480
No nosso exemplo, o endereço IPv6 da placa é fe80::20d:88ff:fefc:da1b. Agora, experimente "pingar" seu endereço IPv6, com o utilitário ping6:
debian:~# ping6 -I eth0 fe80::20d:88ff:fefc:da1b
PING fe80::20d:88ff:fefc:da1b(fe80::20d:88ff:fefc:da1b) from fe80::20d:88ff:fefc:da1b eth0: 56 data bytes
64 bytes from fe80::20d:88ff:fefc:da1b: icmp_seq=1 ttl=64 time=0.169 ms
64 bytes from fe80::20d:88ff:fefc:da1b: icmp_seq=2 ttl=64 time=0.036 ms
64 bytes from fe80::20d:88ff:fefc:da1b: icmp_seq=3 ttl=64 time=0.036 ms
64 bytes from fe80::20d:88ff:fefc:da1b: icmp_seq=4 ttl=64 time=0.035 ms

--- fe80::20d:88ff:fefc:da1b ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.035/0.069/0.169/0.057 ms
Surpresa!!! Olha o ping funcionando ... Ué, bug do iptables? Nada disso. O iptables cuida apenas de endereços IPv4. Para proteger os endereços IPv6 de seu equipamento, você tem duas opções:
  • Utilizar o ip6tables (utilitário semelhante ao iptables, mas para endereços IPv6) ou
  • desabilitar completamente o IPv6 da máquina.
Para desabilitar o IPv6 no Debian Linux é muito simples: basta criar um arquivo com o nome /etc/modprobe.d/00local (os dois zeros no começo do nome são importantes, para garantir que o arquivo será lido antes dos outros presentes no diretório, quando da inicialização do sistema) com o seguinte conteúdo:
alias net-pf-10 off
alias ipv6 off
Após salvar o arquivo, é necessária a reinicialização do sistema (o módulo não vai sair da memória com um rmmod ipv6). 

Screen - O Gerenciador de Sessões em modo texto

Introdução
Imagine as seguintes situações:
  1. Você está digitando um texto no vi (ou outro editor de texto) conectado através de uma sessão SSH e por alguma razão a conexão cai. Quando você reconecta, vê que o vi ainda está rodando, mas não tem como recuperar a sessão onde ele se encontra. Assim, você mata o processo e começa novamente.
  2. Você coloca um arquivo para fazer download através do wget; mas o download acaba durando mais tempo do que o desejado. Suas opções são: cancelar o download e continuar depois (o que desperdiçaria tudo o que já foi baixado) ou deixar a sessão aberta sem você por perto para que o download acabe (o que é um rombo na segurança).
Com o uso do screen (que age como um shell), ambos os problemas teriam uma solução simples. Quando se está conectado e utiliza-se o screen e ocorre uma perda de conexão, ao reconectar voltamos a utilizar a mesma sessão de antes, permitindo assim continuar o trabalho de onde paramos. Da mesma forma, podemos desconectar do screen sem fechá-lo (mantendo a sessão ativa), e posteriormente ao reconectar todos os programas ainda estarão em execução. O screen permite ainda que duas pessoas de máquinas diferentes compartilhem a mesma sessão! Perfeito para mostrar a execução de uma tarefa a um amigo que não está no mesmo local que você.

Screen é apresentado no seu site como um gerenciador de janelas que multiplexa (divide) um único terminal virtual em vários. Na prática, ele permite que com apenas uma conexão SSH você abra vários terminais simultâneamente (similar à função das teclas F1, F2, F3 ... do console), além de outras funções muito úteis. Esse artigo visa ser uma pequena introdução às facilidades dessa incrível ferramenta.

Instalação
O screen faz parte da maioria das distribuições atuais. Em sistemas Debian (ou derivados, como Ubuntu e Kurumin) a instalação é bem simples: basta um
debian:~# apt-get install screen
e o programa será instalado, com todas as suas dependências.
Também é possível a instalação através do código fonte, mas isso foge do escopo desse artigo.
Após a instalação, crie (com o vi ou outro editor de texto de sua preferência) um arquivo chamado .screenrc no diretório $HOME do seu usuário (/home/usuario OU /root para o root) com o conteúdo abaixo:
msgwait 3 sorendition 00 43 hardstatus alwayslastline " %c | %d/%m/%Y | %w" bind h hardstatus ignore bind g hardstatus alwayslastline
Esse arquivo de configuração facilita o uso do screen, acrescetando uma barra azul na parte inferior da tela, com informações de data, hora e a lista de janelas, e destaca a janela atual com um asterisco. Caso hajam vários usuários que irão utilizar o screen, você pode definir estas opções diretamente no arquivo de configuração do screen (/etc/screenrc)

Utilizando


Para chamar o screen, basta digitar
debian:~# screen
e o mesmo já estará em execução. Se você criou o arquivo de configuração citado acima, verá uma tela semelhante a esta (clique nas imagens para ampliar):


Esta mensagem aparece sempre que o screen é iniciado, mas é possível desativar sua exibição setando a opção "startup_message off" no arquivo de configuração do sistema ou individualmente por  usuário (/etc/screenrc ou ~/.screenrc respectivamente). Conforme diz a mensagem, pressione ENTER para continuar.

A utilização do screen é vinculada à combinação de teclas CTRL+a, seguida da tecla que representa a função desejada. Para facilitar, vamos adotar a mesma notação utilizada pelo programa: ao invés de escrever CTRL+a, escreverei ^a. Algumas funções podem ser chamadas de mais de uma maneira. Para exibir as combinações de teclas e suas funções, digite ^a ? (^a e em seguida ?). Se possuir espaço suficiente na janela, todas as teclas serão exibidas, e bastar pressionar ENTER para sair da ajuda. Caso não haja espaço, as informações serão paginadas. Nesse caso, a barra de espaço avança para a próxima tela e  ENTER sai.

Vou listar abaixo algumas das combinações mais utilizadas.
Obs1: algumas combinações utilizam letras maiúsculas.
Obs2: caso você acidentalmente pressione ^a s, a tela deixará de ser atualizada, embora tudo o que você digite continue funcionando. Para normalizar isto, pressione ^a q.

^a a: envia um CTRL+a (use isso se você utilizar um programa que necessite da sequência de teclas CTRL+a e o screen estiver atrapalhando.
^a c: cria uma nova aba.
^a ^a: alterna entre as duas últimas abas acessadas.
^a número: vai direto para a aba de numero X, onde X é um número entre 0 e 9.
^a " (aspas duplas): mostra a lista de abas abertas e permite selecionar uma. Útil para casos em que há mais de 10 abas (sim, as vezes acontece comigo ...)
^a A: renomeia a aba atual.
^a S: divide a tela, empilhando as abas. Pressione ^a TAB para alternar entre as abas. É necessário criar uma aba no espaço recém criado (^a c) ou "puxar" uma aba já criada para esse espaço (^a ^a ou ^a número). É possível executar ^a S várias vezes de modo a obter várias divisões, cada uma com sua própria aba. Para voltar ao modo normal, pressione ^a Q
^a d: sai do screen, porém deixa todas as abas abertas e seus respectivos processos rodando normalmente.

Para listar as sessões abertas, digite:
debian:~# screen -ls
There are screens on:
        3193.pts-0.debian       (Detached)
        3216.pts-0.debian       (Attached)
2 Sockets in /var/run/screen/S-root.
A resposta acima mostra que existem duas sessões do screen ativas, sendo que uma está conectada (Attached), ou seja, está em uso, e a outra desconectada (Detached), seja porque a sessão foi perdida (devido a uma queda de conexão remota) ou simplesmente foi desconectada com "^a d".
Para reconectar uma sessão, digite
debian:~# screen -r XXXX
 Onde XXXX é o PID (process ID) da sessão, obtido com screen -ls como mostrado acima. Caso haja apenas uma sessão em uso, não é necessário informar o PID.

Algumas vezes, a sua conexão é encerrada mas o sistema não percebe isso, e continua exibindo sua conexão como Attached quando você executa o screen -ls, não permitindo que você reconecte. Para forçar o sistema a desconectar uma sessão neste estado, digite
debian:~# screen -D
[3193.pts-0.debian power detached.]
Isso vai forçar a desconexão, permitindo que você reconecte. Da mesma forma que a opção screen -r, você terá de informar um número PID caso haja mais de uma conexão. Obs: algumas vezes a desconexão forçada falha, sendo necessário "matar" (com o kill) o processo do screen.

Basicamente é isso. Na verdade, daria para ficar escrevendo muito mais sobre essa ferramenta, mas esse é o básico do seu funcionamento (que já deve atender as necessidades da maioria das pessoas). Uma ótima fonte de informações sobre o screen (e vários outros utilitários em modo texto) é o site do Aurélio Marinho Jargas http://aurelio.net/ - com destaque para a Coluna do Auréliohttp://aurelio.net/doc/coluna/ - onde o Guru esmiuça vários softwares em modo texto. Leitura obrigatória!!

Gerador de Usernames à partir de lista de nomes

Esses dias vi um pedido na Lista Debian Users Portuguese (DUP) solicitando ajuda com um script que recebesse um arquivo com uma lista de nomes e gerasse uma lista de usernames. O email era esse:


Olá pessoal da lista, tudo bem?

Precisava de um auxilio de vocês ma geração (ou otimização) de um script.

Tenho uma rede com samba como PDC em uma escola e agora na volta as aulas preciso gerar usuários e senhas para todos. Eu tenho um script que utilizo a tempos que pega uma lista com nome, username e senha e gera tudo pra mim. Mas eu preciso gerar esta lista.

O que eu queria era conseguir com a lista de nomes, gerar os usernames de forma que o username seja o primeiro e o ultimo nomes juntos (sem espaço) com letras minusculas e a senha seria de 6 digitos, todos numéricos. Caso o username fosse repetido, o sistema me avisaria (Andre Silva e Andre pereira rodrigues silva por exemplo seria repetido). Eu (ainda) não tenho experiencia com programação, apenas um pouco de bash.

Fico grato por qualquer ajuda

Abraço a todos

Daniel
 Após meditar um pouco no problema do Daniel, criei este programa em PHP.

Preparação:
O programa utiliza a versão de linha de comando do PHP, então é necessária a instalação do mesmo. Testei o programa apenas com o PHP5, mas teoricamente deve funcionar com o PHP4 sem problemas. No Debian, instale o pacote php5-cli (ou php4-cli).
aptitude install php5-cli
Baixe o programa (disponível aqui , via GoogleDocs. Copie e cole em um arquivo de texto, com o nome de geraUsername.php), dê permissão de execução (chmod +x geraUsername.php) e execute o programa da seguinte maneira:
./geraUsername.php lista.txt > lista2.txt
Exemplo de uso:
Suponha uma lista de nomes como essa abaixo (os nomes são fictícios, quaisquer semelhanças com nomes reais são meras coincidências):

José da Silva
José Saramago da Silva
Juca Pirama
Daniel de Andrade
Daniel Souza
Odorico Paraguaçú
Alcebíades Nogueira
A saída do programa (o arquivo gerado em lista2.txt) seria essa:

alcebiadesnogueira,Alcebíades Nogueira
danielandrade,Daniel de Andrade
danielsouza,Daniel Souza
josesilva,José Saramago da Silva
josesilva,José da Silva
jucapirama,Juca Pirama
odoricoparaguacu,Odorico Paraguaçú

Lista de Usernames duplicados

josesilva => 2
O que o programa faz:

  • Faz a conversão de letras: Ç vira C, vogais acentuadas (com til, trema, crase, acentos agudos e/ou circunflexos) viram as mesmas vogais porém sem nenhum acento (ã vira a, ï vira i, ù vira u, etc)
  • Converte todo o texto para minusculas;
  • Insere o separador, caso haja algum configurado (veja mais abaixo)

Perceba que existem duas ocorrências do username josesilva. O programa alerta para isso na lista de usernames duplicados, no final da listagem. Cabe a você corrigir isso manualmente, o que é facilitado por causa da listagem ser ordenada pelos usernames, fazendo com que usernames iguais fiquem juntos.

O programa permite ainda uma personalização do modo como os usernames são criados: você pode definir um separador a ser inserido entre o nome e o sobrenome. Normalmente utiliza-se ponto (.), hífen (-) ou underscore (_) como elemento separador. Assim, o username josesilva ficaria jose.silva, jose-silva ou jose_silva, dependendo do separador utilizado. Não utilize vírgula como separador, pois vai "quebrar" a formatação do arquivo de saída, já que o mesmo utiliza vírgulas para separar o username do nome do usuário. Para realizar essa configuração, procure pelo texto $separadorUsername = ""; e substitua pelo valor desejado (por exemplo $separadorUsername = ".";).


Bom, é isso. Espero que seja útil para mais alguém. Caso você precise de uma ajudinha com um script, faça um comentário ou mande-me um email que terei prazer em ajudar na medida do possível.