Concevoir un site comme celui-ci avec WordPress.com
Commencer

Service de mise-à-jour.

Les logiciels graphiques Gnome de gestion des paquets sont trop lourds à mon goût. Et comme en ligne de commandes je répondais toujours Y …. j’ai automatisé la mise-à-jour.

  1. Mise à jour au démarrage du PC.
    1. Le script
    2. Le service.
      1. Le script exécuté en cas d’erreur:
    3. Tester le service.
    4. Activer le service pour qu’il soit lancé au démarrage.
      1. Vérifications.
        1. Vérification par commande
  2. Cas d’erreurs.
    1. Tentative de réparation par le script.
      1. Relancer le script manuellement.
        1. Relancer une mise à jour par commandes.

Mise à jour au démarrage du PC.

Le script

Créer le fichier update-perso dans /opt et lui donner les droits d’exécution.

-rwxr-xr-x 1 root root 4127 8 févr. 22:50 update-perso

Avec le contenu:

#!/bin/bash
# pour tracer demasquer set -x
#set -x
#
# Version 24 Novembre 2022
#
# test si le fichier résultat existe sinon c'est le tout premier lancement et alors créer le fichier
if [ ! -f "/tmp/resul-opt-update-perso.txt" ];
then touch /tmp/resul-opt-update-perso.txt
fi
#

date >> /tmp/resul-opt-update-perso.txt
date
#
# Pré Nettoyage 
echo "Pré nettoyage"
echo "Pré nettoyage" >> /tmp/resul-opt-update-perso.txt
echo "apt clean et autoclean"
echo "apt clean et autoclean" >> /tmp/resul-opt-update-perso.txt
apt-get clean >> /tmp/resul-opt-update-perso.txt 2> /dev/null
apt-get autoclean >> /tmp/resul-opt-update-perso.txt 2> /dev/null
#
# mise à jour des listes
echo "****************************************************************" >> /tmp/resul-opt-update-perso.txt
echo "Mise à jour des listes apt"
echo "Mise à jour des listes apt" >> /tmp/resul-opt-update-perso.txt 
apt update >> /tmp/resul-opt-update-perso.txt 2> /dev/null
#
# 
# Quand on veut tester un code retour de commande il faut le faire immédiatement après la commande
# ne pas inserer même un simple echo qui sera toujours ok et alors c'est le résultat de echo qui serait testé
#
#y a t il besoin de mettre à jour?
if [ $? != '0' ]
then
	echo 'apt update pas ok, on ne peut rien faire' >> /tmp/resul-opt-update-perso.txt
	echo 'apt update pas ok, on ne peut rien faire'
	date >> /tmp/resul-opt-update-perso.txt
	# tempo d'attente de l'ouverture de session
	echo "attente d'ouverture de session"
	sleep 120
else
# mise à jour des paquets
#
	echo "****************************************************************" >> /tmp/resul-opt-update-perso.txt
	echo "Essayons apt full-upgrade"
	echo "Essayons apt full-upgrade" >> /tmp/resul-opt-update-perso.txt
	export DEBIAN_FRONTEND=noninteractive 
#
# reference https://debian-handbook.info/browse/fr-FR/stable/sect.automatic-upgrades.html
#
	apt full-upgrade -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" >> /tmp/resul-opt-update-perso.txt 2> /dev/null
	if [ $? != '0' ]
	then
		echo "Echec de la commande apt-full-upgrade"
		echo "Echec de la commande apt-full-upgrade" >> /tmp/resul-opt-update-perso.txt 
		/usr/bin/mailx -s "résul nok 1er update-perso service" root@localhost < /tmp/resul-opt-update-perso.txt &> /dev/null
		date > /tmp/resul-opt-update-perso.txt
                echo "apt -y --fix-broken install"
		echo "apt -y --fix-broken install" >> /tmp/resul-opt-update-perso.txt
		dpkg --configure -a >> /tmp/resul-opt-update-perso.txt 2> /dev/null
		apt -y --fix-broken install >> /tmp/resul-opt-update-perso.txt 2> /dev/null
		/usr/bin/mailx -s "résul broken install update-perso service" root@localhost < /tmp/resul-opt-update-perso.txt &> /dev/null
		sudo -u guy  DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus notify-send --icon=/usr/share/pixmaps/debian-logo.png ' ECHEC DE MAJ '
	echo "deuxième tentative après réparation"
	echo "****************************************************************" >> /tmp/resul-opt-update-perso.txt
	echo "deuxième tentative après réparation" >> /tmp/resul-opt-update-perso.txt
	echo "Mise à jour des listes apt deuxième"
	echo "Mise à jour des listes apt deuxième" >> /tmp/resul-opt-update-perso.txt 
	apt update >> /tmp/resul-opt-update-perso.txt 2> /dev/null
	echo "Essayons apt full-upgrade deuxième"
	echo "Essayons apt full-upgrade deuxième" >> /tmp/resul-opt-update-perso.txt
	export DEBIAN_FRONTEND=noninteractive
	apt full-upgrade -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" >> /tmp/resul-opt-update-perso.txt 2> /dev/null
		if [ $? != '0' ]
		then
		/usr/bin/mailx -s "résul nok 2 update-perso service" root@localhost < /tmp/resul-opt-update-perso.txt &> /dev/null
		sudo -u guy  DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus notify-send --icon=/usr/share/pixmaps/debian-logo.png ' DEUXIEME ECHEC DE MAJ '	
		fi	
	fi
	echo "****************************************************************" >> /tmp/resul-opt-update-perso.txt
	echo "Vérification dpkg --audit"
	echo "Vérification dpkg --audit" >> /tmp/resul-opt-update-perso.txt
	dpkg --audit >> /tmp/resul-opt-update-perso.txt 2> /dev/null
#
# post nettoyage
	echo "****************************************************************" >> /tmp/resul-opt-update-perso.txt
	echo "post nettoyage"
	echo "post nettoyage" >> /tmp/resul-opt-update-perso.txt
	echo "apt purge --autoremove"
	echo "apt purge --autoremove " >> /tmp/resul-opt-update-perso.txt
	apt-get purge --autoremove -y >> /tmp/resul-opt-update-perso.txt 2> /dev/null
	echo "apt clean et autoclean"
	echo "apt clean et autoclean" >> /tmp/resul-opt-update-perso.txt
	apt-get clean >> /tmp/resul-opt-update-perso.txt 2> /dev/null
	apt-get autoclean >> /tmp/resul-opt-update-perso.txt 2> /dev/null
	echo "****************************************************************" >> /tmp/resul-opt-update-perso.txt
# listage utilisation disque après
	echo "listage occupation du disque après nettoyage"
	echo "listage occupation du disque après nettoyage" >> /tmp/resul-opt-update-perso.txt
	df -hT >> /tmp/resul-opt-update-perso.txt 2> /dev/null
#
fi
echo "****************************************************************" >> /tmp/resul-opt-update-perso.txt
# listage des paquets obsolètes et locaux
echo "listage des paquets obsolètes et locaux"
echo "listage des paquets obsolètes et locaux" >> /tmp/resul-opt-update-perso.txt
apt list --installed 2> /dev/null | grep /now >> /tmp/resul-opt-update-perso.txt 
echo "****************************************************************" >> /tmp/resul-opt-update-perso.txt
# vérification des services
echo "vérification des services"	
echo "vérification des services" >> /tmp/resul-opt-update-perso.txt
systemctl --failed >> /tmp/resul-opt-update-perso.txt
echo "****************************************************************" >> /tmp/resul-opt-update-perso.txt
/usr/sbin/checkrestart >> /tmp/resul-opt-update-perso.txt 2> /dev/null
echo "****************************************************************" >> /tmp/resul-opt-update-perso.txt
date >> /tmp/resul-opt-update-perso.txt
#
# envoi du mail de résultat
# tempo d'attente de l'ouverture de session
date
#echo "attente d'ouverture de session"
#echo "attente d'ouverture de session" >> /tmp/resul-opt-update-perso.txt
#sleep 120
#
echo "notification"
echo "notification" >> /tmp/resul-opt-update-perso.txt	
sudo -u guy  DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus notify-send --icon=/usr/share/pixmaps/debian-logo.png ' MAJ terminée'
#
/usr/bin/mailx -s "résul update-perso service" root@localhost < /tmp/resul-opt-update-perso.txt &> /dev/null
echo "mail envoyé à root par /opt/update-perso"
echo "mail envoyé à root par /opt/update-perso"  >> /tmp/resul-opt-update-perso.txt
# ne pas tuer le process avant que mail et notif soient traités
sleep 2
rm /tmp/resul-opt-update-perso.txt

Exemple de résultat:

dim. 23 oct. 2022 11:41:33 CEST
Pré nettoyage
apt clean et autoclean
Mise à jour des listes apt
Essayons apt full-upgrade
Vérification dpkg --audit
post nettoyage
apt purge --autoremove
apt clean et autoclean
listage occupation du disque après nettoyage
listage des paquets obsolètes et locaux
vérification des services
dim. 23 oct. 2022 11:45:09 CEST
notification
mail envoyé à root par /opt/update-perso

Le service.

Créer le fichier /etc/systemd/system/maj.service

Avec le contenu:

On attends que l’accès au réseau Internet soit garanti. Voir https://bidouilledebian.wordpress.com/2019/08/26/tester-que-lacces-a-internet-est-ok-avec-networkmanager/

[Unit]
Description=Mise à jour périodique
Requires=NetworkManager-wait-online.service
After=exim4.service
[Install]
WantedBy=graphical.target
[Service]
Type=oneshot
ExecStart=/opt/update-perso
ExecStopPost=/opt/resul-update-perso-nok

Le script exécuté en cas d’erreur:

Voir Table 6. Summary of possible service result variable values

resul-update-perso-nok

#!/bin/bash
# pour tracer demasquer set -x
#set -x
#
# Version 25 Novembre 2022
#
#echo "$EXIT_STATUS"
if [ "$EXIT_STATUS" != 0 ]
then 
sudo -u guy  DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus notify-send --icon=/usr/share/pixmaps/debian-logo.png ' MAJ INTERROMPUE resul NOK'
#
/usr/bin/mailx -s "résul update-perso NOK" root@localhost < /tmp/resul-opt-update-perso.txt &> /dev/null
fi

Tester le service.

sudo systemctl start maj.service

Si le résultat est satisfaisant,

sudo systemctl status maj.service -l -n 100 --no-pager
○ maj.service - Mise à jour périodique
     Loaded: loaded (/etc/systemd/system/maj.service; enabled; preset: enabled)
     Active: inactive (dead) since Fri 2022-11-25 09:35:17 CET; 2min 29s ago
    Process: 12494 ExecStart=/opt/update-perso (code=exited, status=0/SUCCESS)
    Process: 12772 ExecStopPost=/opt/resul-update-perso-nok (code=exited, status=0/SUCCESS)
   Main PID: 12494 (code=exited, status=0/SUCCESS)
        CPU: 34.309s

nov. 25 09:34:37 debian systemd[1]: Starting Mise à jour périodique...
nov. 25 09:34:37 debian update-perso[12497]: ven. 25 nov. 2022 09:34:37 CET
nov. 25 09:34:37 debian update-perso[12494]: Pré nettoyage
nov. 25 09:34:37 debian update-perso[12494]: apt clean et autoclean
nov. 25 09:34:45 debian update-perso[12494]: Mise à jour des listes apt
nov. 25 09:34:53 debian update-perso[12494]: Essayons apt full-upgrade
nov. 25 09:34:57 debian update-perso[12494]: Vérification dpkg --audit
nov. 25 09:34:57 debian update-perso[12494]: post nettoyage
nov. 25 09:34:57 debian update-perso[12494]: apt purge --autoremove
nov. 25 09:35:00 debian update-perso[12494]: apt clean et autoclean
nov. 25 09:35:07 debian update-perso[12494]: listage occupation du disque après nettoyage
nov. 25 09:35:07 debian update-perso[12494]: listage des paquets obsolètes et locaux
nov. 25 09:35:09 debian update-perso[12494]: vérification des services
nov. 25 09:35:13 debian update-perso[12756]: ven. 25 nov. 2022 09:35:13 CET
nov. 25 09:35:13 debian update-perso[12494]: notification
nov. 25 09:35:14 debian sudo[12757]:     root : PWD=/ ; USER=guy ; ENV=DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus ; COMMAND=/usr/bin/notify-send --icon=/usr/share/pixmaps/debian-logo.png  MAJ terminée
nov. 25 09:35:14 debian sudo[12757]: pam_unix(sudo:session): session opened for user guy(uid=1001) by (uid=0)
nov. 25 09:35:14 debian sudo[12757]: pam_unix(sudo:session): session closed for user guy
nov. 25 09:35:15 debian update-perso[12494]: mail envoyé à root par /opt/update-perso
nov. 25 09:35:17 debian systemd[1]: maj.service: Deactivated successfully.
nov. 25 09:35:17 debian systemd[1]: Finished Mise à jour périodique.
nov. 25 09:35:17 debian systemd[1]: maj.service: Consumed 34.309s CPU time.

Activer le service pour qu’il soit lancé au démarrage.

sudo systemctl enable maj.service

Vérifications.

systemd-analyze plot > boot-après-modif-NetworkManager-wait-online.svg

Le service envoi un courrier de résultat au compte root. Il est faisable de lire le courrier avec une application comme Evolution ou Thunderbird. Mais ceci est une autre histoire…

Lire les courriers de l’utilisateur root avec Thunderbird

Vérification par commande
systemctl status maj.service -l -n 100 --no-pager

Le script envoi aussi la notification de fin à mon utilisateur:

Cas d’erreurs.

Tentative de réparation par le script.

Si les message ne sont pas reçu dans la boite mail ni la notification, on peut suspecter une erreur dans la mise à jour.

Dans tous les cas, Ne pas redémarrer le système

Vérifier l’état d’avancement du service de mise à jour

systemctl status maj.service -l -n 100 --no-pager

Lire le contenu du fichier /tmp/resul-opt-update-perso.txt

cat /tmp/resul-opt-update-perso.txt

Exemple: J’ai noté plusieurs fois un problème dans la mise à jour de Network-Manager, la dernière ligne était alors:

Préparation du dépaquetage de .../36-network-manager_1.38.0-2_amd64.deb ...

ou,

Préparation du dépaquetage de .../02-network-manager_1.40.2-1_amd64.deb ...

Relancer le script manuellement.

sudo bash /opt/update-perso

Le script est auto-réparateur une fois.

Si la notification « DEUXIEME ECHEC DE MAJ » est affichée et le mail « résul nok 2 update-perso service » est reçu la tentative d’auto-réparation a aussi échouée

Relancer une mise à jour par commandes.

sudo apt update
sudo apt full-upgrade

Un message indiquera l’état par exemple « Vous pouvez lancer « apt –fix-broken install » pour corriger ces problèmes. »

Lancer les commandes:

sudo dpkg --configure -a
sudo apt --fix-broken install

Puis relancer la séquence de mise à jour

sudo apt update
sudo apt full-upgrade

Vérifier l’état

sudo dpkg --audit

Il ne doit y avoir aucun compte-rendu par cette commande si tout va bien.

/$ sudo dpkg --audit
/$
Publicité

Par Bidouille De Bian

Bidouilleur sur Linux Debian 10 (Buster). Débutant dans le blog sur Wordpress.

%d blogueurs aiment cette page :