quinta-feira, 27 de agosto de 2009

Shell Script para procura e download de novos arquivos

Na manutenção do meu sistema Linux eu tenho o hábito de fazer o download de todos os pacotes disponíveis no repositório Updates, para então atualizar o que for necessário. Não costumo usar o utilitário yum pois gosto de fazer o download de tudo e não somente das atualizações dos pacotes que estão instalados. Aliás este meu procedimento vem muito antes de existirem estes utilitários que facilitam a atualização de pacotes.

Para facilitar a vida e não ter que fazer todo o trabalho manualmente, desenvolvi um script para o Shell que faz tudo automaticamente. O script é capaz de verificar os pacotes que eu já tenho e selecionar os novos pacotes disponíveis no repositório, aplicando antes um filtro para retirar os pacotes que eu não desejo. Por fim realiza o download dos arquivos.

Para facilitar o entendimento do código do script é necessário descrever o meu cenário. Porém isto é só um exemplo já que a idéia deste artigo é mostrar a possibilidade de um script de pesquisa e download automáticos.

Dentro do meu diretório pessoal (home) existe um diretório (~/Fedora), no qual fica o script, e dentro dele há o diretório Updates que contém os pacotes recebidos por download. Na raiz do meu diretório pessoal existem os arquivos com os hashes MD5 dos arquivos que já foram gravados em DVD e que não estão mais no HD.

O script lê o conteúdo dos arquivos com os hashes, lista o conteúdo do diretório Updates e grava no arquivo "pacotes-que-ja-tem.txt". Em seguida lista o conteúdo do repositório e grava no arquivo "pacotes-no-repo-updates.txt". Para estes dois arquivos há um tratamento para retirar as informações extras e deixar somente os nomes dos pacotes.

Com estas duas listagens é feita uma comparação para verificar as diferenças e, após, aplica o filtro para retirar os pacotes que estão na lista negra. Neste ponto está pronto o arquivo "pra-baixar.txt" que contém a listagem dos pacotes novos.

Na interface com o usuário é apresentada a estatística com a contagem dos novos pacotes e o conteúdo da listagem. Antes de realizar o download o script faz uma pergunta para confirmar. Caso a resposta seja positiva, é feito o download dos pacotes dentro do diretório Updates.

Veja o código do script:

#!/bin/bash

sed 's/^.\{34\}//' ~/hash*.md5 | grep "Updates/" | sed 's/.*\///g' - > updates-baixados.txt

ls ~/Fedora/Updates/ >> updates-baixados.txt

sort updates-baixados.txt > pacotes-que-ja-tem.txt

lynx -dump ftp://download.fedora.redhat.com/pub/fedora/linux/updates/10/i386/ | awk '{print $2}'
| grep .rpm | sed 's/.*\///g' - | sort > pacotes-no-repo-updates.txt

diff pacotes-no-repo-updates.txt pacotes-que-ja-tem.txt | grep "< " | sed 's/< //' - > novidades.txt

diff novidades.txt lista-negra.txt | grep "< " | sed 's/< //' - > pra-baixar.txt

NOVO=`wc -l novidades.txt | awk '{print $1}'`
NEGRA=`wc -l lista-negra.txt | awk '{print $1}'`
BAIXAR=`wc -l pra-baixar.txt | awk '{print $1}'`

echo "Pacotes novos: ${NOVO}"
echo "Pacotes na lista negra: ${NEGRA}"
echo "Pacotes para baixar: ${BAIXAR}"
echo
echo "Listagem:"
echo
cat pra-baixar.txt
echo

if [ ! -s pra-baixar.txt ]; then
echo "Nada para baixar."
else
read -p "Deseja baixar os pacotes? (s/n) " ans
if [ "$ans" == 's' ]; then
POS=1
cd ~/Fedora/Updates/
while read PACOTE
do
echo -e "\n------------------- Baixando pacote ${POS} de ${BAIXAR} ------------------\n"
wget -c -T60 ftp://download.fedora.redhat.com/pub/fedora/linux/updates/10/i386/"$PACOTE"
POS=$((POS+1))
done < ../pra-baixar.txt
cd ..
echo -e "\nFeito!\n"
elif [ "$ans" == 'n' ]; then
echo -e "\nDesistindo...\n"
else
echo -e "\nResposta invalida.\n"
fi
fi

rm -f updates-baixados.txt pacotes-que-ja-tem.txt pacotes-no-repo-updates.txt novidades.txt pra-baixar.txt


O código é até feio visualmente, talvez mal estruturado, porém faz muito bem o que é para ser feito. E lembrando, apesar do script ser para buscar as atualizações da distro Fedora, é possível modificá-lo para atender a qualquer outro repositório de arquivos.

Nenhum comentário:

Postar um comentário