#!/bin/sh # Détection de mises à jour # # nicofo - http://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, ... # 17/07/07 : v2 : version Fedora 7 # 04/10/07 : v2.1 : correction pour smart # 27/10/07 : v2.2 : icône fenêtre zenity # 21/10/08 : v2.3 : corrections ($VERSION_ACTUELLE et suppression "..." dans $UPDATES) # 24/10/08 : v2.4 : ajout option --no-notif # 12/01/09 : v2.5 : suite corrections v2.3 (suppression "\n" dans $UPDATES) # 11/04/09 : v2.6 : utilisation konsole OU gnome-terminal # 25/09/09 : v2.7 : nom des fichiers temporaires contiennent le PID # 22/12/09 : v2.8 : tient en compte les "Obsoleting" # arguments : checkUpdate [--no-notif] [YUM_OPT] # --no-notif pas de notification si pas de mise à jour # YUM_OPT options ajoutées à yum # 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), smart, sudo smart #MAJ=pup #avec pup #MAJ=smart #avec smart #MAJ=ssmart #avec sudo smart #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] #exemple : NON_UPDATE=(openoffice kde) NON_UPDATE=(openoffice) #--------------------------------------------------------------------------------- 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 } if [ "$1" = "--no-notif" ]; then NO_NOTIF=1 shift fi ARGS_YUM="$*" sudo yum check-update $ARGS_YUM -d 0 > $UPDATES 2> $UPDATESERROR RET_YUM=$? #Fedora 7 : yum check-update renvoie # 100 si il y a des updates # 0 si le système est à jour # 1 si erreur #1) ERREURS if [ $RET_YUM -eq 1 ] then zenity --notification --text="Erreur lors de la commande yum check-update $ARGS_YUM : $(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 #2) PAS DE MISES À JOUR if [ $RET_YUM -eq 0 ] then [ ! "$NO_NOTIF" = "1" ] && zenity --notification --text="Le système est à jour ! " "$ICON_OK" quit 0 fi #3) MISES À JOUR DISPONIBLES #le fichier $UPDATES ne contient que les updates sed -i '/^$/d' $UPDATES #supprimer les lignes vides (la 1ère) sed -i "N;s/\.\.\.\n *//;P;D" $UPDATES #suppression du "..."+retour à la ligne si une ligne est trop longue (ancienne version de yum ? -> n'est plus nécessaire ?) sed -i "N;s/\n \+/ /;P;D" $UPDATES #suppression du "\n" si une ligne est trop longue (nouvelle version de yum ?) sed -i '/^Obsoleting Packages$/d' $UPDATES #supprimer cette ligne NOMBREUPDATES=$(wc -l $UPDATES | cut -f1 -d' ') #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 unset 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 $(cat $UPDATES) while [ $# -gt 0 ] do [ -n "$(echo $3|grep "@anaconda-")" ] && shift && shift && shift && continue #"Obsoleting packages" 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 #$1 = paquet ; ${1%.*} = paquet sans extension .i386, .noarch, ... #$2 = nouvelle version ; ${2#*:} = version sans le "1:" devant VERSION_ACTUELLE=$(rpm -q --queryformat "%{VERSION}-%{RELEASE}\n" $1|sort|tail -1) #LIST="$LIST $check "${1%.*}" "${2#*:}" "$VERSION_ACTUELLE" "$3"" # <-- pas OK si un champ contient des espaces 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 ] && [ ! "$NO_NOTIF" = "1" ]; 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=$((137+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=$((137+25*$NOMBREUPDATES)) fi # NOTIFICATION # ################ zenity --notification --text="${TEXT_NOTIF}" "$ICON_MAJ" # FENÊTRE DE MÀJ # ################## if [ ! "$MAJ" = "pup" ] then PACK=$(zenity \ --list \ --title="Mise à jour du système" \ --text="$TEXT" \ --checklist \ --width=800 \ --height=$HAUTEUR_ZENITY \ $ICON_MAJ \ --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 if [ -n "$(echo "$MAJ"|grep "smart")" ]; then UPDATE="upgrade" #smart upgrade pgm else UPDATE="update" #yum update pgm fi case "$MAJ" in syum|ssmart) CMD="echo -e \"\t$UPDATE $ARGS_YUM\n\n\" ; sudo $(echo $MAJ|sed s/^s//) $UPDATE $ARGS_YUM $PACK ; bash -c \"checkUpdate $ARGS_YUM&\" ; exec bash" [ "$DESKTOP_SESSION" = "kde" ] && \ konsole -e bash -c "$CMD" || \ gnome-terminal -e "bash -c '$CMD'";; #gnome-terminal -e "bash -c 'echo -e \"\t$UPDATE $ARGS_YUM\n\n\";sudo $(echo $MAJ|sed s/^s//) $UPDATE $ARGS_YUM $PACK;bash -c \"checkUpdate $ARGS_YUM&\";exec bash'";; yum|smart) CMD="echo -en \"\t$UPDATE $ARGS_YUM\n\nEntrez le mot de passe root : \" ; su -c \"$MAJ $UPDATE $ARGS_YUM $PACK\" ; bash -c \"checkUpdate $ARGS_YUM&\" ; exec bash" [ "$DESKTOP_SESSION" = "kde" ] && \ konsole -e bash -c "$CMD" || \ gnome-terminal -e "bash -c '$CMD'";; #gnome-terminal -e "bash -c 'echo -en \"\t$UPDATE $ARGS_YUM\n\nEntrez le mot de passe root : \";su -c \"$MAJ $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