#!/bin/sh #détection de mises à jour #nicofo - nicofo.tuxfamily.org #18/06/06 : v0 #16/08/06 : v1.0 : checkbox #09/11/06 : v1.1 : affichage de la nouvelle version #27/11/06 : v1.2 : affichage de la version actuelle #09/12/06 : v1.3 : hauteur zenity #30/01/07 : v1.4 : ajout 'if [ $? -eq 1 ]' dans traitement des erreurs #12/02/07 : v1.5 : ajout de NON_UPDATE #21/03/07 : v1.6 : LIST_NOTIF_NON_UPD, ... #renvoie 0 (système à jour) # 1 (système mis à jour) # 2 (système non mis à jour) # 255 (erreur) #--------------------------------------------------------------------------------- # OPTION : # indiquer de quelle manière effectuer les mises à jour : # mise à jour avec pup , yum (demande passwd), sudo yum (sans passwd) #MAJ=pup #avec pup #MAJ=yum #avec yum MAJ=syum #avec sudo yum #--------------------------------------------------------------------------------- #localisation des icônes à afficher dans la zone de notification ICON_MAJ="$HOME/bin/icons/cu_maj.png" #màj dispo ICON_OK="$HOME/bin/icons/cu_ok.png" #le système est à jour ICON_ERR="$HOME/bin/icons/cu_erreur.png" #erreur #--------------------------------------------------------------------------------- #programmes à ne pas updater (ne pas checker) [entre parenthèses séparés par des espaces] NON_UPDATE=(openoffice kde) #--------------------------------------------------------------------------------- for icon in ${!ICON_*} do eval path=\$$icon if [ -f "$path" ] then export $icon="--window-icon=$path" else echo "'$path' n'est pas une icône valide." export $icon="" fi done UPDATES=/tmp/updates.tmp UPDATESERROR=/tmp/updates.err.tmp quit() { rm $UPDATES rm $UPDATESERROR exit $1 } ARGS_YUM="$*" sudo yum check-update $ARGS_YUM > $UPDATES 2> $UPDATESERROR #traitement des erreurs : if [ $? -eq 1 ] || [ -z "$(grep 'Reading repository metadata in from local files' $UPDATES)" ] #si vide then zenity --notification --text="Erreur lors de la commande yum check-update : $(cat ${UPDATESERROR})" "$ICON_ERR" zenity --question --title="Erreur yum check-update" --text="$(cat ${UPDATESERROR}|tr '<>' '[]') Réessayer ?" #tr ==> pour supprimer les éventuels '<' et '>' qui provoquent des erreurs avec zenity #ici, $? vaut 1 si 'cancel' ; 0 si 'OK' ; 137 si a été killé if [ $? -eq 0 ] then checkUpdate $ARGS_YUM exit $? else quit 255 fi fi #recherche de la ligne avant les updates (elle est vide) : NUMLIGNE=$(grep -x "" $UPDATES -n|tail -1) #cherche la dernière ligne vide : renvoie par exemple '4:' if [ -z $NUMLIGNE ] #==> pas de ligne vide ==> pas de màj then zenity --notification --text="Le système est à jour ! " "$ICON_OK" quit 0 fi set $(echo "$NUMLIGNE"|sed "s/:/ /g") #sed : remplace ':' par ' ' NUMLIGNE=$1 NOMBRELIGNES=$(grep "" -c $UPDATES) #nombre de lignes du fichier NOMBREUPDATES=$(($NOMBRELIGNES-NUMLIGNE)) #nombre d'updates trouvées #mise en forme : LIST_NOTIF=" : " #liste des paquets pour la zone de notifications LIST_NOTIF_NON_UPD="" #liste des paquets à ne pas updater pour la zone de notifications LIST="" #liste des paquets pour les check-box N_FALSE=0 #nombre de paquets à ne pas updater (=> not checked pour check-box) #constitution des listes de paquets : set $(tail -$NOMBREUPDATES $UPDATES) while [ $# -gt 0 ] do nu=0 #non update for NU in ${NON_UPDATE[@]}; do if [ -n "$(echo $1|grep $NU)" ]; then nu=1 break fi done if [ -n "$(echo $ARGS_YUM|grep "enablerepo=$3")" ] || [ $nu -eq 1 ] ; then #-n = non vide check="FALSE" N_FALSE=$(($N_FALSE+1)) LIST_NOTIF_NON_UPD="${LIST_NOTIF_NON_UPD} $1 $2 ($3)" else check="TRUE" LIST_NOTIF="${LIST_NOTIF} $1 $2 ($3)" fi VERSION_ACTUELLE=$(rpm -q --queryformat "%{VERSION}-%{RELEASE}\n" $1|sort|tail -1) LIST="$LIST $check "$1" "$2" "$VERSION_ACTUELLE" "$3"" shift;shift;shift done NOMBREUPDATESCHECKED=$(($NOMBREUPDATES-$N_FALSE)) #nombre d'updates (sans les non-ckeckées) #messages à afficher if [ $NOMBREUPDATES -eq 1 ] ; then TEXT="Une mise à jour est disponible" else if [ $N_FALSE -eq 0 ] ; then TEXT="$NOMBREUPDATES mises à jour sont disponibles" else TEXT="$NOMBREUPDATES ($NOMBREUPDATESCHECKED/$NOMBREUPDATES) mises à jour sont disponibles" fi fi if [ $NOMBREUPDATES -eq $N_FALSE ]; then #pas de màj checkée ICON_MAJ=$ICON_OK fi #texte de la notification : if [ $NOMBREUPDATES -gt 20 ] then if [ $NOMBREUPDATESCHECKED -gt 20 ] || [ $NOMBREUPDATESCHECKED -eq 0 ]; then TEXT_NOTIF=$TEXT else TEXT_NOTIF="$TEXT${LIST_NOTIF} ------------------------------- ($N_FALSE mises à jour en plus)" fi HAUTEUR_ZENITY=$((118+25*20)) else if [ $NOMBREUPDATESCHECKED -eq 0 ]; then TEXT_NOTIF="$TEXT${LIST_NOTIF_NON_UPD}" elif [ $N_FALSE -eq 0 ]; then TEXT_NOTIF="$TEXT${LIST_NOTIF}" else TEXT_NOTIF="$TEXT${LIST_NOTIF} -------------------------------${LIST_NOTIF_NON_UPD}" fi HAUTEUR_ZENITY=$((118+25*$NOMBREUPDATES)) fi # NOTIFICATION # ################ zenity --notification --text="${TEXT_NOTIF}" "$ICON_MAJ" # FENÊTRE DE MÀJ # ################## if [ "$MAJ" = "yum" ] || [ "$MAJ" = "syum" ] then PACK=$(zenity \ --list \ --title="Mise à jour du système" \ --text="$TEXT" \ --checklist \ --width=700 \ --height=$HAUTEUR_ZENITY \ --separator=" " \ --column="" \ --column="Application" \ --column="Nouvelle version" \ --column="Version actuelle" \ --column="Dépôt" \ $LIST) else PACK="ok" zenity --question --title="Mise à jour du système" --text="$TEXT${LIST_NOTIF} ${LIST_NOTIF_NON_UPD} Voulez-vous mettre à jour le système ?" fi #ici, $? vaut 1 si 'cancel' ; 0 si 'OK' ; 137 si a été killé if [ $? -eq 0 ] && [ -n "$PACK" ] then case "$MAJ" in syum) gnome-terminal -e "bash -c 'echo -e \"\tupdate $ARGS_YUM\n\n\";sudo yum update $ARGS_YUM $PACK;bash -c \"checkUpdate $ARGS_YUM&\";exec bash'";; yum) gnome-terminal -e "bash -c 'echo -en \"\tupdate $ARGS_YUM\n\nEntrez le mot de passe root : \";su -c \"yum update $ARGS_YUM $PACK\";bash -c \"checkUpdate $ARGS_YUM&\";exec bash'";; *) pup;checkUpdate $ARGS_YUM&;; esac RET=1 #système mis à jour else RET=2 #système non mis à jour fi quit $RET