Pourquoi LogicOS ?
LogicOS équipe les ordinateurs mis à disposition des adhérent·e·s de l'association. On peut y retrouver les logiciels spécifiques utilisés avec les machines de fabrication numérique du fablab, en particulier inkscape/inkstitch, l'extension inkscape-silhouette pour piloter la Cameo 4, cura slicer configuré pour les imprimantes 3D, etc.
Jusque là, nous avions des ordis installés au fil du temps avec des installations de logiciels différentes et différentes versions. Bref, le bazar!
En 2026, il s'agit de la première version, qui ne sera pas exempte de bugs et nécessitera de futures améliorations. Il est possible d'indiquer en bas de page les bugs rencontrés et les améliorations souhaitées.
Quelle système ?
LogicOS est basé sur Debian 13 avec l'environnement de bureau Gnome
Utilisation
Utilisateur : lesporteslogiques
Mot de passe : lpl
Ce compte ne peut pas utiliser sudo. La connexion en tant que superutilisateur est accessible à l'utilisateur root avec un mot de passe spécifique
Mise en place
Les logiciels ont été installés et configurés sur un premier ordinateur par qui a permis de créer un master, puis clonés avec clonezilla. La procédure est documentée sur les pages suivantes :
La version de LogicOS 2026 a été réalisée par Jejy dans le cadre d'un stage de BTS SIO.
Liste de tous les logiciels avec la version installée pour Logic OS 2026.
Si le nom du logiciel est cliquable, le lien renvoie vers la page dédiée de ce wiki.
Origine renvoie au site officiel du logiciel.
| Nom (et lien vers la page de ce wiki) | Origine (lien projet) | Version | Type d'installation |
|---|---|---|---|
| terminator | 2.1.4 | apt | |
| etcher | origine | 2.1.4 | Paquet .deb (Github) |
| gsconnect | 62 | apt | |
| syncthing | origine | 1.29.5 | apt |
| git | 2.47.3 | apt | |
| imhex | origine | 1.37.4 | appimage |
| pdfjam | origine | 4.1.0 | apt |
| poppler-utils | origine | 3.03 | apt |
| pdfposter | 0.8.1 | apt |
Notes
| Nom (et lien vers la page de ce wiki) | Origine (lien projet) | Version | Type d'installation |
|---|---|---|---|
| ffmpeg | 7.1.2 | apt | |
| imagemagick | 7.1.1 | apt | |
| sox | 14.4.2 | apt |
Notes
| Nom (et lien vers la page de ce wiki) | Origine (lien projet) | Version | Type d'installation |
|---|---|---|---|
| audacity | 3.7.3 | apt | |
| reaper | origine | Archive | |
| pure data | 0.55.2 | apt | |
| plugdata | origine | 0.9.2 | apt |
| automatonism | origine | 3.1.0 | Archive site |
| sonic pi | 4.6.0 | Github | |
| chuck | apt | ||
| | |||
| | Archive (Github) | ||
| audacious | 4.4.2 | apt | |
| supercollider IDE | 3.13.0 | apt | |
| mixxx | 2.5.0 | apt | |
| QSynth | 2.4.4 | apt | |
| soundthread | 0.4.0 | github | |
| furnace | 0.6.8.1 | apt | |
| orca | 48.1 | apt | |
| pilot | 2.99 | apt | |
| liquidsoap | origine | 2.3.2 | apt |
| VCV rack | archive site | ||
| jack (server) | 1.9.22 | apt |
Notes
| Nom (et lien vers la page de ce wiki) | Origine (lien projet) | Version | Type d'installation |
|---|---|---|---|
| gimp | 3.0.4 | apt | |
| inkscape | 1.4.3 | AppImage | |
| inkstich | 3.2.2 | Script sh | |
| extension inkscape silhouette | 1.29-1 | Github | |
| scribus | 1.6.3 | apt | |
| fontforge | 20230101 | apt | |
| krita | 5.2.9 | apt |
Notes
| Nom (et lien vers la page de ce wiki) | Origine (lien projet) | Version | Type d'installation |
|---|---|---|---|
| | retiré des postes — voir le nettoyage | ||
| Stickeuse QL-570 | origine | v1.0 | install.sh (dépôt) |
Guide d'utilisation de Stickeuse QL-570
Le lien vers la page matériel de l'imprimante : Brother QL-570.
| Nom (et lien vers la page de ce wiki) | Origine (lien projet) | Version | Type d'installation |
|---|---|---|---|
| VLC | 3.0.21 | apt | |
| kdenlive | 24.12.3 | apt | |
| cheese | 44.1 | apt | |
| OBS Studio | 30.2.3.1-3 | apt | |
| Friction | origine | 0.9.6.1 | AppImage |
| Jubler | 9.0.1 | AppImage | |
| aegisub |
| Nom (et lien vers la page de ce wiki) | Origine (lien projet) | Version | Type d'installation |
|---|---|---|---|
| kicad | v9.0 | ||
| arduino | 1.8.19 | ||
| arduino > 2 | origine | 2.3.6 | |
| fritzing | origine | 1.0.1 | apt |
Notes
| Nom (et lien vers la page de ce wiki) | Origine (lien projet) | Version | Type d'installation |
|---|---|---|---|
| freecad | 1.0 | apt | |
| openscad | 2021.01 | apt | |
| cura slicer | 5.0.0 et 5.11.0 | apt |
| Nom (et lien vers la page de ce wiki) | Origine (lien projet) | Version | Type d'installation |
|---|---|---|---|
| vscodium | origine | 1.106.27818 | |
| processing | origine | 4.4.10 | Snap |
| notepadqq | 2.0.0 | apt | |
| python3 + pipx | apt | ||
| vpype | 1.15.0 | pipx | |
| |
Notes
| Nom (et lien vers la page de ce wiki) | Origine (lien projet) | Version | Type d'installation |
|---|---|---|---|
| GBStudio | 4.1.3 | AppImage | |
| LibreSprite | 1.1 | AppImage | |
| Tiled | 1.11.2 | AppImage | |
| Bitsy local | 7.2 | Raccourci HTML | |
| Ren'Py | 8.3.4 | apt | |
| godot | 4.5.1 | Exécutable site | |
| twine | 2.11.1 | Archive Github |
| Nom (et lien vers la page de ce wiki) | Origine (lien projet) | Version | Type d'installation |
|---|---|---|---|
| libreoffice | 25.2.3.2 | ||
| logseq | 0.10.15 | AppImage |
| Nom (et lien vers la page de ce wiki) | Origine (lien projet) | Version | Type d'installation |
|---|---|---|---|
| |
Notes
Configuration du moteur de recherche du wiki dans firefox : utiliser @wikilpl dans la barre de recherche pour utiliser le moteur de recherche interne du wiki
| Nom (et lien vers la page de ce wiki) | Origine (lien projet) | Version | Type d'installation |
|---|---|---|---|
| gnome-shell-extensions | apt | ||
| Keyboard Modifiers Status | origine | extension gnome |
Notes
Cette liste a été extraite au format csv depuis le framacalc qui a servi à l'établir puis transformée au format dokuwiki par un script python écrit par un LLM, puis corrigée manuellement dans dokuwiki! Le script est ci-dessous.
#!/usr/bin/env python3 """ utilisation : python3 csv_to_dokuwiki.py systeme-logicos26.csv > sortie.txt 20260316 / python 3.1.2 @ Tenko / code python réalisé par un LLM prompt : Script python3, sans dépendances pour passer d'un fichier csv à un format tableau dokuwiki. Voila comment traiter chaque colonne : la ligne 1 fournit les entêtes la ligne 2 n'est pas à traiter Pour toutes les lignes suivantes colonne A : si rempli, créer un nouveau tableau avec les lignes qui suivent colonne B : ne pas traiter colonne C : traiter uniquement si le caractère ! apparaît dans ce cas il faudra barrer le nom de la colonne D colonne D : faire apparaître le nom, si la colonne E est remplie faire de ce nom un lien avec l'url de la colonne E colonne E : voir colonne D colonne F : afficher «origine» et créer un lien vers l'URL contenue dans la colonne F colonne G : afficher colonne H : afficher colonne I : reprendre le texte en bas de page hors des tableaux colonne J : ne pas traiter colonne K : reprendre le texte en bas de page hors des tableaux colonne L : reprendre en bas de page """ import csv import sys def dokuwiki_link(text, url): if url: return f"[[{url}|{text}]]" return text def strike(text): return f"<del>{text}</del>" def main(csv_file): footnotes = [] with open(csv_file, newline='', encoding="utf-8") as f: reader = csv.reader(f) rows = list(reader) headers = rows[0] current_table_open = False for i, row in enumerate(rows[2:], start=3): # ligne 3 et suivantes colA = row[0].strip() if len(row) > 0 else "" colC = row[2].strip() if len(row) > 2 else "" colD = row[3].strip() if len(row) > 3 else "" colE = row[4].strip() if len(row) > 4 else "" colF = row[5].strip() if len(row) > 5 else "" colG = row[6].strip() if len(row) > 6 else "" colH = row[7].strip() if len(row) > 7 else "" colI = row[8].strip() if len(row) > 8 else "" colK = row[10].strip() if len(row) > 10 else "" colL = row[11].strip() if len(row) > 11 else "" # nouveau tableau si colonne A remplie if colA: if current_table_open: print() print(f"===== {colA} =====") print("^ Nom ^ Origine ^ G ^ H ^") current_table_open = True # traitement colonne D (nom + lien éventuel) name = colD if colE: name = dokuwiki_link(name, colE) # si ! dans colonne C → barrer if "!" in colC: name = strike(name) # colonne F → lien origine origine = "" if colF: origine = f"[[{colF}|origine]]" print(f"| {name} | {origine} | {colG} | {colH} |") # collecte bas de page for note in (colI, colK, colL): if note: footnotes.append(note) # affichage notes hors tableau if footnotes: print("\n----\n") for n in footnotes: print(f"* {n}") if __name__ == "__main__": if len(sys.argv) != 2: print("Usage: csv_to_dokuwiki.py fichier.csv") sys.exit(1) main(sys.argv[1])
Les OP[XX] portent une ancienne version de la Stickeuse, venue de l'image clonée de janvier 2026. La retirer avant d'installer la version actuelle.
Il faut le mot de passe root — le demander à Pierre.
Le fichier arrive dans le dossier Téléchargements.
Le code du script est reproduit en bas de page, pour qui veut le lire avant de l'exécuter.
Ctrl + Alt + T.
Une ligne à la fois, en validant chacune par Entrée.
Pour coller une commande dans le terminal : Ctrl + Maj + V —
Ctrl + V ne fonctionne pas ici, et ne produit aucun message d'erreur.
su -
Demande le mot de passe root — pas celui de la session. Rien ne s'affiche
pendant la saisie : c'est normal. En cas de refus, le mot de passe est faux :
le demander à Pierre. Quand ça marche, la ligne devant le curseur se termine
par #.
cd /home/lesporteslogiques/Téléchargements
Se place dans le dossier où le script a été téléchargé. Chemin complet
obligatoire : root n'habite pas dans le dossier de l'utilisateur. Si le message
Aucun fichier ou dossier de ce type apparaît, le téléchargement de
l'étape 1 n'a pas abouti, ou le fichier est ailleurs.
bash nettoyage_stickeuse.txt -n
Inventaire seul : ne supprime rien. Deux cas :
Aucune trace de l'ancienne Stickeuse sur ce poste. — le poste est propre. Ne pas lancer la commande suivante : vous pouvez taper exit pour refermer la session root, c'est terminé et vous fermez et rouvrez la session du poste et vous pouvez installer l'application à partir du dépot GitHubN élément(s) à supprimer : suivi de la liste — c'est ce qui sera effacé. Poursuivre avec la commande suivante.
La ligne brother_ql (pip) : présent — CONSERVÉ peut s'ajouter à l'un ou
l'autre : c'est une bibliothèque partagée avec d'autres usages du poste, que le
script laisse volontairement en place. Ne rien faire.
bash nettoyage_stickeuse.txt
Cette fois, supprime. La liste s'affiche à nouveau, puis la question
Supprimer les éléments ci-dessus ? [o/N] : répondre o puis Entrée.
Toute autre réponse annule sans rien toucher.
Le script vérifie ensuite son travail et conclut par l'un des deux messages :
Aucun reste. Poste OPxx propre. — nettoyage complet.Restes à examiner : suivi d'une liste — des fichiers dont le nom contient « stickeuse » ou « ql570 » existent ailleurs sur le disque. Le plus souvent, ce sont des documents personnels ou des fichiers en corbeille, sans rapport avec l'ancienne version : le script ne les touche pas, par prudence. Ce n'est pas bloquant. Taper exit, l'installation de la nouvelle version peut se faire.exit
Referme la session root. La ligne devant le curseur redevient normale.
Puis fermer et rouvrir la session du poste : le menu ne se met à jour qu'à ce moment-là.
Installer la version actuelle : dépôt du projet.
Les comptes des OP[XX] n'ont pas sudo : suivre la voie B.
Protocole du 29 juillet 2026, révisé le 21 août 2026 — script v1.1.
Options avancées et fonctionnement détaillé : bash nettoyage_stickeuse.sh -h.
Auteurice : Vitally LUBIN — Les Portes Logiques, 2026. Licence : 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).
#!/usr/bin/env bash # # ============================================================================ # nettoyage_stickeuse.txt — 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.txt -n # inventaire seul, ne supprime rien # bash nettoyage_stickeuse.txt # 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,41p' "$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.txt 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 le wiki, section « Limites connues »). # # 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}"