Ubuntu na terra do pão di queijo

21/02/2007

Coisas que não deveriam dar errado (Mas podem dar)

Filed under: Ubuntu — Leonardo Amaral @ 20:35

Hoje é um dos dias em que eu definitivamente não deveria ter saido de casa. Até sair de casa foi um perigo (a corrente da minha bicicleta soltou enquanto cruzava uma grande avenida – a Cristiano Machado – e acabei rasgando minha perna direita na coroa). Mas o pior está por vir…

Pela manhã, antes do incidente com a bicicleta, ví uma menságem preocupante do APT. Ele deu erro na remoção de um pacote quando executava o DPKG (já podem imaginar o quanto o trem foi feio).

“files list file for package `libfreetype6′ contains empty filename”

E ae? Como onde cargas d’água esse negocio foi dar pau? Comecei postando a história no IRC do Debian, quando me disseram que se tratava de arquivos .list corrompidos. Buscando por ai, descobri um script que pegava um arquivo Debian e arrancava o .list dele.

Prossegui fazendo na unha, e descobri que toda a pasta info tava zuada, fato confirmado por um lazarento fsck em modo seguro, e dai decidi fazer um script para recursar o processo.

O primeiro foi pra de fato oficializar o processo (colocar o script do elemento pra ler os arquivos de algum lugar). Já que a tarefa é redundante, lá vai um for:

#!/bin/bash
for i in `ls -1 *.deb`; do
packagename=`dpkg -I $i | grep Package | awk '{print $2}'`
dpkg -c `pwd`/$i | awk '{if ($6 == "./"){ print "/."; } \
else if (substr($6, length($6), 1) == "/")\
{print substr($6, 2, length($6) - 2); } \
else { print substr($6, 2, length($6) - 1);}}'\
> /var/lib/dpkg/info/$packagename.list;
done

Aqui vai o primeiro script, que salva o .info daquele pacote, na respectiva pasta.

Como eu também precisava saber quais pacotes estavam corrompidos, e eram muitos pra checar (vide o número de pacotes que tem no seu sistema), tentei achar algo que eles tinham em comum. E ví que eles sempre começavam com “/.”. Bingo, se o arquivo tivesse isso na primeira linha, então ele era íntegro, do contrario, tava zuado:

#!/bin/bash
for i in $(ls -1 *.list); do
cabecalho=`cat $i | head -n 1`
if [ "$cabecalho" != "/." ]; then
echo $(echo $i | awk -F'.list' '{ print $1 }')
fi
done

Então já sabia quem tava corrompido e como solucionar por pacotes. Agora é só fazer um script que puxa automagicamente os pacotes dos .infos corrompidos, e descorrompe-los:

#!/bin/bash
for i in $(/usr/bin/detecta_dpkg_info_quebrados.sh); do
smart download $i > /dev/null 2> /dev/null
arruma-dpkg-info.sh 2> /dev/null
mv *.deb /var/cache/apt/archives/ 2> /dev/null
done

Notem como eu estou usando o smart package manager, se quiserem usar o apt, esqueçam, pois o apt não consegue executar se o dpkg dá erro. com o aptitude tentei pouco, mas não obtive resultado. Se alguém interessar, posso construir via wget, mas não para todos os pacotes. Se alguém souber um meio de puxar os pacotes sabendo o nome deles e sem depender do dpkg, avisem.

Voilá! Coloquei tudo isso na minha pasta de binários (dúvidas em como fazer? Manda um comentário que eu ajudo) e rodei o último programa, que levou horas (deu tempo de sair de bike e me acidentar), mas resolveu o meu problema, pois ficaram somente 2 pacotes para trás, que eu havia instalado via .deb que me mandaram.

O que eu gostaria de focar é como se arruma soluções para problemas cabeludos, pois ninguém no canal entendeu como era, mas bastou alguém linkar em algo relativamente documentado (achei em um bug do lauchpad essa solução) para que eu pudesse criar minha própria solução.

Anúncios

6 Comentários »

  1. Olá conterrâneo,
    uma forma de instalar um pacote sem usar o dpkg ou outro gerenciador de pacote é através do comando:

    ar -x nomepacote.deb

    Serão criados 2 arquivos: control.tar.gz (contém o info e o md5) e data.tar.gz que contém os arquivos do pacote recriando a árvore do sistema.

    Assim você pode instalar qualquer pacote no sistema de forma manual.

    Comentário por Alan C. Assis — 22/02/2007 @ 7:45 | Responder

  2. Alan, a ideia e boa, mas a extração do .info não depende do sistema estar ok. A informação é interessante porque pode solucionar corrupção de outros arquivos também.

    Mas ainda meu calcanhar de aquiles é que só o smart conseguiu fazer o download dos pacotes e salvar na pasta, já que o apt-get depende do uncompress do dpkg (que dá pau quando temos arquivos corrompidos) e o aptitude nem sei porque deu errado.

    De toda forma, fica a dica.

    Comentário por Leonardo Amaral — 22/02/2007 @ 8:37 | Responder

  3. Aê, conterrâneo! Não entendi porra nenhuma, mas tá valendo. Fui…

    Comentário por luizao — 22/02/2007 @ 11:00 | Responder

  4. Para isso, tenho uma explicação:
    Lei de Murph!!

    Comentário por Simette — 22/02/2007 @ 15:32 | Responder

  5. Simette; a.k.a. Ces’t la Vie!!!!

    Comentário por Leonardo Amaral — 22/02/2007 @ 20:27 | Responder

  6. Bem simples a solução mas muito importante. Nunca passei por esse problema.

    Comentário por Alex — 23/02/2007 @ 9:26 | Responder


RSS feed for comments on this post. TrackBack URI

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Crie um website ou blog gratuito no WordPress.com.

%d blogueiros gostam disto: