View previous topic :: View next topic |
Author |
Message |
olivier elmekki n00b
Joined: 29 Jan 2006 Posts: 55
|
Posted: Tue Jul 11, 2006 7:40 pm Post subject: [SCRIPT] gérer /etc/portage/ |
|
|
Bonjour,
Ce script à pour but de permettre de gérer les fichiers présent dans /etc/portage/ avec une commande unique. On peut ajouter une entrée, en retirer/modifier une ou plusieurs, ou montrer le fichier (ou juste une partie du fichier). En le lançant par exemple avec les options '-r use compiz', on supprime tous les atoms intégrant 'compiz' dans leur nom. Le détail de l'utilisation est fourni dans la fonction usage().
Je sais que ce genre d'outils prettent à polémique, parce que leur bénéfice semble peu important face à la perte de compréhension des rouages qu'ils impliquent, mais comme gentoo est une question de choix, n'hurlons pas au scandale, s'il vous plaît
J'en suis venu à faire ce script principalement par crainte de mettre un '>' à la place d'un '>>' à chaque fois que je faisais un echo 'atom use' >> package.use (par exemple). Il ne remplace pas un tâche forcément très fastidieuse, mais je pourrais rajouter des fonctionnalités si jamais quelqu'un s'en sert et m'en demande.
J'apprécierai aussi beaucoup des critiques conceptuelles et stylistiques, car bash n'est pas mon langage favori, et je me sens un peu pateau avec
Code: |
!/bin/bash
# récupération des arguments
arg_mode="$1"
arg_fichier="$2"
declare -a expression
i=0
while [ "$3" != "" ]; do
expression[i]="$3"
i=$[i+1]
shift
done
base='/etc/portage/package.'
usage() {
echo "\
usage: $0 <mode> <fichier> <expression>
mode: -a: ajouter un élément au fichier
-r: retirer un élément au fichier
-s: chercher un élément dans le fichier
fichier: au choix: keywords, use, mask ou unmask
expression: l'expression doit être consitituée au minimum de l'atom concerné.
Si le fichier est keywords, un type de masque peut être spécifié, faute de quoi ~x86 est choisi par défaut.
Si le fichier est use, les use a enlever ou ajouter doivent être spécifier à la suite de l'atome.
exemples:
$0 -r keywords dev-lang/python
$0 -a mask app-editors/emacs
$0 -a use dev-lang/ruby threads doc -tcltk
$0 -r use app-editor/vim vim-with-x
$0 -s use
$0 -s use x11-terms/rxvt-unicode
"
}
# traitement des arguments
arg_parse() {
case $arg_mode in
"-a" ) mode="ajouter" ;;
"-r" ) mode="retirer" ;;
"-s" ) mode="voir" ;;
* ) usage; exit;;
esac
if [ "$arg_fichier" == "keywords" ] || [ "$arg_fichier" == "use" ] || [ "$arg_fichier" == "mask" ] || [ "$arg_fichier" == "unmask" ]; then
fichier="$arg_fichier"
else
usage
exit
fi
}
ajouter() {
echo $1 >> $base$fichier
echo "ajout effectué"
exit
}
retirer() {
f_tmp="/dev/shm/$fichier"
cp $base$fichier $f_tmp
cp $base$fichier $base$fichier"~"
atom_preserv="$(echo $atom |sed 's/\//\\\//')" # il faut échapper le '/' dans le nom des atoms
if [ "$fichier" == "use" ] && [ "${tab_uses[0]}" != "" ]; then
i=0
while [ "${tab_uses[$i]}" != "" ]; do
awk '/'$atom_preserv'/ {sub(/ '${tab_uses[$i]}'/, "")}; {print}' $base$fichier > $f_tmp
mv $f_tmp $base$fichier
# on supprime toute la ligne s'il n'y a plus de use spécifié dedans
un_use="$(awk '/'$atom_preserv'/ {print $2}' $base$fichier)"
if [ "$un_use" == "" ]; then tab_uses[0]=""; retirer; fi
i=$[$i+1]
done
else
awk '$0 !~ "'$atom_preserv'"' $base$fichier > $f_tmp 2>&1
mv $f_tmp $base$fichier
fi
echo -e "atom(s) modifié(s):\n" "$(cat $base$fichier"~" | grep $atom | cut -d ' ' -f 1)"
exit
}
exist?() {
# on quitte en cas de demande incohérente
resultat="$(cat $base$fichier | grep $atom)"
if [ "$fichier" != "use" ] && [ "$mode" == "ajouter" ] && [ "$resultat" != "" ]; then
echo "cet atom est déjà présent dans $base$fichier"
exit
fi
if [ "$mode" == "retirer" ] && [ "$resultat" == "" ]; then
echo "cet atom n'est pas présent dans $base$fichier"
exit
fi
}
voir(){
if [ "$atom" != "" ]; then
recherche="$(cat $base$fichier | grep $atom)"
recherche="$(awk '/'$atom'/ ' $base$fichier | grep $atom)"
reg_atom="$(echo $atom | sed 's/^/\//')"
reg_atom="$(echo $reg_atom | sed 's/$/\//')"
else
recherche="$(cat $base$fichier)"
fi
if [ "$recherche" == "" ]; then
echo "cet atom n'est pas présent dans $base$fichier"
else
awk ''$reg_atom' {
texte="\033[33m" $1
i=2
while ( i <= NF ) {
if ( $i ~ /^-/ ) { texte=texte" \033[34m" }
else { texte=texte" \033[31m" }
texte=texte$i
i++
}
print texte
}' $base$fichier 2>&1
fi
}
# main
arg_parse
atom=${expression[0]}
case $fichier in
"keywords" )
if [ "${expression[1]}" != "" ]; then keyword=${expression[1]}; else keyword="~x86"; fi # par défaut, le keyword est ~x86
case $mode in
"ajouter" ) exist?; ajouter "$atom $keyword";;
"retirer" ) exist?; retirer;;
"voir" ) voir;;
esac;;
"mask" | "unmask" )
case $mode in
"ajouter" ) exist?; ajouter $atom;;
"retirer" ) exist?; retirer;;
"voir" ) voir;;
esac ;;
"use" )
declare -a tab_uses
i=1
while [ "${expression[$i]}" != "" ]; do tab_uses[$i-1]="${expression[$i]}"; i=$[$i+1]; done
case $mode in
"ajouter" )
exist?
if [ "$resultat" == "" ]; then
ajouter "$atom ${tab_uses[*]}"
else
echo -e "atom(s) modifié(s):"
j=0
nbr_lignes=$(echo -e "$resultat" | wc -l)
for (( j=1; j <= nbr_lignes; j++ )); do
i=0
cp $base$fichier $base$fichier"~"
atom_tmp="$(echo -e "$resultat" | head -n $j | tail -n 1)"
while [ "${tab_uses[$i]}" != "" ]; do
resultat_preserv="$(echo -e "$atom_tmp" |sed 's/\//\\\//')"
sed -i 's/'"$resultat_preserv"'/'"$resultat_preserv"' '${tab_uses[$i]}'/' $base$fichier
i=$[$i+1]
done
echo -e "$atom_tmp" | cut -d ' ' -f 1
done
fi
;;j
"retirer" ) exist?; retirer;;
"voir" ) voir ;;
esac;;
esac
|
|
|
Back to top |
|
|
BuBuaBu l33t
Joined: 09 Jul 2005 Posts: 914 Location: France
|
Posted: Wed Jul 12, 2006 11:02 am Post subject: |
|
|
Le gros problème c'est que tout se barre au sync ...
Une solution serai de faire un overlay, et de copier le fichier modif dedans (avec tout ce qu'il faut) |
|
Back to top |
|
|
olivier elmekki n00b
Joined: 29 Jan 2006 Posts: 55
|
Posted: Wed Jul 12, 2006 2:11 pm Post subject: |
|
|
Quote: | Le gros problème c'est que tout se barre au sync ... |
Je ne comprends pas ce que tu veux dire... Chez moi, emerge --sync ne touche pas à /etc/portage/* ...
Il s'agit bien ici de ce qui ce trouve dans /etc/portage, et non pas de ce qu'il y a dans /usr/portage |
|
Back to top |
|
|
BuBuaBu l33t
Joined: 09 Jul 2005 Posts: 914 Location: France
|
Posted: Wed Jul 12, 2006 9:22 pm Post subject: |
|
|
olivier elmekki wrote: | Quote: | Le gros problème c'est que tout se barre au sync ... |
Je ne comprends pas ce que tu veux dire... Chez moi, emerge --sync ne touche pas à /etc/portage/* ...
|
J'avais rien compri au script ... |
|
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
|
|