sábado, 25 de julho de 2015

Processando arquivos e strings contendo espaços no Bash

A última vez que eu escrevi um script decente em bash foi em 2001. Lá se vão vários anos, até que eu esquecesse totalmente de como programar em bash. Tornei-me monolíngue em C.
Gozado, o que exige-se de um usuário de Windows é que saiba clicar no botão iniciar (ainda existe? Deixei de usar este "sistema" ainda na versão 95) e usar o pacote de escritórios da Microsoft. Já o que se exige de um usuário GNU/Linux é que ele tenha seja onisciente em computação... E isso é bom. Um dia chego à perfeição. :-D

Tive problemas com com arquivos cujos nomes continham espaços.
O delimitador de campos do bash é o espaço. Para lidar com nomes e strings contendo espaço (e fazer com que tudo seja interpretado como um único campo), podemos mudar para próxima linha.
A variável IFS é a responsável para mudar este delimitador.

Ao digitar no bash (por uma sessão), ou no script
IFS=$'\n' (ou IFS=$ \n) ,
altera-se o delimitador de campo, e aí conseguimos processar strings que contenham espaço, como nomes de arquivos com espaço.
\n é o caractere de próxima linha também no bash (velho conhecido de quem usa C).

segunda-feira, 20 de julho de 2015

Completion no VIM

Sabe aquele recurso de IDEs como Eclipse, NetBeans, ou mesmo o Bash, que propõem maneiras de completar um comando, nome de variável, complemento de comando etc?
Só agora descobri que ele está disponível no VIM (nunca precisei usar, mas acho que é útil principalmente quando se está programando em linguagens orientadas a objeto).

Para utilizá-lo, basta, ainda no modo de edição, pressionar 'ctrl+n' em cima de uma palavra ou comando ainda a completar.
Veja este exemplo, quando eu queria que fossem dadas opções para completar a função printf():

domingo, 12 de julho de 2015

Atualizando o firmware OpenWRT para uma nova versão

Depois de instalar a versão "factory" do firmware do OpenWRT para o TL-WDR4300 da TP-Link (ou do seu roteador), ou seja, a versão que substituiu o firmware original do fabricante, as próximas versões a instalar do firmware OpenWRT são de atualização, as "sysupgrade".
Uma vez que o sistema está funcionando a contento, já temos acesso à Internet, a rede interna funciona etc (ou, temos apenas a rede interna funcionando), podemos atualizar o sistema.

Para atualizarmos o firmware OpenWRT, precisamos copiar o arquivo com o firmware para o diretório /tmp do roteador. Isso pode ser feito através de comandos como scp (caso já tenha baixado o firmware no seu computador, e queira apenas copiar para o roteador).
Um exemplo seria
scp < caminho para o firmware em seu PC > root@openwrt:/tmp/

É possível, também, estar dentro do diretório /tmp, no roteador e utilizar o comando wget para baixar o firmware.

Depois de colocar o firmware no diretório /tmp, pode-se proceder de duas formas:

1) Sobreescrever a memória FLASH (Flash Overwrite)
Para mais instruções sobre este método, siga o link.
Neste método, porém, é preciso reconfigurar a sua rede e a sua conexão com a Internet novamente. Ajuda se tiver backups

2) Procedimento genérico de atualização do sistema (Generic Upgrade)
Este procedimento é descrito no link.
Foi o procedimento que eu segui.
Ele trás a vantagem de incluirmos os arquivos de configuração a preservar (menos os que estiverem em um disco USB) no roteador, e ao fazer a atualização, a rede já volta funcionando quando o novo firmware já estiver rodando, desde que não tenha configurações baseadas em pacotes que você teve de baixar por não estar por padrão dentro do firmware corrente).

Vou relatar aqui, os passos principais para realizar a atualização do modo que eu fiz

2.1) Informe ao OpenWRT quais arquivos de configuração deseja manter
Basicamente, você deve escrever o caminho para eles no arquivo /etc/sysupgrade.conf

2.2) Faça uma lista de pacotes que baixou para reinstalá-los no OpenWRT após a atualização (necessário para que os pacotes trabalhem em sintonia com o kernel mais atual)

Uma maneira de fazer isso é executar o comando proposto no último link:

find /overlay/ | sed s:/overlay::g | while read file; do opkg search $file; done | awk '{print $1}' | sort | uniq

2.3) Uma vez que o firmware, de algum modo, já esteja no diretório /tmp, utilizar o comando

sysupgrade -v /tmp/openwrt-ar71xx-generic-tl-wdr4300-v1-squashfs-sysupgrade.bin

No lugar de openwrt-ar71xx-generic-tl-wdr4300-v1-squashfs-sysupgrade.bin, deve ser o firmware do roteador por você possuído.

A saída do comando, deve ser algo parecido com isso:
Saving config files...
root/statistics
etc/sysupgrade.conf
etc/sysctl.conf
etc/rc.local
etc/profile
etc/passwd
etc/firewall.user
etc/dropbear/dropbear_rsa_host_key
etc/dropbear/dropbear_dss_host_key
etc/config/wireless
etc/config/system
etc/config/network
etc/config/firewall
etc/config/dropbear
etc/config/dhcp
Switching to ramdisk...
Performing system upgrade...
Unlocking firmware ...

Writing from to firmware ...
Appending jffs2 data from /tmp/sysupgrade.tgz to firmware...TRX header not found
Error fixing up TRX header

Writing from to firmware ...
Upgrade completed
Rebooting system...

Ou seja, mostrando os arquivos de configuração que você resolveu manter, e depois fazendo o upgrade.

Depois que o sistema rebootar, ele voltará já rodando com o novo firmware, e com a rede básica e a conexão com a Internet funcionando.
Lembre-se, se for o caso, de reinstalar os pacotes que você havia baixado na versão anterior do firmware.

domingo, 14 de junho de 2015

Instalando OpenWRT no TL-WDR4300 da TP-Link

Aviso: De todos as postagens que eu fiz até agora contando minhas aventuras com GNU/Linux, esta é a que você mais pode se f*der  muito se tentar reproduzir o que eu fiz de forma desatenta. Não me responsabilizo por qualquer c*gada eventualmente praticada, mas posso tentar dar uma ajuda, se estiver dentro da minha alçada de conhecimento. Gostaria de alertar que ainda não sei/precisei lidar com dispositivos "brickados" (na verdade, ainda estou para recuperar o meu WRT54G v8, da Linksys, e só vou tentar do jeito mais difícil quando tiver um tempinho. Nele, usei DD-WRT, porque a baixa quantidade de ROM não me permitiu instalar OpenWRT).
O que é OpenWRT?

OpenWRT é uma distribuição GNU/Linux para dispositivos embarcados, em particular roteadores wireless.
Ele possui uma vasta coleção de pacotes, que podem ser instalados no roteador de modo muito similar ao apt-get no Debian.
Ele pode aumentar o número de funcionalidades de seu roteador sem fio doméstico para que possua serviços e utilidades semelhantes a de um roteador profissional (a limitação, geralmente, está no tamanho da memória RAM, da ROM do aparelho, e claro, do processador), além de ser uma ótima plataforma para aumentarmos o nosso conhecimento de redes (além de Hacking de dispositivos).

No meu caso, eu comprei um TP-Link TL-WDR4300. Originalmente, estava interessado em uma máquina da Buffalo, com 32MB de ROM e 128MB de RAM, mas ela aumentou muito o preço e acabei comprando a que já citei anteriormente, com apenas 8MB de ROM, mas a mesma quantidade de ROM.
Fiz essa compra em julho do ano passado (2014), e tive de instalar uma versão "trunk" experimental da Barrier Break, construída por um usuário mais avançado. Queria ter avançado e mexido mais no sistema, mas Mecânica Quântica da pós não deixou, e eu demorei uns 2 meses só para configurar o aparelho, por pura falta de tempo.
A atual versão é a 14.07, "Barrier Breaker". As versões levam o nome de bebidas, e ao entrar no roteador por ssh, obtém-se (em inglês)a receita para fazê-la. Portanto, se você é um bebum (não é o meu caso, eu não bebo), tem mais uma razão para utilzar o OpenWRT. (Recomendo que a instalação e configuração sejam realizadas enquanto você está sóbrio).
Dentro de algumas semanas, uma nova versão "Chaos Calmer" sairá do forno.
 


Roteador Wireless TL-WDR4300 da TP-Link
Para instalar OpenWRT neste dispositivo, segui os seguintes passos, posteriormente detalhados:
1 - Verificar qual versão do dispositivo possui a partir da interface web do produto

Isto também pode ser feito conforme instruções deste site aqui.

2 - Utilizar a Interface do produto para fazer o backup do firmware para a restauração, caso seja necessário (embora o firmware possa ser obtido do site do fabricante), bem como das configurações anteriormente passadas, caso já estivesse utilizando o roteador antes de instalar OpenWRT (não foi o meu caso)

3 - Baixar a versão apropriada do firmware OpenWRT para o seu hardware (pode não ser o meu)

No meu caso, tive de baixar os arquivos openwrt-ar71xx-generic-tl-wdr4300-v1-squashfs-factory.bin e openwrt-ar71xx-generic-tl-wdr4300-v1-squashfs-sysupgrade.bin .
O primeiro, será utilizado para instalar o OpenWRT retirando o firmware da TP-Link. O segundo será necessário para seguir instalando e configurando coisas no roteador, além de, daqui para frente, sempre atualizar o sistema a partir de imagens sysupgrade.

4 - Instalar a versão por algum meio (em geral, a primeira instalação é feita a partir da interface web do próprio firmware original do dispositivo)

É recomendável fazer isso a partir de um computador que esteja conectado ao roteador via cabo, pois após a atualização do firmware para OpenWRT, o sinal wireless está, inicialmente, desligado.
Dá para fazer isso de várias formas, já fiz por tftp (no meu Linksys, dispensei o jeito fácil e fiz por tftp), mas a mais simples é utilizando a opção de upgrade de firmware da própria interface web do roteador.
Menu de configuração da interface web
No caso do TL-WDR4300, deve-se acessar o roteador pelo endereço 192.168.0.1(este é o endereço padrão do roteador na rede) em seu browser, clicar em "System Tools" --> "Firmware Upgrade" no menu à esquerda, e irá aparecer a tela onde deverá ser colocado o arquivo da firmware.
Tela de atualização de firmware
 Selecione o arquivo que contém o firmware "factory" do OpenWRT.

No meu caso, é o caminho para o arquivo openwrt-ar71xx-generic-tl-wdr4300-v1-squashfs-factory.bin .
Após a instalação do firmware, se bem sucedida, você conseguirá acessar o roteador por telnet. O usuário é "root", e não há senha.
Após a configuração de uma senha, com o comando passwd, o acesso via telnet será desativado e a conexão se dará por ssh.

$ telnet 192.168.1.1 --> Para acessar o roteador, cujo o endereço é 192.168.1.1
root@OpenWrt:~# passwd --> Para alterar a senha do roteador.
Para acessar o roteador, posteriormente, deve-se acessá-lo com ssh:
$ ssh root@openwrt (o DNS está ativado).
Depois de instalado o firmware "factory", deve ser instalado o firmware "sysupgrade", e depois, todas as demais atualizações serão a partir de imagens "sysupgrade".

No próximo artigo, aprenderemos como configurar a rede wireless e a rede WAN (a conexão com a Internet).
Os artigos por vir são:
- Instalação da versão sysupgrade e  Configuração do OpenWRT
- Backup das configurações e atualização do firmware
- Um pouco da arquitetura do OpenWRT (estrutura de diretórios, arquivos de configuração, formas de configurá-lo etc) e do TL-WDR4300
- Instalando QoS (Controle de Qualidade, para controlar a distribuição de banda entre os clientes)
- Instalando dispositivos de armazenamento
- Configurando serviços como SAMBA, torrent, NFS

Possíveis serviços em que tenho interesse em configurar:
- VPN

quinta-feira, 28 de maio de 2015

Configurando saída de áudio HDMI com a placa de vídeo radeon HD5450 no Debian

Isto é uma coisa que demorei muito para aprender (tipo, uns 5 meses), mas que quando configurado, torna-se fácil.
Cheguei a perder as esperanças, pois em algum momento, apenas o driver proprietário catalyst permitia tal configuração.
Digitando 'lspci' no prompt, obtemos, entre as várias saídas, este resultado, caso tenham a mesma placa que eu (ou da mesma família):

Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Cedar HDMI Audio [Radeon HD 5400/6300 Series]


Temos de fazer 3 coisas:

1) Configurar o GRUB para enviar uma mensagem ao kernel para ligar a saída de som HDMI para o driver radeon

Para isso, editamos o arquivo /etc/default/grub, e colocamos a opção

GRUB_CMDLINE_LINUX="radeon.audio=1"
Depois, é preciso atualizar o grub:
# update-grub

2) Selecionar a saída de som associada à placa de vídeo com o alsamixer

Digitamos alsamixer no prompt, e simplesmente alteramos a placa de som para 'HDA ATI HDMI'

3) Selecionar, eventualmente em cada software e mixers, o dispositivo associado à placa de vídeo

Esta parte, se necessária, depende do aplicativo que você está utilizando.

Se desejar (eu ainda não fiz isso), você pode entrar na BIOS e desabilitar a placa de som onboard na BIOS (ou desisntalar, se realmente deseja fazer isso), a placa de som offboard

sábado, 9 de maio de 2015

Aproveitamento dos pacotes debian anteriormente baixados em outros computadores

Para você que não quer perder tempo (ou para pessoas como eu, que moram na periferia e são negligenciadas pelas empresas de telecomunicações com planos de 'banda larga' para lá de limitados), e deseja aproveitar os pacotes já baixados de um computador em outro, há soluções:

1 - Copiar o pacote para o computador  (ou acessá-los remotamente), instalar com dpkg -i  < arquivo do pacote > e resolver as dependências manualmente, utilizando dpkg -i iterativamente;

2 - Utilizar softwares como aptoncd (# apt-get install aptoncd) que pegam tudo o que está no diretório /var/cache/apt/archives do computador de onde os diretórios foram baixados, gravam em um cd, e copiam para o mesmo diretório no computador em que deseja copiá-los. Com todo o respeito aos camaradas que curtiram a Revolução dos Cravos enquanto nós afundávamos no período mais terrível da nossa ditadura, este método aqui descrito considero-o como "lusitano" :-) .

3 - Copiar você mesmo os arquivos de /var/cache/apt/archives do computador de onde os pacotes foram instalados para o mesmo diretório na máquina em que deseja (o método, você escolhe: pendrive, DVD-R(W), scp, sshfs, samba, nfs, a pia da cozinha etc).

Depois de copiado, você pode instalar o pacote que deseja de duas maneiras:

1 - Usando dpkg (na verdade, você ainda vai precisar usar apt, provavelmente)
      # dpkg -i < arquivo do pacote > --> Instala o pacote diretamente
      # apt-get -f install --> Instala o pacote resolvendo as dependências faltantes. Se os pacotes faltantes já existem no cache, não serão baixados.

2 - Usando apt
      # apt-get install < pacote >

Você também pode atualizar o seu computador para uma outra distribuição dessa maneira.
Caso tenha atualizado um de seus computadores, basta copiar os pacotes para o /var/cache/apt/archives do computador que ainda não foi atualizado, e proceder conforme descrito minha postagem sobre a atualização para o Jessie .

segunda-feira, 27 de abril de 2015

Atualizando Debian GNU/Linux de Wheezy (7) para Jessie (8)

Eis que no dia 25 de abril de 2015, sábado (no meio do FLISOL São Paulo, que aconteceu junto à CryptoRave no Centro Cultural São Paulo), o projeto Debian atualizou sua distribuição estável do Wheezy para o Jessie.

Catei a imagem de  Br-Linux , deliberadamente. Esta aqui, se eu não me engano, é a namoradinha do 3.0 :-D
Não sei se o projeto lançou-o nesta data para homenagear a Revolução dos Cravos, mas enfim, está lançado.

Vou relatar o meu procedimento para atualizar a distribuição aqui em casa.
Antes de começar, eu procurei atualizar todas os pacotes no Wheezy para as suas versões mais atuais. Creio que esse procedimento, talvez, seja desnecessário. Utilizei (sempre como root) apt-get update e apt-get upgrade com o apt configurado ainda para apontar para o Wheezy.

Depois, segui o caminho relatado no Capítulo 4 das Notas de Lançamento do Jessie.
A atualização consistiu em 3 fases:
  1. Fazer uma atualização segura de pacotes que não causam problemas
  2. Fazer a atualização completa
  3. Purgar (remover completamente, inclusive logs e arquivos de configuração) pacotes orfãos que não serão aproveitados na versão 9, e que já não são necessários na versão atual.
Parte 1: Fazer uma atualização segura de pacotes que não causam problemas

Para a primeira parte, eu, primeiro atualizei o arquivo de fontes do APT (o arquivo que informa o APT de onde baixar os pacotes da distribuição), presente em /etc/apt/sources.list. Basicamente, substitui tudo que tinha wheezy por jessie.
Depois, digitei os comandos (sempre como root)
# apt-get update --> Atualiza a lista de pacotes
# apt-get upgrade --> Faz a atualização mínima do sistema
Parte 2:  Fazer a a atualização completa do sistema
# apt-get dist-upgrade
Pode haver alguma interação na atualização do sistema quando da substituição de pacotes importantes.

Parte 3:  Purgar os pacotes que não serão utilizados, mas que não foram removidos.
# aptitude purge '~c'

No link que eu passei, há mais informações e considerações que devem ser consideradas, visite o link para verificar se você precisa observá-las.

Referências

Notas de Lançamento para Debian 8 (Jessie)