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.

 

21 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

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.