# Rapport PDF ## Objectif Le PDF doit etre lisible par une equipe d'exploitation et exploitable comme preuve de suivi lors d'un audit. Il doit privilegier la clarte, la date de generation, la couverture de sauvegarde et les exceptions. Etat actuel : la generation PDF est implementee avec `WeasyPrint` a partir d'un template HTML/CSS. L'ancien rendu `reportlab` reste present dans le depot comme reference technique, mais la commande `--generate-pdf` utilise le rendu WeasyPrint. La langue du rapport WeasyPrint est configurable avec `REPORT_LANGUAGE=fr` ou `REPORT_LANGUAGE=en`. La valeur par defaut reste `fr`. Etat du rendu WeasyPrint : - Page de garde complete (break-after page) : barre de logo sur fond blanc en haut, titre principal en bleu `#1f4e79` 32pt centre, barre de metadonnees (Generation, Version) ancree en bas de page via un spacer flex. - Pied de page present sur toutes les pages y compris la page de garde : libelle de document a gauche, date de generation au centre, version a droite, separes du contenu par un filet horizontal. - En-tetes de pages (hors premiere page) : titre du rapport a gauche, numero de page sur le total a droite. - Table des matieres avec numeros de page automatiques (CSS `target-counter`) et hierarchie visuelle : titres de groupe en gras bleu, sous-sections indentees. - Icones SVG devant chaque titre de section (histogramme, serveur, cylindre, horloge, engrenage, triangle d'alerte, bouclier, archive, croix, cercle gris avec point d'interrogation pour la namespace non renseignee) pour identifier rapidement chaque partie. - En-tetes de sections avec bordure gauche bleue et fond gris tres clair pour distinguer les titres du contenu. - Section Resume affichee en grille de KPI cards (7 colonnes sur 2 lignes) plutot qu'en tableau ; les indicateurs "Non sauvegardees" et "Anomalies" apparaissent en orange si leur valeur est superieure a zero. - Tableaux avec en-tetes fonces, lignes alternees, et classes CSS appliquees aux cellules selon leur valeur : vert pour "Active" et "Succes", rouge/gras pour "Non-active" et "Echec", ambre pour "Indetermine", gris italique pour "non renseigne". - Messages d'avertissement (GC PBS en cours) et messages vides distincts visuellement des tableaux. - Le rapport reste lisible en impression noir et blanc : le style repose sur le gras, l'italique et la bordure gauche en plus de la couleur. Le modele de donnees final du futur rapport est previsualisable avec : ```sh PYTHONPATH=src python3 -m pve_backup_report --dump-report-data ``` Cette commande produit un JSON contenant le resume calcule, les stockages PBS, les jobs de sauvegarde, la couverture VM/CT et les anomalies. Les champs bruts sensibles sont filtres dans cette sortie, mais `--dump-report-data` reste une sortie d'audit technique : elle contient des noms de VM/CT, VMID, notes PVE, serveurs, datastores, namespaces, utilisateurs PBS et metadonnees d'infrastructure. Elle doit etre traitee comme une donnee interne. Generation PDF : ```sh PYTHONPATH=src python3 -m pve_backup_report --generate-pdf ``` Le fichier est ecrit dans `REPORT_OUTPUT_DIR` avec un nom horodate. Un rapport existant n'est jamais ecrase. ## Nom du fichier Format recommande : ```text rapport-sauvegardes-pve-YYYY-MM-DD-HHMMSS.pdf ``` Exemple : ```text rapport-sauvegardes-pve-2026-05-07-020000.pdf ``` Le script doit refuser d'ecraser un fichier existant ou generer un nom alternatif unique. ## Structure du rapport ### Page de garde Structure implementee (page entiere, break-after page) : 1. **Barre logo** : logo Proxmox VE (PNG base64) sur fond blanc, separee par un filet gris en bas. 2. **Zone titre** : titre `{{ title }}` en bleu `#1f4e79` 32pt centre, sur fond blanc. 3. **Spacer** : div `flex: 1` qui absorbe l'espace vide et pousse le cartouche en bas. 4. **Barre de metadonnees** : fond gris clair avec bordure bleue en haut, deux elements centres — Generation (`{{ generated_at }}`) et Version (`{{ version }}`), separes par un filet vertical. ### Table des matieres La table des matieres est placee apres la page de garde. Elle est alimentee automatiquement depuis les titres de sections du rapport afin de faciliter la navigation dans le PDF. ### Resume executif Indicateurs minimaux : - nombre total de VM ; - nombre total de CT ; - nombre de VM/CT avec sauvegarde planifiee ; - nombre de VM/CT sans sauvegarde planifiee ; - nombre de VM/CT indetermines ; - nombre de stockages PBS ; - nombre d'anomalies. Le resume calcule dans `ReportSummary` contient aussi : - nombre de jobs actifs ; - nombre de jobs inactifs ; - nombre de sauvegardes vers storage non PBS ; - nombre de sauvegardes vers PBS desactive ; ### Stockages PBS déclarés sur PVE Tableau attendu : | ID | Username | Serveur PBS | Datastore | Namespace | Actif | | --- | --- | --- | --- | --- | --- | Les secrets ne doivent jamais apparaitre. La colonne `Actif` affiche `oui` lorsque le stockage PBS est actif dans PVE. Si le champ PVE `disable` est absent, le stockage est considere actif ; `disable=1` est affiche `non`. ### Utilisateurs PBS - Audit des accès Ce tableau est place juste apres `Stockages PBS déclarés sur PVE`. Tableau attendu : | Serveur PBS | Auth-id | Storage PVE | Datastore | Namespace | Actif | Expiration | Email | Permissions | Commentaire | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | Les donnees viennent des `username` des stockages PBS PVE, rapproches des utilisateurs et permissions effectives exposes par les PBS configures. Si l'auth-id PVE est un token de type `user@realm!token`, la colonne `Auth-id` conserve la valeur complete et les metadonnees utilisateur sont rapprochees avec `user@realm`. Les secrets ne doivent jamais apparaitre. Les permissions affichees sont uniquement les privileges effectifs actifs sur le datastore/namespace cible. ### Espaces de stockage PBS Tableau attendu : | Serveur PBS | Datastore | Espace total | Espace consomme | Espace libre | | --- | --- | --- | --- | --- | Les valeurs sont alimentees depuis le statut des datastores de chaque PBS configure. Les tailles sont affichees en unites lisibles (`Kio`, `Mio`, `Gio`, `Tio`). ### Sauvegarde des VM/CT par namespace Les tableaux de sauvegarde sont regroupes sous un titre de niveau 1 `Sauvegarde des VM/CT`. Les VM/CT sont affichees dans plusieurs tableaux, un tableau par namespace. Le titre de chaque tableau indique la namespace concernee. Colonnes attendues : | VMID | Nom | Notes | Type | Noeud | Etat de la VM | Sauvegarde | Serveur PBS | Storage | Mode | Frequence de sauvegarde | Derniere sauvegarde | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | La colonne `Notes` reprend les notes renseignees sur la VM ou le CT dans PVE. Si aucune note n'est renseignee ou si elle ne peut pas etre collectee, la valeur affichee est `non renseigné`. La colonne `Sauvegarde` affiche `Active` lorsqu'une sauvegarde PBS active est planifiee, sinon `Non-active`. La colonne `Frequence de sauvegarde` reprend l'horaire des jobs de sauvegarde associes, c'est-a-dire la valeur affichee dans la colonne `Horaire` du tableau `Jobs de sauvegarde`. La colonne `Serveur PBS` est deduite du storage PBS associe lorsque le storage est connu. Si `PBS_HOSTNAMES` contient une correspondance, le rendu est `IP (nom-hote)`. La namespace n'est pas affichee comme colonne dans ces tableaux, car elle est deja portee par le titre du tableau. Les tableaux sont tries par ordre alphabetique de namespace, puis les lignes de chaque tableau sont triees par ordre alphabetique sur `Frequence de sauvegarde`. Le `VMID` ne sert plus de critere principal de tri. La colonne `Mode` traduit le mode technique PVE du job : - `snapshot` devient `Aucune interruption attendue` ; - `suspend` devient `Suspension temporaire` ; - `stop` devient `Arret pendant sauvegarde`. La colonne `Derniere sauvegarde` affiche l'etat `Succes`, `Echec` ou `Indetermine`, suivi de la date, de l'heure de fin et de la duree de la derniere tache `vzdump` connue pour la VM/CT lorsque cette duree est disponible. Pour les jobs multi-VM/CT, cette information est deduite du log de la tache `vzdump`, pas seulement de la tache globale du job. La valeur `non renseigne` est attendue si aucune tache `vzdump` terminee n'est encore disponible dans l'historique PVE accessible, par exemple pour une VM/CT ajoutee recemment a un job avant sa premiere sauvegarde effective. Les lignes sans sauvegarde doivent etre visuellement identifiables. Les lignes indeterminees doivent etre distinctes des lignes non sauvegardees. ### Retention des sauvegardes VM/CT par PBS et namespace Les tableaux de retention sont regroupes sous un titre de niveau 1 `Retention des sauvegardes VM/CT`. Les donnees de retention sont affichees dans plusieurs tableaux, separes par serveur PBS puis par namespace. Le titre de chaque tableau indique le PBS et la namespace concernes. Colonnes attendues : | VMID | Nom VM/CT | Datastore | Etat PVE | Nombre de versions | Nombre attendu de versions | Delta | Plus ancienne | Plus recente | Taille | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | La colonne `Datastore` permet de distinguer deux sauvegardes appartenant a la meme namespace sur un meme PBS mais stockees dans des datastores differents. Les colonnes `Nombre de versions`, `Plus ancienne`, `Plus recente` et `Taille` sont alimentees depuis le PBS concerne via la liste des snapshots du datastore et de la namespace concernes. La colonne `Nombre attendu de versions` est calculee depuis la politique de retention active du meme serveur PBS, datastore et namespace, en additionnant les valeurs `keep-last`, `keep-hourly`, `keep-daily`, `keep-weekly`, `keep-monthly` et `keep-yearly` renseignees. La colonne `Delta` affiche l'ecart `Nombre de versions - Nombre attendu de versions` avec un signe `+` ou `-` sauf lorsque l'ecart vaut zero. Si aucune politique active correspondante n'est trouvee, les colonnes `Nombre attendu de versions` et `Delta` affichent `non renseigne`. La colonne `Taille` correspond a la taille de la sauvegarde la plus recente visible sur le PBS concerne. La colonne `Etat PVE` indique si la VM/CT existe encore dans l'inventaire PVE (`Active sur PVE`) ou si elle n'y est plus presente (`Non-active sur PVE`). Chaque serveur PBS peut disposer de plusieurs tableaux : - `Retention des sauvegardes VM/CT - `. La namespace n'est pas affichee comme colonne dans ces tableaux, car elle est deja portee par le titre du tableau. Si le garbage collector du PBS/datastore concerne est en cours au moment de la generation du rapport, un avertissement est affiche juste sous le titre du tableau concerne. Cet avertissement precise que le nombre de versions des sauvegardes des VM/CT peut apparaitre superieur au nombre de versions declarees. Chaque tableau ne liste que les VM/CT pour lesquelles au moins un snapshot correspondant est visible sur le PBS concerne. Les VM/CT encore visibles sur PBS mais absentes de l'inventaire PVE restent affichees dans le tableau et sont marquees `Non-active sur PVE`. Les snapshots dont le namespace n'existe pas dans les namespaces declares sur PVE sont exclus de ces tableaux. Les tableaux de retention sont classes par namespace, puis par nom de VM/CT et VMID lorsque l'information est disponible. ### Politique de retention Le tableau `Politique de retention` est alimente depuis les PBS configures lorsque leurs variables `*_API_URL`, `*_API_TOKEN_ID` et `*_API_TOKEN_SECRET` sont renseignees. La collecte lit les prune jobs PBS via `/config/prune` et affiche : - serveur PBS ; - datastore ; - namespace ; - planification ; - etat actif/inactif ; - colonnes `Derniere`, `Horaire`, `Jour`, `Semaine`, `Mois`, `Annee` ; - profondeur `max-depth`. Une namespace absente dans PBS est affichee comme `/`, c'est-a-dire la namespace racine. ### VM/CT sans sauvegarde Cette section doit reprendre uniquement les charges non couvertes. Elle doit etre courte et directement exploitable. ### Anomalies Cette section liste les problemes de collecte ou d'interpretation. Elle peut etre vide, mais doit alors indiquer qu'aucune anomalie n'a ete detectee. ## Lisibilite Le rapport doit rester lisible en impression noir et blanc. Ne pas dependre uniquement de la couleur pour signaler un risque. Utiliser des libelles explicites : - `Sauvegarde planifiee` ; - `Non sauvegardee` ; - `Indetermine`. ## Horodatage Toutes les dates affichees doivent utiliser le fuseau configure. Le fuseau horaire doit apparaitre dans le rapport. ## Conservation Le rapport quotidien doit etre conserve dans un repertoire persistant. La politique de retention des rapports generes est distincte des politiques de retention PBS et doit etre documentee dans l'exploitation si elle est ajoutee.