Distro à jour, distro toujours!

  1. Introduction
  2. Le programme de mise à jour
  3. Les difficultés rencontrées avec crontab et systemd.timer
  4. L’astuce pour contourner le problème
  5. Le code
  6. Conclusion

Introduction

Bonjour,

Il y a quelques jours, j’ai regardé une vidéo d’Adrien Linuxtricks expliquant que la distribution Linux Mint présentait l’inconvénient de ne jamais rappeler à l’utilisateur lambada qu’il était temps de faire une mise à jour de son système (avec sudo apt update), ou de mettre à niveau sa distribution (c’est-à-dire par exemple de passer de la version Loana à la version Nabilla). 

Résultat des courses, une femme un utilisateur tête-en-l’air va attendre que son système soit en carafe avant d’appeler les secours. Je sais de quoi je parle puisqu’il y a un an et demi, j’ai installé Linux Mint sur l’ordinateur de celle qui partage ma vie, et le fait est que malgré des explications détaillées, c’est toujours moi qui me tape les mises à jour. Comment suis-je au courant qu’il est grand temps d’intervenir? Eh bien en général, lorsque Firefox est en train de faire un malaise.

Le programme de mise à jour

J’ai donc décidé de remédier au problème en codant un petit programme Python qui fait office de pense-bête. Ce programme s’appelle Distro à jour, distro toujours! Je n’ai pas mis longtemps à l’écrire mais j’ai toutefois été confronté à deux difficultés que je vous détaille plus bas.

Voici donc la page d’accueil :

  • Un titre : « Mise à jour du système »,
  • Une flèche verte qui symbolise le processus de mise à jour,
  • Un bouton « Mettre à jour »,
  • Un bouton « Annuler »

app_update

Le clic sur le bouton de mise à jour déclenche l’ouverture d’une fenêtre de terminal qui correspond à la variable d’environnement $TERM. Voici donc les commandes  qui sont exécutées :

com_1 = 'sudo apt update'
com_2 = 'sudo apt full-upgrade'
com_3 = 'echo Pressez la touche \"Entrée\" && read'
os.system('$TERM -e "{0} && {2} && {1} && {2}"'.format(com_1, com_2, com_3))

Décomposition du code :

  1. Ouverture du terminal défini dans la variable d’environnement $TERM,
  2. sudo apt update : Mise à jour des dépôts contenus dans le fichier de configuration /etc/apt/sources.list,
  3. « Pressez la touche Entrée »,
  4. read : bloque le script et attend une réponse de l’utilisateur. read correspond à input() en python. Il suffit de presser la touche Entrée pour continuer l’exécution du programme
  5. sudo apt full-upgrade : Mise à jour de tous les paquets vers leur dernière version,
  6. Idem point n°3,
  7. read : idem point n° 4.

20_5_2019_22:19:14

Si tout s’est déroulé comme prévu, la grosse flèche est remplacée par ceci :

20_5_2019_22:27:32

Les difficultés rencontrées avec crontab et systemd.timer

Avec ce programme, le but du jeu est de rappeler à l’étourdi(e) qu’il faut mettre à jour son système avant que ce dernier ne claque. Ce n’est donc pas à lui de se rappeler d’ouvrir le programme! C’est au programme de prendre l’initiative de surgir périodiquement sur son bureau tel un zébulon facétieux (par exemple une fois par semaine). Pour ce faire, il existe des outils de planification des tâches tels que crontab et systemd.timer.

Je vais être honnête. Je n’ai pas réussi à utiliser ces deux outils. crontab ouvrait l’application mais cette dernière ne se comportait pas comme prévu. Elle n’effectuait pas les tâches de mise à jour. Je pense qu’elle en était empêchée par une incompatibilité entre crontab et la commande sudo

Quant à systemd.timer, il n’a jamais voulu lancer le programme…

L’astuce pour contourner le problème

J’ai donc réfléchi très fort, jusqu’à devenir rouge comme une écrevisse… Et au moment où j’allais faire un malaise, la solution a jailli de mon cervelas.

  • J’ai entré le chemin du programme dans le fichier /etc/xdg/openbox/autostart pour qu’il se lance à chaque démarrage.
  • J’ai modifié mon programme pour que ce dernier ouvre un fichier intitulé count et y écrive le chiffre 6.
  • À chaque démarrage de l’ordinateur, le programme se lance, décrémente la valeur contenue dans le fichier count (6-=1, 5-=1, etc…) et se ferme immédiatement si cette valeur n’est pas égale à 0, de telle sorte qu’aucune fenêtre n’apparaît!
  • Par contre, si la valeur du fichier count est égale à zéro, le programme se lance normalement, la fenêtre s’ouvre et à la fin, la valeur 0 est remplacée par la valeur 6.
  • Si, pour une quelconque raison, l’utilisateur clique sur annuler, la fenêtre réapparaîtra au prochain démarrage jusqu’à ce qu’il se décide enfin à faire une mise à jour.

En fait, je suis parti du principe que peu de gugusses s’amusent à allumer et éteindre leur ordinateur plusieurs fois d’affilée. Une personne normalement constituée l’allume une fois par jour, parfois deux, rarement plus. Cela fait que le programme n’apparaît que tous les sept démarrages, c’est-à-dire une fois par semaine environ.

Je suis persuadé qu’il est tout à fait possible de programmer une vraie tâche périodique avec les modules timedatetime et compagnie. Ce sera mon prochain objectif.

Le code 

Il est là :

https://framagit.org/Ordinosor/distro-a-jour/blob/master/system_update.py

Il est nécessaire d’installer au préalable:

  • xterm
  • python3,
  • python3-pil.imagetk
  • python3-tk

Si vous n’utilisez pas Openbox, vous pouvez fort bien créer un lanceur dans le répertoire /etc/xdg/autostart. Dans ce cas, il faut lui donner l’extension *.desktop par exemple system_update.desktop. N’oubliez pas également de le rendre exécutable. Voici un exemple du contenu de ce fichier (testé et approuvé par votre serviteur!) :

[Desktop Entry]
Name=system_update
Exec=/home/ordinosor/.config/system_update/system_update.py
Terminal=false
Type=Application
Categories=Utility
StartupNotify=false

Il faut, bien évidemment, adapter la ligne exec.

Conclusion

La question que je me pose, c’est pourquoi Linux Mint ne prévient pas ses utilisateurs qu’il faut absolument mettre à jour sa distribution ou upgrader cette dernière vers une version plus récente. Là encore, Linux se plaint de ne pas percer sur les PC de bureau mais c’est tout à fait normal car ce comportement n’est pas du tout user-friendly.

 

24 commentaires sur “Distro à jour, distro toujours!

  1. Je ne comprends pas… Linux Mint, via le gestionnaire de mise à jour, prévient par défaut lorsque des mises à jour sont dispos. Il est même possible de le paramétrer pour que les mises à jour s’appliquent automatiquement, ce qui en fait la distro avec le moins de maintenance possible (aucune !). Je l’ai paramétré dans mon école sur une vingtaine d’ordis, que du bonheur.
    Pour les passage d’une version à une autre de la distribution, cela reste « manuel », mais l’arrivée de la nouvelle version est tout de même bien indiquée par dans le gestionnaire de mises à jour.

    1. Bonjour,

      Merci pour l’info. J’aurais du me renseigner davantage… Il n’empêche que je ne suis pas le seul à avoir été confronté à ce problème de mise à jour sur Linux Mint, ce qui signifie que le procédé ne saute peut-être pas aux yeux du simple utilisateur. Il y a peut-être quelque chose à revoir.

    2. Ah, ok, je comprends, vous parlez des mises à jour de version Linux Mint…En effet, je ne crois pas qu’on reçoive une alerte pour paser d’une version (17…) à une autre (19…).

  2. Vous êtes pas drôle, je m’étais justement dis que j’écrirais un programme qui fais exactement ça pendant mes prochaines vacances…
    J’ai été doublé…
    Merci quand même !

    1. Sincèrement désolé 🙁
      Cela dit, vous pouvez améliorer le code si vous voulez, par exemple faire que l’application s’ouvre réellement tous les sept jours. Ce n’est pas le cas actuellement. Elle s’ouvre toutes les sept connexions.

  3. /etc/xdg/openbox/autostart correspond à une ouverture de session plutôt qu’à un redémarrage non ? Quid des utilisateurs qui ne se déconnectent pas trop souvent ? GNU/Linux étant un système généralement très stable, les redémarrages se font beaucoup plus rares et les utilisateurs peuvent se contenter d’une mise en veille voire d’une hibernation si besoin. Du coup avec un compteur de 6 ça peut durer des lustres chez certains 😉

    1. Vous avez tout à fait raison. C’est d’ailleurs ce que je précise dans mon article. Je compte bien trouver une solution pour que L’application puisse s’ouvrir réellement une fois par semaine. Donc, il y aura un acte II 😉

  4. sudo ne peut pas fonctionner dans un cron user parce qu’il s’agit d’une commande interactive (demande du mot de passe du sudoer) alors que cron est non-interactif.
    Aussi il faut lancer les commandes qui nécessitent les droits d’admin depuis root (sans sudo).
    Par contre du coup faut penser à ajouter le cron dans le crontab de root et non du user (par exemple via sudo crontab -e ou via le compte root si y en a un). Par contre du coup ça semble nécessiter une démarche de la part des utilisateurs (voudront/sauront-ils faire ?) de votre script (et faut qu’ils en aient les droits en plus)…

    1. J’avais essayé d’utiliser cron dans le compte root et ça ne me convenait pas. Je vais essayer de voir ce que je peux faire avec les modules python time et datetime.

  5. Intéressant article merci pour ton partage. Concernant ton souci avec cron et sudo, tu peux passer par une configuration du fichier sudoers et faire en sorte qu’il ne demande pas la saisie du mot de passe. J’ai réussi, sur les postes utilisateurs du parc de l’entreprise où je bosse, à le configurer afin qu’il ne le demande pas pour les mises à jour d’un logiciel en particulier.

  6. Salut « Ordinosor » (ce pseudo rigolo fait surgir en moi l’image de Denver avec sa basse rose et ses lunettes étoiles et ça me donne envie de danser sur un solo endiablé de dino, joie ineffable ! 🙂 )

    Je ne sais pas si ma démarche sera couronnée de succès mais j’aurais un truc précis à te demander par échange mail, il y a moyen ? (en fait je voudrais demander un service et si dans un tu accès de faiblesse, tu me dis oui, tout le monde le verra sur les commentaires et t’exploiteras éhontément, comme je souhaite le faire en meuf incapable en informatique, mais genre je ne sais vraiment pas faire grand chose et n’y comprends pas grand chose d’ailleurs)

    Don’t be dubitatif sur la transparence de ma requête please, je suis gentille et honnête (enfin la plupart du temps, sauf qd on laisse trainer du chocolat devant moi, là il n’y a plus d’amis qui tiennent ! NOMNOMNOM !)

    Laure, une admiratrice de ta démarche généreuse sur ce site (et qui aurait bien besoin d’un coup de main ^^)

    1. Bonjour Laure,
      Merci pour ton commentaire qui m’a mis de bonne humeur en ce lundi de la pentecôte 🙂 Toi aussi tu as un pseudo rigolo 😉
      Tu peux me contacter par l’intermédiaire du formulaire de contact et je te répondrai en te donnant mon adresse e-mail privée.
      @ bientôt
      Benoît aka Ordinosor

  7. Bonjour,

    J’arrive un peu après la bagarre, mais c’est juste pour confirmer que pour effectuer des mises à jour automatiques d’une distribution basée sur Debian (comme Ubuntu, Mint) : la « bonne méthode » est d’utiliser l’outil ‘unattended-upgrades’, comme le soulignait plus haut Christophe.
    A ma connaissance : il n’y a pas d’interface graphique pour effectuer cette opération sous Mint (?)
    https://wiki.debian.org/UnattendedUpgrades
    En recherchant « Unattended Upgrades Linux Mint » on peut trouver aussi des articles sur le sujet. Comme celui-ci (en français qui plus est) :
    https://www.numetopia.fr/parametrer-les-mises-a-jour-automatiques-de-linux-mint/

    Par ailleurs, concernant la montée de version d’une distribution (bien plus risquée) : il faut toujours se référer aux explications données sur le site de l’éditeur !…
    En ce qui concerne Mint, consulter le site/blog officiel ET les commentaires de l’article sur le sujet, car cela permet de savoir si la procédure de mise à jour est (ou non) sans effet secondaire…
    Dans la majorité des cas, en dehors des préconisations de sauvegarde, il faudra suivre une procédure particulière, parfois fonction de l’environnement de bureau utilisé, ou d’autres paramètres, tout n’étant pas automatisable… Pas trivial, même si l’équipe de Linux Mint (tout comme Ubuntu) à sérieusement simplifiée le processus, cela peut poser problème avec des logiciels installés via des dépots tiers (ppa), par exemple.

    NB: ne pas toujours prendre les propos de Linuxtricks pour argent comptant, car en dehors de ce qu’il connait très bien comme Gentoo/Calculate (par exemple), il a parfois la fâcheuse habitude de survoler voire bacler les sujets qui ne l’attirent pas, ce qui est frustrant par ailleurs car c’est un très bon pédagogue/vulgarisateur francophone du monde Linux… ;(

    1. Bonjour Sydz,

      Merci pour ton long commentaire et aussi pour les liens. On n’arrive jamais après la bagarre lorsqu’il s’agit d’apporter des précisions utiles, surtout sur un sujet aussi sensible que les mises à jour ou les mises à niveaux. 😉 Ce programme « unattended upgrades » est en effet très pratique. Je me permets de rajouter quelque chose au niveau de la traduction. « unattended upgrades » est un faux-ami qui ne veut pas dire « mises à jour inattendues » mais « mises à jour non assistées ». La nuance est importante.
      C’est comme avec cfdisk, il y a une erreur de traduction dans le programme. « The partitions table has been altered » ne signifie pas « La table de partitions a été altérée ». Ça signifie « La table de partitions a été modifiée. »
      Bon dimanche,
      Benoît

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.