SYNOMAP — Flux de migration/miroir torrents → Synology Version du flux: 2025-11-11 Entrées - mapping_entries.txt : liste des items localisés et leur dest_dir cible (/syno/torrents/completed/). - qBittorrent API : état des torrents (hash, save_path, tags, state, progress). Étapes 1) PLAN (daily_qbittorrent_update_v1.32c_synomap.sh) - Lit mapping_entries.txt + inventaire qB. - Produit /root/synomap_plan.txt : • En-tête par torrent: " cat=<...> count= top='' dest_dir=/syno/..." • Ligne d’action: "plan: ln 'SRC' -> 'DST'" • Ajoute des marqueurs éventuels: SKIP:age, [NOSTAT], stalledUP, etc. 2) APPLY (synomap_apply_from_plan_v1.2.6.sh) - PREVIEW: affiche ce qui serait fait (mkdir, ln, setLocation, addTags, recheck/skip). - WRITE: exécute réellement. - Règles: • Si le hardlink existe et inode identique → LINK-EXISTS + SKIP recheck. • Sinon: ln, setLocation(dest_dir), addTags(SYNO), recheck si nécessaire. - one-shot ciblé possible via synomap_one_apply_v1.1.2.sh (un hash du plan). 3) VERIFY - Vérif qB: /api/v2/torrents/info?hashes= → save_path=/syno/..., tags=SYNO, progress=1. - Vérif hardlink: stat -c '%d %i %h %n' "SRC" "DST" → device et inode identiques, nlinks≥2. 4) CLEANUP (synomap_orphans_cleanup_v1.0.sh) - Objectif: supprimer les anciennes copies OMV hors /syno **après** migration validée. - Filtrage strict: ne jamais scanner /syno/ ni /srv/remotemount/. - Procédure: PREVIEW (liste des rm), puis EXEC quand validé. Points d’attention / Edge cases - [NOSTAT] : chemins introuvables/inaccessibles → à traiter au cas par cas. - SKIP:age : torrents trop récents (politique de seuil). - Montages distants (/srv/remotemount/*) : représentent le miroir → exclus de toute suppression. - Recheck: coûteux; s’appuie sur la présence du hardlink; peut être SKIP quand link déjà existant. - Toujours commencer par PREVIEW; ne faire WRITE qu’après lecture attentive de la sortie. Sorties attendues - qBittorrent seed depuis /syno, tag SYNO. - SRC & DST sur le même FS Synology (device identique), nlinks≥2. - Aucune copie résiduelle sous les racines OMV locales après cleanup. [SYNOMAP_DIGEST] roots: syno_root: /syno qb.completed.base: /syno/torrents/completed plan.grammar: header: " cat= count= top='' dest_dir=" action: "plan: ln '' -> ''" qb.api: login: POST /api/v2/auth/login (username,password) info: GET /api/v2/torrents/info?hashes= → save_path,tags,state,progress setLocation: POST /api/v2/torrents/setLocation (hashes,location) addTags: POST /api/v2/torrents/addTags (hashes,tags) recheck: POST /api/v2/torrents/recheck (hashes) apply.logic: if LINK_EXISTS(same inode) → skip recheck else ln(src,dst) → setLocation(dest_dir) → addTags(SYNO) → optional recheck verify.logic: qb.save_path startswith "/syno/" qb.progress == 1.0 stat(src)==stat(dst) on (dev,inode), nlink>=2 cleanup.logic: find only under OMV_LOCAL_ROOTS=/srv/dev-disk-by-uuid-*/data exclude paths: /syno/* , /srv/remotemount/* require qb.save_path=/syno/* AND progress==1 before rm modes: PREVIEW: print actions, no changes WRITE: execute actions tags: ["SYNO"]