Service d’état Rust — pcmirror-serveur remplace status-server/server.py #3

Merged
foXaCe merged 3 commits from hermes/serveur-etat-rust into main 2026-10-16 22:52:23 +02:00
Collaborator

Carte t_21cfa69d.

crates/pcmirror-serveur (binaire pcmirror-serveur) remplace status-server/server.py : mêmes routes, mêmes codes, mêmes pages, plus l’espace disque, l’historique des passes et un verdict de santé.

API — ce que le front doit savoir. Aucun champ retiré ni renommé : /json garde ses douze clés (taille_octets, taille, fichiers, dossiers, derniere_modif, age_secondes, sync_en_cours, sync_progression, dernier_sync, backup_pve_dernier, cache_calcule_le, duree_scan_s) et en ajoute onze (disque, sante, sante_libelle, sante_details, sante_faits, derniere_passe, historique, rapports_illisibles, scan_en_cours, racine, demarre_le). Deux routes neuves : /api/etat (/json + listes : dossiers, récents, plus gros, extensions) et /api/sante (le verdict seul). Rien à changer côté front pour que ça continue de marcher ; les nouveaux blocs sont à disposition si svelte veut les afficher.

Preuves. cargo test --release --locked → 188 tests verts (122 pour ce crate, dont 10 de parité sur de vraies connexions TCP) ; cargo clippy --all-targets --locked -- -D warnings vert ; cargo fmt --check vert ; python3 tests/verifier_reference.py → 21/21 en ligne, 17/17 hors ligne (le serveur Python de référence n’a pas bougé). Les 17 sondes de tests/fixtures/status-server-local/attendu.json sont rejouées contre le binaire Rust par crates/pcmirror-serveur/tests/parite_reference.rs.

Détail des écarts assumés et des bizarreries reproduites : docs/SERVEUR-RUST.md.

Carte t_21cfa69d. `crates/pcmirror-serveur` (binaire `pcmirror-serveur`) remplace `status-server/server.py` : mêmes routes, mêmes codes, mêmes pages, plus l’espace disque, l’historique des passes et un verdict de santé. **API — ce que le front doit savoir.** Aucun champ retiré ni renommé : `/json` garde ses douze clés (`taille_octets`, `taille`, `fichiers`, `dossiers`, `derniere_modif`, `age_secondes`, `sync_en_cours`, `sync_progression`, `dernier_sync`, `backup_pve_dernier`, `cache_calcule_le`, `duree_scan_s`) et en ajoute onze (`disque`, `sante`, `sante_libelle`, `sante_details`, `sante_faits`, `derniere_passe`, `historique`, `rapports_illisibles`, `scan_en_cours`, `racine`, `demarre_le`). Deux routes neuves : `/api/etat` (`/json` + `listes` : dossiers, récents, plus gros, extensions) et `/api/sante` (le verdict seul). Rien à changer côté front pour que ça continue de marcher ; les nouveaux blocs sont à disposition si `svelte` veut les afficher. **Preuves.** `cargo test --release --locked` → 188 tests verts (122 pour ce crate, dont 10 de parité sur de vraies connexions TCP) ; `cargo clippy --all-targets --locked -- -D warnings` vert ; `cargo fmt --check` vert ; `python3 tests/verifier_reference.py` → 21/21 en ligne, 17/17 hors ligne (le serveur Python de référence n’a pas bougé). Les 17 sondes de `tests/fixtures/status-server-local/attendu.json` sont rejouées contre le binaire Rust par `crates/pcmirror-serveur/tests/parite_reference.rs`. Détail des écarts assumés et des bizarreries reproduites : `docs/SERVEUR-RUST.md`.
19 sondages contre le serveur d'état du LXC 108 (codes, en-têtes, corps), la
copie de référence du script de synchro déployé, ses unités systemd, la ligne
de cron périmée et les fichiers de télémétrie lus dans le miroir.

Ajoute capturer.sh (rejoue la capture, en lecture seule) et
verifier_contrat.py (20 contrôles du contrat du serveur vivant).
Documente pcmirror-sync.sh tel qu'il tourne (sources, exclusions, options
rsync, verrou, garde-fous, journaux, codes de sortie, minuteur systemd horaire
à la place du cron périmé, télémétrie, mode restauration) et chaque route de
status-server/server.py avec les fichiers qu'elle lit et écrit.

Relève les écarts : sync/pcmirror-sync.sh du dépôt est la version du 4 juillet
alors que celle déployée date du 12 octobre ; les seuils de santé affichés ne
correspondent pas au code ; POST /exclude supprime le dossier du miroir.
ci: contrôler les réponses de référence à chaque poussée
Some checks failed
Contrôles des références / Références du comportement (push) Has been cancelled
Contrôles des références / Références du comportement (pull_request) Has been cancelled
3db9522adc
Le dépôt n'avait aucun workflow : la carte demandait une CI verte et il n'y
avait rien à passer. Ajoute un métier léger sur l'exécutant du PC (étiquette
`studio`, mode host) : les scripts Python compilent, les 19 réponses de
référence sont complètes et conformes (tests/verifier_reference.py), les
fichiers de télémétrie se relisent. Aucun accès réseau, aucun secret.

Le socle Rust de la carte 2/6 viendra s'ajouter à ce même fichier.
ci: demander l'étiquette pc-lourd pour vérifier l'exécutant disponible
Some checks failed
Contrôles des références / Références du comportement (push) Has been cancelled
Contrôles des références / Références du comportement (pull_request) Has been cancelled
68a87b2acb
docs: notes de reference sur la synchro pcmirror (depot vs version en service)
Some checks failed
Contrôles des références / Références du comportement (push) Has been cancelled
Contrôles des références / Références du comportement (pull_request) Has been cancelled
4166906e46
Cause : le script du depot (sync/pcmirror-sync.sh, 79 lignes) et celui en service
(tests/fixtures/synchro/pcmirror-sync.sh.deploye, 129 lignes) ont diverge (verrou,
garde-fous disque/hote, --partial, exclusions PC-Home, code de sortie, corbeille).
Mesure : avec rsync 3.5.1 et LC_ALL=C, la progression est ecrite en octets a
separateurs de milliers, illisible par l'expression de la ligne 69 du script en
service ; l'expression du depot (l. 50) ne lit jamais le debit.

Remede : inventaire ligne par ligne des deux versions, ecarts, mesures rejouables et
correctif propose (-h, en gardant LC_ALL=C), a integrer dans docs/COMPORTEMENT.md.
tests: capturer les routes qui écrivent et vérifier leurs effets de bord
Some checks failed
Contrôles des références / Références du comportement (push) Has been cancelled
Contrôles des références / Références du comportement (pull_request) Has been cancelled
3da9d160f7
Les instantanés de référence ne couvraient que les routes en lecture : sonder
POST /exclude sur le serveur du LXC 108 supprime un dossier du miroir, donc la
capture en ligne ne pouvait pas montrer ces routes sans détruire des données.

capturer_local.py monte un miroir factice dans /tmp, y écrit un dossier illisible
et exécute le server.py du dépôt — seules trois lignes changent (racine, adresse
d'écoute, message de démarrage), le diff est affiché et vérifié à chaque
exécution. Il rejoue 17 sondes et contrôle les effets de bord : /exclude supprime
bien le dossier du miroir, conserve le motif existant de _exclusions.txt et
laisse les fichiers voisins intacts ; /include retire le motif sans restaurer le
dossier. --verifier rejoue les mêmes sondes et compare les codes au manifeste
attendu.json, sans rien réécrire : c'est ce que lance la CI.

Complètent le jeu en ligne les deux sondes qui manquaient (HEAD et DELETE par
capturer.sh), et verifier_reference.py relit désormais les deux jeux
d'instantanés (trios présents, codes conformes au manifeste, en-têtes en
HTTP/1.0, couverture du vérificateur en ligne).

Deux défauts mesurés sont documentés dans docs/COMPORTEMENT.md : HEAD répond 501
et annonce un Content-Length sans écrire aucun corps (vérifié sur la socket nue),
et le confinement de /files, sans séparateur, accepte un dossier voisin dont le
nom prolonge la racine. Le comportement du serveur n'est pas modifié.
docs: sourcer et corriger l'état mesuré de COMPORTEMENT.md
All checks were successful
Contrôles des références / Références du comportement (push) Successful in 3s
Contrôles des références / Références du comportement (pull_request) Successful in 3s
ea9c9dfafb
La section « écart dépôt / version en service » et la méthode s'appuyaient sur
des copies et des dates non nommées, et trois affirmations étaient fausses.

- planification : cron n'est pas installé sur le PC (« le paquet cronie n'a pas
  été trouvé », `cronie.service` inconnu) ; les unités systemd --user sont
  identiques dans la sauvegarde kde-backup (81326f75…/d10a93c8…) et dans les
  fixtures, et l'en-tête du script en service (l. 14) les déclare ; deux
  horodatages de `_last-sync.json` à ~:03 de l'heure pleine corroborent la
  cadence horaire.
- provenance nommée : `/mnt/Media/Nas/scripts/` (fichiers des 3 et 4 juillet)
  pour la copie périmée de `sync/`, `kde-backup` pour les unités, et
  `/mnt/Media/Nas/scripts/mirror-status-server.py` (4 juillet, 814360fb…,
  889 lignes, 0 `aria-hidden`, 0 `class="vh"`) pour la version qui précède le
  dépôt ; l'unité `mirror-status.service` (de36f6c0…) est lue dans le même
  dossier.
- corrections : la ligne ssh est passée par `-e "$RSH"` (pas `RSYNC_RSH`) ; les
  exclusions fixes sont ajoutées après la dérivation d'`EXCL2`, donc portées par
  le seul rsync média ; les dossiers personnels partent en un seul rsync aplati
  et le code de sortie vient du dernier rsync (un échec média est masqué) ; le
  script du dépôt écrit aussi `rc` dans `_last-sync.json`.
- mesure ajoutée : `/dl?p=_pve-configs/.last-backup` → 404 le 2026-10-15, ce qui
  explique le champ vide `backup_pve_dernier` du tableau de bord ; relevé du
  serveur à 17:31 (89,7 s de scan, 3 255 290 fichiers, 152,4 Go).

Tests : `tests/verifier_reference.py` 21/21 en ligne et 17/17 hors ligne,
`tests/fixtures/capturer_local.py --verifier` 0 incident,
`tests/fixtures/verifier_contrat.py` 22/22 sur 192.168.1.210:9090.
feat(pcmirror): socle Rust de la synchro PC Mirror
Some checks failed
Contrôles des références / Références du comportement (push) Has been cancelled
Contrôles des références / Crate pcmirror (formatage, Clippy, tests) (push) Has been cancelled
Contrôles des références / Références du comportement (pull_request) Has been cancelled
Contrôles des références / Crate pcmirror (formatage, Clippy, tests) (pull_request) Has been cancelled
c250e5ac1d
La passe de synchronisation du PC Studio est réécrite en Rust : crate
`crates/pcmirror` (bibliothèque et binaire), configuration TOML, verrou,
garde-fous, exclusions, corbeille datée, rapport JSON et télémétrie aux mêmes
clés que le script en service.

La référence reste `sync/pcmirror-sync.sh`, que le PC exécute toujours : rien
n'est déployé. `pcmirror run --dry-run` affiche les commandes `rsync` prévues et
reproduit la passe décrite dans `docs/COMPORTEMENT-SYNCHRO.md`.

- verrou `flock` sans attente, comme `flock -n` : un second passage n'attend pas
  et sort en 0 ; une panne de `flock` autre qu'un verrou occupé remonte au lieu
  de se faire passer pour une passe déjà en cours ;
- garde-fous : média absent ou vide, hôte injoignable, dossier personnel vide
  face à une copie pleine, dossier personnel absent ignoré,
  `--ignorer-garde-fous` pour outrepasser un essai à la main ;
- exclusions : les six motifs fixes du script, `_exclusions.txt` du miroir pour
  le transfert média, `/_rapports/` pour ne pas effacer les rapports déposés ;
- rapport JSON de passe, déposé sur le miroir dans `_rapports/` ; télémétrie
  `_last-sync.json` et `_sync-progress.json` (`{"pct":…,"rate":…}` toutes les
  4 s), aux clés du script ;
- CI Forgejo : formatage, `clippy` sans avertissement, tests lançant un vrai
  `rsync` dans `/tmp`, relecture des fichiers de référence.

Mesures : 68 tests passés (`cargo test --release --locked`), `clippy
--all-targets -D warnings` sans avertissement, couverture 89,15 % des régions /
87,58 % des lignes. Référence de parité : le script en service
`/mnt/Media/Linux/pcmirror-sync.sh` (129 lignes, sha256 `cfe3a4b0…`).
ci(pcmirror): mesurer la couverture, documenter les variables d'environnement
Some checks failed
Contrôles des références / Références du comportement (push) Successful in 3s
Contrôles des références / Crate pcmirror (formatage, Clippy, tests) (push) Failing after 0s
Contrôles des références / Références du comportement (pull_request) Successful in 3s
Contrôles des références / Crate pcmirror (formatage, Clippy, tests) (pull_request) Failing after 0s
3bb407d7a7
La carte 2/6 demande la couverture dans la CI et une configuration sans secret.
L'étape `cargo llvm-cov --locked --summary-only --fail-under-lines 80` est ajoutée
au contrôle de la crate : elle mesure quand `cargo-llvm-cov` est installé sur
l'exécutant, et l'écrit sans échouer sinon (l'outil n'est pas garanti partout).
Vérifié à la main : la commande sort 0 (87,58 % des lignes, seuil 80).

`.env.example` recense les trois variables lues par la crate — `PCMIRROR_CONFIG`,
`HOME`, `XDG_RUNTIME_DIR` — sans aucun secret ; la clé SSH reste dans `~/.ssh`,
hors du dépôt. Le README pointe ce fichier.
service d'état Rust : pcmirror-serveur remplace status-server/server.py
Some checks failed
Contrôles des références / Références du comportement (push) Has been cancelled
Contrôles des références / Crate pcmirror (formatage, Clippy, tests) (push) Has been cancelled
Contrôles des références / Références du comportement (pull_request) Has been cancelled
Contrôles des références / Crate pcmirror (formatage, Clippy, tests) (pull_request) Has been cancelled
36942526dc
Cause : le serveur d'état du miroir était un script Python
(status-server/server.py) qui ne dit ni l'espace disque, ni l'historique des
passes, ni si le miroir est à jour : un disque qui se remplit, un sync en
retard ou une passe en échec ne se voyaient qu'en lisant des chiffres bruts.

Remède : nouveau crate pcmirror-serveur (binaire pcmirror-serveur) qui sert les
mêmes routes, mêmes codes et mêmes pages que le serveur Python — vérifié sur de
vraies connexions TCP par les 17 sondes des fixtures de référence — et qui
ajoute l'espace disque du volume (statvfs), l'historique des passes lues dans
<racine>/_rapports (rapports de pcmirror) et un verdict de santé calculé par
des règles explicites (seuils configurables, chaque règle déclenchée listée).

L'API gagne /api/etat et /api/sante ; /json garde ses douze clés et en ajoute
onze, sans en retirer ni renommer : le front continue de fonctionner tel quel.

Quatre écarts assumés, documentés dans docs/SERVEUR-RUST.md : plus aucun emoji
dans les pages (icône SVG dans le fil d'Ariane), l'intervalle de balayage
affiché est le vrai (900 s — le « 5 minutes » du Python était faux), trois
blocs neufs au tableau de bord, et un serveur HTTP écrit à la main pour tenir
501/303 et le téléchargement en flux.

Quatre bizarreries du serveur de référence sont reproduites et couvertes par
tests : le confinement de /files compare un préfixe sans séparateur (un dossier
voisin est listable), les fichiers internes ne sont masqués que pour p vide,
les liens symboliques comptent comme des fichiers, et _exclusions.txt se relit
les barres retirées (sans quoi la liste doublait à chaque enregistrement).
hermes-bot force-pushed hermes/serveur-etat-rust from 36942526dc
Some checks failed
Contrôles des références / Références du comportement (push) Has been cancelled
Contrôles des références / Crate pcmirror (formatage, Clippy, tests) (push) Has been cancelled
Contrôles des références / Références du comportement (pull_request) Has been cancelled
Contrôles des références / Crate pcmirror (formatage, Clippy, tests) (pull_request) Has been cancelled
to f9c6b47860
Some checks failed
Contrôles des références / Références du comportement (push) Successful in 3s
Contrôles des références / Crate pcmirror (formatage, Clippy, tests) (push) Failing after 1s
Contrôles des références / Références du comportement (pull_request) Successful in 3s
Contrôles des références / Crate pcmirror (formatage, Clippy, tests) (pull_request) Failing after 0s
2026-10-15 21:13:18 +02:00
Compare
Collaborator

fusion-auto : pas de fusion, la CI est rouge (Crate pcmirror, Crate pcmirror). Le chef de l'atelier renvoie la carte à l'agent ; l'étiquette tombera d'elle-même une fois corrigé.

`fusion-auto` : pas de fusion, la CI est rouge (Crate pcmirror, Crate pcmirror). Le chef de l'atelier renvoie la carte à l'agent ; l'étiquette tombera d'elle-même une fois corrigé.
CI : le cargo du runner est dans /usr/bin et les navigateurs Playwright sont deja installes
Some checks failed
Contrôles des références / Références du comportement (push) Successful in 4s
Contrôles des références / Crate pcmirror (formatage, Clippy, tests) (push) Failing after 2s
Contrôles des références / Références du comportement (pull_request) Has been cancelled
Contrôles des références / Crate pcmirror (formatage, Clippy, tests) (pull_request) Has been cancelled
e8ed7d0cd4
CI : le relevé des outils ne casse plus le pipeline (SIGPIPE 141)
All checks were successful
Contrôles des références / Références du comportement (push) Successful in 3s
Contrôles des références / Crate pcmirror (formatage, Clippy, tests) (push) Successful in 1m18s
Contrôles des références / Références du comportement (pull_request) Successful in 3s
Contrôles des références / Crate pcmirror (formatage, Clippy, tests) (pull_request) Successful in 1m19s
79a5800e06
foXaCe merged commit 03b8036a22 into main 2026-10-16 22:52:23 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
foXaCe/pc-mirror!3
No description provided.