#!/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 packages" # 28/09/10 : v2.9 : amélioration des "Obsoleting packages" (dépôt = @...) # 01/01/11 : v2.10 : mise à jour KDE 4.6 # 22/03/11 : v2.11 : ajout '--no-notif' à la relance de checkUpdate # 29/05/11 : v2.12 : correction IS_KDE # 19/07/11 : v2.13 : sup. msg d'erreur (avec plus de 2 séries d'espaces) de yum dans la liste des màj # 01/08/11 : v2.14 : mise à jour sed (supprimer '\n+espace' et 'plus de séries d'espaces') # 22/01/12 : v2.15 : utilisation de 'yad' au lieu de 'zenity' pour les notifications # 05/01/13 : v2.16 : suppression 'sort' dans calcul de 'VERSION_ACTUELLE' # 17/02/13 : v2.17 : --no-notif -> quitte aussi si il n'y a que des màj non checkées # 05/03/13 : v2.18 : Correction "Obsoleting packages" (suite à màj yum ?) # 20/03/13 : v2.19 : Ajout --cleanGrub pour corriger grub2.conf après màj du kernel. # 05/05/13 : v2.20 : suppression 'sort' dans calcul du dernier kernel (car risque de bug avec kernel-3.8.9 > kernel-3.8.10) # 02/09/13 : v2.21 : --cleanGrub remplacé par --newKernel et grub2.conf plus modifié (bug dans grub corrigé) # 27/12/13 : v2.22 : suppression de la notification de "pas de màj disponible" après 5 min (--timeout=300) # 06/07/14 : v2.23 : 'Obsoleting packages' : le dépôt du paquet remplacé est "@" ou "installed" (ajout de cette 2e cdt) # 15/09/14 : v2.24 : suppression de la notification de "màj disponibles" après 5 min (--timeout=300) # 13/10/14 : v2.25 : détections de mise à jour majeure # 22/07/15 : v2.26 : mise à jour IS_KDE pour plasma ; remplacement de yum par dnf ; suppression du support de pup (anciennes versions de Fedora) # 13/04/16 : v2.27 : mise à jour "Obsoleting Packages" avec dnf (dnf update et non ) # 29/04/16 : v2.28 : (test avec $TERM pour pas lancer ds un nv terminal ; ajout de 2>/dev/null) # 04/07/17 : v2.29 : suppression de la suppression de la notification de "màj disponibles" après 5 min (--timeout=300) (v2.24) # 20/10/20 : v2.30 : suppression du support de dnf sans sudo et de smart ; les NON_UPDATE sont quand même mis à jour en cas de màj majeure # arguments : checkUpdate [--newKernel ][--no-notif] [DNF_OPT] # --newKernel affiche message quand un nouveau kernel a été installé # --no-notif pas de notification si pas de mise à jour # DNF_OPT options ajoutées à dnf # rem concernant l'option '--enablerepo' : # 1) --enablerepo= => les paquets ne sont pas checkés # 2) --enablerepo => les paquets sont checkés (comme les autres) # renvoie 0 (système à jour) # 1 (système mis à jour) # 2 (système non mis à jour) # 255 (erreur) #--------------------------------------------------------------------------------- #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 en cas de mise à jour mineure (ne pas checker) [entre parenthèses séparés par des espaces] #exemple : NON_UPDATE=(openoffice kde) NON_UPDATE=(libreoffice kernel) #--------------------------------------------------------------------------------- [ -n "$(echo $DESKTOP_SESSION | grep 'kde\|plasma')" ] && IS_KDE=1 || IS_KDE=0 #utilisation de konsole ou gnome-terminal if [ -n "$(which yad 2>/dev/null)" ]; then NOTIFIER=yad NOTIF_ICON_OPT="--image" #option yad pour modifier l'icône else NOTIFIER=zenity NOTIF_ICON_OPT="--window-icon" fi for icon in ${!ICON_*} do eval path=\$$icon if [ -f "$path" ] then export $icon="--window-icon=$path" #pour fenêtres autres que notifications (zenity) export NOTIF_${icon}="$NOTIF_ICON_OPT=$path" #pour les notifications (yad ou zenity) 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 } # Actions à effectuer en cas de mise à jour du kernel # (initialement pour mettre à jour grub2.conf pour l'intégration KDM - GRUB2) if [ "$1" = "--newKernel" ]; then KERNEL_OLD_VER=$2 #version du dernier noyau installé avant la màj KERNEL_NEW_VER=$(rpm -q kernel|tail -1) #version du dernier noyau installé après la màj if [ "$KERNEL_NEW_VER" != "$KERNEL_OLD_VER" ] ; then echo && echo && echo "Le nouveau kernel (${KERNEL_NEW_VER#kernel-}) a été installé." && echo fi shift ; shift fi if [ "$1" = "--no-notif" ]; then NO_NOTIF=1 shift fi ARGS_DNF="$*" sudo dnf check-update $ARGS_DNF -d 0 > $UPDATES 2> $UPDATESERROR RET_DNF=$? #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_DNF -eq 1 ] then $NOTIFIER --notification --text="Erreur lors de la commande dnf check-update $ARGS_DNF : $(cat ${UPDATESERROR})" "$NOTIF_ICON_ERR" zenity --question --title="Erreur dnf 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_DNF exit $? else quit 255 fi fi #2) PAS DE MISES À JOUR if [ $RET_DNF -eq 0 ] then [ ! "$NO_NOTIF" = "1" ] && $NOTIFIER --notification --text="Le système est à jour ! " "$NOTIF_ICON_OK" --timeout=300 || echo "Le système est à jour." 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 '/^Obsoleting Packages$/d' $UPDATES #supprimer cette ligne sed -i '/^[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+[^ ]/d' $UPDATES #supprimer toutes les lignes avec erreur (càd avec plus de 2 séries d'espaces [sauf espaces en début de ligne]) #Rem : ne tient pas compte des espaces en début de ligne car ils sont présents en cas de 'Obsoleting packages' #rem : mettre les paquets (y compris les Obsoleting) sur une seule ligne afin de pouvoir compter le nombre d'updates (=nombre de lignes) #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 "N;s/\n \+/ /;P;D" $UPDATES #3 X max dans le cas d'Obsoleting packages sed -i "N;s/\n \+/ /;P;D" $UPDATES 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 #$1 = paquet ; ${1%.*} = paquet sans extension .i386, .noarch, ... #$2 = nouvelle version ; ${2#*:} = version sans le "1:" devant #$3 = dépôt. Si commence par un '@' => il s'agit d'un paquet remplacé (Obsoleting packages) # format : <@dépôt> PACK=${1%.*} VERSION_NEW=${2#*:} DEPOT=$3 VERSION_ACTUELLE=$(rpm -q --queryformat "%{VERSION}-%{RELEASE}\n" $PACK|tail -1) shift;shift;shift B1="" #mise en gras () B2="" #mise en gras (<\b>) B3="" # Obsoleting packages if [ -n "$(echo $3|grep "^@")" -o "$3" = "installed" ] ; then #ancienne version : "yum update " ok #VERSION_ACTUELLE="(remplace ${1%.*} ${2#*:})" #nouvelle version : il faut faire "dnf update " ( NOK car non installé) VERSION_NEW="$PACK $VERSION_NEW" PACK=${1%.*} VERSION_ACTUELLE=${2#*:} shift;shift;shift #on passe la ligne suivante (qui contient le nom du paquet remplacé) #mise en gras des mises à jour majeures else n1=${VERSION_NEW%%.*} #n1=numéro majeur de version (ou version complète si pas de point "." dans VERSION) n2=${VERSION_NEW#$n1.*} #n2=VERSION sans n1 (ou version complète si pas de point "." dans VERSION) n2=${n2%%.*} #n2=numéro mineur de version (ou version complète si pas de point "." dans VERSION) n2=${n2%%-*} #(cas où VERSION contient "-", p.ex. : 4.3-2) o1=${VERSION_ACTUELLE%%.*} o2=${VERSION_ACTUELLE#$o1.*} o2=${o2%%.*} o2=${o2%%-*} if [[ $n1 =~ ^[0-9]+$ ]] && [[ $o1 =~ ^[0-9]+$ ]] ; then #si ce sont 2 entiers if [ $n1 -gt $o1 ] ; then B1="" ; B2="" ; B3=" * " elif [[ $n2 =~ ^[0-9]+$ ]] && [[ $o2 =~ ^[0-9]+$ ]] ; then if [ $n2 -gt $o2 ] ; then B1="" ; B2="" ; B3=" * " fi fi fi fi nu=0 #non update for NU in ${NON_UPDATE[@]}; do if [ -n "$(echo $PACK|grep $NU)" ]; then [ "$B1$B2$B3" = "" ] && nu=1 #non update, sauf si c'est une màj majeure break fi done if [ -n "$(echo $ARGS_DNF|grep "enablerepo=$DEPOT")" ] || [ $nu -eq 1 ] ; then #-n = non vide check="FALSE" N_FALSE=$(($N_FALSE+1)) LIST_NOTIF_NON_UPD="${LIST_NOTIF_NON_UPD} $B1$PACK $VERSION_NEW$B2 ($DEPOT)" else check="TRUE" LIST_NOTIF="${LIST_NOTIF} $B1$PACK $VERSION_NEW$B2 ($DEPOT)" fi LIST=("${LIST[@]}" $check "$PACK" "$B3$VERSION_NEW" "$VERSION_ACTUELLE" "$DEPOT") done NOMBREUPDATESCHECKED=$(($NOMBREUPDATES-$N_FALSE)) #nombre d'updates (sans les non-checké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 if [ "$NO_NOTIF" = "1" ]; then echo "Il y a $NOMBREUPDATES mises à jour non sélectionnées." quit 0 fi ICON_MAJ=$ICON_OK NOTIF_ICON_MAJ=$NOTIF_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 # ################ $NOTIFIER --notification --text="${TEXT_NOTIF}" "$NOTIF_ICON_MAJ" 2>/dev/null [ $? -ne 0 ] && quit 2 # FENÊTRE DE MÀJ # ################## 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[@]}" 2>/dev/null) #ici, $? vaut 1 si 'cancel' ; 0 si 'OK' ; 137 si a été killé if [ $? -eq 0 ] && [ -n "$PACK" ] then KERNEL_VER=$(rpm -q kernel|tail -1) #version du dernier noyau installé avant la màj #lancement de la commande : checkUpdate --newKernel $KERNEL_VER --no-notif $ARGS_DNF& #- dans une nouvelle fenêtre terminal si commande non lancée depuis un terminal (ex. au démarrage de la session -> $TERM=dumb) #- dans le terminal courant sinon (-> TERM=xterm-256color) if [ "$TERM" = "xterm-256color" ]; then sudo dnf upgrade $ARGS_DNF $PACK bash -c "checkUpdate --newKernel $KERNEL_VER --no-notif $ARGS_DNF&" else CMD="echo -e \"\tupgrade $ARGS_DNF\n\n\" ; sudo dnf upgrade $ARGS_DNF $PACK ; bash -c \"checkUpdate --newKernel $KERNEL_VER --no-notif $ARGS_DNF&\" ; exec bash" [ $IS_KDE -eq 1 ] && \ konsole -e bash -c "$CMD" || \ gnome-terminal -- bash -c "$CMD" fi RET=1 #système mis à jour else RET=2 #système non mis à jour fi quit $RET