View previous topic :: View next topic |
Author |
Message |
ZeLegolas Tux's lil' helper
Joined: 26 Apr 2005 Posts: 128
|
Posted: Tue Jun 19, 2007 7:06 am Post subject: [Scripts] RebuildPackages et FindLibrary |
|
|
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 |
|
|
Temet Advocate
Joined: 14 Mar 2006 Posts: 2586 Location: 92
|
Posted: Tue Jun 19, 2007 7:10 am Post subject: |
|
|
Pourquoi ne pas avoir mis ça dans "Documentations, Astuces et Scripts" ?? |
|
Back to top |
|
|
geekounet Bodhisattva
Joined: 11 Oct 2004 Posts: 3772 Location: Wellington, Aotearoa
|
Posted: Tue Jun 19, 2007 8:44 am Post subject: |
|
|
Temet wrote: | Pourquoi ne pas avoir mis ça dans "Documentations, Astuces et Scripts" ?? |
Déplacé |
|
Back to top |
|
|
ultrabug Developer
Joined: 24 Jan 2005 Posts: 698 Location: Paris
|
Posted: Fri Jun 22, 2007 5:31 pm Post subject: |
|
|
Merci en tout cas ! |
|
Back to top |
|
|
ZeLegolas Tux's lil' helper
Joined: 26 Apr 2005 Posts: 128
|
Posted: Sun Jul 08, 2007 3:24 pm Post subject: |
|
|
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 |
|
|
truc Advocate
Joined: 25 Jul 2005 Posts: 3199
|
Posted: Mon Jul 09, 2007 11:43 am Post subject: |
|
|
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?
'tain, j'passe trop de temps ici moi _________________ The End of the Internet! |
|
Back to top |
|
|
ZeLegolas Tux's lil' helper
Joined: 26 Apr 2005 Posts: 128
|
Posted: Mon Jul 09, 2007 12:11 pm Post subject: |
|
|
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?
'tain, j'passe trop de temps ici moi |
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 |
|
|
|
|
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
|
|