Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[Scripts] RebuildPackages et FindLibrary
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index French
View previous topic :: View next topic  
Author Message
ZeLegolas
Tux's lil' helper
Tux's lil' helper


Joined: 26 Apr 2005
Posts: 128

PostPosted: Tue Jun 19, 2007 7:06 am    Post subject: [Scripts] RebuildPackages et FindLibrary Reply with quote

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.
Code:
#!/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.
Code:
#!/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 :
Code:
# ./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 :
Code:
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
Back to top
View user's profile Send private message
Temet
Advocate
Advocate


Joined: 14 Mar 2006
Posts: 2579
Location: 92

PostPosted: Tue Jun 19, 2007 7:10 am    Post subject: Reply with quote

Pourquoi ne pas avoir mis ça dans "Documentations, Astuces et Scripts" ??
Back to top
View user's profile Send private message
geekounet
Bodhisattva
Bodhisattva


Joined: 11 Oct 2004
Posts: 3756
Location: Lyon, France

PostPosted: Tue Jun 19, 2007 8:44 am    Post subject: Reply with quote

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

Déplacé ;)
_________________
Google+ | Twitter
Back to top
View user's profile Send private message
ultrabug
Developer
Developer


Joined: 24 Jan 2005
Posts: 698
Location: Paris

PostPosted: Fri Jun 22, 2007 5:31 pm    Post subject: Reply with quote

Merci en tout cas !
Back to top
View user's profile Send private message
ZeLegolas
Tux's lil' helper
Tux's lil' helper


Joined: 26 Apr 2005
Posts: 128

PostPosted: Sun Jul 08, 2007 3:24 pm    Post subject: Reply with quote

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

Code:
#!/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
Back to top
View user's profile Send private message
truc
Advocate
Advocate


Joined: 25 Jul 2005
Posts: 3199

PostPosted: Mon Jul 09, 2007 11:43 am    Post subject: Reply with quote

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 :) , sinon, bah, j'n'ai pas encore pris le temps de tout lire, mais merci de partager ton travail :)


EDIT: Rho, j'avais zappé, bon ça va ça déchire comme 2000ème post? :lol:
'tain, j'passe trop de temps ici moi :twisted:
_________________
The End of the Internet!
Back to top
View user's profile Send private message
ZeLegolas
Tux's lil' helper
Tux's lil' helper


Joined: 26 Apr 2005
Posts: 128

PostPosted: Mon Jul 09, 2007 12:11 pm    Post subject: Reply with quote

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"

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 :) , sinon, bah, j'n'ai pas encore pris le temps de tout lire, mais merci de partager ton travail :)


EDIT: Rho, j'avais zappé, bon ça va ça déchire comme 2000ème post? :lol:
'tain, j'passe trop de temps ici moi :twisted:


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

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...
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index French All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum