# [Scripts] RebuildPackages et FindLibrary

## ZeLegolas

Bonjour,

Je me suis fait 2 petits scripts qui sont sans prétention mais qui pourront sans doute aider quelque uns :

1 - RebuildPackages : Ce script va lancer une mise à jour des packages en gardant une trace de tous ce qu'il fait. Si un package plante il passera au suivant. Utile quand on est pas necessairement devant son écran. 

```
#!/bin/bash

# Generation de packages.lst avec la commande suivante

#

# Recompilation de tous les packages :

#  emerge -ep --columns world | grep ebuild > packages.lst

#

# Mise a jour des packages :

#  emerge -up --deep --newuse --columns world | grep ebuild > packages.lst

if [[ $# -eq 0 ]]

then

 echo "Selectionner le mode : "

 echo " 1 - Recompilation de tous les packages"

 echo " 2 - Mise a jour des packages system"

 echo " 3 - Mise a jour des packages world"

 echo " 4 - Mise a jour des packages system puis world"

 echo " 5 - Utiliser la liste existant"

 echo " 0 - Abandonner"

 echo " "

 echo " Pour creer sa propre liste de packages a recompiler faire :"

 echo "  emerge -up --columns <liste des packages> | grep ebuild  > packages.lst"

 echo " "

 echo " Exemples :"

 echo "  emerge -up --columns gcc glibc | grep ebuild > packages.lst"

 echo "  emerge -up --columns \$(cat ~/portage/portage-kde) | grep ebuild > packages.lst"

 echo " "

 read -p "Faites votre choix :" CHOIX

 echo " "

 echo "Vous avez selectionne : "

 case "$CHOIX" in

  1) echo " $CHOIX : emerge -ep --columns world | grep ebuild > packages.lst"

     emerge -ep --columns world | grep ebuild > packages.lst

     ;;

  2) echo " $CHOIX : merge -up --deep --newuse --columns system | grep ebuild > packages.lst"

     emerge -up --deep --newuse --columns system | grep ebuild > packages.lst

     ;;

  3) echo " $CHOIX : emerge -up --deep --newuse --columns world | grep ebuild > packages.lst"

     emerge -up --deep --newuse --columns world | grep ebuild > packages.lst

     ;;

  4) echo " $CHOIX : emerge -up --deep --newuse --columns system | grep ebuild > packages.lst"

     echo "          emerge -up --deep --newuse --columns world | grep ebuild >> packages.lst"

     echo " "

     emerge -up --deep --newuse --columns system | grep ebuild > packages.lst

     emerge -up --deep --newuse --columns world | grep ebuild >> packages.lst

     ;;

  5) ;;

  0) exit

     ;;

 esac

fi

echo " "

DIRLOG="rebuild/$(date +%Y-%m-%d)/$(date +%H-%M-%S-%N)"

mkdir -p $DIRLOG > /dev/null

if [[ ! -f packages.lst ]]

then

 echo Fichier packages.lst manquant

 exit

else

 mv packages.lst $DIRLOG/packages.lst

fi

echo Download packages

echo - Download packages ----------------------------------------        >> $DIRLOG/all.log

emerge -f $(cat $DIRLOG/packages.lst  | cut -d ' ' -f 8)   2>&1          >> $DIRLOG/all.log

echo - Download packages ------------------------------------------      >> $DIRLOG/all.log

echo " "

for i in $(cat $DIRLOG/packages.lst | cut -d ' ' -f 8)

do

 echo Current [$i]

 emerge $i &> $DIRLOG/current.log

 RET=$?

 if [[ $RET -eq 0 ]]

 then

  echo "Success : $i" >> $DIRLOG/success.log

 else

  echo "Error   : $i" >> $DIRLOG/error.log

  cp $DIRLOG/current.log $DIRLOG/err-$(echo $i| cut -d '/' -f2).log

 fi

 echo - Begin ---------------------------------------- >> $DIRLOG/all.log

 echo $i >> $DIRLOG/all.log

 echo ------------------------------------------------ >> $DIRLOG/all.log

 cat $DIRLOG/current.log >> $DIRLOG/all.log

 echo - End ------------------------------------------ >> $DIRLOG/all.log

done

```

2 - FindLibrary : Vous avez une librairie dans /usr/lib et vous vous demandez qui l'utilise. Ce script peut vous aider.  Donnez lui le nom de la librarie, exemple libxvidcore.so et il vous donnera la liste des autres librairies et des exécutables qui y font référence, ainsi que les packages associés. Ce script est interessant car il va directement chercher dans les binaires l'information.

```
#!/bin/bash

if [[ $# -eq 0 ]]

then

 echo "Syntaxe : "

 echo " \$1 : La librarie"

 echo " "

 echo "Exemple : "

 echo " ./FindLibrary stdc "

fi

PACKAGESLST="$(pwd)/$(date +%Y%m%d%H%M%S%N).lst"

# 1 - Concat les repertoires de PATH et ceux de ld.so.conf

# 2 - Recherche dans les repertoires a la fois bin et lib

DIRS=$PATH:$(echo $PATH | sed "s/\/bin/\/lib/g"):$(cat /etc/ld.so.conf | grep -o "^/.*" | sed "s/\/\//\//g" | gawk '{ print $1,":"}')

DIRS=$(echo $DIRS | gawk  'BEGIN {RS=":"};{ print $1,":"}' | sort -u)

# Parcours les repertoires

echo $DIRS | gawk  'BEGIN {RS=":"};{print $1}' | while read REP

do

  # Va dans le repertoire

  pushd $REP &> /dev/null

  # Liste l'ensemble des fichiers contenu dans le repertoire

  ls -1 | while read FILE

  do

   # Creation du nom du fichier avec son path complet

   NAME="$REP/$FILE"

   # Controle que le fichier est bin un executable ou une librairie

   TYPE=$(file $NAME 2> /dev/null | grep -o "ELF")

   if [[ $TYPE != "" ]]

   then

    # Recherche dans le binaire si celui-ci fait reference a notre librairie

    GAWKCMD="/NEEDED.*$1/ { printf \"%s %s %s\n\", \"$NAME\", \"PACKAGE\", \$2 }"

    OUT=$(objdump -x $NAME | gawk "$GAWKCMD")

   # Si nous trouvons notre librairie nous cherchons le package correspondant

   # a notre fichier

   if [[ $OUT != "" ]]

    then

     # Extraction du nom du package

     PACKAGE=$(qfile -C $NAME | sed "s/\(.*\)[ ].*/\1/")

     echo $PACKAGE >> $PACKAGESLST

     # Reformatage de l'affichage

     GAWKCMD="{ printf \"%-50s %-30s %s\n\", \$1, \$2, \$3 }"

     # Nous substituons "PACKAGE" par le nom du package et nous l'affichons

     PACKAGE=$(echo $PACKAGE|sed "s/\//\\\\\//")

     echo $OUT | sed "s/PACKAGE/$PACKAGE/" | gawk "$GAWKCMD"

    fi

   fi

  done

  # Retour au repertoire d'origine

  popd &> /dev/null

done

# Prepare un fichier utilisable par le script RebuildPackages

emerge -p --columns $(cat $PACKAGESLST | uniq) | grep ebuild > packages.lst

echo " "

echo "Commande pour emerge :"

echo "emerge -p " $(cat $PACKAGESLST | uniq)

# Detruit le fichier temporaire

rm  $PACKAGESLST

```

Exemple :

```
# ./FindLibrary libxvidcore.so

/usr/bin/mencoder                                  media-video/mplayer            libxvidcore.so.4

/usr/bin/mplayer                                   media-video/mplayer            libxvidcore.so.4

/usr/lib/libavcodec.so.51.40.2                     media-video/ffmpeg             libxvidcore.so.4

Commande pour emerge :

emerge -p  media-video/mplayer media-video/ffmpeg

```

Pour que ces scripts fonctionnent  vous devez avoir installé sur votre machine les packages suivants :

```
app-portage/portage-utils

sys-devel/binutils

sys-apps/coreutils

sys-apps/sed

sys-apps/gawk

sys-apps/portage

sys-apps/grep

sys-apps/file

```

Comme je l'ai dis au début ils sont sans prétention et sont fournis "AS IS".Last edited by ZeLegolas on Sun Jun 24, 2007 4:04 am; edited 2 times in total

----------

## Temet

Pourquoi ne pas avoir mis ça dans "Documentations, Astuces et Scripts" ??

----------

## geekounet

 *Temet wrote:*   

> Pourquoi ne pas avoir mis ça dans "Documentations, Astuces et Scripts" ??

 

Déplacé  :Wink: 

----------

## ultrabug

Merci en tout cas !

----------

## ZeLegolas

Voici une autre version de FindLibrary. Celle-ci corrige certains pbs que l'on peut avoir avec la precedente 

Changement :

- Etablit une liste des fichiers binaires avant de les controler

- Certain fichiers binaires ne sont ni present dans PATH et ni dans ld.so.conf. Ils sont par contre dans un de leurs sous repertoires, cette version va les chercher.

- si le path du fichier est > a 50 il est tronque a l'affichage

```
#!/bin/bash

if [[ $# -eq 0 ]]

then

 echo "Syntaxe : "

 echo " \$1 : La librarie"

 echo " "

 echo "Exemple : "

 echo " ./FindLibrary stdc "

 exit

fi

PACKAGESLST="$(pwd)/FindLibray.package.$(date +%Y%m%d%H%M%S%N).tmp"

FILESLST1="$(pwd)/FindLibrary.files1.$(date +%Y%m%d%H%M%S%N).tmp"

FILESLST2="$(pwd)/FindLibrary.files2.$(date +%Y%m%d%H%M%S%N).tmp"

# 1 - Concat les repertoires de PATH et ceux de ld.so.conf

# 2 - Recherche dans les repertoires a la fois bin et lib

DIRS=$PATH:$(echo $PATH | sed "s/\/bin/\/lib/g"):$(cat /etc/ld.so.conf | grep -o "^/.*" | sed "s/\/\//\//g" | gawk '{ print $1,":"}')

DIRS=$(echo $DIRS | gawk  'BEGIN {RS=":"};{ print $1,":"}' | sort -u)

# S'assure que la liste de fichiers n'existe pas avant

rm $FILESLST1 &> /dev/null

# Parcours les repertoires et etablie une liste des fichiers binaires a controler

echo $DIRS | gawk  'BEGIN {RS=":"};{print $1}' | while read REP

do

  # Liste des fichiers binaires

  find $REP -executable -type f -exec file '{}' \; 2> /dev/null | grep ELF | sed "s/\(.*\): .*/\1/"  >> $FILESLST1

done

# Trie la liste des fichiers et enleve les doublons 

cat $FILESLST1 | sort -u > $FILESLST2

rm $FILESLST1

cat $FILESLST2 | while read NAME

do

 if [[ ${#NAME} -gt 50 ]]

 then

  NAMEDISPLAY="...${NAME:$((${#NAME}-47))}"

 else

  NAMEDISPLAY=$NAME

 fi

 # Recherche dans le binaire si celui-ci fait reference a notre librairie

 GAWKCMD="/NEEDED.*$1/ { printf \"%s %s %s\n\", \"$NAMEDISPLAY\", \"PACKAGE\", \$2 }"

 OUT=$(objdump -x $NAME | gawk "$GAWKCMD")

 # Si nous trouvons notre librairie nous cherchons le package correspondant

 # a notre fichier

 if [[ $OUT != "" ]]

 then

  FILENAME=$(echo $NAME| sed "s/.*\/\(.*\)$/\1/")

  # Extraction du nom du package

  PACKAGE=$(qfile -C $FILENAME | tail -n 1 | sed "s/\(.*\)[ ].*/\1/")

  echo $PACKAGE >> $PACKAGESLST

  # Reformatage de l'affichage

  GAWKCMD="{ printf \"%-50s %-30s %s\n\", \$1, \$2, \$3 }"

  # Nous substituons "PACKAGE" par le nom du package et nous l'affichons

  PACKAGE=$(echo $PACKAGE|sed "s/\//\\\\\//")

  echo $OUT | sed "s/PACKAGE/$PACKAGE/" | gawk "$GAWKCMD"

 fi

done

# Destruction du fichier temp

rm $FILESLST2 &> /dev/null

# Prepare un fichier utilisable par le script RebuildPackages

emerge -p --columns $(cat $PACKAGESLST | uniq) | grep ebuild > packages.lst

echo " "

echo "Commande pour emerge :"

echo "emerge -p " $(cat $PACKAGESLST | uniq)

# Detruit le fichier temporaire

rm  $PACKAGESLST
```

----------

## truc

salut, pas grand chose à dire si ce n'est une petite remarque sur sed:

au lieu de te galérer à échapper des '/' omme ici par exemple:

DIRS=$PATH:$(echo $PATH | sed "s/\/bin/\/lib/g"):$(cat /etc/ld.so.conf | grep -o "^/.*" | sed "s/\/\//\//g" 

sache que tu peux utiliser un auter séparater que '/' lui même, ainsi si je prends un '#' à la place ça donne

DIRS=$PATH:$(echo $PATH | sed "s#/bin#/lib#g"):$(cat /etc/ld.so.conf | grep -o "^/.*" | sed "s#//#/#g" 

Si je ne m'abuse, et au passage en faisant ça j'ai remarqué que tu avais un 'cat' inutil dans cette même ligne, (c'est une critique constructive hein? Je ne prendrais pas de temps de commenter sinon)

cat /etc/ld.so.conf | grep -o "^/.*" 

le cat ici est inutil, tu peux directement jouer avec grep:! 

grep -o "^/.*"   /etc/ld.so.conf 

Et si on veut pousser le vice encore un peu plus loin, tu n'as en fait même pas besoin de grep, car tu peux selectionner avec sed:

par exemple selectionner les lignes que tu voulais comme ça sed '\#^/.*#!d'   (ou '#' est encore une fois le spérateur)

ainsi ta ligne peut s'écrire (toujours si je ne fais pas d'erreur)

sed -e '\#^/.*#!d' -e 's#//#/#g' /etc/ld.so.conf

en poussant à l'extrème on peut du coup simplifier la première regex en ça

sed -e '\#^/#!d' -e 's#//#/#g' /etc/ld.so.conf

Voili-voilou, en éspérant que ça peut aider  :Smile:  , sinon, bah, j'n'ai pas encore pris le temps de tout lire, mais merci de partager  ton travail  :Smile: 

EDIT: Rho, j'avais zappé, bon ça va ça déchire comme 2000ème post?  :Laughing: 

'tain, j'passe trop de temps ici moi  :Twisted Evil: 

----------

## ZeLegolas

 *truc wrote:*   

> salut, pas grand chose à dire si ce n'est une petite remarque sur sed:
> 
> au lieu de te galérer à échapper des '/' omme ici par exemple:
> 
> DIRS=$PATH:$(echo $PATH | sed "s/\/bin/\/lib/g"):$(cat /etc/ld.so.conf | grep -o "^/.*" | sed "s/\/\//\//g" 
> ...

 

Merci pour tes commentaires, ils sont appréciés  :Smile: 

Une évolution à laquelle je pensais est de trier la liste des packages en fonction de leurs dépendances respectives. 

Quand j'aurai un peu de temps je jetterai un oeil...

----------

