Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
|
materiel:logicos:start [2026/05/07 15:16] laure [Améliorations souhaitées pour les prochaines versions] |
materiel:logicos:start [2026/07/30 12:04] (Version actuelle) emoc |
||
|---|---|---|---|
| Ligne 100: | Ligne 100: | ||
| **Notes** | **Notes** | ||
| * extension inkscape-silhouette : dépendance python3-usb nécessaire + python3-matplotlib + python3-tinycss2 | * extension inkscape-silhouette : dépendance python3-usb nécessaire + python3-matplotlib + python3-tinycss2 | ||
| + | * probleme du bug qui ferme inkscape quand on ouvre le menu préferences : effacer le dossier '~/.local/share/icc' (certains profils utilisent des caractères ISO-8859-1 alors que l'encodage local est en UTF-8 : [[https://gitlab.com/inkscape/inkscape/-/work_items/5389|source]]) | ||
| Ligne 108: | Ligne 109: | ||
| | Stickeuse QL570 | | | | | | Stickeuse QL570 | | | | | ||
| + | [[materiel:logicos:guideql570|Guide d'utilisation de StickeuseQL570]] | ||
| ==== Logiciels de vidéo / création vidéo ==== | ==== Logiciels de vidéo / création vidéo ==== | ||
| Ligne 315: | Ligne 316: | ||
| * Installation de MPlayer (nécessaire pour Jubler, merci) | * Installation de MPlayer (nécessaire pour Jubler, merci) | ||
| * Ajouter Anaouder | * Ajouter Anaouder | ||
| + | |||
| + | ===== Désinstaller l'ancienne Stickeuse QL-570 des OP[XX] (image de janvier 2026) ===== | ||
| + | |||
| + | //Protocole établi le 29 juillet 2026 — script version 1.1.// | ||
| + | |||
| + | **Périmètre** — les ordinateurs portables **OP[XX]** des Portes Logiques. | ||
| + | |||
| + | **Qui l'applique** — Pierre, ou toute personne qu'il habilite. L'opération exige les | ||
| + | droits root et intervient dans les dossiers personnels de **tous** les comptes du | ||
| + | poste : elle ne s'improvise pas. | ||
| + | |||
| + | Les OP[XX] ont été déployés par **clonage**, par Jérôme (Jejy), en décembre 2025 / | ||
| + | janvier 2026. L'**ancienne** version de la Stickeuse figurait dans l'image clonée : | ||
| + | elle est donc présente sur tous les postes issus de ce déploiement, **aux mêmes | ||
| + | emplacements** — ''/opt/stickeuse_ql570'', ''~/bin/stickeuse_ql570'', | ||
| + | ''~/.gitdl/ql570'', l'icône et les deux lanceurs. Elle n'a pas de désinstalleur | ||
| + | fiable. | ||
| + | |||
| + | Un poste peut s'écarter de ce motif s'il a reçu des installations manuelles | ||
| + | ultérieures : OP42, poste de développement, porte en plus une règle udev, une | ||
| + | entrée d'autostart et un binaire dans ''/usr/local/bin''. Le script couvre les deux | ||
| + | cas. | ||
| + | |||
| + | Il faut la retirer **avant** d'installer la version actuelle, sinon les deux se | ||
| + | marchent dessus : deux entrées de menu portant le même nom, un agent fantôme | ||
| + | relancé à chaque ouverture de session, une règle udev obsolète. | ||
| + | |||
| + | Ordre : **nettoyer, puis installer**. | ||
| + | |||
| + | * Version actuelle de l'appli : [[https://github.com/lesporteslogiques/stickeuse|dépôt lesporteslogiques/stickeuse]] | ||
| + | |||
| + | ==== Utilisation ==== | ||
| + | |||
| + | Télécharger le script ci-dessous, puis, sur le poste à nettoyer : | ||
| + | |||
| + | <code bash> | ||
| + | su - | ||
| + | cd /chemin/vers/le/script | ||
| + | bash nettoyage_stickeuse.sh -n # inventaire seul, ne supprime rien | ||
| + | bash nettoyage_stickeuse.sh # supprime, après confirmation | ||
| + | </code> | ||
| + | |||
| + | Pas besoin de ''chmod +x'' : lancer par ''bash nom_du_script'' suffit. | ||
| + | |||
| + | ^ Option ^ Effet ^ | ||
| + | | ''-n'', ''%%--%%inventaire-seul'' | Affiche ce qui serait supprimé, puis s'arrête. | | ||
| + | | ''-y'', ''%%--%%oui'' | Ne demande pas confirmation. Pour enchaîner les postes. | | ||
| + | | ''%%--%%avec-pip'' | Désinstalle aussi la bibliothèque Python ''brother_ql''. | | ||
| + | | ''-h'', ''%%--%%aide'' | Affiche l'aide intégrée. | | ||
| + | |||
| + | ==== Ce qu'il fait ==== | ||
| + | |||
| + | - **Inventaire** — cherche les traces sans rien supprimer, côté système (''/opt/stickeuse_ql570'', ''/usr/local/bin/ql570'', lanceurs, règles udev) et dans chaque compte de ''/home'' (''bin/stickeuse_ql570'', ''.gitdl/ql570'', ''.icons'', ''.config'', ''.cache'', ''.local/share'', ''autostart'', ''Bureau'', ''Desktop''). Aucun nom de compte n'est écrit en dur. | ||
| + | - **Confirmation** — affiche la liste et attend un ''o''. Toute autre réponse annule. | ||
| + | - **Suppression** — efface, recharge les règles udev, rafraîchit le cache des menus. | ||
| + | - **Vérification** — relance la recherche et annonce « Aucun reste » ou la liste de ce qui subsiste. | ||
| + | |||
| + | Chaque passage écrit un journal ''nettoyage_<hôte>_<horodatage>.log'' dans le | ||
| + | dossier courant. Lancé depuis une clé USB, les journaux s'y accumulent : c'est le | ||
| + | suivi du parc. | ||
| + | |||
| + | ==== Garde-fou : ancienne ou nouvelle version ? ==== | ||
| + | |||
| + | Le script s'appuie sur la ligne ''Exec='' des fichiers ''.desktop'', qui indique | ||
| + | le programme réellement lancé : | ||
| + | |||
| + | ^ ''Exec='' pointe vers ^ Version ^ Décision ^ | ||
| + | | ''/opt/stickeuse_ql570/…'' ou ''/usr/local/bin/ql570'' | ancienne | supprimé | | ||
| + | | ''/opt/ql570/venv/bin/python …'' | nouvelle | conservé et signalé | | ||
| + | |||
| + | La nouvelle version n'est **jamais** supprimée. | ||
| + | |||
| + | ==== Le cas brother_ql ==== | ||
| + | |||
| + | ''brother_ql'' est la bibliothèque Python qui pilote les imprimantes QL. Installée | ||
| + | par ''pip'' en root dans ''/usr/local'', elle est **partagée par tout le poste**. | ||
| + | Elle n'appartient pas à l'ancienne version — celle-ci passait par un binaire C | ||
| + | compilé. | ||
| + | |||
| + | Sur OP60, elle est datée du **8 janvier 2026**, soit dans la fenêtre du clonage : | ||
| + | elle vient donc probablement de l'image, et non d'un usage personnel. Si la même | ||
| + | date se retrouve sur les autres postes, l'hypothèse se confirme et | ||
| + | ''%%--%%avec-pip'' devient le passage par défaut. Par prudence, le script la | ||
| + | **conserve** tant que la question n'est pas tranchée, et signale seulement sa | ||
| + | présence. | ||
| + | |||
| + | ==== Marche à suivre sur le parc ==== | ||
| + | |||
| + | Les postes étant issus d'un même clonage, l'inventaire devrait être identique de | ||
| + | l'un à l'autre. C'est ce qui rend le passage en série possible — et ce qu'il faut | ||
| + | vérifier d'abord. | ||
| + | |||
| + | - Sur les trois ou quatre premiers postes, passer en ''-n'' et lire l'inventaire. Il doit être le même partout. Un écart signale une installation manuelle ultérieure : la relever avant de continuer. | ||
| + | - Une fois le motif confirmé, enchaîner les postes suivants. | ||
| + | - Noter la date de ''brother_ql'' sur ces premiers postes (voir plus haut). | ||
| + | - Récupérer les journaux pour tenir le décompte du parc. | ||
| + | |||
| + | ==== Limites connues ==== | ||
| + | |||
| + | * **Une seule partition** — la recherche utilise ''-xdev'' et ne franchit pas les frontières de systèmes de fichiers. Si ''/home'' est sur une partition séparée (''df -h / /home /opt'' pour le vérifier), relancer à la main : ''find /home -iname '*stickeuse*' -o -iname '*ql570*' ''. | ||
| + | * **Emplacements connus seulement** — le script cherche dans les dossiers observés sur deux postes (OP42, poste de développement, et OP60, issu du clonage). Une installation posée ailleurs lui échapperait, d'où le passage en ''-n'' sur les premiers postes. | ||
| + | * **Fermer la session** — l'affichage du menu ne se rafraîchit complètement qu'à la réouverture de session. | ||
| + | * **Corbeille** — les fichiers déjà mis à la corbeille par un utilisateur (''~/.local/share/Trash'') ne sont pas concernés. | ||
| + | |||
| + | ==== Récupérer le script ==== | ||
| + | |||
| + | Le script est publié en bas de cette page. Le bloc de code porte son nom en | ||
| + | en-tête : **cliquer dessus télécharge le fichier**. Préférer ce lien au | ||
| + | copier-coller, qui risque d'emporter des espaces ou de tronquer une ligne. | ||
| + | |||
| + | Deux façons de l'amener sur les postes : | ||
| + | |||
| + | * **Depuis le poste lui-même** — ouvrir cette page dans le navigateur du poste, télécharger, puis lancer depuis ''~/Téléchargements''. | ||
| + | * **Par clé USB** — télécharger une fois, copier sur la clé, passer de poste en poste. À privilégier : les journaux s'accumulent sur la clé et donnent le suivi du parc. | ||
| + | |||
| + | Contrôle après téléchargement, avant la première utilisation : | ||
| + | |||
| + | <code bash> | ||
| + | wc -l nettoyage_stickeuse.sh # doit afficher 334 lignes | ||
| + | bash -n nettoyage_stickeuse.sh # vérifie la syntaxe, n'exécute rien | ||
| + | </code> | ||
| + | |||
| + | Si la seconde commande ne dit rien, le fichier est intact. | ||
| + | |||
| + | ==== Le script ==== | ||
| + | |||
| + | Auteurice : Vitally LUBIN — Les Portes Logiques, 2026. | ||
| + | Licence : [[https://www.gnu.org/licenses/agpl-3.0.html|GNU Affero General Public | ||
| + | License v3 (AGPL-3.0)]], comme le reste du projet Stickeuse — et non la licence | ||
| + | CC BY-SA du wiki (le pied de page réserve ce cas : //sauf mention contraire//). | ||
| + | |||
| + | <accordion> | ||
| + | <panel title="nettoyage_stickeuse.sh (cliquer pour afficher le code)"> | ||
| + | <code bash nettoyage_stickeuse.sh> | ||
| + | #!/usr/bin/env bash | ||
| + | # | ||
| + | # ============================================================================ | ||
| + | # nettoyage_stickeuse.sh — version 1.1 | ||
| + | # | ||
| + | # Retire l'ANCIENNE Stickeuse QL-570 d'un poste OP (Les Portes Logiques). | ||
| + | # | ||
| + | # Auteurice : Vitally LUBIN — Les Portes Logiques, 2026 | ||
| + | # Licence : GNU Affero General Public License v3 (AGPL-3.0) | ||
| + | # https://www.gnu.org/licenses/agpl-3.0.html | ||
| + | # | ||
| + | # POURQUOI | ||
| + | # Faire place nette AVANT d'installer la version aboutie du dépôt : | ||
| + | # https://github.com/lesporteslogiques/stickeuse | ||
| + | # Sans ce ménage, les résidus de l'ancienne version (lanceurs orphelins, | ||
| + | # agent fantôme, règle udev obsolète) parasitent le déploiement. | ||
| + | # Ordre : nettoyer, puis installer. | ||
| + | # | ||
| + | # UTILISATION RAPIDE | ||
| + | # su - | ||
| + | # bash nettoyage_stickeuse.sh -n # inventaire seul, ne supprime rien | ||
| + | # bash nettoyage_stickeuse.sh # inventorie, montre, demande, supprime | ||
| + | # | ||
| + | # OPTIONS | ||
| + | # -n, --inventaire-seul affiche ce qui serait supprimé, puis s'arrête | ||
| + | # -y, --oui ne demande pas confirmation (passage en série) | ||
| + | # --avec-pip désinstalle aussi la bibliothèque Python brother_ql | ||
| + | # -h, --aide affiche cette aide | ||
| + | # | ||
| + | # DÉROULÉ | ||
| + | # 1. Inventaire : cherche les traces, ne touche à rien | ||
| + | # 2. Confirmation : affiche la liste, attend un « o » | ||
| + | # 3. Suppression : efface, recharge udev, rafraîchit les menus | ||
| + | # 4. Vérification : relance la recherche et annonce ce qui subsiste | ||
| + | # | ||
| + | # GARDE-FOU | ||
| + | # La NOUVELLE version (/opt/ql570 et son venv) n'est JAMAIS supprimée. | ||
| + | # Tout lanceur .desktop pointant vers elle est conservé et signalé. | ||
| + | # | ||
| + | # Documentation complète : https://lesporteslogiques.net/wiki/materiel/logicos/start | ||
| + | # ============================================================================ | ||
| + | |||
| + | # set -u : une variable non définie devient une erreur au lieu d'un vide | ||
| + | # silencieux. Sur un script qui fait des rm, c'est vital : « rm -rf | ||
| + | # $CHEMIN » avec CHEMIN vide viserait la racine. | ||
| + | # set -o pipefail : dans « a | b », le code retour est celui du premier | ||
| + | # maillon qui échoue, pas seulement du dernier. | ||
| + | # (pas de « set -e » : on veut continuer le nettoyage même si un rm échoue, | ||
| + | # et le signaler dans le journal.) | ||
| + | set -uo pipefail | ||
| + | |||
| + | VERSION="1.1" | ||
| + | HOTE="$(hostname)" # sert à nommer le journal par poste | ||
| + | HORODATE="$(date +%Y%m%d-%H%M%S)" | ||
| + | JOURNAL="$(pwd)/nettoyage_${HOTE}_${HORODATE}.log" | ||
| + | |||
| + | # Drapeaux, modifiés plus bas par les options de la ligne de commande | ||
| + | INVENTAIRE_SEUL=0 | ||
| + | SANS_CONFIRMATION=0 | ||
| + | AVEC_PIP=0 | ||
| + | |||
| + | # Liste blanche : chemins de la NOUVELLE version, jamais supprimés. | ||
| + | # Ajouter ici tout autre chemin à préserver. | ||
| + | PROTEGES=("/opt/ql570") | ||
| + | |||
| + | CIBLES=() # ce qui sera supprimé | ||
| + | SIGNALES=() # ce qui est conservé volontairement, mais mérite d'être dit | ||
| + | |||
| + | # ---------------------------------------------------------------- utilitaires | ||
| + | |||
| + | # Tout ce qui s'affiche part aussi dans le journal : « tee -a » écrit sur la | ||
| + | # sortie standard ET ajoute au fichier. Sur 30 postes, le journal est la seule | ||
| + | # trace de ce qui a été trouvé et supprimé sur chacun. | ||
| + | msg() { printf '%s\n' "$*" | tee -a "$JOURNAL"; } | ||
| + | titre() { printf '\n=== %s ===\n' "$*" | tee -a "$JOURNAL"; } | ||
| + | |||
| + | # Le chemin appartient-il à la nouvelle version ? | ||
| + | # Le motif "$p"/* attrape aussi tout ce qui est DANS un dossier protégé. | ||
| + | est_protege() { | ||
| + | local chemin="$1" p | ||
| + | for p in "${PROTEGES[@]}"; do | ||
| + | [[ "$chemin" == "$p" || "$chemin" == "$p"/* ]] && return 0 | ||
| + | done | ||
| + | return 1 | ||
| + | } | ||
| + | |||
| + | # Ajoute un chemin à la liste de suppression, avec trois filtres : | ||
| + | # 1. chemin vide -> ignoré (protection anti-« rm -rf » sur rien) | ||
| + | # 2. n'existe pas -> ignoré (inutile d'encombrer la liste) | ||
| + | # 3. protégé -> ignoré (nouvelle version) | ||
| + | # 4. déjà présent -> ignoré (évite les doublons) | ||
| + | ajouter() { | ||
| + | local chemin="$1" | ||
| + | [[ -z "$chemin" ]] && return | ||
| + | [[ -e "$chemin" ]] || return | ||
| + | est_protege "$chemin" && return | ||
| + | local c | ||
| + | # ${CIBLES[@]+"${CIBLES[@]}"} : formule qui évite l'erreur « variable non | ||
| + | # définie » (set -u) quand le tableau est encore vide. | ||
| + | for c in ${CIBLES[@]+"${CIBLES[@]}"}; do | ||
| + | [[ "$c" == "$chemin" ]] && return | ||
| + | done | ||
| + | CIBLES+=("$chemin") | ||
| + | } | ||
| + | |||
| + | signaler() { SIGNALES+=("$1"); } | ||
| + | |||
| + | # L'aide est l'en-tête du fichier lui-même : une seule source, jamais de | ||
| + | # décalage entre la doc et le code. | ||
| + | aide() { sed -n '4,38p' "$0" | sed 's/^# \{0,1\}//'; exit 0; } | ||
| + | |||
| + | # ------------------------------------------------------------------ arguments | ||
| + | |||
| + | while [[ $# -gt 0 ]]; do | ||
| + | case "$1" in | ||
| + | -n|--inventaire-seul) INVENTAIRE_SEUL=1 ;; | ||
| + | -y|--oui) SANS_CONFIRMATION=1 ;; | ||
| + | --avec-pip) AVEC_PIP=1 ;; | ||
| + | -h|--aide) aide ;; | ||
| + | *) echo "Option inconnue : $1 (voir --aide)" >&2; exit 2 ;; | ||
| + | esac | ||
| + | shift | ||
| + | done | ||
| + | |||
| + | # EUID = identifiant effectif de l'utilisateur ; 0 = root. | ||
| + | # Nécessaire pour /opt et /etc, et pour parcourir tous les /home. | ||
| + | if [[ "${EUID}" -ne 0 ]]; then | ||
| + | echo "Ce script doit tourner en root : su - puis bash $0" >&2 | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | msg "nettoyage_stickeuse.sh v${VERSION} — poste ${HOTE} — ${HORODATE}" | ||
| + | msg "Journal : ${JOURNAL}" | ||
| + | |||
| + | # ============================================================== 1. INVENTAIRE | ||
| + | # Rien n'est supprimé ici : on ne fait que remplir CIBLES et SIGNALES. | ||
| + | |||
| + | titre "1. Inventaire" | ||
| + | |||
| + | # --- côté système ----------------------------------------------------------- | ||
| + | ajouter "/opt/stickeuse_ql570" # dossier de l'ancienne version | ||
| + | ajouter "/usr/local/bin/ql570" # binaire C compilé de l'ancienne version | ||
| + | |||
| + | # Lanceurs du menu général. C'est ici que se joue la distinction ancienne / | ||
| + | # nouvelle : la ligne « Exec= » du fichier .desktop dit quel programme est | ||
| + | # lancé. Si elle pointe vers /opt/ql570, c'est la NOUVELLE -> on conserve. | ||
| + | for f in /usr/share/applications/*ql570* /usr/share/applications/*stickeuse*; do | ||
| + | [[ -e "$f" ]] || continue # le motif non résolu reste littéral : on saute | ||
| + | if grep -qs 'Exec=.*/opt/ql570' "$f"; then | ||
| + | signaler "$f (lanceur de la NOUVELLE version — conservé)" | ||
| + | else | ||
| + | ajouter "$f" | ||
| + | fi | ||
| + | done | ||
| + | |||
| + | # Règles udev : elles donnent à l'utilisateur le droit de parler à | ||
| + | # l'imprimante USB. Absentes sur OP60, présentes sur OP42. | ||
| + | for f in /etc/udev/rules.d/*ql570* /etc/udev/rules.d/*brother-ql*; do | ||
| + | [[ -e "$f" ]] && ajouter "$f" | ||
| + | done | ||
| + | |||
| + | # --- côté utilisateurs ------------------------------------------------------ | ||
| + | # On balaie /home/* plutôt que d'écrire un nom de compte en dur : il vaut | ||
| + | # « xor » sur OP42, « lesporteslogiques » sur OP60, et sans doute autre chose | ||
| + | # ailleurs. Le script s'adapte sans être modifié. | ||
| + | for maison in /home/*; do | ||
| + | [[ -d "$maison" ]] || continue | ||
| + | |||
| + | ajouter "$maison/bin/stickeuse_ql570" # dossier de travail (OP60) | ||
| + | ajouter "$maison/.gitdl/ql570" # sources téléchargées (OP60) | ||
| + | ajouter "$maison/.ql570" # journal d'impression de l'appli | ||
| + | |||
| + | # Recherche par motif dans les dossiers de configuration. | ||
| + | # -maxdepth 1 : on ne descend pas dans les sous-dossiers, pour ne pas | ||
| + | # ramasser un fichier sans rapport enfoui quelque part. | ||
| + | for d in "$maison/.icons" "$maison/.config" "$maison/.cache" \ | ||
| + | "$maison/.local/share" "$maison/.config/autostart"; do | ||
| + | [[ -d "$d" ]] || continue | ||
| + | # « while read < <(commande) » : on lit ligne par ligne sans sous-shell, | ||
| + | # sinon les ajouts au tableau CIBLES seraient perdus. | ||
| + | while IFS= read -r f; do | ||
| + | ajouter "$f" | ||
| + | done < <(find "$d" -maxdepth 1 \( -iname '*stickeuse*' -o -iname '*ql570*' \) 2>/dev/null) | ||
| + | done | ||
| + | |||
| + | # Lanceurs personnels : menu utilisateur, Bureau (session en français) et | ||
| + | # Desktop (session en anglais). Même test Exec= que plus haut. | ||
| + | for d in "$maison/.local/share/applications" "$maison/Bureau" "$maison/Desktop"; do | ||
| + | [[ -d "$d" ]] || continue | ||
| + | while IFS= read -r f; do | ||
| + | if grep -qs 'Exec=.*/opt/ql570' "$f"; then | ||
| + | signaler "$f (lanceur de la NOUVELLE version — conservé)" | ||
| + | else | ||
| + | ajouter "$f" | ||
| + | fi | ||
| + | done < <(find "$d" -maxdepth 1 \( -iname '*stickeuse*' -o -iname '*ql570*' \) 2>/dev/null) | ||
| + | done | ||
| + | done | ||
| + | |||
| + | # --- bibliothèque Python brother_ql ----------------------------------------- | ||
| + | # Installée par pip en root dans /usr/local, donc partagée par tout le poste. | ||
| + | # Elle n'appartient PAS à l'ancienne version (qui utilisait un binaire C) : | ||
| + | # quelqu'un a pu l'installer pour son propre usage. Conservée par défaut. | ||
| + | PIP_PRESENT=0 | ||
| + | if command -v brother_ql >/dev/null 2>&1 || \ | ||
| + | ls -d /usr/local/lib/python3.*/dist-packages/brother_ql >/dev/null 2>&1; then | ||
| + | PIP_PRESENT=1 | ||
| + | fi | ||
| + | |||
| + | # --- restitution de l'inventaire -------------------------------------------- | ||
| + | if [[ ${#CIBLES[@]} -eq 0 ]]; then | ||
| + | msg "Aucune trace de l'ancienne Stickeuse sur ce poste." | ||
| + | else | ||
| + | msg "${#CIBLES[@]} élément(s) à supprimer :" | ||
| + | for c in "${CIBLES[@]}"; do msg " - $c"; done | ||
| + | fi | ||
| + | |||
| + | if [[ ${#SIGNALES[@]} -gt 0 ]]; then | ||
| + | msg "" | ||
| + | msg "Conservé (non concerné par l'ancienne version) :" | ||
| + | for s in "${SIGNALES[@]}"; do msg " ! $s"; done | ||
| + | fi | ||
| + | |||
| + | if [[ $PIP_PRESENT -eq 1 ]]; then | ||
| + | msg "" | ||
| + | if [[ $AVEC_PIP -eq 1 ]]; then | ||
| + | msg "brother_ql (pip) : présent — sera désinstallé (--avec-pip)." | ||
| + | else | ||
| + | msg "brother_ql (pip) : présent — CONSERVÉ. Relancer avec --avec-pip pour l'ôter." | ||
| + | fi | ||
| + | fi | ||
| + | |||
| + | if [[ $INVENTAIRE_SEUL -eq 1 ]]; then | ||
| + | msg "" | ||
| + | msg "Mode inventaire seul : rien n'a été supprimé." | ||
| + | exit 0 | ||
| + | fi | ||
| + | |||
| + | # Poste déjà propre : on s'arrête là. | ||
| + | [[ ${#CIBLES[@]} -eq 0 && $PIP_PRESENT -eq 0 ]] && exit 0 | ||
| + | |||
| + | # ============================================================ 2. CONFIRMATION | ||
| + | |||
| + | if [[ $SANS_CONFIRMATION -eq 0 ]]; then | ||
| + | printf '\nSupprimer les éléments ci-dessus ? [o/N] ' | ||
| + | read -r reponse | ||
| + | echo "Réponse : ${reponse:-N}" >> "$JOURNAL" | ||
| + | case "${reponse}" in | ||
| + | [oOyY]) ;; # o, O, y ou Y : on continue | ||
| + | *) msg "Abandon : rien n'a été supprimé."; exit 0 ;; # tout le reste : on sort | ||
| + | esac | ||
| + | fi | ||
| + | |||
| + | # ============================================================= 3. SUPPRESSION | ||
| + | |||
| + | titre "2. Suppression" | ||
| + | |||
| + | UDEV_TOUCHE=0 | ||
| + | for c in ${CIBLES[@]+"${CIBLES[@]}"}; do | ||
| + | est_protege "$c" && continue # second contrôle, au cas où la liste | ||
| + | # blanche aurait évolué entre-temps | ||
| + | [[ "$c" == /etc/udev/rules.d/* ]] && UDEV_TOUCHE=1 | ||
| + | # « -- » marque la fin des options : un fichier nommé « -rf » serait traité | ||
| + | # comme un nom, pas comme un drapeau. | ||
| + | if rm -rf -- "$c"; then | ||
| + | msg " supprimé : $c" | ||
| + | else | ||
| + | msg " ÉCHEC : $c" | ||
| + | fi | ||
| + | done | ||
| + | |||
| + | # Sans rechargement, une règle supprimée reste active jusqu'au redémarrage. | ||
| + | if [[ $UDEV_TOUCHE -eq 1 ]]; then | ||
| + | udevadm control --reload-rules 2>/dev/null && msg " règles udev rechargées" | ||
| + | fi | ||
| + | |||
| + | # Debian 13 refuse pip en root sans --break-system-packages (PEP 668). | ||
| + | # Sans risque ici : ces fichiers vivent dans /usr/local, hors du Python géré | ||
| + | # par apt. Le « || » relance sans le drapeau sur les Debian plus anciennes. | ||
| + | if [[ $PIP_PRESENT -eq 1 && $AVEC_PIP -eq 1 ]]; then | ||
| + | msg " désinstallation de brother_ql (pip)" | ||
| + | pip3 uninstall -y --break-system-packages brother_ql 2>&1 | tee -a "$JOURNAL" \ | ||
| + | || pip3 uninstall -y brother_ql 2>&1 | tee -a "$JOURNAL" | ||
| + | fi | ||
| + | |||
| + | # Le menu lit un cache : sans ce rafraîchissement, l'entrée reste affichée | ||
| + | # alors que le fichier a disparu (clic sans effet). | ||
| + | if command -v update-desktop-database >/dev/null 2>&1; then | ||
| + | update-desktop-database /usr/share/applications 2>/dev/null | ||
| + | for maison in /home/*; do | ||
| + | [[ -d "$maison/.local/share/applications" ]] && \ | ||
| + | update-desktop-database "$maison/.local/share/applications" 2>/dev/null | ||
| + | done | ||
| + | msg " menus rafraîchis" | ||
| + | fi | ||
| + | |||
| + | # ============================================================ 4. VERIFICATION | ||
| + | # On relance la recherche à blanc sur tout le disque pour confirmer. | ||
| + | |||
| + | titre "3. Vérification" | ||
| + | |||
| + | # -xdev : ne franchit pas les frontières de systèmes de fichiers. Évite de | ||
| + | # partir dans /proc et /sys. Si /home est sur une autre partition, il faut | ||
| + | # relancer la recherche dessus (voir README, section « Limites »). | ||
| + | # | ||
| + | # On écarte de la liste des « restes » : la nouvelle version, ce qui a été | ||
| + | # volontairement conservé, le script lui-même et son journal — sinon le script | ||
| + | # signalerait comme suspect ce qu'il vient de décider de garder. | ||
| + | MOI="$(readlink -f "$0" 2>/dev/null || echo "$0")" | ||
| + | RESTES="$(find / -xdev \( -iname '*stickeuse*' -o -iname '*ql570*' \) 2>/dev/null \ | ||
| + | | grep -v '^/opt/ql570' \ | ||
| + | | grep -Fxv "$MOI" \ | ||
| + | | grep -Fv "$(basename "$MOI")" \ | ||
| + | | grep -Fxv "$JOURNAL" || true)" | ||
| + | |||
| + | for s in ${SIGNALES[@]+"${SIGNALES[@]}"}; do | ||
| + | chemin="${s%% (*}" # retire le commentaire entre parenthèses | ||
| + | RESTES="$(printf '%s\n' "$RESTES" | grep -Fxv "$chemin" || true)" | ||
| + | done | ||
| + | |||
| + | if [[ -z "$RESTES" ]]; then | ||
| + | msg "Aucun reste. Poste ${HOTE} propre." | ||
| + | else | ||
| + | msg "Restes à examiner :" | ||
| + | printf '%s\n' "$RESTES" | tee -a "$JOURNAL" | ||
| + | fi | ||
| + | |||
| + | if command -v brother_ql >/dev/null 2>&1; then | ||
| + | msg "brother_ql (pip) toujours en place (conservé volontairement, ou --avec-pip non passé)." | ||
| + | fi | ||
| + | |||
| + | msg "" | ||
| + | msg "Terminé. Fermer et rouvrir la session pour rafraîchir l'affichage du menu." | ||
| + | msg "Journal : ${JOURNAL}" | ||
| + | </code> | ||
| + | </panel> | ||
| + | </accordion> | ||