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.