diff --git a/.backup-days-until-due-pilot/domains.yaml.bak b/.backup-days-until-due-pilot/domains.yaml.bak new file mode 100644 index 0000000..61761f9 --- /dev/null +++ b/.backup-days-until-due-pilot/domains.yaml.bak @@ -0,0 +1,768 @@ +domains: + + revue: + - name: revue-quotidienne-life-noc + date: "2026-03-13" + notes: Vérifier le tableau de bord Life-NOC + probe: + type: elapsed_time + source: + type: manual_date + inputs_file: "/opt/life-noc/data/inputs/revue.yaml" + item_key: "revue-quotidienne-life-noc" + metric: + unit: days + thresholds: + unknown_lt: 1 + ok_gte: 1 + warning_gte: 2 + critical_gte: 3 + policy: + on_error: critical + + - name: revue-hebdomadaire-priorites + date: "2026-03-10" + notes: Revoir les priorités de la semaine + probe: + type: elapsed_time + source: + type: manual_date + inputs_file: "/opt/life-noc/data/inputs/revue.yaml" + item_key: "revue-hebdomadaire-priorites" + metric: + unit: days + thresholds: + unknown_lt: 5 + ok_gte: 5 + warning_gte: 7 + critical_gte: 10 + policy: + on_error: critical + + - name: revue-mensuelle-systeme-vie + date: 2026-04-01 + notes: Revue mensuelle de l'ensemble du système Life-NOC + + - name: revue-trimestrielle-orientation + date: 2026-06-30 + notes: Revue trimestrielle des orientations de vie et de Chezlepro + + focus: + - name: entretien-processus-focus + date: 2026-03-09 + notes: Vérifier que les cartouches FOCUS sont à jour + + - name: nettoyage-inbox-mentale + date: 2026-03-09 + notes: Vider et clarifier les éléments capturés hors système + + - name: revue-limitation-engagements + date: 2026-03-31 + notes: Vérifier que les engagements actifs demeurent réalistes + + finances-personnelles: + - name: revision-comptes-bancaires + date: 2026-04-01 + notes: Révision mensuelle des comptes bancaires personnels + + - name: verification-cartes-credit + date: 2026-04-01 + notes: Vérification des soldes et transactions des cartes de crédit + + - name: paiement-cartes-credit + date: 2026-04-15 + notes: Paiement des cartes de crédit personnelles + + - name: revision-budget-personnel + date: 2026-04-05 + notes: Révision mensuelle du budget personnel + + - name: verification-prelevements-automatiques + date: 2026-04-03 + notes: Vérification des prélèvements automatiques personnels + + - name: verification-placements + date: 2026-06-30 + notes: Vérification périodique des placements et comptes enregistrés + + - name: verification-cotisations-reer + date: 2026-02-28 + notes: Vérification des cotisations REER + + - name: verification-celi + date: 2026-05-01 + notes: Vérification de l'espace CELI et de son utilisation + + - name: preparation-dossier-financier-annuel + date: 2026-01-31 + notes: Préparer le dossier financier annuel personnel + + fiscalite-personnelle: + - name: preparation-documents-impots + date: 2026-03-15 + notes: Rassembler tous les documents fiscaux personnels + + - name: production-impots-federal + date: 2026-04-30 + notes: Produire la déclaration de revenus fédérale + + - name: production-impots-quebec + date: 2026-04-30 + notes: Produire la déclaration de revenus Québec + + - name: paiement-solde-impots + date: 2026-04-30 + notes: Payer tout solde d'impôt exigible + + - name: verification-avis-cotisation + date: 2026-05-31 + notes: Vérifier les avis de cotisation ARC et Revenu Québec + + - name: archivage-documents-fiscaux + date: 2026-06-15 + notes: Archiver les documents fiscaux personnels + + - name: verification-acomptes-provisionnels + date: 2026-03-15 + notes: Vérifier si des acomptes provisionnels sont requis + + obligations-legales-personnelles: + - name: verification-testament + date: 2026-07-01 + notes: Vérifier la pertinence et l'actualité du testament + + - name: verification-mandat-inaptitude + date: 2026-07-01 + notes: Vérifier le mandat de protection et documents connexes + + - name: verification-directives-medicales + date: 2026-07-15 + notes: Vérifier les directives médicales anticipées + + - name: verification-papiers-identite + date: 2026-06-01 + notes: Vérifier l'expiration des papiers d'identité + + - name: renouvellement-permis-conduire + date: 2027-01-01 + notes: Vérifier le renouvellement du permis de conduire + + - name: verification-carte-assurance-maladie + date: 2026-10-01 + notes: Vérifier l'expiration de la carte d'assurance maladie + + - name: verification-passeport + date: 2026-06-01 + notes: Vérifier l'expiration du passeport + + maison: + - name: remplacement-filtre-fournaise + date: 2026-04-01 + notes: Remplacer le filtre de la fournaise + + - name: inspection-fournaise + date: 2026-09-15 + notes: Inspection générale de la fournaise avant saison froide + + - name: inspection-thermopompe + date: 2026-05-01 + notes: Inspection et entretien de la thermopompe + + - name: nettoyage-unites-exterieures + date: 2026-05-15 + notes: Nettoyer les unités extérieures et vérifier le dégagement + + - name: inspection-toiture + date: 2026-10-01 + notes: Inspection annuelle de la toiture + + - name: inspection-gouttieres + date: 2026-11-01 + notes: Inspection et nettoyage des gouttières + + - name: inspection-fondation + date: 2026-06-01 + notes: Inspection de la fondation et des fissures + + - name: verification-drainage-terrain + date: 2026-05-15 + notes: Vérification du drainage autour de la maison + + - name: test-detecteurs-fumee + date: 2026-04-01 + notes: Test des détecteurs de fumée + + - name: test-detecteurs-co + date: 2026-04-01 + notes: Test des détecteurs de monoxyde de carbone + + - name: remplacement-piles-detecteurs + date: 2026-10-01 + notes: Remplacement préventif des piles des détecteurs + + - name: verification-plomberie-visible + date: 2026-05-01 + notes: Vérification visuelle de la plomberie accessible + + - name: inspection-sump-pump + date: 2026-04-15 + notes: Vérification de la pompe de puisard si applicable + + - name: verification-calfetrage + date: 2026-10-15 + notes: Vérification du calfeutrage portes et fenêtres + + - name: inspection-portes-garage + date: 2026-05-15 + notes: Vérification mécanique et sécurité des portes de garage + + - name: verification-extincteurs + date: 2026-06-01 + notes: Vérification des extincteurs + + garage-et-rangement: + - name: inspection-rangement-plafond + date: 2026-05-01 + notes: Vérification des supports suspendus au plafond du garage + + - name: revue-inventaire-garage + date: 2026-04-15 + notes: Revue de l'inventaire et de l'ordre du garage + + - name: verification-rouille-outillage + date: 2026-05-15 + notes: Vérification de la corrosion sur les outils et équipements + + - name: inspection-securite-garage + date: 2026-06-01 + notes: Vérification des conditions de sécurité du garage + + - name: rotation-stockage-bacs + date: 2026-05-15 + notes: Revue des contenus de bacs de rangement + + energie: + - name: inspection-batteries-lifepo4 + date: 2026-04-01 + notes: Inspection physique et logique des batteries LiFePO4 + + - name: verification-tension-batteries + date: 2026-03-15 + notes: Vérification des tensions et cohérence des batteries + + - name: verification-smartshunt + date: 2026-03-15 + notes: Vérification SmartShunt et cohérence du monitoring + + - name: verification-cerbo-gx + date: 2026-03-15 + notes: Vérification Cerbo GX et remontée des données + + - name: verification-can-rs485 + date: 2026-04-15 + notes: Vérification des communications CAN ou RS485 + + - name: inspection-cablage-energie + date: 2026-05-01 + notes: Inspection du câblage et des connexions énergétiques + + - name: verification-busbars + date: 2026-05-01 + notes: Vérification du serrage, corrosion et échauffement des busbars + + - name: verification-parametres-charge + date: 2026-04-01 + notes: Vérification des paramètres de charge et float + + - name: test-charge-batteries + date: 2026-04-15 + notes: Test de comportement en charge des batteries + + - name: test-comportement-onduleur + date: 2026-05-01 + notes: Vérifier le comportement du Multiplus sous charge légère + + - name: verification-journal-evenements-victron + date: 2026-04-15 + notes: Vérification des événements et anomalies Victron + + resilience: + - name: test-generatrice-propane + date: 2026-04-01 + notes: Test mensuel de la génératrice au propane + + - name: verification-carburant-generatrice + date: 2026-04-01 + notes: Vérification de l'approvisionnement propane lié à la génératrice + + - name: verification-procedure-bascule + date: 2026-04-15 + notes: Réviser la procédure de bascule en mode secours + + - name: verification-stock-lampes-piles + date: 2026-05-01 + notes: Vérification des lampes, piles et éclairage d'urgence + + - name: verification-trousses-urgence + date: 2026-05-15 + notes: Vérification des trousses d'urgence + + - name: revision-plan-urgence + date: 2026-06-01 + notes: Réviser le plan d'urgence domestique + + - name: test-autonomie-base + date: 2026-06-15 + notes: Vérifier l'autonomie énergétique minimale attendue + + - name: verification-moyens-cuisson-secours + date: 2026-05-15 + notes: Vérification des moyens de cuisson de secours + + stock-alimentaire: + - name: rotation-nourriture-seche + date: 2026-04-01 + notes: Rotation des stocks de nourriture sèche + + - name: verification-reserve-eau + date: 2026-04-15 + notes: Vérification de la réserve d'eau potable + + - name: verification-mylar-absorbeurs + date: 2026-05-01 + notes: Vérifier l'intégrité des emballages Mylar et absorbeurs + + - name: revue-inventaire-conserves + date: 2026-04-15 + notes: Revue des conserves et dates de rotation + + - name: revue-inventaire-farine-riz-pates + date: 2026-04-01 + notes: Vérification des gros stocks alimentaires de base + + - name: verification-bacs-legumes-racines + date: 2026-10-01 + notes: Vérification des bacs de stockage de légumes racines + + - name: revue-supplements-vitamines + date: 2026-05-01 + notes: Vérification du stock de suppléments et dates utiles + + sante: + - name: verification-trousse-premiers-soins + date: 2026-04-01 + notes: Vérification de la trousse de premiers soins + + - name: verification-expiration-medicaments + date: 2026-05-01 + notes: Vérification des dates d'expiration des médicaments + + - name: revision-rendez-vous-medicaux + date: 2026-04-15 + notes: Revoir les rendez-vous médicaux requis + + - name: verification-lunettes-prescriptions + date: 2026-06-01 + notes: Vérifier les prescriptions et besoins de renouvellement + + - name: verification-dossier-sante + date: 2026-06-15 + notes: Vérifier l'ordre et l'accessibilité des documents de santé + + voiture: + - name: verification-huile-moteur + date: 2026-04-01 + notes: Vérification de l'huile moteur + + - name: inspection-freins + date: 2026-05-01 + notes: Inspection des freins + + - name: verification-pneus + date: 2026-04-15 + notes: Vérification usure, pression et permutation des pneus + + - name: ajustement-valves + date: 2026-08-01 + notes: Vérification et ajustement des valves Honda Accord + + - name: verification-timing-belt + date: 2027-01-01 + notes: Vérification de la courroie de distribution et pompe à eau + + - name: verification-batterie-voiture + date: 2026-10-01 + notes: Vérification de l'état de la batterie automobile + + - name: verification-balais-essuie-glace + date: 2026-05-01 + notes: Vérification des essuie-glaces + + - name: verification-liquides + date: 2026-04-15 + notes: Vérification des liquides de la voiture + + - name: verification-eclairage + date: 2026-05-01 + notes: Vérification de l'éclairage et des phares + + - name: verification-immatriculation-assurance + date: 2026-06-01 + notes: Vérification papiers d'assurance et immatriculation + + jardin: + - name: inspection-vignes + date: 2026-04-15 + notes: Inspection et entretien des vignes + + - name: entretien-bleuetiers + date: 2026-05-01 + notes: Entretien des bleuetiers + + - name: entretien-framboisiers + date: 2026-06-01 + notes: Entretien des framboisiers + + - name: inspection-kiwis-nordiques + date: 2026-05-15 + notes: Vérification des kiwis nordiques + + - name: entretien-rhubarbe + date: 2026-05-15 + notes: Entretien de la rhubarbe + + - name: inspection-groseillier + date: 2026-05-15 + notes: Inspection du groseillier + + - name: inspection-muriers + date: 2026-05-15 + notes: Inspection des mûriers + + - name: entretien-houblon + date: 2026-06-01 + notes: Vérification et entretien du houblon + + - name: revision-pharmacopée-jardin + date: 2026-05-01 + notes: Vérification du stock de soins pour végétaux + + - name: revision-armoire-produits-jardin + date: 2026-05-01 + notes: Vérification et ordre de l'armoire des produits pour végétaux + + outils-et-equipements: + - name: entretien-outils-jardin + date: 2026-04-15 + notes: Nettoyage et entretien des outils de jardin + + - name: inspection-outils-electriques + date: 2026-05-01 + notes: Vérification des outils électriques + + - name: verification-rallonges-et-connecteurs + date: 2026-05-01 + notes: Vérification des rallonges et connecteurs + + - name: verification-compresseur-et-accessoires + date: 2026-05-15 + notes: Vérification du compresseur et accessoires + + - name: revision-inventaire-outillage + date: 2026-06-01 + notes: Revue de l'inventaire d'outillage + + informatique-personnelle: + - name: verification-sauvegardes-personnelles + date: 2026-04-01 + notes: Vérification des sauvegardes personnelles + + - name: nettoyage-stockage-personnel + date: 2026-04-15 + notes: Nettoyage du stockage numérique personnel + + - name: verification-comptes-importants + date: 2026-05-01 + notes: Vérification des comptes numériques personnels importants + + - name: revue-mots-de-passe-personnels + date: 2026-06-01 + notes: Revue des mots de passe personnels critiques + + - name: verification-documents-cloud-personnels + date: 2026-05-15 + notes: Vérifier la cohérence des documents personnels sauvegardés + + infrastructure-chezlepro: + - name: verification-proxmox + date: 2026-04-01 + notes: Vérification générale de l'environnement Proxmox + + - name: verification-ceph + date: 2026-04-01 + notes: Vérification générale de l'état Ceph + + - name: test-restauration-backups + date: 2026-04-15 + notes: Test de restauration des sauvegardes + + - name: verification-pbs-truenas + date: 2026-05-01 + notes: Vérification des solutions de sauvegarde et synchronisation + + - name: verification-ups-infrastructure + date: 2026-04-15 + notes: Vérification des UPS de l'infrastructure + + - name: verification-capacite-stockage + date: 2026-04-15 + notes: Vérifier capacité et croissance du stockage + + - name: verification-apt-cacher-ng + date: 2026-05-01 + notes: Vérification du bon fonctionnement d'apt-cacher-ng + + - name: verification-icinga2 + date: 2026-04-01 + notes: Vérification de la supervision Icinga2 + + - name: verification-keycloak-openldap + date: 2026-05-01 + notes: Vérification de l'identité et de l'authentification centralisées + + - name: verification-nextcloud + date: 2026-04-15 + notes: Vérification de l'état Nextcloud + + - name: verification-mailcow + date: 2026-05-01 + notes: Vérification de l'infrastructure Mailcow + + - name: verification-openvas + date: 2026-05-15 + notes: Vérification de la plateforme OpenVAS + + - name: verification-journaux-systemes + date: 2026-04-15 + notes: Revue des journaux systèmes critiques + + reseau-chezlepro: + - name: verification-firewalls + date: 2026-04-01 + notes: Vérification des firewalls + + - name: verification-vpn-openvpn + date: 2026-04-15 + notes: Vérification des tunnels OpenVPN + + - name: verification-crl-certificats + date: 2026-04-15 + notes: Vérification de la CRL et des certificats + + - name: verification-switches + date: 2026-05-01 + notes: Vérification des switches et uplinks + + - name: verification-vlans-segmentation + date: 2026-05-01 + notes: Vérification de la segmentation réseau + + - name: verification-dns + date: 2026-05-15 + notes: Vérification DNS interne et externe + + - name: verification-dynamic-dns + date: 2026-05-15 + notes: Vérification du DNS dynamique si utilisé + + - name: audit-regles-firewall + date: 2026-06-01 + notes: Audit périodique des règles de firewall + + - name: verification-geoblocking + date: 2026-05-15 + notes: Vérifier le geoblocking et son effet attendu + + - name: verification-certificats-publics + date: 2026-06-01 + notes: Vérifier les expirations de certificats publics + + securite-chezlepro: + - name: verification-mises-a-jour-securite + date: 2026-04-01 + notes: Vérification des mises à jour de sécurité + + - name: audit-comptes-acces + date: 2026-05-01 + notes: Audit des comptes et accès privilégiés + + - name: verification-ids-snort + date: 2026-05-01 + notes: Vérification des IDS et de leur état + + - name: revue-pki-privee + date: 2026-05-15 + notes: Revue de la PKI privée et des autorités intermédiaires + + - name: revue-politiques-securite + date: 2026-06-01 + notes: Revue des politiques et pratiques de sécurité numérique + + - name: verification-sauvegardes-configuration + date: 2026-04-15 + notes: Vérifier les sauvegardes des configurations critiques + + exploitation-chezlepro: + - name: revision-playbooks-ansible + date: 2026-05-01 + notes: Revue des playbooks Ansible + + - name: verification-inventaires-ansible + date: 2026-05-01 + notes: Vérification des inventaires Ansible + + - name: revision-documentation-technique + date: 2026-05-15 + notes: Revue de la documentation technique Chezlepro + + - name: verification-procedures-reprise + date: 2026-06-01 + notes: Vérifier les procédures de reprise et restauration + + - name: revue-capacite-ressources + date: 2026-06-15 + notes: Revue CPU RAM stockage et charge de l'infrastructure + + - name: verification-jobs-automatises + date: 2026-05-15 + notes: Vérification des jobs automatisés et scripts périodiques + + obligations-chezlepro: + - name: verification-registraire-entreprise + date: 2026-06-15 + notes: Vérifier les obligations au Registraire des entreprises + + - name: verification-declarations-taxes + date: 2026-04-30 + notes: Vérifier les obligations de taxes de l'entreprise si applicables + + - name: verification-dossier-comptable-entreprise + date: 2026-04-15 + notes: Vérifier l'ordre du dossier comptable Chezlepro + + - name: verification-facturation-clients + date: 2026-04-10 + notes: Vérifier la facturation et son suivi + + - name: verification-paiements-fournisseurs + date: 2026-04-10 + notes: Vérifier les paiements fournisseurs + + - name: verification-contrats-ententes + date: 2026-05-15 + notes: Vérifier contrats, ententes et obligations associées + + - name: verification-assurances-entreprise + date: 2026-06-01 + notes: Vérifier les assurances de l'entreprise + + - name: archivage-documents-entreprise + date: 2026-05-31 + notes: Archiver les documents administratifs et financiers de l'entreprise + + actifs-chezlepro: + - name: revision-inventaire-materiel + date: 2026-05-01 + notes: Revoir l'inventaire du matériel de Chezlepro + + - name: verification-amortissables + date: 2026-06-01 + notes: Vérifier le registre des biens amortissables + + - name: verification-serveurs-et-composants + date: 2026-05-15 + notes: Vérifier l'état des serveurs et composants matériels + + - name: verification-reserve-pieces + date: 2026-06-01 + notes: Vérifier les pièces de rechange critiques + + - name: revision-actifs-transferts + date: 2026-06-15 + notes: Réviser les actifs transférés ou à transférer à l'entreprise + + projets: + - name: revision-life-noc + date: 2026-04-01 + notes: Révision du projet Life-NOC + + - name: revision-alliance-boreale + date: 2026-04-15 + notes: Révision du projet Alliance Boréale + + - name: revision-erplibre + date: 2026-05-01 + notes: Révision du projet ERPLibre + + - name: revision-semence-numerique + date: 2026-05-15 + notes: Révision du projet semence numérique + + - name: revision-ortrux-1 + date: 2026-05-15 + notes: Révision du système Ortrux-1 + + - name: revision-district16 + date: 2026-05-01 + notes: Révision du projet DISTRICT16 + + communaute: + - name: verification-outils-aa + date: 2026-05-01 + notes: Vérifier les outils numériques liés aux activités communautaires + + - name: verification-espace-87-16 + date: 2026-05-01 + notes: Vérifier l'espace Nextcloud du district + + - name: verification-salles-visio-groupes + date: 2026-05-15 + notes: Vérifier les salles de visioconférence des groupes + + - name: verification-depots-rapports-rsg + date: 2026-05-15 + notes: Vérifier les dépôts de rapports RSG + + - name: revision-outils-communication-communaute + date: 2026-06-01 + notes: Réviser les moyens de communication communautaires + + documentation: + - name: revue-docs-personnelles-importantes + date: 2026-05-15 + notes: Revoir l'organisation des documents personnels importants + + - name: revue-wiki-technique + date: 2026-05-15 + notes: Revoir le wiki technique et sa cohérence + + - name: revue-base-connaissances + date: 2026-06-01 + notes: Revoir la base de connaissances globale + + - name: verification-sauvegarde-docs-cles + date: 2026-05-15 + notes: Vérifier la sauvegarde des documents clés + + animaux: + - name: verification-stock-nourriture-chats + date: 2026-04-15 + notes: Vérification du stock de nourriture pour chats + + - name: verification-friandises-et-litiere + date: 2026-04-15 + notes: Vérification des stocks de friandises et de litière + + - name: revision-routine-soins-animaux + date: 2026-05-01 + notes: Revue de la routine de soins et des besoins matériels des chats diff --git a/.patch-backup-days-until-due-v2/domains.yaml.bak b/.patch-backup-days-until-due-v2/domains.yaml.bak new file mode 100644 index 0000000..61761f9 --- /dev/null +++ b/.patch-backup-days-until-due-v2/domains.yaml.bak @@ -0,0 +1,768 @@ +domains: + + revue: + - name: revue-quotidienne-life-noc + date: "2026-03-13" + notes: Vérifier le tableau de bord Life-NOC + probe: + type: elapsed_time + source: + type: manual_date + inputs_file: "/opt/life-noc/data/inputs/revue.yaml" + item_key: "revue-quotidienne-life-noc" + metric: + unit: days + thresholds: + unknown_lt: 1 + ok_gte: 1 + warning_gte: 2 + critical_gte: 3 + policy: + on_error: critical + + - name: revue-hebdomadaire-priorites + date: "2026-03-10" + notes: Revoir les priorités de la semaine + probe: + type: elapsed_time + source: + type: manual_date + inputs_file: "/opt/life-noc/data/inputs/revue.yaml" + item_key: "revue-hebdomadaire-priorites" + metric: + unit: days + thresholds: + unknown_lt: 5 + ok_gte: 5 + warning_gte: 7 + critical_gte: 10 + policy: + on_error: critical + + - name: revue-mensuelle-systeme-vie + date: 2026-04-01 + notes: Revue mensuelle de l'ensemble du système Life-NOC + + - name: revue-trimestrielle-orientation + date: 2026-06-30 + notes: Revue trimestrielle des orientations de vie et de Chezlepro + + focus: + - name: entretien-processus-focus + date: 2026-03-09 + notes: Vérifier que les cartouches FOCUS sont à jour + + - name: nettoyage-inbox-mentale + date: 2026-03-09 + notes: Vider et clarifier les éléments capturés hors système + + - name: revue-limitation-engagements + date: 2026-03-31 + notes: Vérifier que les engagements actifs demeurent réalistes + + finances-personnelles: + - name: revision-comptes-bancaires + date: 2026-04-01 + notes: Révision mensuelle des comptes bancaires personnels + + - name: verification-cartes-credit + date: 2026-04-01 + notes: Vérification des soldes et transactions des cartes de crédit + + - name: paiement-cartes-credit + date: 2026-04-15 + notes: Paiement des cartes de crédit personnelles + + - name: revision-budget-personnel + date: 2026-04-05 + notes: Révision mensuelle du budget personnel + + - name: verification-prelevements-automatiques + date: 2026-04-03 + notes: Vérification des prélèvements automatiques personnels + + - name: verification-placements + date: 2026-06-30 + notes: Vérification périodique des placements et comptes enregistrés + + - name: verification-cotisations-reer + date: 2026-02-28 + notes: Vérification des cotisations REER + + - name: verification-celi + date: 2026-05-01 + notes: Vérification de l'espace CELI et de son utilisation + + - name: preparation-dossier-financier-annuel + date: 2026-01-31 + notes: Préparer le dossier financier annuel personnel + + fiscalite-personnelle: + - name: preparation-documents-impots + date: 2026-03-15 + notes: Rassembler tous les documents fiscaux personnels + + - name: production-impots-federal + date: 2026-04-30 + notes: Produire la déclaration de revenus fédérale + + - name: production-impots-quebec + date: 2026-04-30 + notes: Produire la déclaration de revenus Québec + + - name: paiement-solde-impots + date: 2026-04-30 + notes: Payer tout solde d'impôt exigible + + - name: verification-avis-cotisation + date: 2026-05-31 + notes: Vérifier les avis de cotisation ARC et Revenu Québec + + - name: archivage-documents-fiscaux + date: 2026-06-15 + notes: Archiver les documents fiscaux personnels + + - name: verification-acomptes-provisionnels + date: 2026-03-15 + notes: Vérifier si des acomptes provisionnels sont requis + + obligations-legales-personnelles: + - name: verification-testament + date: 2026-07-01 + notes: Vérifier la pertinence et l'actualité du testament + + - name: verification-mandat-inaptitude + date: 2026-07-01 + notes: Vérifier le mandat de protection et documents connexes + + - name: verification-directives-medicales + date: 2026-07-15 + notes: Vérifier les directives médicales anticipées + + - name: verification-papiers-identite + date: 2026-06-01 + notes: Vérifier l'expiration des papiers d'identité + + - name: renouvellement-permis-conduire + date: 2027-01-01 + notes: Vérifier le renouvellement du permis de conduire + + - name: verification-carte-assurance-maladie + date: 2026-10-01 + notes: Vérifier l'expiration de la carte d'assurance maladie + + - name: verification-passeport + date: 2026-06-01 + notes: Vérifier l'expiration du passeport + + maison: + - name: remplacement-filtre-fournaise + date: 2026-04-01 + notes: Remplacer le filtre de la fournaise + + - name: inspection-fournaise + date: 2026-09-15 + notes: Inspection générale de la fournaise avant saison froide + + - name: inspection-thermopompe + date: 2026-05-01 + notes: Inspection et entretien de la thermopompe + + - name: nettoyage-unites-exterieures + date: 2026-05-15 + notes: Nettoyer les unités extérieures et vérifier le dégagement + + - name: inspection-toiture + date: 2026-10-01 + notes: Inspection annuelle de la toiture + + - name: inspection-gouttieres + date: 2026-11-01 + notes: Inspection et nettoyage des gouttières + + - name: inspection-fondation + date: 2026-06-01 + notes: Inspection de la fondation et des fissures + + - name: verification-drainage-terrain + date: 2026-05-15 + notes: Vérification du drainage autour de la maison + + - name: test-detecteurs-fumee + date: 2026-04-01 + notes: Test des détecteurs de fumée + + - name: test-detecteurs-co + date: 2026-04-01 + notes: Test des détecteurs de monoxyde de carbone + + - name: remplacement-piles-detecteurs + date: 2026-10-01 + notes: Remplacement préventif des piles des détecteurs + + - name: verification-plomberie-visible + date: 2026-05-01 + notes: Vérification visuelle de la plomberie accessible + + - name: inspection-sump-pump + date: 2026-04-15 + notes: Vérification de la pompe de puisard si applicable + + - name: verification-calfetrage + date: 2026-10-15 + notes: Vérification du calfeutrage portes et fenêtres + + - name: inspection-portes-garage + date: 2026-05-15 + notes: Vérification mécanique et sécurité des portes de garage + + - name: verification-extincteurs + date: 2026-06-01 + notes: Vérification des extincteurs + + garage-et-rangement: + - name: inspection-rangement-plafond + date: 2026-05-01 + notes: Vérification des supports suspendus au plafond du garage + + - name: revue-inventaire-garage + date: 2026-04-15 + notes: Revue de l'inventaire et de l'ordre du garage + + - name: verification-rouille-outillage + date: 2026-05-15 + notes: Vérification de la corrosion sur les outils et équipements + + - name: inspection-securite-garage + date: 2026-06-01 + notes: Vérification des conditions de sécurité du garage + + - name: rotation-stockage-bacs + date: 2026-05-15 + notes: Revue des contenus de bacs de rangement + + energie: + - name: inspection-batteries-lifepo4 + date: 2026-04-01 + notes: Inspection physique et logique des batteries LiFePO4 + + - name: verification-tension-batteries + date: 2026-03-15 + notes: Vérification des tensions et cohérence des batteries + + - name: verification-smartshunt + date: 2026-03-15 + notes: Vérification SmartShunt et cohérence du monitoring + + - name: verification-cerbo-gx + date: 2026-03-15 + notes: Vérification Cerbo GX et remontée des données + + - name: verification-can-rs485 + date: 2026-04-15 + notes: Vérification des communications CAN ou RS485 + + - name: inspection-cablage-energie + date: 2026-05-01 + notes: Inspection du câblage et des connexions énergétiques + + - name: verification-busbars + date: 2026-05-01 + notes: Vérification du serrage, corrosion et échauffement des busbars + + - name: verification-parametres-charge + date: 2026-04-01 + notes: Vérification des paramètres de charge et float + + - name: test-charge-batteries + date: 2026-04-15 + notes: Test de comportement en charge des batteries + + - name: test-comportement-onduleur + date: 2026-05-01 + notes: Vérifier le comportement du Multiplus sous charge légère + + - name: verification-journal-evenements-victron + date: 2026-04-15 + notes: Vérification des événements et anomalies Victron + + resilience: + - name: test-generatrice-propane + date: 2026-04-01 + notes: Test mensuel de la génératrice au propane + + - name: verification-carburant-generatrice + date: 2026-04-01 + notes: Vérification de l'approvisionnement propane lié à la génératrice + + - name: verification-procedure-bascule + date: 2026-04-15 + notes: Réviser la procédure de bascule en mode secours + + - name: verification-stock-lampes-piles + date: 2026-05-01 + notes: Vérification des lampes, piles et éclairage d'urgence + + - name: verification-trousses-urgence + date: 2026-05-15 + notes: Vérification des trousses d'urgence + + - name: revision-plan-urgence + date: 2026-06-01 + notes: Réviser le plan d'urgence domestique + + - name: test-autonomie-base + date: 2026-06-15 + notes: Vérifier l'autonomie énergétique minimale attendue + + - name: verification-moyens-cuisson-secours + date: 2026-05-15 + notes: Vérification des moyens de cuisson de secours + + stock-alimentaire: + - name: rotation-nourriture-seche + date: 2026-04-01 + notes: Rotation des stocks de nourriture sèche + + - name: verification-reserve-eau + date: 2026-04-15 + notes: Vérification de la réserve d'eau potable + + - name: verification-mylar-absorbeurs + date: 2026-05-01 + notes: Vérifier l'intégrité des emballages Mylar et absorbeurs + + - name: revue-inventaire-conserves + date: 2026-04-15 + notes: Revue des conserves et dates de rotation + + - name: revue-inventaire-farine-riz-pates + date: 2026-04-01 + notes: Vérification des gros stocks alimentaires de base + + - name: verification-bacs-legumes-racines + date: 2026-10-01 + notes: Vérification des bacs de stockage de légumes racines + + - name: revue-supplements-vitamines + date: 2026-05-01 + notes: Vérification du stock de suppléments et dates utiles + + sante: + - name: verification-trousse-premiers-soins + date: 2026-04-01 + notes: Vérification de la trousse de premiers soins + + - name: verification-expiration-medicaments + date: 2026-05-01 + notes: Vérification des dates d'expiration des médicaments + + - name: revision-rendez-vous-medicaux + date: 2026-04-15 + notes: Revoir les rendez-vous médicaux requis + + - name: verification-lunettes-prescriptions + date: 2026-06-01 + notes: Vérifier les prescriptions et besoins de renouvellement + + - name: verification-dossier-sante + date: 2026-06-15 + notes: Vérifier l'ordre et l'accessibilité des documents de santé + + voiture: + - name: verification-huile-moteur + date: 2026-04-01 + notes: Vérification de l'huile moteur + + - name: inspection-freins + date: 2026-05-01 + notes: Inspection des freins + + - name: verification-pneus + date: 2026-04-15 + notes: Vérification usure, pression et permutation des pneus + + - name: ajustement-valves + date: 2026-08-01 + notes: Vérification et ajustement des valves Honda Accord + + - name: verification-timing-belt + date: 2027-01-01 + notes: Vérification de la courroie de distribution et pompe à eau + + - name: verification-batterie-voiture + date: 2026-10-01 + notes: Vérification de l'état de la batterie automobile + + - name: verification-balais-essuie-glace + date: 2026-05-01 + notes: Vérification des essuie-glaces + + - name: verification-liquides + date: 2026-04-15 + notes: Vérification des liquides de la voiture + + - name: verification-eclairage + date: 2026-05-01 + notes: Vérification de l'éclairage et des phares + + - name: verification-immatriculation-assurance + date: 2026-06-01 + notes: Vérification papiers d'assurance et immatriculation + + jardin: + - name: inspection-vignes + date: 2026-04-15 + notes: Inspection et entretien des vignes + + - name: entretien-bleuetiers + date: 2026-05-01 + notes: Entretien des bleuetiers + + - name: entretien-framboisiers + date: 2026-06-01 + notes: Entretien des framboisiers + + - name: inspection-kiwis-nordiques + date: 2026-05-15 + notes: Vérification des kiwis nordiques + + - name: entretien-rhubarbe + date: 2026-05-15 + notes: Entretien de la rhubarbe + + - name: inspection-groseillier + date: 2026-05-15 + notes: Inspection du groseillier + + - name: inspection-muriers + date: 2026-05-15 + notes: Inspection des mûriers + + - name: entretien-houblon + date: 2026-06-01 + notes: Vérification et entretien du houblon + + - name: revision-pharmacopée-jardin + date: 2026-05-01 + notes: Vérification du stock de soins pour végétaux + + - name: revision-armoire-produits-jardin + date: 2026-05-01 + notes: Vérification et ordre de l'armoire des produits pour végétaux + + outils-et-equipements: + - name: entretien-outils-jardin + date: 2026-04-15 + notes: Nettoyage et entretien des outils de jardin + + - name: inspection-outils-electriques + date: 2026-05-01 + notes: Vérification des outils électriques + + - name: verification-rallonges-et-connecteurs + date: 2026-05-01 + notes: Vérification des rallonges et connecteurs + + - name: verification-compresseur-et-accessoires + date: 2026-05-15 + notes: Vérification du compresseur et accessoires + + - name: revision-inventaire-outillage + date: 2026-06-01 + notes: Revue de l'inventaire d'outillage + + informatique-personnelle: + - name: verification-sauvegardes-personnelles + date: 2026-04-01 + notes: Vérification des sauvegardes personnelles + + - name: nettoyage-stockage-personnel + date: 2026-04-15 + notes: Nettoyage du stockage numérique personnel + + - name: verification-comptes-importants + date: 2026-05-01 + notes: Vérification des comptes numériques personnels importants + + - name: revue-mots-de-passe-personnels + date: 2026-06-01 + notes: Revue des mots de passe personnels critiques + + - name: verification-documents-cloud-personnels + date: 2026-05-15 + notes: Vérifier la cohérence des documents personnels sauvegardés + + infrastructure-chezlepro: + - name: verification-proxmox + date: 2026-04-01 + notes: Vérification générale de l'environnement Proxmox + + - name: verification-ceph + date: 2026-04-01 + notes: Vérification générale de l'état Ceph + + - name: test-restauration-backups + date: 2026-04-15 + notes: Test de restauration des sauvegardes + + - name: verification-pbs-truenas + date: 2026-05-01 + notes: Vérification des solutions de sauvegarde et synchronisation + + - name: verification-ups-infrastructure + date: 2026-04-15 + notes: Vérification des UPS de l'infrastructure + + - name: verification-capacite-stockage + date: 2026-04-15 + notes: Vérifier capacité et croissance du stockage + + - name: verification-apt-cacher-ng + date: 2026-05-01 + notes: Vérification du bon fonctionnement d'apt-cacher-ng + + - name: verification-icinga2 + date: 2026-04-01 + notes: Vérification de la supervision Icinga2 + + - name: verification-keycloak-openldap + date: 2026-05-01 + notes: Vérification de l'identité et de l'authentification centralisées + + - name: verification-nextcloud + date: 2026-04-15 + notes: Vérification de l'état Nextcloud + + - name: verification-mailcow + date: 2026-05-01 + notes: Vérification de l'infrastructure Mailcow + + - name: verification-openvas + date: 2026-05-15 + notes: Vérification de la plateforme OpenVAS + + - name: verification-journaux-systemes + date: 2026-04-15 + notes: Revue des journaux systèmes critiques + + reseau-chezlepro: + - name: verification-firewalls + date: 2026-04-01 + notes: Vérification des firewalls + + - name: verification-vpn-openvpn + date: 2026-04-15 + notes: Vérification des tunnels OpenVPN + + - name: verification-crl-certificats + date: 2026-04-15 + notes: Vérification de la CRL et des certificats + + - name: verification-switches + date: 2026-05-01 + notes: Vérification des switches et uplinks + + - name: verification-vlans-segmentation + date: 2026-05-01 + notes: Vérification de la segmentation réseau + + - name: verification-dns + date: 2026-05-15 + notes: Vérification DNS interne et externe + + - name: verification-dynamic-dns + date: 2026-05-15 + notes: Vérification du DNS dynamique si utilisé + + - name: audit-regles-firewall + date: 2026-06-01 + notes: Audit périodique des règles de firewall + + - name: verification-geoblocking + date: 2026-05-15 + notes: Vérifier le geoblocking et son effet attendu + + - name: verification-certificats-publics + date: 2026-06-01 + notes: Vérifier les expirations de certificats publics + + securite-chezlepro: + - name: verification-mises-a-jour-securite + date: 2026-04-01 + notes: Vérification des mises à jour de sécurité + + - name: audit-comptes-acces + date: 2026-05-01 + notes: Audit des comptes et accès privilégiés + + - name: verification-ids-snort + date: 2026-05-01 + notes: Vérification des IDS et de leur état + + - name: revue-pki-privee + date: 2026-05-15 + notes: Revue de la PKI privée et des autorités intermédiaires + + - name: revue-politiques-securite + date: 2026-06-01 + notes: Revue des politiques et pratiques de sécurité numérique + + - name: verification-sauvegardes-configuration + date: 2026-04-15 + notes: Vérifier les sauvegardes des configurations critiques + + exploitation-chezlepro: + - name: revision-playbooks-ansible + date: 2026-05-01 + notes: Revue des playbooks Ansible + + - name: verification-inventaires-ansible + date: 2026-05-01 + notes: Vérification des inventaires Ansible + + - name: revision-documentation-technique + date: 2026-05-15 + notes: Revue de la documentation technique Chezlepro + + - name: verification-procedures-reprise + date: 2026-06-01 + notes: Vérifier les procédures de reprise et restauration + + - name: revue-capacite-ressources + date: 2026-06-15 + notes: Revue CPU RAM stockage et charge de l'infrastructure + + - name: verification-jobs-automatises + date: 2026-05-15 + notes: Vérification des jobs automatisés et scripts périodiques + + obligations-chezlepro: + - name: verification-registraire-entreprise + date: 2026-06-15 + notes: Vérifier les obligations au Registraire des entreprises + + - name: verification-declarations-taxes + date: 2026-04-30 + notes: Vérifier les obligations de taxes de l'entreprise si applicables + + - name: verification-dossier-comptable-entreprise + date: 2026-04-15 + notes: Vérifier l'ordre du dossier comptable Chezlepro + + - name: verification-facturation-clients + date: 2026-04-10 + notes: Vérifier la facturation et son suivi + + - name: verification-paiements-fournisseurs + date: 2026-04-10 + notes: Vérifier les paiements fournisseurs + + - name: verification-contrats-ententes + date: 2026-05-15 + notes: Vérifier contrats, ententes et obligations associées + + - name: verification-assurances-entreprise + date: 2026-06-01 + notes: Vérifier les assurances de l'entreprise + + - name: archivage-documents-entreprise + date: 2026-05-31 + notes: Archiver les documents administratifs et financiers de l'entreprise + + actifs-chezlepro: + - name: revision-inventaire-materiel + date: 2026-05-01 + notes: Revoir l'inventaire du matériel de Chezlepro + + - name: verification-amortissables + date: 2026-06-01 + notes: Vérifier le registre des biens amortissables + + - name: verification-serveurs-et-composants + date: 2026-05-15 + notes: Vérifier l'état des serveurs et composants matériels + + - name: verification-reserve-pieces + date: 2026-06-01 + notes: Vérifier les pièces de rechange critiques + + - name: revision-actifs-transferts + date: 2026-06-15 + notes: Réviser les actifs transférés ou à transférer à l'entreprise + + projets: + - name: revision-life-noc + date: 2026-04-01 + notes: Révision du projet Life-NOC + + - name: revision-alliance-boreale + date: 2026-04-15 + notes: Révision du projet Alliance Boréale + + - name: revision-erplibre + date: 2026-05-01 + notes: Révision du projet ERPLibre + + - name: revision-semence-numerique + date: 2026-05-15 + notes: Révision du projet semence numérique + + - name: revision-ortrux-1 + date: 2026-05-15 + notes: Révision du système Ortrux-1 + + - name: revision-district16 + date: 2026-05-01 + notes: Révision du projet DISTRICT16 + + communaute: + - name: verification-outils-aa + date: 2026-05-01 + notes: Vérifier les outils numériques liés aux activités communautaires + + - name: verification-espace-87-16 + date: 2026-05-01 + notes: Vérifier l'espace Nextcloud du district + + - name: verification-salles-visio-groupes + date: 2026-05-15 + notes: Vérifier les salles de visioconférence des groupes + + - name: verification-depots-rapports-rsg + date: 2026-05-15 + notes: Vérifier les dépôts de rapports RSG + + - name: revision-outils-communication-communaute + date: 2026-06-01 + notes: Réviser les moyens de communication communautaires + + documentation: + - name: revue-docs-personnelles-importantes + date: 2026-05-15 + notes: Revoir l'organisation des documents personnels importants + + - name: revue-wiki-technique + date: 2026-05-15 + notes: Revoir le wiki technique et sa cohérence + + - name: revue-base-connaissances + date: 2026-06-01 + notes: Revoir la base de connaissances globale + + - name: verification-sauvegarde-docs-cles + date: 2026-05-15 + notes: Vérifier la sauvegarde des documents clés + + animaux: + - name: verification-stock-nourriture-chats + date: 2026-04-15 + notes: Vérification du stock de nourriture pour chats + + - name: verification-friandises-et-litiere + date: 2026-04-15 + notes: Vérification des stocks de friandises et de litière + + - name: revision-routine-soins-animaux + date: 2026-05-01 + notes: Revue de la routine de soins et des besoins matériels des chats diff --git a/.patch-backup-days-until-due-v2/generate_services.py.bak b/.patch-backup-days-until-due-v2/generate_services.py.bak new file mode 100644 index 0000000..e7373a9 --- /dev/null +++ b/.patch-backup-days-until-due-v2/generate_services.py.bak @@ -0,0 +1,298 @@ +#!/usr/bin/env python3 + +from pathlib import Path +import re +import sys +import yaml + +INPUT_FILE = Path("domains.yaml") +OUTPUT_DIR = Path("icinga/services") +SERVICEGROUPS_DIR = Path("icinga/servicegroups") +SERVICEGROUPS_FILE = SERVICEGROUPS_DIR / "life-noc.conf" +HOST_NAME = "life-noc" +SERVICE_TEMPLATE = "service_echeance" +PROBE_TEMPLATE = "service_life_noc_probe" +DEFAULT_MOCK_STATE = "OK" +DEFAULT_MOCK_MESSAGE = "Sous contrôle" + + +def slugify(value: str) -> str: + value = value.strip().lower() + replacements = { + "à": "a", "â": "a", "ä": "a", + "ç": "c", + "é": "e", "è": "e", "ê": "e", "ë": "e", + "î": "i", "ï": "i", + "ô": "o", "ö": "o", + "ù": "u", "û": "u", "ü": "u", + "ÿ": "y", + "œ": "oe", + "æ": "ae", + "'": "", + "’": "", + } + for old, new in replacements.items(): + value = value.replace(old, new) + value = re.sub(r"[^a-z0-9\-]+", "-", value) + value = re.sub(r"-{2,}", "-", value) + return value.strip("-") + + +def aliasify(value: str) -> str: + value = value.strip().upper() + replacements = { + "À": "A", "Â": "A", "Ä": "A", + "Ç": "C", + "É": "E", "È": "E", "Ê": "E", "Ë": "E", + "Î": "I", "Ï": "I", + "Ô": "O", "Ö": "O", + "Ù": "U", "Û": "U", "Ü": "U", + "Ÿ": "Y", + "Œ": "OE", + "Æ": "AE", + "'": "", + "’": "", + } + for old, new in replacements.items(): + value = value.replace(old, new) + value = re.sub(r"[^A-Z0-9\-]+", "-", value) + value = re.sub(r"-{2,}", "-", value) + return value.strip("-") + + +def icinga_escape(value: str) -> str: + return value.replace("\\", "\\\\").replace('"', '\\"') + + +def normalize_mock_state(value: str) -> str: + state = str(value).strip().upper() + allowed = {"OK", "WARNING", "CRITICAL"} + if state not in allowed: + raise ValueError( + f"mock_state invalide: {value}. Valeurs permises: {', '.join(sorted(allowed))}" + ) + return state + + +def render_mock_service(domain: str, group_name: str, item: dict) -> str: + name = item["name"].strip() + date = str(item["date"]).strip() + notes = item.get("notes", "").strip() + notes_url = item.get("notes_url", "").strip() + action_url = item.get("action_url", "").strip() + mock_state = normalize_mock_state(item.get("mock_state", DEFAULT_MOCK_STATE)) + mock_message = item.get("mock_message", DEFAULT_MOCK_MESSAGE).strip() or DEFAULT_MOCK_MESSAGE + + service_name = f"{domain}-{name}" + + lines = [ + f'apply Service "{icinga_escape(service_name)}" {{', + f' import "{SERVICE_TEMPLATE}"', + f' vars.date_echeance = "{icinga_escape(date)}"', + f' vars.mock_state = "{icinga_escape(mock_state)}"', + f' vars.mock_message = "{icinga_escape(mock_message)}"', + f' groups = [ "{icinga_escape(group_name)}" ]', + ] + + if notes: + lines.append(f' notes = "{icinga_escape(notes)}"') + if notes_url: + lines.append(f' notes_url = "{icinga_escape(notes_url)}"') + if action_url: + lines.append(f' action_url = "{icinga_escape(action_url)}"') + + lines.append(f' assign where host.name == "{HOST_NAME}"') + lines.append("}") + lines.append("") + + return "\n".join(lines) + + +def render_probe_service(domain: str, group_name: str, item: dict) -> str: + name = item["name"].strip() + notes = item.get("notes", "").strip() + notes_url = item.get("notes_url", "").strip() + action_url = item.get("action_url", "").strip() + probe = item["probe"] + + probe_type = str(probe["type"]).strip() + source = probe["source"] + metric = probe["metric"] + thresholds = probe["thresholds"] + policy = probe.get("policy", {}) + + service_name = f"{domain}-{name}" + + lines = [ + f'apply Service "{icinga_escape(service_name)}" {{', + f' import "{PROBE_TEMPLATE}"', + f' vars.life_noc_probe_type = "{icinga_escape(probe_type)}"', + f' vars.life_noc_source_type = "{icinga_escape(str(source["type"]).strip())}"', + f' vars.life_noc_source_value = "{icinga_escape(str(source.get("value", "")).strip())}"', + f' vars.life_noc_inputs_file = "{icinga_escape(str(source.get("inputs_file", "")).strip())}"', + f' vars.life_noc_item_key = "{icinga_escape(str(source.get("item_key", name)).strip())}"', + f' vars.life_noc_metric_unit = "{icinga_escape(str(metric["unit"]).strip())}"', + f' vars.life_noc_label = "{icinga_escape(name)}"', + f' groups = [ "{icinga_escape(group_name)}" ]', + ] + + if "unknown_lt" in thresholds: + lines.append(f' vars.life_noc_threshold_unknown_lt = "{icinga_escape(str(thresholds["unknown_lt"]))}"') + if "ok_gte" in thresholds: + lines.append(f' vars.life_noc_threshold_ok_gte = "{icinga_escape(str(thresholds["ok_gte"]))}"') + if "warning_gte" in thresholds: + lines.append(f' vars.life_noc_threshold_warning_gte = "{icinga_escape(str(thresholds["warning_gte"]))}"') + if "critical_gte" in thresholds: + lines.append(f' vars.life_noc_threshold_critical_gte = "{icinga_escape(str(thresholds["critical_gte"]))}"') + + on_error = str(policy.get("on_error", "critical")).strip() + lines.append(f' vars.life_noc_on_error = "{icinga_escape(on_error)}"') + + if notes: + lines.append(f' notes = "{icinga_escape(notes)}"') + if notes_url: + lines.append(f' notes_url = "{icinga_escape(notes_url)}"') + if action_url: + lines.append(f' action_url = "{icinga_escape(action_url)}"') + + lines.append(f' assign where host.name == "{HOST_NAME}"') + lines.append("}") + lines.append("") + + return "\n".join(lines) + + +def validate_probe(item: dict) -> None: + probe = item["probe"] + if not isinstance(probe, dict): + raise ValueError("probe doit être un objet") + + if str(probe.get("type", "")).strip() != "elapsed_time": + raise ValueError("seul probe.type=elapsed_time est supporté en v1") + + source = probe.get("source") + if not isinstance(source, dict): + raise ValueError("probe.source doit être un objet") + if str(source.get("type", "")).strip() != "manual_date": + raise ValueError("seul probe.source.type=manual_date est supporté en v1") + + has_inline_value = "value" in source + has_store_ref = "inputs_file" in source and "item_key" in source + + if not has_inline_value and not has_store_ref: + raise ValueError("probe.source.value ou probe.source.inputs_file + item_key requis") + + metric = probe.get("metric") + if not isinstance(metric, dict): + raise ValueError("probe.metric doit être un objet") + if str(metric.get("unit", "")).strip() != "days": + raise ValueError("seul probe.metric.unit=days est supporté en v1") + + thresholds = probe.get("thresholds") + if not isinstance(thresholds, dict): + raise ValueError("probe.thresholds doit être un objet") + + +def render_servicegroup(group_name: str) -> str: + return "\n".join([ + f'object ServiceGroup "{icinga_escape(group_name)}" {{', + f' display_name = "{icinga_escape(group_name)}"', + "}", + "", + ]) + + +def main() -> int: + if not INPUT_FILE.exists(): + print(f"Erreur: fichier introuvable: {INPUT_FILE}", file=sys.stderr) + return 1 + + with INPUT_FILE.open("r", encoding="utf-8") as f: + data = yaml.safe_load(f) + + if not isinstance(data, dict) or "domains" not in data: + print("Erreur: le YAML doit contenir une clé racine 'domains'.", file=sys.stderr) + return 1 + + domains = data["domains"] + if not isinstance(domains, dict): + print("Erreur: 'domains' doit être un objet YAML.", file=sys.stderr) + return 1 + + OUTPUT_DIR.mkdir(parents=True, exist_ok=True) + SERVICEGROUPS_DIR.mkdir(parents=True, exist_ok=True) + + for existing_conf in OUTPUT_DIR.glob("*.conf"): + existing_conf.unlink() + + if SERVICEGROUPS_FILE.exists(): + SERVICEGROUPS_FILE.unlink() + + generated_files = [] + servicegroup_content = [ + "/*", + " AUTO-GENERATED FILE - SERVICE GROUPS", + " Ne pas modifier manuellement.", + " Source: domains.yaml", + "*/", + "", + ] + + for raw_domain, services in domains.items(): + domain = slugify(str(raw_domain)) + group_name = aliasify(str(raw_domain)) + + if not isinstance(services, list): + print(f"Erreur: le domaine '{raw_domain}' doit contenir une liste.", file=sys.stderr) + return 1 + + output_file = OUTPUT_DIR / f"{domain}.conf" + content = [ + "/*", + f" AUTO-GENERATED FILE - DOMAIN: {raw_domain}", + " Ne pas modifier manuellement.", + " Source: domains.yaml", + "*/", + "", + ] + + servicegroup_content.append(render_servicegroup(group_name)) + + for idx, item in enumerate(services, start=1): + if not isinstance(item, dict): + print(f"Erreur: entrée invalide dans '{raw_domain}' à la position {idx}.", file=sys.stderr) + return 1 + + missing = [key for key in ("name", "date", "notes") if key not in item] + if missing: + print( + f"Erreur: dans le domaine '{raw_domain}', entrée {idx}, champs manquants: {', '.join(missing)}", + file=sys.stderr, + ) + return 1 + + try: + if "probe" in item: + validate_probe(item) + content.append(render_probe_service(domain, group_name, item)) + else: + content.append(render_mock_service(domain, group_name, item)) + except ValueError as exc: + print(f"Erreur dans '{raw_domain}', entrée {idx}: {exc}", file=sys.stderr) + return 1 + + output_file.write_text("\n".join(content).rstrip() + "\n", encoding="utf-8") + generated_files.append(str(output_file)) + + SERVICEGROUPS_FILE.write_text("\n".join(servicegroup_content).rstrip() + "\n", encoding="utf-8") + generated_files.append(str(SERVICEGROUPS_FILE)) + + print("Fichiers générés :") + for file_path in generated_files: + print(f" - {file_path}") + + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/.patch-backup-days-until-due-v3/domains.yaml.bak b/.patch-backup-days-until-due-v3/domains.yaml.bak new file mode 100644 index 0000000..61761f9 --- /dev/null +++ b/.patch-backup-days-until-due-v3/domains.yaml.bak @@ -0,0 +1,768 @@ +domains: + + revue: + - name: revue-quotidienne-life-noc + date: "2026-03-13" + notes: Vérifier le tableau de bord Life-NOC + probe: + type: elapsed_time + source: + type: manual_date + inputs_file: "/opt/life-noc/data/inputs/revue.yaml" + item_key: "revue-quotidienne-life-noc" + metric: + unit: days + thresholds: + unknown_lt: 1 + ok_gte: 1 + warning_gte: 2 + critical_gte: 3 + policy: + on_error: critical + + - name: revue-hebdomadaire-priorites + date: "2026-03-10" + notes: Revoir les priorités de la semaine + probe: + type: elapsed_time + source: + type: manual_date + inputs_file: "/opt/life-noc/data/inputs/revue.yaml" + item_key: "revue-hebdomadaire-priorites" + metric: + unit: days + thresholds: + unknown_lt: 5 + ok_gte: 5 + warning_gte: 7 + critical_gte: 10 + policy: + on_error: critical + + - name: revue-mensuelle-systeme-vie + date: 2026-04-01 + notes: Revue mensuelle de l'ensemble du système Life-NOC + + - name: revue-trimestrielle-orientation + date: 2026-06-30 + notes: Revue trimestrielle des orientations de vie et de Chezlepro + + focus: + - name: entretien-processus-focus + date: 2026-03-09 + notes: Vérifier que les cartouches FOCUS sont à jour + + - name: nettoyage-inbox-mentale + date: 2026-03-09 + notes: Vider et clarifier les éléments capturés hors système + + - name: revue-limitation-engagements + date: 2026-03-31 + notes: Vérifier que les engagements actifs demeurent réalistes + + finances-personnelles: + - name: revision-comptes-bancaires + date: 2026-04-01 + notes: Révision mensuelle des comptes bancaires personnels + + - name: verification-cartes-credit + date: 2026-04-01 + notes: Vérification des soldes et transactions des cartes de crédit + + - name: paiement-cartes-credit + date: 2026-04-15 + notes: Paiement des cartes de crédit personnelles + + - name: revision-budget-personnel + date: 2026-04-05 + notes: Révision mensuelle du budget personnel + + - name: verification-prelevements-automatiques + date: 2026-04-03 + notes: Vérification des prélèvements automatiques personnels + + - name: verification-placements + date: 2026-06-30 + notes: Vérification périodique des placements et comptes enregistrés + + - name: verification-cotisations-reer + date: 2026-02-28 + notes: Vérification des cotisations REER + + - name: verification-celi + date: 2026-05-01 + notes: Vérification de l'espace CELI et de son utilisation + + - name: preparation-dossier-financier-annuel + date: 2026-01-31 + notes: Préparer le dossier financier annuel personnel + + fiscalite-personnelle: + - name: preparation-documents-impots + date: 2026-03-15 + notes: Rassembler tous les documents fiscaux personnels + + - name: production-impots-federal + date: 2026-04-30 + notes: Produire la déclaration de revenus fédérale + + - name: production-impots-quebec + date: 2026-04-30 + notes: Produire la déclaration de revenus Québec + + - name: paiement-solde-impots + date: 2026-04-30 + notes: Payer tout solde d'impôt exigible + + - name: verification-avis-cotisation + date: 2026-05-31 + notes: Vérifier les avis de cotisation ARC et Revenu Québec + + - name: archivage-documents-fiscaux + date: 2026-06-15 + notes: Archiver les documents fiscaux personnels + + - name: verification-acomptes-provisionnels + date: 2026-03-15 + notes: Vérifier si des acomptes provisionnels sont requis + + obligations-legales-personnelles: + - name: verification-testament + date: 2026-07-01 + notes: Vérifier la pertinence et l'actualité du testament + + - name: verification-mandat-inaptitude + date: 2026-07-01 + notes: Vérifier le mandat de protection et documents connexes + + - name: verification-directives-medicales + date: 2026-07-15 + notes: Vérifier les directives médicales anticipées + + - name: verification-papiers-identite + date: 2026-06-01 + notes: Vérifier l'expiration des papiers d'identité + + - name: renouvellement-permis-conduire + date: 2027-01-01 + notes: Vérifier le renouvellement du permis de conduire + + - name: verification-carte-assurance-maladie + date: 2026-10-01 + notes: Vérifier l'expiration de la carte d'assurance maladie + + - name: verification-passeport + date: 2026-06-01 + notes: Vérifier l'expiration du passeport + + maison: + - name: remplacement-filtre-fournaise + date: 2026-04-01 + notes: Remplacer le filtre de la fournaise + + - name: inspection-fournaise + date: 2026-09-15 + notes: Inspection générale de la fournaise avant saison froide + + - name: inspection-thermopompe + date: 2026-05-01 + notes: Inspection et entretien de la thermopompe + + - name: nettoyage-unites-exterieures + date: 2026-05-15 + notes: Nettoyer les unités extérieures et vérifier le dégagement + + - name: inspection-toiture + date: 2026-10-01 + notes: Inspection annuelle de la toiture + + - name: inspection-gouttieres + date: 2026-11-01 + notes: Inspection et nettoyage des gouttières + + - name: inspection-fondation + date: 2026-06-01 + notes: Inspection de la fondation et des fissures + + - name: verification-drainage-terrain + date: 2026-05-15 + notes: Vérification du drainage autour de la maison + + - name: test-detecteurs-fumee + date: 2026-04-01 + notes: Test des détecteurs de fumée + + - name: test-detecteurs-co + date: 2026-04-01 + notes: Test des détecteurs de monoxyde de carbone + + - name: remplacement-piles-detecteurs + date: 2026-10-01 + notes: Remplacement préventif des piles des détecteurs + + - name: verification-plomberie-visible + date: 2026-05-01 + notes: Vérification visuelle de la plomberie accessible + + - name: inspection-sump-pump + date: 2026-04-15 + notes: Vérification de la pompe de puisard si applicable + + - name: verification-calfetrage + date: 2026-10-15 + notes: Vérification du calfeutrage portes et fenêtres + + - name: inspection-portes-garage + date: 2026-05-15 + notes: Vérification mécanique et sécurité des portes de garage + + - name: verification-extincteurs + date: 2026-06-01 + notes: Vérification des extincteurs + + garage-et-rangement: + - name: inspection-rangement-plafond + date: 2026-05-01 + notes: Vérification des supports suspendus au plafond du garage + + - name: revue-inventaire-garage + date: 2026-04-15 + notes: Revue de l'inventaire et de l'ordre du garage + + - name: verification-rouille-outillage + date: 2026-05-15 + notes: Vérification de la corrosion sur les outils et équipements + + - name: inspection-securite-garage + date: 2026-06-01 + notes: Vérification des conditions de sécurité du garage + + - name: rotation-stockage-bacs + date: 2026-05-15 + notes: Revue des contenus de bacs de rangement + + energie: + - name: inspection-batteries-lifepo4 + date: 2026-04-01 + notes: Inspection physique et logique des batteries LiFePO4 + + - name: verification-tension-batteries + date: 2026-03-15 + notes: Vérification des tensions et cohérence des batteries + + - name: verification-smartshunt + date: 2026-03-15 + notes: Vérification SmartShunt et cohérence du monitoring + + - name: verification-cerbo-gx + date: 2026-03-15 + notes: Vérification Cerbo GX et remontée des données + + - name: verification-can-rs485 + date: 2026-04-15 + notes: Vérification des communications CAN ou RS485 + + - name: inspection-cablage-energie + date: 2026-05-01 + notes: Inspection du câblage et des connexions énergétiques + + - name: verification-busbars + date: 2026-05-01 + notes: Vérification du serrage, corrosion et échauffement des busbars + + - name: verification-parametres-charge + date: 2026-04-01 + notes: Vérification des paramètres de charge et float + + - name: test-charge-batteries + date: 2026-04-15 + notes: Test de comportement en charge des batteries + + - name: test-comportement-onduleur + date: 2026-05-01 + notes: Vérifier le comportement du Multiplus sous charge légère + + - name: verification-journal-evenements-victron + date: 2026-04-15 + notes: Vérification des événements et anomalies Victron + + resilience: + - name: test-generatrice-propane + date: 2026-04-01 + notes: Test mensuel de la génératrice au propane + + - name: verification-carburant-generatrice + date: 2026-04-01 + notes: Vérification de l'approvisionnement propane lié à la génératrice + + - name: verification-procedure-bascule + date: 2026-04-15 + notes: Réviser la procédure de bascule en mode secours + + - name: verification-stock-lampes-piles + date: 2026-05-01 + notes: Vérification des lampes, piles et éclairage d'urgence + + - name: verification-trousses-urgence + date: 2026-05-15 + notes: Vérification des trousses d'urgence + + - name: revision-plan-urgence + date: 2026-06-01 + notes: Réviser le plan d'urgence domestique + + - name: test-autonomie-base + date: 2026-06-15 + notes: Vérifier l'autonomie énergétique minimale attendue + + - name: verification-moyens-cuisson-secours + date: 2026-05-15 + notes: Vérification des moyens de cuisson de secours + + stock-alimentaire: + - name: rotation-nourriture-seche + date: 2026-04-01 + notes: Rotation des stocks de nourriture sèche + + - name: verification-reserve-eau + date: 2026-04-15 + notes: Vérification de la réserve d'eau potable + + - name: verification-mylar-absorbeurs + date: 2026-05-01 + notes: Vérifier l'intégrité des emballages Mylar et absorbeurs + + - name: revue-inventaire-conserves + date: 2026-04-15 + notes: Revue des conserves et dates de rotation + + - name: revue-inventaire-farine-riz-pates + date: 2026-04-01 + notes: Vérification des gros stocks alimentaires de base + + - name: verification-bacs-legumes-racines + date: 2026-10-01 + notes: Vérification des bacs de stockage de légumes racines + + - name: revue-supplements-vitamines + date: 2026-05-01 + notes: Vérification du stock de suppléments et dates utiles + + sante: + - name: verification-trousse-premiers-soins + date: 2026-04-01 + notes: Vérification de la trousse de premiers soins + + - name: verification-expiration-medicaments + date: 2026-05-01 + notes: Vérification des dates d'expiration des médicaments + + - name: revision-rendez-vous-medicaux + date: 2026-04-15 + notes: Revoir les rendez-vous médicaux requis + + - name: verification-lunettes-prescriptions + date: 2026-06-01 + notes: Vérifier les prescriptions et besoins de renouvellement + + - name: verification-dossier-sante + date: 2026-06-15 + notes: Vérifier l'ordre et l'accessibilité des documents de santé + + voiture: + - name: verification-huile-moteur + date: 2026-04-01 + notes: Vérification de l'huile moteur + + - name: inspection-freins + date: 2026-05-01 + notes: Inspection des freins + + - name: verification-pneus + date: 2026-04-15 + notes: Vérification usure, pression et permutation des pneus + + - name: ajustement-valves + date: 2026-08-01 + notes: Vérification et ajustement des valves Honda Accord + + - name: verification-timing-belt + date: 2027-01-01 + notes: Vérification de la courroie de distribution et pompe à eau + + - name: verification-batterie-voiture + date: 2026-10-01 + notes: Vérification de l'état de la batterie automobile + + - name: verification-balais-essuie-glace + date: 2026-05-01 + notes: Vérification des essuie-glaces + + - name: verification-liquides + date: 2026-04-15 + notes: Vérification des liquides de la voiture + + - name: verification-eclairage + date: 2026-05-01 + notes: Vérification de l'éclairage et des phares + + - name: verification-immatriculation-assurance + date: 2026-06-01 + notes: Vérification papiers d'assurance et immatriculation + + jardin: + - name: inspection-vignes + date: 2026-04-15 + notes: Inspection et entretien des vignes + + - name: entretien-bleuetiers + date: 2026-05-01 + notes: Entretien des bleuetiers + + - name: entretien-framboisiers + date: 2026-06-01 + notes: Entretien des framboisiers + + - name: inspection-kiwis-nordiques + date: 2026-05-15 + notes: Vérification des kiwis nordiques + + - name: entretien-rhubarbe + date: 2026-05-15 + notes: Entretien de la rhubarbe + + - name: inspection-groseillier + date: 2026-05-15 + notes: Inspection du groseillier + + - name: inspection-muriers + date: 2026-05-15 + notes: Inspection des mûriers + + - name: entretien-houblon + date: 2026-06-01 + notes: Vérification et entretien du houblon + + - name: revision-pharmacopée-jardin + date: 2026-05-01 + notes: Vérification du stock de soins pour végétaux + + - name: revision-armoire-produits-jardin + date: 2026-05-01 + notes: Vérification et ordre de l'armoire des produits pour végétaux + + outils-et-equipements: + - name: entretien-outils-jardin + date: 2026-04-15 + notes: Nettoyage et entretien des outils de jardin + + - name: inspection-outils-electriques + date: 2026-05-01 + notes: Vérification des outils électriques + + - name: verification-rallonges-et-connecteurs + date: 2026-05-01 + notes: Vérification des rallonges et connecteurs + + - name: verification-compresseur-et-accessoires + date: 2026-05-15 + notes: Vérification du compresseur et accessoires + + - name: revision-inventaire-outillage + date: 2026-06-01 + notes: Revue de l'inventaire d'outillage + + informatique-personnelle: + - name: verification-sauvegardes-personnelles + date: 2026-04-01 + notes: Vérification des sauvegardes personnelles + + - name: nettoyage-stockage-personnel + date: 2026-04-15 + notes: Nettoyage du stockage numérique personnel + + - name: verification-comptes-importants + date: 2026-05-01 + notes: Vérification des comptes numériques personnels importants + + - name: revue-mots-de-passe-personnels + date: 2026-06-01 + notes: Revue des mots de passe personnels critiques + + - name: verification-documents-cloud-personnels + date: 2026-05-15 + notes: Vérifier la cohérence des documents personnels sauvegardés + + infrastructure-chezlepro: + - name: verification-proxmox + date: 2026-04-01 + notes: Vérification générale de l'environnement Proxmox + + - name: verification-ceph + date: 2026-04-01 + notes: Vérification générale de l'état Ceph + + - name: test-restauration-backups + date: 2026-04-15 + notes: Test de restauration des sauvegardes + + - name: verification-pbs-truenas + date: 2026-05-01 + notes: Vérification des solutions de sauvegarde et synchronisation + + - name: verification-ups-infrastructure + date: 2026-04-15 + notes: Vérification des UPS de l'infrastructure + + - name: verification-capacite-stockage + date: 2026-04-15 + notes: Vérifier capacité et croissance du stockage + + - name: verification-apt-cacher-ng + date: 2026-05-01 + notes: Vérification du bon fonctionnement d'apt-cacher-ng + + - name: verification-icinga2 + date: 2026-04-01 + notes: Vérification de la supervision Icinga2 + + - name: verification-keycloak-openldap + date: 2026-05-01 + notes: Vérification de l'identité et de l'authentification centralisées + + - name: verification-nextcloud + date: 2026-04-15 + notes: Vérification de l'état Nextcloud + + - name: verification-mailcow + date: 2026-05-01 + notes: Vérification de l'infrastructure Mailcow + + - name: verification-openvas + date: 2026-05-15 + notes: Vérification de la plateforme OpenVAS + + - name: verification-journaux-systemes + date: 2026-04-15 + notes: Revue des journaux systèmes critiques + + reseau-chezlepro: + - name: verification-firewalls + date: 2026-04-01 + notes: Vérification des firewalls + + - name: verification-vpn-openvpn + date: 2026-04-15 + notes: Vérification des tunnels OpenVPN + + - name: verification-crl-certificats + date: 2026-04-15 + notes: Vérification de la CRL et des certificats + + - name: verification-switches + date: 2026-05-01 + notes: Vérification des switches et uplinks + + - name: verification-vlans-segmentation + date: 2026-05-01 + notes: Vérification de la segmentation réseau + + - name: verification-dns + date: 2026-05-15 + notes: Vérification DNS interne et externe + + - name: verification-dynamic-dns + date: 2026-05-15 + notes: Vérification du DNS dynamique si utilisé + + - name: audit-regles-firewall + date: 2026-06-01 + notes: Audit périodique des règles de firewall + + - name: verification-geoblocking + date: 2026-05-15 + notes: Vérifier le geoblocking et son effet attendu + + - name: verification-certificats-publics + date: 2026-06-01 + notes: Vérifier les expirations de certificats publics + + securite-chezlepro: + - name: verification-mises-a-jour-securite + date: 2026-04-01 + notes: Vérification des mises à jour de sécurité + + - name: audit-comptes-acces + date: 2026-05-01 + notes: Audit des comptes et accès privilégiés + + - name: verification-ids-snort + date: 2026-05-01 + notes: Vérification des IDS et de leur état + + - name: revue-pki-privee + date: 2026-05-15 + notes: Revue de la PKI privée et des autorités intermédiaires + + - name: revue-politiques-securite + date: 2026-06-01 + notes: Revue des politiques et pratiques de sécurité numérique + + - name: verification-sauvegardes-configuration + date: 2026-04-15 + notes: Vérifier les sauvegardes des configurations critiques + + exploitation-chezlepro: + - name: revision-playbooks-ansible + date: 2026-05-01 + notes: Revue des playbooks Ansible + + - name: verification-inventaires-ansible + date: 2026-05-01 + notes: Vérification des inventaires Ansible + + - name: revision-documentation-technique + date: 2026-05-15 + notes: Revue de la documentation technique Chezlepro + + - name: verification-procedures-reprise + date: 2026-06-01 + notes: Vérifier les procédures de reprise et restauration + + - name: revue-capacite-ressources + date: 2026-06-15 + notes: Revue CPU RAM stockage et charge de l'infrastructure + + - name: verification-jobs-automatises + date: 2026-05-15 + notes: Vérification des jobs automatisés et scripts périodiques + + obligations-chezlepro: + - name: verification-registraire-entreprise + date: 2026-06-15 + notes: Vérifier les obligations au Registraire des entreprises + + - name: verification-declarations-taxes + date: 2026-04-30 + notes: Vérifier les obligations de taxes de l'entreprise si applicables + + - name: verification-dossier-comptable-entreprise + date: 2026-04-15 + notes: Vérifier l'ordre du dossier comptable Chezlepro + + - name: verification-facturation-clients + date: 2026-04-10 + notes: Vérifier la facturation et son suivi + + - name: verification-paiements-fournisseurs + date: 2026-04-10 + notes: Vérifier les paiements fournisseurs + + - name: verification-contrats-ententes + date: 2026-05-15 + notes: Vérifier contrats, ententes et obligations associées + + - name: verification-assurances-entreprise + date: 2026-06-01 + notes: Vérifier les assurances de l'entreprise + + - name: archivage-documents-entreprise + date: 2026-05-31 + notes: Archiver les documents administratifs et financiers de l'entreprise + + actifs-chezlepro: + - name: revision-inventaire-materiel + date: 2026-05-01 + notes: Revoir l'inventaire du matériel de Chezlepro + + - name: verification-amortissables + date: 2026-06-01 + notes: Vérifier le registre des biens amortissables + + - name: verification-serveurs-et-composants + date: 2026-05-15 + notes: Vérifier l'état des serveurs et composants matériels + + - name: verification-reserve-pieces + date: 2026-06-01 + notes: Vérifier les pièces de rechange critiques + + - name: revision-actifs-transferts + date: 2026-06-15 + notes: Réviser les actifs transférés ou à transférer à l'entreprise + + projets: + - name: revision-life-noc + date: 2026-04-01 + notes: Révision du projet Life-NOC + + - name: revision-alliance-boreale + date: 2026-04-15 + notes: Révision du projet Alliance Boréale + + - name: revision-erplibre + date: 2026-05-01 + notes: Révision du projet ERPLibre + + - name: revision-semence-numerique + date: 2026-05-15 + notes: Révision du projet semence numérique + + - name: revision-ortrux-1 + date: 2026-05-15 + notes: Révision du système Ortrux-1 + + - name: revision-district16 + date: 2026-05-01 + notes: Révision du projet DISTRICT16 + + communaute: + - name: verification-outils-aa + date: 2026-05-01 + notes: Vérifier les outils numériques liés aux activités communautaires + + - name: verification-espace-87-16 + date: 2026-05-01 + notes: Vérifier l'espace Nextcloud du district + + - name: verification-salles-visio-groupes + date: 2026-05-15 + notes: Vérifier les salles de visioconférence des groupes + + - name: verification-depots-rapports-rsg + date: 2026-05-15 + notes: Vérifier les dépôts de rapports RSG + + - name: revision-outils-communication-communaute + date: 2026-06-01 + notes: Réviser les moyens de communication communautaires + + documentation: + - name: revue-docs-personnelles-importantes + date: 2026-05-15 + notes: Revoir l'organisation des documents personnels importants + + - name: revue-wiki-technique + date: 2026-05-15 + notes: Revoir le wiki technique et sa cohérence + + - name: revue-base-connaissances + date: 2026-06-01 + notes: Revoir la base de connaissances globale + + - name: verification-sauvegarde-docs-cles + date: 2026-05-15 + notes: Vérifier la sauvegarde des documents clés + + animaux: + - name: verification-stock-nourriture-chats + date: 2026-04-15 + notes: Vérification du stock de nourriture pour chats + + - name: verification-friandises-et-litiere + date: 2026-04-15 + notes: Vérification des stocks de friandises et de litière + + - name: revision-routine-soins-animaux + date: 2026-05-01 + notes: Revue de la routine de soins et des besoins matériels des chats diff --git a/.patch-backup-days-until-due-v3/generate_services.py.bak b/.patch-backup-days-until-due-v3/generate_services.py.bak new file mode 100644 index 0000000..e7373a9 --- /dev/null +++ b/.patch-backup-days-until-due-v3/generate_services.py.bak @@ -0,0 +1,298 @@ +#!/usr/bin/env python3 + +from pathlib import Path +import re +import sys +import yaml + +INPUT_FILE = Path("domains.yaml") +OUTPUT_DIR = Path("icinga/services") +SERVICEGROUPS_DIR = Path("icinga/servicegroups") +SERVICEGROUPS_FILE = SERVICEGROUPS_DIR / "life-noc.conf" +HOST_NAME = "life-noc" +SERVICE_TEMPLATE = "service_echeance" +PROBE_TEMPLATE = "service_life_noc_probe" +DEFAULT_MOCK_STATE = "OK" +DEFAULT_MOCK_MESSAGE = "Sous contrôle" + + +def slugify(value: str) -> str: + value = value.strip().lower() + replacements = { + "à": "a", "â": "a", "ä": "a", + "ç": "c", + "é": "e", "è": "e", "ê": "e", "ë": "e", + "î": "i", "ï": "i", + "ô": "o", "ö": "o", + "ù": "u", "û": "u", "ü": "u", + "ÿ": "y", + "œ": "oe", + "æ": "ae", + "'": "", + "’": "", + } + for old, new in replacements.items(): + value = value.replace(old, new) + value = re.sub(r"[^a-z0-9\-]+", "-", value) + value = re.sub(r"-{2,}", "-", value) + return value.strip("-") + + +def aliasify(value: str) -> str: + value = value.strip().upper() + replacements = { + "À": "A", "Â": "A", "Ä": "A", + "Ç": "C", + "É": "E", "È": "E", "Ê": "E", "Ë": "E", + "Î": "I", "Ï": "I", + "Ô": "O", "Ö": "O", + "Ù": "U", "Û": "U", "Ü": "U", + "Ÿ": "Y", + "Œ": "OE", + "Æ": "AE", + "'": "", + "’": "", + } + for old, new in replacements.items(): + value = value.replace(old, new) + value = re.sub(r"[^A-Z0-9\-]+", "-", value) + value = re.sub(r"-{2,}", "-", value) + return value.strip("-") + + +def icinga_escape(value: str) -> str: + return value.replace("\\", "\\\\").replace('"', '\\"') + + +def normalize_mock_state(value: str) -> str: + state = str(value).strip().upper() + allowed = {"OK", "WARNING", "CRITICAL"} + if state not in allowed: + raise ValueError( + f"mock_state invalide: {value}. Valeurs permises: {', '.join(sorted(allowed))}" + ) + return state + + +def render_mock_service(domain: str, group_name: str, item: dict) -> str: + name = item["name"].strip() + date = str(item["date"]).strip() + notes = item.get("notes", "").strip() + notes_url = item.get("notes_url", "").strip() + action_url = item.get("action_url", "").strip() + mock_state = normalize_mock_state(item.get("mock_state", DEFAULT_MOCK_STATE)) + mock_message = item.get("mock_message", DEFAULT_MOCK_MESSAGE).strip() or DEFAULT_MOCK_MESSAGE + + service_name = f"{domain}-{name}" + + lines = [ + f'apply Service "{icinga_escape(service_name)}" {{', + f' import "{SERVICE_TEMPLATE}"', + f' vars.date_echeance = "{icinga_escape(date)}"', + f' vars.mock_state = "{icinga_escape(mock_state)}"', + f' vars.mock_message = "{icinga_escape(mock_message)}"', + f' groups = [ "{icinga_escape(group_name)}" ]', + ] + + if notes: + lines.append(f' notes = "{icinga_escape(notes)}"') + if notes_url: + lines.append(f' notes_url = "{icinga_escape(notes_url)}"') + if action_url: + lines.append(f' action_url = "{icinga_escape(action_url)}"') + + lines.append(f' assign where host.name == "{HOST_NAME}"') + lines.append("}") + lines.append("") + + return "\n".join(lines) + + +def render_probe_service(domain: str, group_name: str, item: dict) -> str: + name = item["name"].strip() + notes = item.get("notes", "").strip() + notes_url = item.get("notes_url", "").strip() + action_url = item.get("action_url", "").strip() + probe = item["probe"] + + probe_type = str(probe["type"]).strip() + source = probe["source"] + metric = probe["metric"] + thresholds = probe["thresholds"] + policy = probe.get("policy", {}) + + service_name = f"{domain}-{name}" + + lines = [ + f'apply Service "{icinga_escape(service_name)}" {{', + f' import "{PROBE_TEMPLATE}"', + f' vars.life_noc_probe_type = "{icinga_escape(probe_type)}"', + f' vars.life_noc_source_type = "{icinga_escape(str(source["type"]).strip())}"', + f' vars.life_noc_source_value = "{icinga_escape(str(source.get("value", "")).strip())}"', + f' vars.life_noc_inputs_file = "{icinga_escape(str(source.get("inputs_file", "")).strip())}"', + f' vars.life_noc_item_key = "{icinga_escape(str(source.get("item_key", name)).strip())}"', + f' vars.life_noc_metric_unit = "{icinga_escape(str(metric["unit"]).strip())}"', + f' vars.life_noc_label = "{icinga_escape(name)}"', + f' groups = [ "{icinga_escape(group_name)}" ]', + ] + + if "unknown_lt" in thresholds: + lines.append(f' vars.life_noc_threshold_unknown_lt = "{icinga_escape(str(thresholds["unknown_lt"]))}"') + if "ok_gte" in thresholds: + lines.append(f' vars.life_noc_threshold_ok_gte = "{icinga_escape(str(thresholds["ok_gte"]))}"') + if "warning_gte" in thresholds: + lines.append(f' vars.life_noc_threshold_warning_gte = "{icinga_escape(str(thresholds["warning_gte"]))}"') + if "critical_gte" in thresholds: + lines.append(f' vars.life_noc_threshold_critical_gte = "{icinga_escape(str(thresholds["critical_gte"]))}"') + + on_error = str(policy.get("on_error", "critical")).strip() + lines.append(f' vars.life_noc_on_error = "{icinga_escape(on_error)}"') + + if notes: + lines.append(f' notes = "{icinga_escape(notes)}"') + if notes_url: + lines.append(f' notes_url = "{icinga_escape(notes_url)}"') + if action_url: + lines.append(f' action_url = "{icinga_escape(action_url)}"') + + lines.append(f' assign where host.name == "{HOST_NAME}"') + lines.append("}") + lines.append("") + + return "\n".join(lines) + + +def validate_probe(item: dict) -> None: + probe = item["probe"] + if not isinstance(probe, dict): + raise ValueError("probe doit être un objet") + + if str(probe.get("type", "")).strip() != "elapsed_time": + raise ValueError("seul probe.type=elapsed_time est supporté en v1") + + source = probe.get("source") + if not isinstance(source, dict): + raise ValueError("probe.source doit être un objet") + if str(source.get("type", "")).strip() != "manual_date": + raise ValueError("seul probe.source.type=manual_date est supporté en v1") + + has_inline_value = "value" in source + has_store_ref = "inputs_file" in source and "item_key" in source + + if not has_inline_value and not has_store_ref: + raise ValueError("probe.source.value ou probe.source.inputs_file + item_key requis") + + metric = probe.get("metric") + if not isinstance(metric, dict): + raise ValueError("probe.metric doit être un objet") + if str(metric.get("unit", "")).strip() != "days": + raise ValueError("seul probe.metric.unit=days est supporté en v1") + + thresholds = probe.get("thresholds") + if not isinstance(thresholds, dict): + raise ValueError("probe.thresholds doit être un objet") + + +def render_servicegroup(group_name: str) -> str: + return "\n".join([ + f'object ServiceGroup "{icinga_escape(group_name)}" {{', + f' display_name = "{icinga_escape(group_name)}"', + "}", + "", + ]) + + +def main() -> int: + if not INPUT_FILE.exists(): + print(f"Erreur: fichier introuvable: {INPUT_FILE}", file=sys.stderr) + return 1 + + with INPUT_FILE.open("r", encoding="utf-8") as f: + data = yaml.safe_load(f) + + if not isinstance(data, dict) or "domains" not in data: + print("Erreur: le YAML doit contenir une clé racine 'domains'.", file=sys.stderr) + return 1 + + domains = data["domains"] + if not isinstance(domains, dict): + print("Erreur: 'domains' doit être un objet YAML.", file=sys.stderr) + return 1 + + OUTPUT_DIR.mkdir(parents=True, exist_ok=True) + SERVICEGROUPS_DIR.mkdir(parents=True, exist_ok=True) + + for existing_conf in OUTPUT_DIR.glob("*.conf"): + existing_conf.unlink() + + if SERVICEGROUPS_FILE.exists(): + SERVICEGROUPS_FILE.unlink() + + generated_files = [] + servicegroup_content = [ + "/*", + " AUTO-GENERATED FILE - SERVICE GROUPS", + " Ne pas modifier manuellement.", + " Source: domains.yaml", + "*/", + "", + ] + + for raw_domain, services in domains.items(): + domain = slugify(str(raw_domain)) + group_name = aliasify(str(raw_domain)) + + if not isinstance(services, list): + print(f"Erreur: le domaine '{raw_domain}' doit contenir une liste.", file=sys.stderr) + return 1 + + output_file = OUTPUT_DIR / f"{domain}.conf" + content = [ + "/*", + f" AUTO-GENERATED FILE - DOMAIN: {raw_domain}", + " Ne pas modifier manuellement.", + " Source: domains.yaml", + "*/", + "", + ] + + servicegroup_content.append(render_servicegroup(group_name)) + + for idx, item in enumerate(services, start=1): + if not isinstance(item, dict): + print(f"Erreur: entrée invalide dans '{raw_domain}' à la position {idx}.", file=sys.stderr) + return 1 + + missing = [key for key in ("name", "date", "notes") if key not in item] + if missing: + print( + f"Erreur: dans le domaine '{raw_domain}', entrée {idx}, champs manquants: {', '.join(missing)}", + file=sys.stderr, + ) + return 1 + + try: + if "probe" in item: + validate_probe(item) + content.append(render_probe_service(domain, group_name, item)) + else: + content.append(render_mock_service(domain, group_name, item)) + except ValueError as exc: + print(f"Erreur dans '{raw_domain}', entrée {idx}: {exc}", file=sys.stderr) + return 1 + + output_file.write_text("\n".join(content).rstrip() + "\n", encoding="utf-8") + generated_files.append(str(output_file)) + + SERVICEGROUPS_FILE.write_text("\n".join(servicegroup_content).rstrip() + "\n", encoding="utf-8") + generated_files.append(str(SERVICEGROUPS_FILE)) + + print("Fichiers générés :") + for file_path in generated_files: + print(f" - {file_path}") + + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/.patch-backup-days-until-due/check_life_noc_probe.conf.bak b/.patch-backup-days-until-due/check_life_noc_probe.conf.bak new file mode 100644 index 0000000..2c5b33b --- /dev/null +++ b/.patch-backup-days-until-due/check_life_noc_probe.conf.bak @@ -0,0 +1,18 @@ +object CheckCommand "check_life_noc_probe" { + command = [ PluginDir + "/check_life_noc_probe.py" ] + + arguments = { + "--probe-type" = "$life_noc_probe_type$" + "--source-type" = "$life_noc_source_type$" + "--source-value" = "$life_noc_source_value$" + "--inputs-file" = "$life_noc_inputs_file$" + "--item-key" = "$life_noc_item_key$" + "--unit" = "$life_noc_metric_unit$" + "--unknown-lt" = "$life_noc_threshold_unknown_lt$" + "--ok-gte" = "$life_noc_threshold_ok_gte$" + "--warning-gte" = "$life_noc_threshold_warning_gte$" + "--critical-gte" = "$life_noc_threshold_critical_gte$" + "--on-error" = "$life_noc_on_error$" + "--label" = "$life_noc_label$" + } +} diff --git a/.patch-backup-days-until-due/check_life_noc_probe.py.bak b/.patch-backup-days-until-due/check_life_noc_probe.py.bak new file mode 100644 index 0000000..0c957e5 --- /dev/null +++ b/.patch-backup-days-until-due/check_life_noc_probe.py.bak @@ -0,0 +1,97 @@ +#!/usr/bin/env python3 + +import argparse +from datetime import datetime, timezone +from pathlib import Path +import sys +import yaml + + +def exit_with(code: int, text: str) -> None: + print(text) + raise SystemExit(code) + + +def parse_date(value: str) -> datetime: + return datetime.strptime(value, "%Y-%m-%d").replace(tzinfo=timezone.utc) + + +def load_input_value(inputs_file: str, item_key: str) -> str: + path = Path(inputs_file) + if not path.exists(): + raise ValueError(f"inputs file introuvable: {inputs_file}") + + data = yaml.safe_load(path.read_text(encoding="utf-8")) + if not isinstance(data, dict): + raise ValueError(f"inputs file invalide: {inputs_file}") + + if item_key not in data: + raise ValueError(f"item_key introuvable dans le store: {item_key}") + + item = data[item_key] + if not isinstance(item, dict): + raise ValueError(f"entrée invalide pour item_key: {item_key}") + + if "value" not in item: + raise ValueError(f"champ 'value' absent pour item_key: {item_key}") + + return str(item["value"]).strip() + + +def main() -> int: + ap = argparse.ArgumentParser() + ap.add_argument("--probe-type", required=True) + ap.add_argument("--source-type", required=True) + ap.add_argument("--source-value") + ap.add_argument("--inputs-file") + ap.add_argument("--item-key") + ap.add_argument("--unit", required=True) + ap.add_argument("--unknown-lt", type=float) + ap.add_argument("--ok-gte", type=float) + ap.add_argument("--warning-gte", type=float) + ap.add_argument("--critical-gte", type=float) + ap.add_argument("--on-error", default="critical") + ap.add_argument("--label", default="life-noc") + args = ap.parse_args() + + try: + if args.probe_type != "elapsed_time": + exit_with(2, f"CRITICAL - probe_type non supporté: {args.probe_type}") + + if args.source_type != "manual_date": + exit_with(2, f"CRITICAL - source_type non supporté: {args.source_type}") + + if args.unit != "days": + exit_with(2, f"CRITICAL - unité non supportée: {args.unit}") + + source_value = None + + if args.inputs_file and args.item_key: + source_value = load_input_value(args.inputs_file, args.item_key) + elif args.source_value: + source_value = args.source_value + else: + raise ValueError("aucune source fournie: inputs-file/item-key ou source-value requis") + + dt = parse_date(source_value) + now = datetime.now(timezone.utc) + delta_days = (now - dt).total_seconds() / 86400.0 + + if args.critical_gte is not None and delta_days >= args.critical_gte: + exit_with(2, f"CRITICAL - {args.label}: {delta_days:.1f} jours") + if args.warning_gte is not None and delta_days >= args.warning_gte: + exit_with(1, f"WARNING - {args.label}: {delta_days:.1f} jours") + if args.ok_gte is not None and delta_days >= args.ok_gte: + exit_with(0, f"OK - {args.label}: {delta_days:.1f} jours") + if args.unknown_lt is not None and delta_days < args.unknown_lt: + exit_with(3, f"UNKNOWN - {args.label}: {delta_days:.1f} jours") + + exit_with(2, f"CRITICAL - {args.label}: seuils incohérents") + except Exception as exc: + if args.on_error == "critical": + exit_with(2, f"CRITICAL - erreur sonde: {exc}") + exit_with(3, f"UNKNOWN - erreur sonde: {exc}") + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/.patch-backup-days-until-due/domains.yaml.bak b/.patch-backup-days-until-due/domains.yaml.bak new file mode 100644 index 0000000..61761f9 --- /dev/null +++ b/.patch-backup-days-until-due/domains.yaml.bak @@ -0,0 +1,768 @@ +domains: + + revue: + - name: revue-quotidienne-life-noc + date: "2026-03-13" + notes: Vérifier le tableau de bord Life-NOC + probe: + type: elapsed_time + source: + type: manual_date + inputs_file: "/opt/life-noc/data/inputs/revue.yaml" + item_key: "revue-quotidienne-life-noc" + metric: + unit: days + thresholds: + unknown_lt: 1 + ok_gte: 1 + warning_gte: 2 + critical_gte: 3 + policy: + on_error: critical + + - name: revue-hebdomadaire-priorites + date: "2026-03-10" + notes: Revoir les priorités de la semaine + probe: + type: elapsed_time + source: + type: manual_date + inputs_file: "/opt/life-noc/data/inputs/revue.yaml" + item_key: "revue-hebdomadaire-priorites" + metric: + unit: days + thresholds: + unknown_lt: 5 + ok_gte: 5 + warning_gte: 7 + critical_gte: 10 + policy: + on_error: critical + + - name: revue-mensuelle-systeme-vie + date: 2026-04-01 + notes: Revue mensuelle de l'ensemble du système Life-NOC + + - name: revue-trimestrielle-orientation + date: 2026-06-30 + notes: Revue trimestrielle des orientations de vie et de Chezlepro + + focus: + - name: entretien-processus-focus + date: 2026-03-09 + notes: Vérifier que les cartouches FOCUS sont à jour + + - name: nettoyage-inbox-mentale + date: 2026-03-09 + notes: Vider et clarifier les éléments capturés hors système + + - name: revue-limitation-engagements + date: 2026-03-31 + notes: Vérifier que les engagements actifs demeurent réalistes + + finances-personnelles: + - name: revision-comptes-bancaires + date: 2026-04-01 + notes: Révision mensuelle des comptes bancaires personnels + + - name: verification-cartes-credit + date: 2026-04-01 + notes: Vérification des soldes et transactions des cartes de crédit + + - name: paiement-cartes-credit + date: 2026-04-15 + notes: Paiement des cartes de crédit personnelles + + - name: revision-budget-personnel + date: 2026-04-05 + notes: Révision mensuelle du budget personnel + + - name: verification-prelevements-automatiques + date: 2026-04-03 + notes: Vérification des prélèvements automatiques personnels + + - name: verification-placements + date: 2026-06-30 + notes: Vérification périodique des placements et comptes enregistrés + + - name: verification-cotisations-reer + date: 2026-02-28 + notes: Vérification des cotisations REER + + - name: verification-celi + date: 2026-05-01 + notes: Vérification de l'espace CELI et de son utilisation + + - name: preparation-dossier-financier-annuel + date: 2026-01-31 + notes: Préparer le dossier financier annuel personnel + + fiscalite-personnelle: + - name: preparation-documents-impots + date: 2026-03-15 + notes: Rassembler tous les documents fiscaux personnels + + - name: production-impots-federal + date: 2026-04-30 + notes: Produire la déclaration de revenus fédérale + + - name: production-impots-quebec + date: 2026-04-30 + notes: Produire la déclaration de revenus Québec + + - name: paiement-solde-impots + date: 2026-04-30 + notes: Payer tout solde d'impôt exigible + + - name: verification-avis-cotisation + date: 2026-05-31 + notes: Vérifier les avis de cotisation ARC et Revenu Québec + + - name: archivage-documents-fiscaux + date: 2026-06-15 + notes: Archiver les documents fiscaux personnels + + - name: verification-acomptes-provisionnels + date: 2026-03-15 + notes: Vérifier si des acomptes provisionnels sont requis + + obligations-legales-personnelles: + - name: verification-testament + date: 2026-07-01 + notes: Vérifier la pertinence et l'actualité du testament + + - name: verification-mandat-inaptitude + date: 2026-07-01 + notes: Vérifier le mandat de protection et documents connexes + + - name: verification-directives-medicales + date: 2026-07-15 + notes: Vérifier les directives médicales anticipées + + - name: verification-papiers-identite + date: 2026-06-01 + notes: Vérifier l'expiration des papiers d'identité + + - name: renouvellement-permis-conduire + date: 2027-01-01 + notes: Vérifier le renouvellement du permis de conduire + + - name: verification-carte-assurance-maladie + date: 2026-10-01 + notes: Vérifier l'expiration de la carte d'assurance maladie + + - name: verification-passeport + date: 2026-06-01 + notes: Vérifier l'expiration du passeport + + maison: + - name: remplacement-filtre-fournaise + date: 2026-04-01 + notes: Remplacer le filtre de la fournaise + + - name: inspection-fournaise + date: 2026-09-15 + notes: Inspection générale de la fournaise avant saison froide + + - name: inspection-thermopompe + date: 2026-05-01 + notes: Inspection et entretien de la thermopompe + + - name: nettoyage-unites-exterieures + date: 2026-05-15 + notes: Nettoyer les unités extérieures et vérifier le dégagement + + - name: inspection-toiture + date: 2026-10-01 + notes: Inspection annuelle de la toiture + + - name: inspection-gouttieres + date: 2026-11-01 + notes: Inspection et nettoyage des gouttières + + - name: inspection-fondation + date: 2026-06-01 + notes: Inspection de la fondation et des fissures + + - name: verification-drainage-terrain + date: 2026-05-15 + notes: Vérification du drainage autour de la maison + + - name: test-detecteurs-fumee + date: 2026-04-01 + notes: Test des détecteurs de fumée + + - name: test-detecteurs-co + date: 2026-04-01 + notes: Test des détecteurs de monoxyde de carbone + + - name: remplacement-piles-detecteurs + date: 2026-10-01 + notes: Remplacement préventif des piles des détecteurs + + - name: verification-plomberie-visible + date: 2026-05-01 + notes: Vérification visuelle de la plomberie accessible + + - name: inspection-sump-pump + date: 2026-04-15 + notes: Vérification de la pompe de puisard si applicable + + - name: verification-calfetrage + date: 2026-10-15 + notes: Vérification du calfeutrage portes et fenêtres + + - name: inspection-portes-garage + date: 2026-05-15 + notes: Vérification mécanique et sécurité des portes de garage + + - name: verification-extincteurs + date: 2026-06-01 + notes: Vérification des extincteurs + + garage-et-rangement: + - name: inspection-rangement-plafond + date: 2026-05-01 + notes: Vérification des supports suspendus au plafond du garage + + - name: revue-inventaire-garage + date: 2026-04-15 + notes: Revue de l'inventaire et de l'ordre du garage + + - name: verification-rouille-outillage + date: 2026-05-15 + notes: Vérification de la corrosion sur les outils et équipements + + - name: inspection-securite-garage + date: 2026-06-01 + notes: Vérification des conditions de sécurité du garage + + - name: rotation-stockage-bacs + date: 2026-05-15 + notes: Revue des contenus de bacs de rangement + + energie: + - name: inspection-batteries-lifepo4 + date: 2026-04-01 + notes: Inspection physique et logique des batteries LiFePO4 + + - name: verification-tension-batteries + date: 2026-03-15 + notes: Vérification des tensions et cohérence des batteries + + - name: verification-smartshunt + date: 2026-03-15 + notes: Vérification SmartShunt et cohérence du monitoring + + - name: verification-cerbo-gx + date: 2026-03-15 + notes: Vérification Cerbo GX et remontée des données + + - name: verification-can-rs485 + date: 2026-04-15 + notes: Vérification des communications CAN ou RS485 + + - name: inspection-cablage-energie + date: 2026-05-01 + notes: Inspection du câblage et des connexions énergétiques + + - name: verification-busbars + date: 2026-05-01 + notes: Vérification du serrage, corrosion et échauffement des busbars + + - name: verification-parametres-charge + date: 2026-04-01 + notes: Vérification des paramètres de charge et float + + - name: test-charge-batteries + date: 2026-04-15 + notes: Test de comportement en charge des batteries + + - name: test-comportement-onduleur + date: 2026-05-01 + notes: Vérifier le comportement du Multiplus sous charge légère + + - name: verification-journal-evenements-victron + date: 2026-04-15 + notes: Vérification des événements et anomalies Victron + + resilience: + - name: test-generatrice-propane + date: 2026-04-01 + notes: Test mensuel de la génératrice au propane + + - name: verification-carburant-generatrice + date: 2026-04-01 + notes: Vérification de l'approvisionnement propane lié à la génératrice + + - name: verification-procedure-bascule + date: 2026-04-15 + notes: Réviser la procédure de bascule en mode secours + + - name: verification-stock-lampes-piles + date: 2026-05-01 + notes: Vérification des lampes, piles et éclairage d'urgence + + - name: verification-trousses-urgence + date: 2026-05-15 + notes: Vérification des trousses d'urgence + + - name: revision-plan-urgence + date: 2026-06-01 + notes: Réviser le plan d'urgence domestique + + - name: test-autonomie-base + date: 2026-06-15 + notes: Vérifier l'autonomie énergétique minimale attendue + + - name: verification-moyens-cuisson-secours + date: 2026-05-15 + notes: Vérification des moyens de cuisson de secours + + stock-alimentaire: + - name: rotation-nourriture-seche + date: 2026-04-01 + notes: Rotation des stocks de nourriture sèche + + - name: verification-reserve-eau + date: 2026-04-15 + notes: Vérification de la réserve d'eau potable + + - name: verification-mylar-absorbeurs + date: 2026-05-01 + notes: Vérifier l'intégrité des emballages Mylar et absorbeurs + + - name: revue-inventaire-conserves + date: 2026-04-15 + notes: Revue des conserves et dates de rotation + + - name: revue-inventaire-farine-riz-pates + date: 2026-04-01 + notes: Vérification des gros stocks alimentaires de base + + - name: verification-bacs-legumes-racines + date: 2026-10-01 + notes: Vérification des bacs de stockage de légumes racines + + - name: revue-supplements-vitamines + date: 2026-05-01 + notes: Vérification du stock de suppléments et dates utiles + + sante: + - name: verification-trousse-premiers-soins + date: 2026-04-01 + notes: Vérification de la trousse de premiers soins + + - name: verification-expiration-medicaments + date: 2026-05-01 + notes: Vérification des dates d'expiration des médicaments + + - name: revision-rendez-vous-medicaux + date: 2026-04-15 + notes: Revoir les rendez-vous médicaux requis + + - name: verification-lunettes-prescriptions + date: 2026-06-01 + notes: Vérifier les prescriptions et besoins de renouvellement + + - name: verification-dossier-sante + date: 2026-06-15 + notes: Vérifier l'ordre et l'accessibilité des documents de santé + + voiture: + - name: verification-huile-moteur + date: 2026-04-01 + notes: Vérification de l'huile moteur + + - name: inspection-freins + date: 2026-05-01 + notes: Inspection des freins + + - name: verification-pneus + date: 2026-04-15 + notes: Vérification usure, pression et permutation des pneus + + - name: ajustement-valves + date: 2026-08-01 + notes: Vérification et ajustement des valves Honda Accord + + - name: verification-timing-belt + date: 2027-01-01 + notes: Vérification de la courroie de distribution et pompe à eau + + - name: verification-batterie-voiture + date: 2026-10-01 + notes: Vérification de l'état de la batterie automobile + + - name: verification-balais-essuie-glace + date: 2026-05-01 + notes: Vérification des essuie-glaces + + - name: verification-liquides + date: 2026-04-15 + notes: Vérification des liquides de la voiture + + - name: verification-eclairage + date: 2026-05-01 + notes: Vérification de l'éclairage et des phares + + - name: verification-immatriculation-assurance + date: 2026-06-01 + notes: Vérification papiers d'assurance et immatriculation + + jardin: + - name: inspection-vignes + date: 2026-04-15 + notes: Inspection et entretien des vignes + + - name: entretien-bleuetiers + date: 2026-05-01 + notes: Entretien des bleuetiers + + - name: entretien-framboisiers + date: 2026-06-01 + notes: Entretien des framboisiers + + - name: inspection-kiwis-nordiques + date: 2026-05-15 + notes: Vérification des kiwis nordiques + + - name: entretien-rhubarbe + date: 2026-05-15 + notes: Entretien de la rhubarbe + + - name: inspection-groseillier + date: 2026-05-15 + notes: Inspection du groseillier + + - name: inspection-muriers + date: 2026-05-15 + notes: Inspection des mûriers + + - name: entretien-houblon + date: 2026-06-01 + notes: Vérification et entretien du houblon + + - name: revision-pharmacopée-jardin + date: 2026-05-01 + notes: Vérification du stock de soins pour végétaux + + - name: revision-armoire-produits-jardin + date: 2026-05-01 + notes: Vérification et ordre de l'armoire des produits pour végétaux + + outils-et-equipements: + - name: entretien-outils-jardin + date: 2026-04-15 + notes: Nettoyage et entretien des outils de jardin + + - name: inspection-outils-electriques + date: 2026-05-01 + notes: Vérification des outils électriques + + - name: verification-rallonges-et-connecteurs + date: 2026-05-01 + notes: Vérification des rallonges et connecteurs + + - name: verification-compresseur-et-accessoires + date: 2026-05-15 + notes: Vérification du compresseur et accessoires + + - name: revision-inventaire-outillage + date: 2026-06-01 + notes: Revue de l'inventaire d'outillage + + informatique-personnelle: + - name: verification-sauvegardes-personnelles + date: 2026-04-01 + notes: Vérification des sauvegardes personnelles + + - name: nettoyage-stockage-personnel + date: 2026-04-15 + notes: Nettoyage du stockage numérique personnel + + - name: verification-comptes-importants + date: 2026-05-01 + notes: Vérification des comptes numériques personnels importants + + - name: revue-mots-de-passe-personnels + date: 2026-06-01 + notes: Revue des mots de passe personnels critiques + + - name: verification-documents-cloud-personnels + date: 2026-05-15 + notes: Vérifier la cohérence des documents personnels sauvegardés + + infrastructure-chezlepro: + - name: verification-proxmox + date: 2026-04-01 + notes: Vérification générale de l'environnement Proxmox + + - name: verification-ceph + date: 2026-04-01 + notes: Vérification générale de l'état Ceph + + - name: test-restauration-backups + date: 2026-04-15 + notes: Test de restauration des sauvegardes + + - name: verification-pbs-truenas + date: 2026-05-01 + notes: Vérification des solutions de sauvegarde et synchronisation + + - name: verification-ups-infrastructure + date: 2026-04-15 + notes: Vérification des UPS de l'infrastructure + + - name: verification-capacite-stockage + date: 2026-04-15 + notes: Vérifier capacité et croissance du stockage + + - name: verification-apt-cacher-ng + date: 2026-05-01 + notes: Vérification du bon fonctionnement d'apt-cacher-ng + + - name: verification-icinga2 + date: 2026-04-01 + notes: Vérification de la supervision Icinga2 + + - name: verification-keycloak-openldap + date: 2026-05-01 + notes: Vérification de l'identité et de l'authentification centralisées + + - name: verification-nextcloud + date: 2026-04-15 + notes: Vérification de l'état Nextcloud + + - name: verification-mailcow + date: 2026-05-01 + notes: Vérification de l'infrastructure Mailcow + + - name: verification-openvas + date: 2026-05-15 + notes: Vérification de la plateforme OpenVAS + + - name: verification-journaux-systemes + date: 2026-04-15 + notes: Revue des journaux systèmes critiques + + reseau-chezlepro: + - name: verification-firewalls + date: 2026-04-01 + notes: Vérification des firewalls + + - name: verification-vpn-openvpn + date: 2026-04-15 + notes: Vérification des tunnels OpenVPN + + - name: verification-crl-certificats + date: 2026-04-15 + notes: Vérification de la CRL et des certificats + + - name: verification-switches + date: 2026-05-01 + notes: Vérification des switches et uplinks + + - name: verification-vlans-segmentation + date: 2026-05-01 + notes: Vérification de la segmentation réseau + + - name: verification-dns + date: 2026-05-15 + notes: Vérification DNS interne et externe + + - name: verification-dynamic-dns + date: 2026-05-15 + notes: Vérification du DNS dynamique si utilisé + + - name: audit-regles-firewall + date: 2026-06-01 + notes: Audit périodique des règles de firewall + + - name: verification-geoblocking + date: 2026-05-15 + notes: Vérifier le geoblocking et son effet attendu + + - name: verification-certificats-publics + date: 2026-06-01 + notes: Vérifier les expirations de certificats publics + + securite-chezlepro: + - name: verification-mises-a-jour-securite + date: 2026-04-01 + notes: Vérification des mises à jour de sécurité + + - name: audit-comptes-acces + date: 2026-05-01 + notes: Audit des comptes et accès privilégiés + + - name: verification-ids-snort + date: 2026-05-01 + notes: Vérification des IDS et de leur état + + - name: revue-pki-privee + date: 2026-05-15 + notes: Revue de la PKI privée et des autorités intermédiaires + + - name: revue-politiques-securite + date: 2026-06-01 + notes: Revue des politiques et pratiques de sécurité numérique + + - name: verification-sauvegardes-configuration + date: 2026-04-15 + notes: Vérifier les sauvegardes des configurations critiques + + exploitation-chezlepro: + - name: revision-playbooks-ansible + date: 2026-05-01 + notes: Revue des playbooks Ansible + + - name: verification-inventaires-ansible + date: 2026-05-01 + notes: Vérification des inventaires Ansible + + - name: revision-documentation-technique + date: 2026-05-15 + notes: Revue de la documentation technique Chezlepro + + - name: verification-procedures-reprise + date: 2026-06-01 + notes: Vérifier les procédures de reprise et restauration + + - name: revue-capacite-ressources + date: 2026-06-15 + notes: Revue CPU RAM stockage et charge de l'infrastructure + + - name: verification-jobs-automatises + date: 2026-05-15 + notes: Vérification des jobs automatisés et scripts périodiques + + obligations-chezlepro: + - name: verification-registraire-entreprise + date: 2026-06-15 + notes: Vérifier les obligations au Registraire des entreprises + + - name: verification-declarations-taxes + date: 2026-04-30 + notes: Vérifier les obligations de taxes de l'entreprise si applicables + + - name: verification-dossier-comptable-entreprise + date: 2026-04-15 + notes: Vérifier l'ordre du dossier comptable Chezlepro + + - name: verification-facturation-clients + date: 2026-04-10 + notes: Vérifier la facturation et son suivi + + - name: verification-paiements-fournisseurs + date: 2026-04-10 + notes: Vérifier les paiements fournisseurs + + - name: verification-contrats-ententes + date: 2026-05-15 + notes: Vérifier contrats, ententes et obligations associées + + - name: verification-assurances-entreprise + date: 2026-06-01 + notes: Vérifier les assurances de l'entreprise + + - name: archivage-documents-entreprise + date: 2026-05-31 + notes: Archiver les documents administratifs et financiers de l'entreprise + + actifs-chezlepro: + - name: revision-inventaire-materiel + date: 2026-05-01 + notes: Revoir l'inventaire du matériel de Chezlepro + + - name: verification-amortissables + date: 2026-06-01 + notes: Vérifier le registre des biens amortissables + + - name: verification-serveurs-et-composants + date: 2026-05-15 + notes: Vérifier l'état des serveurs et composants matériels + + - name: verification-reserve-pieces + date: 2026-06-01 + notes: Vérifier les pièces de rechange critiques + + - name: revision-actifs-transferts + date: 2026-06-15 + notes: Réviser les actifs transférés ou à transférer à l'entreprise + + projets: + - name: revision-life-noc + date: 2026-04-01 + notes: Révision du projet Life-NOC + + - name: revision-alliance-boreale + date: 2026-04-15 + notes: Révision du projet Alliance Boréale + + - name: revision-erplibre + date: 2026-05-01 + notes: Révision du projet ERPLibre + + - name: revision-semence-numerique + date: 2026-05-15 + notes: Révision du projet semence numérique + + - name: revision-ortrux-1 + date: 2026-05-15 + notes: Révision du système Ortrux-1 + + - name: revision-district16 + date: 2026-05-01 + notes: Révision du projet DISTRICT16 + + communaute: + - name: verification-outils-aa + date: 2026-05-01 + notes: Vérifier les outils numériques liés aux activités communautaires + + - name: verification-espace-87-16 + date: 2026-05-01 + notes: Vérifier l'espace Nextcloud du district + + - name: verification-salles-visio-groupes + date: 2026-05-15 + notes: Vérifier les salles de visioconférence des groupes + + - name: verification-depots-rapports-rsg + date: 2026-05-15 + notes: Vérifier les dépôts de rapports RSG + + - name: revision-outils-communication-communaute + date: 2026-06-01 + notes: Réviser les moyens de communication communautaires + + documentation: + - name: revue-docs-personnelles-importantes + date: 2026-05-15 + notes: Revoir l'organisation des documents personnels importants + + - name: revue-wiki-technique + date: 2026-05-15 + notes: Revoir le wiki technique et sa cohérence + + - name: revue-base-connaissances + date: 2026-06-01 + notes: Revoir la base de connaissances globale + + - name: verification-sauvegarde-docs-cles + date: 2026-05-15 + notes: Vérifier la sauvegarde des documents clés + + animaux: + - name: verification-stock-nourriture-chats + date: 2026-04-15 + notes: Vérification du stock de nourriture pour chats + + - name: verification-friandises-et-litiere + date: 2026-04-15 + notes: Vérification des stocks de friandises et de litière + + - name: revision-routine-soins-animaux + date: 2026-05-01 + notes: Revue de la routine de soins et des besoins matériels des chats diff --git a/.patch-backup-days-until-due/generate_services.py.bak b/.patch-backup-days-until-due/generate_services.py.bak new file mode 100644 index 0000000..e7373a9 --- /dev/null +++ b/.patch-backup-days-until-due/generate_services.py.bak @@ -0,0 +1,298 @@ +#!/usr/bin/env python3 + +from pathlib import Path +import re +import sys +import yaml + +INPUT_FILE = Path("domains.yaml") +OUTPUT_DIR = Path("icinga/services") +SERVICEGROUPS_DIR = Path("icinga/servicegroups") +SERVICEGROUPS_FILE = SERVICEGROUPS_DIR / "life-noc.conf" +HOST_NAME = "life-noc" +SERVICE_TEMPLATE = "service_echeance" +PROBE_TEMPLATE = "service_life_noc_probe" +DEFAULT_MOCK_STATE = "OK" +DEFAULT_MOCK_MESSAGE = "Sous contrôle" + + +def slugify(value: str) -> str: + value = value.strip().lower() + replacements = { + "à": "a", "â": "a", "ä": "a", + "ç": "c", + "é": "e", "è": "e", "ê": "e", "ë": "e", + "î": "i", "ï": "i", + "ô": "o", "ö": "o", + "ù": "u", "û": "u", "ü": "u", + "ÿ": "y", + "œ": "oe", + "æ": "ae", + "'": "", + "’": "", + } + for old, new in replacements.items(): + value = value.replace(old, new) + value = re.sub(r"[^a-z0-9\-]+", "-", value) + value = re.sub(r"-{2,}", "-", value) + return value.strip("-") + + +def aliasify(value: str) -> str: + value = value.strip().upper() + replacements = { + "À": "A", "Â": "A", "Ä": "A", + "Ç": "C", + "É": "E", "È": "E", "Ê": "E", "Ë": "E", + "Î": "I", "Ï": "I", + "Ô": "O", "Ö": "O", + "Ù": "U", "Û": "U", "Ü": "U", + "Ÿ": "Y", + "Œ": "OE", + "Æ": "AE", + "'": "", + "’": "", + } + for old, new in replacements.items(): + value = value.replace(old, new) + value = re.sub(r"[^A-Z0-9\-]+", "-", value) + value = re.sub(r"-{2,}", "-", value) + return value.strip("-") + + +def icinga_escape(value: str) -> str: + return value.replace("\\", "\\\\").replace('"', '\\"') + + +def normalize_mock_state(value: str) -> str: + state = str(value).strip().upper() + allowed = {"OK", "WARNING", "CRITICAL"} + if state not in allowed: + raise ValueError( + f"mock_state invalide: {value}. Valeurs permises: {', '.join(sorted(allowed))}" + ) + return state + + +def render_mock_service(domain: str, group_name: str, item: dict) -> str: + name = item["name"].strip() + date = str(item["date"]).strip() + notes = item.get("notes", "").strip() + notes_url = item.get("notes_url", "").strip() + action_url = item.get("action_url", "").strip() + mock_state = normalize_mock_state(item.get("mock_state", DEFAULT_MOCK_STATE)) + mock_message = item.get("mock_message", DEFAULT_MOCK_MESSAGE).strip() or DEFAULT_MOCK_MESSAGE + + service_name = f"{domain}-{name}" + + lines = [ + f'apply Service "{icinga_escape(service_name)}" {{', + f' import "{SERVICE_TEMPLATE}"', + f' vars.date_echeance = "{icinga_escape(date)}"', + f' vars.mock_state = "{icinga_escape(mock_state)}"', + f' vars.mock_message = "{icinga_escape(mock_message)}"', + f' groups = [ "{icinga_escape(group_name)}" ]', + ] + + if notes: + lines.append(f' notes = "{icinga_escape(notes)}"') + if notes_url: + lines.append(f' notes_url = "{icinga_escape(notes_url)}"') + if action_url: + lines.append(f' action_url = "{icinga_escape(action_url)}"') + + lines.append(f' assign where host.name == "{HOST_NAME}"') + lines.append("}") + lines.append("") + + return "\n".join(lines) + + +def render_probe_service(domain: str, group_name: str, item: dict) -> str: + name = item["name"].strip() + notes = item.get("notes", "").strip() + notes_url = item.get("notes_url", "").strip() + action_url = item.get("action_url", "").strip() + probe = item["probe"] + + probe_type = str(probe["type"]).strip() + source = probe["source"] + metric = probe["metric"] + thresholds = probe["thresholds"] + policy = probe.get("policy", {}) + + service_name = f"{domain}-{name}" + + lines = [ + f'apply Service "{icinga_escape(service_name)}" {{', + f' import "{PROBE_TEMPLATE}"', + f' vars.life_noc_probe_type = "{icinga_escape(probe_type)}"', + f' vars.life_noc_source_type = "{icinga_escape(str(source["type"]).strip())}"', + f' vars.life_noc_source_value = "{icinga_escape(str(source.get("value", "")).strip())}"', + f' vars.life_noc_inputs_file = "{icinga_escape(str(source.get("inputs_file", "")).strip())}"', + f' vars.life_noc_item_key = "{icinga_escape(str(source.get("item_key", name)).strip())}"', + f' vars.life_noc_metric_unit = "{icinga_escape(str(metric["unit"]).strip())}"', + f' vars.life_noc_label = "{icinga_escape(name)}"', + f' groups = [ "{icinga_escape(group_name)}" ]', + ] + + if "unknown_lt" in thresholds: + lines.append(f' vars.life_noc_threshold_unknown_lt = "{icinga_escape(str(thresholds["unknown_lt"]))}"') + if "ok_gte" in thresholds: + lines.append(f' vars.life_noc_threshold_ok_gte = "{icinga_escape(str(thresholds["ok_gte"]))}"') + if "warning_gte" in thresholds: + lines.append(f' vars.life_noc_threshold_warning_gte = "{icinga_escape(str(thresholds["warning_gte"]))}"') + if "critical_gte" in thresholds: + lines.append(f' vars.life_noc_threshold_critical_gte = "{icinga_escape(str(thresholds["critical_gte"]))}"') + + on_error = str(policy.get("on_error", "critical")).strip() + lines.append(f' vars.life_noc_on_error = "{icinga_escape(on_error)}"') + + if notes: + lines.append(f' notes = "{icinga_escape(notes)}"') + if notes_url: + lines.append(f' notes_url = "{icinga_escape(notes_url)}"') + if action_url: + lines.append(f' action_url = "{icinga_escape(action_url)}"') + + lines.append(f' assign where host.name == "{HOST_NAME}"') + lines.append("}") + lines.append("") + + return "\n".join(lines) + + +def validate_probe(item: dict) -> None: + probe = item["probe"] + if not isinstance(probe, dict): + raise ValueError("probe doit être un objet") + + if str(probe.get("type", "")).strip() != "elapsed_time": + raise ValueError("seul probe.type=elapsed_time est supporté en v1") + + source = probe.get("source") + if not isinstance(source, dict): + raise ValueError("probe.source doit être un objet") + if str(source.get("type", "")).strip() != "manual_date": + raise ValueError("seul probe.source.type=manual_date est supporté en v1") + + has_inline_value = "value" in source + has_store_ref = "inputs_file" in source and "item_key" in source + + if not has_inline_value and not has_store_ref: + raise ValueError("probe.source.value ou probe.source.inputs_file + item_key requis") + + metric = probe.get("metric") + if not isinstance(metric, dict): + raise ValueError("probe.metric doit être un objet") + if str(metric.get("unit", "")).strip() != "days": + raise ValueError("seul probe.metric.unit=days est supporté en v1") + + thresholds = probe.get("thresholds") + if not isinstance(thresholds, dict): + raise ValueError("probe.thresholds doit être un objet") + + +def render_servicegroup(group_name: str) -> str: + return "\n".join([ + f'object ServiceGroup "{icinga_escape(group_name)}" {{', + f' display_name = "{icinga_escape(group_name)}"', + "}", + "", + ]) + + +def main() -> int: + if not INPUT_FILE.exists(): + print(f"Erreur: fichier introuvable: {INPUT_FILE}", file=sys.stderr) + return 1 + + with INPUT_FILE.open("r", encoding="utf-8") as f: + data = yaml.safe_load(f) + + if not isinstance(data, dict) or "domains" not in data: + print("Erreur: le YAML doit contenir une clé racine 'domains'.", file=sys.stderr) + return 1 + + domains = data["domains"] + if not isinstance(domains, dict): + print("Erreur: 'domains' doit être un objet YAML.", file=sys.stderr) + return 1 + + OUTPUT_DIR.mkdir(parents=True, exist_ok=True) + SERVICEGROUPS_DIR.mkdir(parents=True, exist_ok=True) + + for existing_conf in OUTPUT_DIR.glob("*.conf"): + existing_conf.unlink() + + if SERVICEGROUPS_FILE.exists(): + SERVICEGROUPS_FILE.unlink() + + generated_files = [] + servicegroup_content = [ + "/*", + " AUTO-GENERATED FILE - SERVICE GROUPS", + " Ne pas modifier manuellement.", + " Source: domains.yaml", + "*/", + "", + ] + + for raw_domain, services in domains.items(): + domain = slugify(str(raw_domain)) + group_name = aliasify(str(raw_domain)) + + if not isinstance(services, list): + print(f"Erreur: le domaine '{raw_domain}' doit contenir une liste.", file=sys.stderr) + return 1 + + output_file = OUTPUT_DIR / f"{domain}.conf" + content = [ + "/*", + f" AUTO-GENERATED FILE - DOMAIN: {raw_domain}", + " Ne pas modifier manuellement.", + " Source: domains.yaml", + "*/", + "", + ] + + servicegroup_content.append(render_servicegroup(group_name)) + + for idx, item in enumerate(services, start=1): + if not isinstance(item, dict): + print(f"Erreur: entrée invalide dans '{raw_domain}' à la position {idx}.", file=sys.stderr) + return 1 + + missing = [key for key in ("name", "date", "notes") if key not in item] + if missing: + print( + f"Erreur: dans le domaine '{raw_domain}', entrée {idx}, champs manquants: {', '.join(missing)}", + file=sys.stderr, + ) + return 1 + + try: + if "probe" in item: + validate_probe(item) + content.append(render_probe_service(domain, group_name, item)) + else: + content.append(render_mock_service(domain, group_name, item)) + except ValueError as exc: + print(f"Erreur dans '{raw_domain}', entrée {idx}: {exc}", file=sys.stderr) + return 1 + + output_file.write_text("\n".join(content).rstrip() + "\n", encoding="utf-8") + generated_files.append(str(output_file)) + + SERVICEGROUPS_FILE.write_text("\n".join(servicegroup_content).rstrip() + "\n", encoding="utf-8") + generated_files.append(str(SERVICEGROUPS_FILE)) + + print("Fichiers générés :") + for file_path in generated_files: + print(f" - {file_path}") + + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/apply_days_until_due_pilot.sh b/apply_days_until_due_pilot.sh new file mode 100755 index 0000000..fd5a38f --- /dev/null +++ b/apply_days_until_due_pilot.sh @@ -0,0 +1,121 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT="${1:-.}" + +need_file() { + local f="$1" + if [[ ! -f "$ROOT/$f" ]]; then + echo "Fichier introuvable: $f" >&2 + exit 1 + fi +} + +echo "==> Vérification" +need_file "domains.yaml" +need_file "icinga/commands/check_life_noc_probe.conf" +need_file "scripts/generate_services.py" +need_file "Makefile" + +echo "==> Sauvegarde minimale" +mkdir -p "$ROOT/.backup-days-until-due-pilot" +cp -a "$ROOT/domains.yaml" "$ROOT/.backup-days-until-due-pilot/domains.yaml.bak" + +echo "==> Création du store d'intrants" +mkdir -p "$ROOT/data/inputs" +cat > "$ROOT/data/inputs/obligations-legales-personnelles.yaml" <<'EOF' +renouvellement-permis-conduire: + value: "2026-09-20" + captured_at: "2026-03-14T23:30:00Z" + origin: manual +EOF + +echo "==> Mise à jour de domains.yaml" +python3 - "$ROOT/domains.yaml" <<'PY' +from pathlib import Path +import sys +import yaml + +path = Path(sys.argv[1]) +data = yaml.safe_load(path.read_text(encoding="utf-8")) + +domains = data.get("domains") +if not isinstance(domains, dict): + raise SystemExit("domains.yaml invalide: clé racine 'domains' absente ou invalide") + +domain_name = "obligations-legales-personnelles" +items = domains.get(domain_name) +if not isinstance(items, list): + raise SystemExit(f"Domaine introuvable ou invalide: {domain_name}") + +target = None +for item in items: + if isinstance(item, dict) and item.get("name") == "renouvellement-permis-conduire": + target = item + break + +if target is None: + raise SystemExit("Item 'renouvellement-permis-conduire' introuvable dans domains.yaml") + +target["date"] = "2026-09-20" +target["notes"] = "Vérifier la proximité de l’échéance du permis" +target["probe"] = { + "type": "days_until_due", + "source": { + "type": "manual_date", + "inputs_file": "/opt/life-noc/data/inputs/obligations-legales-personnelles.yaml", + "item_key": "renouvellement-permis-conduire", + }, + "metric": { + "unit": "days", + }, + "thresholds": { + "critical_lt": 7, + "warning_lt": 30, + "ok_lt": 90, + "unknown_gte": 90, + }, + "policy": { + "on_error": "critical", + }, +} + +path.write_text(yaml.safe_dump(data, sort_keys=False, allow_unicode=True), encoding="utf-8") +print("domains.yaml mis à jour") +PY + +echo "==> Vérification rapide de la commande Icinga" +for needle in \ + '--unknown-gte' \ + '--ok-lt' \ + '--warning-lt' \ + '--critical-lt' +do + if ! grep -q -- "$needle" "$ROOT/icinga/commands/check_life_noc_probe.conf"; then + echo "ERREUR: argument manquant dans icinga/commands/check_life_noc_probe.conf : $needle" >&2 + exit 1 + fi +done + +echo "==> Génération" +( + cd "$ROOT" + python3 scripts/generate_services.py +) + +echo "==> Validation" +( + cd "$ROOT" + make check +) + +echo "==> Déploiement" +( + cd "$ROOT" + make deploy-with-bpm +) + +echo +echo "Terminé." +echo "Test utile ensuite :" +echo " python3 scripts/life_noc_input.py set obligations-legales-personnelles renouvellement-permis-conduire 2026-03-20" diff --git a/checks/check_life_noc_probe.py b/checks/check_life_noc_probe.py old mode 100644 new mode 100755 index 0c957e5..3e69c31 --- a/checks/check_life_noc_probe.py +++ b/checks/check_life_noc_probe.py @@ -3,7 +3,6 @@ import argparse from datetime import datetime, timezone from pathlib import Path -import sys import yaml @@ -46,26 +45,30 @@ def main() -> int: ap.add_argument("--inputs-file") ap.add_argument("--item-key") ap.add_argument("--unit", required=True) + ap.add_argument("--unknown-lt", type=float) + ap.add_argument("--unknown-gte", type=float) + ap.add_argument("--ok-gte", type=float) + ap.add_argument("--ok-lt", type=float) + ap.add_argument("--warning-gte", type=float) + ap.add_argument("--warning-lt", type=float) + ap.add_argument("--critical-gte", type=float) + ap.add_argument("--critical-lt", type=float) + ap.add_argument("--on-error", default="critical") ap.add_argument("--label", default="life-noc") args = ap.parse_args() try: - if args.probe_type != "elapsed_time": - exit_with(2, f"CRITICAL - probe_type non supporté: {args.probe_type}") - if args.source_type != "manual_date": exit_with(2, f"CRITICAL - source_type non supporté: {args.source_type}") if args.unit != "days": exit_with(2, f"CRITICAL - unité non supportée: {args.unit}") - source_value = None - if args.inputs_file and args.item_key: source_value = load_input_value(args.inputs_file, args.item_key) elif args.source_value: @@ -75,18 +78,38 @@ def main() -> int: dt = parse_date(source_value) now = datetime.now(timezone.utc) - delta_days = (now - dt).total_seconds() / 86400.0 - if args.critical_gte is not None and delta_days >= args.critical_gte: - exit_with(2, f"CRITICAL - {args.label}: {delta_days:.1f} jours") - if args.warning_gte is not None and delta_days >= args.warning_gte: - exit_with(1, f"WARNING - {args.label}: {delta_days:.1f} jours") - if args.ok_gte is not None and delta_days >= args.ok_gte: - exit_with(0, f"OK - {args.label}: {delta_days:.1f} jours") - if args.unknown_lt is not None and delta_days < args.unknown_lt: - exit_with(3, f"UNKNOWN - {args.label}: {delta_days:.1f} jours") + if args.probe_type == "elapsed_time": + metric = (now - dt).total_seconds() / 86400.0 + + if args.critical_gte is not None and metric >= args.critical_gte: + exit_with(2, f"CRITICAL - {args.label}: {metric:.1f} jours") + if args.warning_gte is not None and metric >= args.warning_gte: + exit_with(1, f"WARNING - {args.label}: {metric:.1f} jours") + if args.ok_gte is not None and metric >= args.ok_gte: + exit_with(0, f"OK - {args.label}: {metric:.1f} jours") + if args.unknown_lt is not None and metric < args.unknown_lt: + exit_with(3, f"UNKNOWN - {args.label}: {metric:.1f} jours") + + exit_with(2, f"CRITICAL - {args.label}: seuils incohérents") + + elif args.probe_type == "days_until_due": + metric = (dt - now).total_seconds() / 86400.0 + + if args.critical_lt is not None and metric < args.critical_lt: + exit_with(2, f"CRITICAL - {args.label}: {metric:.1f} jours restants") + if args.warning_lt is not None and metric < args.warning_lt: + exit_with(1, f"WARNING - {args.label}: {metric:.1f} jours restants") + if args.ok_lt is not None and metric < args.ok_lt: + exit_with(0, f"OK - {args.label}: {metric:.1f} jours restants") + if args.unknown_gte is not None and metric >= args.unknown_gte: + exit_with(3, f"UNKNOWN - {args.label}: {metric:.1f} jours restants") + + exit_with(2, f"CRITICAL - {args.label}: seuils incohérents") + + else: + exit_with(2, f"CRITICAL - probe_type non supporté: {args.probe_type}") - exit_with(2, f"CRITICAL - {args.label}: seuils incohérents") except Exception as exc: if args.on_error == "critical": exit_with(2, f"CRITICAL - erreur sonde: {exc}") diff --git a/data/inputs/obligations-legales-personnelles.yaml b/data/inputs/obligations-legales-personnelles.yaml new file mode 100644 index 0000000..7d23679 --- /dev/null +++ b/data/inputs/obligations-legales-personnelles.yaml @@ -0,0 +1,4 @@ +renouvellement-permis-conduire: + value: "2026-09-20" + captured_at: "2026-03-14T23:30:00Z" + origin: manual diff --git a/domains.yaml b/domains.yaml index 61761f9..d17b0cc 100644 --- a/domains.yaml +++ b/domains.yaml @@ -1,768 +1,605 @@ domains: - revue: - - name: revue-quotidienne-life-noc - date: "2026-03-13" - notes: Vérifier le tableau de bord Life-NOC - probe: - type: elapsed_time - source: - type: manual_date - inputs_file: "/opt/life-noc/data/inputs/revue.yaml" - item_key: "revue-quotidienne-life-noc" - metric: - unit: days - thresholds: - unknown_lt: 1 - ok_gte: 1 - warning_gte: 2 - critical_gte: 3 - policy: - on_error: critical - - - name: revue-hebdomadaire-priorites - date: "2026-03-10" - notes: Revoir les priorités de la semaine - probe: - type: elapsed_time - source: - type: manual_date - inputs_file: "/opt/life-noc/data/inputs/revue.yaml" - item_key: "revue-hebdomadaire-priorites" - metric: - unit: days - thresholds: - unknown_lt: 5 - ok_gte: 5 - warning_gte: 7 - critical_gte: 10 - policy: - on_error: critical - - - name: revue-mensuelle-systeme-vie - date: 2026-04-01 - notes: Revue mensuelle de l'ensemble du système Life-NOC - - - name: revue-trimestrielle-orientation - date: 2026-06-30 - notes: Revue trimestrielle des orientations de vie et de Chezlepro - + - name: revue-quotidienne-life-noc + date: '2026-03-13' + notes: Vérifier le tableau de bord Life-NOC + probe: + type: elapsed_time + source: + type: manual_date + inputs_file: /opt/life-noc/data/inputs/revue.yaml + item_key: revue-quotidienne-life-noc + metric: + unit: days + thresholds: + unknown_lt: 1 + ok_gte: 1 + warning_gte: 2 + critical_gte: 3 + policy: + on_error: critical + - name: revue-hebdomadaire-priorites + date: '2026-03-10' + notes: Revoir les priorités de la semaine + probe: + type: elapsed_time + source: + type: manual_date + inputs_file: /opt/life-noc/data/inputs/revue.yaml + item_key: revue-hebdomadaire-priorites + metric: + unit: days + thresholds: + unknown_lt: 5 + ok_gte: 5 + warning_gte: 7 + critical_gte: 10 + policy: + on_error: critical + - name: revue-mensuelle-systeme-vie + date: 2026-04-01 + notes: Revue mensuelle de l'ensemble du système Life-NOC + - name: revue-trimestrielle-orientation + date: 2026-06-30 + notes: Revue trimestrielle des orientations de vie et de Chezlepro focus: - - name: entretien-processus-focus - date: 2026-03-09 - notes: Vérifier que les cartouches FOCUS sont à jour - - - name: nettoyage-inbox-mentale - date: 2026-03-09 - notes: Vider et clarifier les éléments capturés hors système - - - name: revue-limitation-engagements - date: 2026-03-31 - notes: Vérifier que les engagements actifs demeurent réalistes - + - name: entretien-processus-focus + date: 2026-03-09 + notes: Vérifier que les cartouches FOCUS sont à jour + - name: nettoyage-inbox-mentale + date: 2026-03-09 + notes: Vider et clarifier les éléments capturés hors système + - name: revue-limitation-engagements + date: 2026-03-31 + notes: Vérifier que les engagements actifs demeurent réalistes finances-personnelles: - - name: revision-comptes-bancaires - date: 2026-04-01 - notes: Révision mensuelle des comptes bancaires personnels - - - name: verification-cartes-credit - date: 2026-04-01 - notes: Vérification des soldes et transactions des cartes de crédit - - - name: paiement-cartes-credit - date: 2026-04-15 - notes: Paiement des cartes de crédit personnelles - - - name: revision-budget-personnel - date: 2026-04-05 - notes: Révision mensuelle du budget personnel - - - name: verification-prelevements-automatiques - date: 2026-04-03 - notes: Vérification des prélèvements automatiques personnels - - - name: verification-placements - date: 2026-06-30 - notes: Vérification périodique des placements et comptes enregistrés - - - name: verification-cotisations-reer - date: 2026-02-28 - notes: Vérification des cotisations REER - - - name: verification-celi - date: 2026-05-01 - notes: Vérification de l'espace CELI et de son utilisation - - - name: preparation-dossier-financier-annuel - date: 2026-01-31 - notes: Préparer le dossier financier annuel personnel - + - name: revision-comptes-bancaires + date: 2026-04-01 + notes: Révision mensuelle des comptes bancaires personnels + - name: verification-cartes-credit + date: 2026-04-01 + notes: Vérification des soldes et transactions des cartes de crédit + - name: paiement-cartes-credit + date: 2026-04-15 + notes: Paiement des cartes de crédit personnelles + - name: revision-budget-personnel + date: 2026-04-05 + notes: Révision mensuelle du budget personnel + - name: verification-prelevements-automatiques + date: 2026-04-03 + notes: Vérification des prélèvements automatiques personnels + - name: verification-placements + date: 2026-06-30 + notes: Vérification périodique des placements et comptes enregistrés + - name: verification-cotisations-reer + date: 2026-02-28 + notes: Vérification des cotisations REER + - name: verification-celi + date: 2026-05-01 + notes: Vérification de l'espace CELI et de son utilisation + - name: preparation-dossier-financier-annuel + date: 2026-01-31 + notes: Préparer le dossier financier annuel personnel fiscalite-personnelle: - - name: preparation-documents-impots - date: 2026-03-15 - notes: Rassembler tous les documents fiscaux personnels - - - name: production-impots-federal - date: 2026-04-30 - notes: Produire la déclaration de revenus fédérale - - - name: production-impots-quebec - date: 2026-04-30 - notes: Produire la déclaration de revenus Québec - - - name: paiement-solde-impots - date: 2026-04-30 - notes: Payer tout solde d'impôt exigible - - - name: verification-avis-cotisation - date: 2026-05-31 - notes: Vérifier les avis de cotisation ARC et Revenu Québec - - - name: archivage-documents-fiscaux - date: 2026-06-15 - notes: Archiver les documents fiscaux personnels - - - name: verification-acomptes-provisionnels - date: 2026-03-15 - notes: Vérifier si des acomptes provisionnels sont requis - + - name: preparation-documents-impots + date: 2026-03-15 + notes: Rassembler tous les documents fiscaux personnels + - name: production-impots-federal + date: 2026-04-30 + notes: Produire la déclaration de revenus fédérale + - name: production-impots-quebec + date: 2026-04-30 + notes: Produire la déclaration de revenus Québec + - name: paiement-solde-impots + date: 2026-04-30 + notes: Payer tout solde d'impôt exigible + - name: verification-avis-cotisation + date: 2026-05-31 + notes: Vérifier les avis de cotisation ARC et Revenu Québec + - name: archivage-documents-fiscaux + date: 2026-06-15 + notes: Archiver les documents fiscaux personnels + - name: verification-acomptes-provisionnels + date: 2026-03-15 + notes: Vérifier si des acomptes provisionnels sont requis obligations-legales-personnelles: - - name: verification-testament - date: 2026-07-01 - notes: Vérifier la pertinence et l'actualité du testament - - - name: verification-mandat-inaptitude - date: 2026-07-01 - notes: Vérifier le mandat de protection et documents connexes - - - name: verification-directives-medicales - date: 2026-07-15 - notes: Vérifier les directives médicales anticipées - - - name: verification-papiers-identite - date: 2026-06-01 - notes: Vérifier l'expiration des papiers d'identité - - - name: renouvellement-permis-conduire - date: 2027-01-01 - notes: Vérifier le renouvellement du permis de conduire - - - name: verification-carte-assurance-maladie - date: 2026-10-01 - notes: Vérifier l'expiration de la carte d'assurance maladie - - - name: verification-passeport - date: 2026-06-01 - notes: Vérifier l'expiration du passeport - + - name: verification-testament + date: 2026-07-01 + notes: Vérifier la pertinence et l'actualité du testament + - name: verification-mandat-inaptitude + date: 2026-07-01 + notes: Vérifier le mandat de protection et documents connexes + - name: verification-directives-medicales + date: 2026-07-15 + notes: Vérifier les directives médicales anticipées + - name: verification-papiers-identite + date: 2026-06-01 + notes: Vérifier l'expiration des papiers d'identité + - name: renouvellement-permis-conduire + date: '2026-09-20' + notes: Vérifier la proximité de l’échéance du permis + probe: + type: days_until_due + source: + type: manual_date + inputs_file: /opt/life-noc/data/inputs/obligations-legales-personnelles.yaml + item_key: renouvellement-permis-conduire + metric: + unit: days + thresholds: + critical_lt: 7 + warning_lt: 30 + ok_lt: 90 + unknown_gte: 90 + policy: + on_error: critical + - name: verification-carte-assurance-maladie + date: 2026-10-01 + notes: Vérifier l'expiration de la carte d'assurance maladie + - name: verification-passeport + date: 2026-06-01 + notes: Vérifier l'expiration du passeport maison: - - name: remplacement-filtre-fournaise - date: 2026-04-01 - notes: Remplacer le filtre de la fournaise - - - name: inspection-fournaise - date: 2026-09-15 - notes: Inspection générale de la fournaise avant saison froide - - - name: inspection-thermopompe - date: 2026-05-01 - notes: Inspection et entretien de la thermopompe - - - name: nettoyage-unites-exterieures - date: 2026-05-15 - notes: Nettoyer les unités extérieures et vérifier le dégagement - - - name: inspection-toiture - date: 2026-10-01 - notes: Inspection annuelle de la toiture - - - name: inspection-gouttieres - date: 2026-11-01 - notes: Inspection et nettoyage des gouttières - - - name: inspection-fondation - date: 2026-06-01 - notes: Inspection de la fondation et des fissures - - - name: verification-drainage-terrain - date: 2026-05-15 - notes: Vérification du drainage autour de la maison - - - name: test-detecteurs-fumee - date: 2026-04-01 - notes: Test des détecteurs de fumée - - - name: test-detecteurs-co - date: 2026-04-01 - notes: Test des détecteurs de monoxyde de carbone - - - name: remplacement-piles-detecteurs - date: 2026-10-01 - notes: Remplacement préventif des piles des détecteurs - - - name: verification-plomberie-visible - date: 2026-05-01 - notes: Vérification visuelle de la plomberie accessible - - - name: inspection-sump-pump - date: 2026-04-15 - notes: Vérification de la pompe de puisard si applicable - - - name: verification-calfetrage - date: 2026-10-15 - notes: Vérification du calfeutrage portes et fenêtres - - - name: inspection-portes-garage - date: 2026-05-15 - notes: Vérification mécanique et sécurité des portes de garage - - - name: verification-extincteurs - date: 2026-06-01 - notes: Vérification des extincteurs - + - name: remplacement-filtre-fournaise + date: 2026-04-01 + notes: Remplacer le filtre de la fournaise + - name: inspection-fournaise + date: 2026-09-15 + notes: Inspection générale de la fournaise avant saison froide + - name: inspection-thermopompe + date: 2026-05-01 + notes: Inspection et entretien de la thermopompe + - name: nettoyage-unites-exterieures + date: 2026-05-15 + notes: Nettoyer les unités extérieures et vérifier le dégagement + - name: inspection-toiture + date: 2026-10-01 + notes: Inspection annuelle de la toiture + - name: inspection-gouttieres + date: 2026-11-01 + notes: Inspection et nettoyage des gouttières + - name: inspection-fondation + date: 2026-06-01 + notes: Inspection de la fondation et des fissures + - name: verification-drainage-terrain + date: 2026-05-15 + notes: Vérification du drainage autour de la maison + - name: test-detecteurs-fumee + date: 2026-04-01 + notes: Test des détecteurs de fumée + - name: test-detecteurs-co + date: 2026-04-01 + notes: Test des détecteurs de monoxyde de carbone + - name: remplacement-piles-detecteurs + date: 2026-10-01 + notes: Remplacement préventif des piles des détecteurs + - name: verification-plomberie-visible + date: 2026-05-01 + notes: Vérification visuelle de la plomberie accessible + - name: inspection-sump-pump + date: 2026-04-15 + notes: Vérification de la pompe de puisard si applicable + - name: verification-calfetrage + date: 2026-10-15 + notes: Vérification du calfeutrage portes et fenêtres + - name: inspection-portes-garage + date: 2026-05-15 + notes: Vérification mécanique et sécurité des portes de garage + - name: verification-extincteurs + date: 2026-06-01 + notes: Vérification des extincteurs garage-et-rangement: - - name: inspection-rangement-plafond - date: 2026-05-01 - notes: Vérification des supports suspendus au plafond du garage - - - name: revue-inventaire-garage - date: 2026-04-15 - notes: Revue de l'inventaire et de l'ordre du garage - - - name: verification-rouille-outillage - date: 2026-05-15 - notes: Vérification de la corrosion sur les outils et équipements - - - name: inspection-securite-garage - date: 2026-06-01 - notes: Vérification des conditions de sécurité du garage - - - name: rotation-stockage-bacs - date: 2026-05-15 - notes: Revue des contenus de bacs de rangement - + - name: inspection-rangement-plafond + date: 2026-05-01 + notes: Vérification des supports suspendus au plafond du garage + - name: revue-inventaire-garage + date: 2026-04-15 + notes: Revue de l'inventaire et de l'ordre du garage + - name: verification-rouille-outillage + date: 2026-05-15 + notes: Vérification de la corrosion sur les outils et équipements + - name: inspection-securite-garage + date: 2026-06-01 + notes: Vérification des conditions de sécurité du garage + - name: rotation-stockage-bacs + date: 2026-05-15 + notes: Revue des contenus de bacs de rangement energie: - - name: inspection-batteries-lifepo4 - date: 2026-04-01 - notes: Inspection physique et logique des batteries LiFePO4 - - - name: verification-tension-batteries - date: 2026-03-15 - notes: Vérification des tensions et cohérence des batteries - - - name: verification-smartshunt - date: 2026-03-15 - notes: Vérification SmartShunt et cohérence du monitoring - - - name: verification-cerbo-gx - date: 2026-03-15 - notes: Vérification Cerbo GX et remontée des données - - - name: verification-can-rs485 - date: 2026-04-15 - notes: Vérification des communications CAN ou RS485 - - - name: inspection-cablage-energie - date: 2026-05-01 - notes: Inspection du câblage et des connexions énergétiques - - - name: verification-busbars - date: 2026-05-01 - notes: Vérification du serrage, corrosion et échauffement des busbars - - - name: verification-parametres-charge - date: 2026-04-01 - notes: Vérification des paramètres de charge et float - - - name: test-charge-batteries - date: 2026-04-15 - notes: Test de comportement en charge des batteries - - - name: test-comportement-onduleur - date: 2026-05-01 - notes: Vérifier le comportement du Multiplus sous charge légère - - - name: verification-journal-evenements-victron - date: 2026-04-15 - notes: Vérification des événements et anomalies Victron - + - name: inspection-batteries-lifepo4 + date: 2026-04-01 + notes: Inspection physique et logique des batteries LiFePO4 + - name: verification-tension-batteries + date: 2026-03-15 + notes: Vérification des tensions et cohérence des batteries + - name: verification-smartshunt + date: 2026-03-15 + notes: Vérification SmartShunt et cohérence du monitoring + - name: verification-cerbo-gx + date: 2026-03-15 + notes: Vérification Cerbo GX et remontée des données + - name: verification-can-rs485 + date: 2026-04-15 + notes: Vérification des communications CAN ou RS485 + - name: inspection-cablage-energie + date: 2026-05-01 + notes: Inspection du câblage et des connexions énergétiques + - name: verification-busbars + date: 2026-05-01 + notes: Vérification du serrage, corrosion et échauffement des busbars + - name: verification-parametres-charge + date: 2026-04-01 + notes: Vérification des paramètres de charge et float + - name: test-charge-batteries + date: 2026-04-15 + notes: Test de comportement en charge des batteries + - name: test-comportement-onduleur + date: 2026-05-01 + notes: Vérifier le comportement du Multiplus sous charge légère + - name: verification-journal-evenements-victron + date: 2026-04-15 + notes: Vérification des événements et anomalies Victron resilience: - - name: test-generatrice-propane - date: 2026-04-01 - notes: Test mensuel de la génératrice au propane - - - name: verification-carburant-generatrice - date: 2026-04-01 - notes: Vérification de l'approvisionnement propane lié à la génératrice - - - name: verification-procedure-bascule - date: 2026-04-15 - notes: Réviser la procédure de bascule en mode secours - - - name: verification-stock-lampes-piles - date: 2026-05-01 - notes: Vérification des lampes, piles et éclairage d'urgence - - - name: verification-trousses-urgence - date: 2026-05-15 - notes: Vérification des trousses d'urgence - - - name: revision-plan-urgence - date: 2026-06-01 - notes: Réviser le plan d'urgence domestique - - - name: test-autonomie-base - date: 2026-06-15 - notes: Vérifier l'autonomie énergétique minimale attendue - - - name: verification-moyens-cuisson-secours - date: 2026-05-15 - notes: Vérification des moyens de cuisson de secours - + - name: test-generatrice-propane + date: 2026-04-01 + notes: Test mensuel de la génératrice au propane + - name: verification-carburant-generatrice + date: 2026-04-01 + notes: Vérification de l'approvisionnement propane lié à la génératrice + - name: verification-procedure-bascule + date: 2026-04-15 + notes: Réviser la procédure de bascule en mode secours + - name: verification-stock-lampes-piles + date: 2026-05-01 + notes: Vérification des lampes, piles et éclairage d'urgence + - name: verification-trousses-urgence + date: 2026-05-15 + notes: Vérification des trousses d'urgence + - name: revision-plan-urgence + date: 2026-06-01 + notes: Réviser le plan d'urgence domestique + - name: test-autonomie-base + date: 2026-06-15 + notes: Vérifier l'autonomie énergétique minimale attendue + - name: verification-moyens-cuisson-secours + date: 2026-05-15 + notes: Vérification des moyens de cuisson de secours stock-alimentaire: - - name: rotation-nourriture-seche - date: 2026-04-01 - notes: Rotation des stocks de nourriture sèche - - - name: verification-reserve-eau - date: 2026-04-15 - notes: Vérification de la réserve d'eau potable - - - name: verification-mylar-absorbeurs - date: 2026-05-01 - notes: Vérifier l'intégrité des emballages Mylar et absorbeurs - - - name: revue-inventaire-conserves - date: 2026-04-15 - notes: Revue des conserves et dates de rotation - - - name: revue-inventaire-farine-riz-pates - date: 2026-04-01 - notes: Vérification des gros stocks alimentaires de base - - - name: verification-bacs-legumes-racines - date: 2026-10-01 - notes: Vérification des bacs de stockage de légumes racines - - - name: revue-supplements-vitamines - date: 2026-05-01 - notes: Vérification du stock de suppléments et dates utiles - + - name: rotation-nourriture-seche + date: 2026-04-01 + notes: Rotation des stocks de nourriture sèche + - name: verification-reserve-eau + date: 2026-04-15 + notes: Vérification de la réserve d'eau potable + - name: verification-mylar-absorbeurs + date: 2026-05-01 + notes: Vérifier l'intégrité des emballages Mylar et absorbeurs + - name: revue-inventaire-conserves + date: 2026-04-15 + notes: Revue des conserves et dates de rotation + - name: revue-inventaire-farine-riz-pates + date: 2026-04-01 + notes: Vérification des gros stocks alimentaires de base + - name: verification-bacs-legumes-racines + date: 2026-10-01 + notes: Vérification des bacs de stockage de légumes racines + - name: revue-supplements-vitamines + date: 2026-05-01 + notes: Vérification du stock de suppléments et dates utiles sante: - - name: verification-trousse-premiers-soins - date: 2026-04-01 - notes: Vérification de la trousse de premiers soins - - - name: verification-expiration-medicaments - date: 2026-05-01 - notes: Vérification des dates d'expiration des médicaments - - - name: revision-rendez-vous-medicaux - date: 2026-04-15 - notes: Revoir les rendez-vous médicaux requis - - - name: verification-lunettes-prescriptions - date: 2026-06-01 - notes: Vérifier les prescriptions et besoins de renouvellement - - - name: verification-dossier-sante - date: 2026-06-15 - notes: Vérifier l'ordre et l'accessibilité des documents de santé - + - name: verification-trousse-premiers-soins + date: 2026-04-01 + notes: Vérification de la trousse de premiers soins + - name: verification-expiration-medicaments + date: 2026-05-01 + notes: Vérification des dates d'expiration des médicaments + - name: revision-rendez-vous-medicaux + date: 2026-04-15 + notes: Revoir les rendez-vous médicaux requis + - name: verification-lunettes-prescriptions + date: 2026-06-01 + notes: Vérifier les prescriptions et besoins de renouvellement + - name: verification-dossier-sante + date: 2026-06-15 + notes: Vérifier l'ordre et l'accessibilité des documents de santé voiture: - - name: verification-huile-moteur - date: 2026-04-01 - notes: Vérification de l'huile moteur - - - name: inspection-freins - date: 2026-05-01 - notes: Inspection des freins - - - name: verification-pneus - date: 2026-04-15 - notes: Vérification usure, pression et permutation des pneus - - - name: ajustement-valves - date: 2026-08-01 - notes: Vérification et ajustement des valves Honda Accord - - - name: verification-timing-belt - date: 2027-01-01 - notes: Vérification de la courroie de distribution et pompe à eau - - - name: verification-batterie-voiture - date: 2026-10-01 - notes: Vérification de l'état de la batterie automobile - - - name: verification-balais-essuie-glace - date: 2026-05-01 - notes: Vérification des essuie-glaces - - - name: verification-liquides - date: 2026-04-15 - notes: Vérification des liquides de la voiture - - - name: verification-eclairage - date: 2026-05-01 - notes: Vérification de l'éclairage et des phares - - - name: verification-immatriculation-assurance - date: 2026-06-01 - notes: Vérification papiers d'assurance et immatriculation - + - name: verification-huile-moteur + date: 2026-04-01 + notes: Vérification de l'huile moteur + - name: inspection-freins + date: 2026-05-01 + notes: Inspection des freins + - name: verification-pneus + date: 2026-04-15 + notes: Vérification usure, pression et permutation des pneus + - name: ajustement-valves + date: 2026-08-01 + notes: Vérification et ajustement des valves Honda Accord + - name: verification-timing-belt + date: 2027-01-01 + notes: Vérification de la courroie de distribution et pompe à eau + - name: verification-batterie-voiture + date: 2026-10-01 + notes: Vérification de l'état de la batterie automobile + - name: verification-balais-essuie-glace + date: 2026-05-01 + notes: Vérification des essuie-glaces + - name: verification-liquides + date: 2026-04-15 + notes: Vérification des liquides de la voiture + - name: verification-eclairage + date: 2026-05-01 + notes: Vérification de l'éclairage et des phares + - name: verification-immatriculation-assurance + date: 2026-06-01 + notes: Vérification papiers d'assurance et immatriculation jardin: - - name: inspection-vignes - date: 2026-04-15 - notes: Inspection et entretien des vignes - - - name: entretien-bleuetiers - date: 2026-05-01 - notes: Entretien des bleuetiers - - - name: entretien-framboisiers - date: 2026-06-01 - notes: Entretien des framboisiers - - - name: inspection-kiwis-nordiques - date: 2026-05-15 - notes: Vérification des kiwis nordiques - - - name: entretien-rhubarbe - date: 2026-05-15 - notes: Entretien de la rhubarbe - - - name: inspection-groseillier - date: 2026-05-15 - notes: Inspection du groseillier - - - name: inspection-muriers - date: 2026-05-15 - notes: Inspection des mûriers - - - name: entretien-houblon - date: 2026-06-01 - notes: Vérification et entretien du houblon - - - name: revision-pharmacopée-jardin - date: 2026-05-01 - notes: Vérification du stock de soins pour végétaux - - - name: revision-armoire-produits-jardin - date: 2026-05-01 - notes: Vérification et ordre de l'armoire des produits pour végétaux - + - name: inspection-vignes + date: 2026-04-15 + notes: Inspection et entretien des vignes + - name: entretien-bleuetiers + date: 2026-05-01 + notes: Entretien des bleuetiers + - name: entretien-framboisiers + date: 2026-06-01 + notes: Entretien des framboisiers + - name: inspection-kiwis-nordiques + date: 2026-05-15 + notes: Vérification des kiwis nordiques + - name: entretien-rhubarbe + date: 2026-05-15 + notes: Entretien de la rhubarbe + - name: inspection-groseillier + date: 2026-05-15 + notes: Inspection du groseillier + - name: inspection-muriers + date: 2026-05-15 + notes: Inspection des mûriers + - name: entretien-houblon + date: 2026-06-01 + notes: Vérification et entretien du houblon + - name: revision-pharmacopée-jardin + date: 2026-05-01 + notes: Vérification du stock de soins pour végétaux + - name: revision-armoire-produits-jardin + date: 2026-05-01 + notes: Vérification et ordre de l'armoire des produits pour végétaux outils-et-equipements: - - name: entretien-outils-jardin - date: 2026-04-15 - notes: Nettoyage et entretien des outils de jardin - - - name: inspection-outils-electriques - date: 2026-05-01 - notes: Vérification des outils électriques - - - name: verification-rallonges-et-connecteurs - date: 2026-05-01 - notes: Vérification des rallonges et connecteurs - - - name: verification-compresseur-et-accessoires - date: 2026-05-15 - notes: Vérification du compresseur et accessoires - - - name: revision-inventaire-outillage - date: 2026-06-01 - notes: Revue de l'inventaire d'outillage - + - name: entretien-outils-jardin + date: 2026-04-15 + notes: Nettoyage et entretien des outils de jardin + - name: inspection-outils-electriques + date: 2026-05-01 + notes: Vérification des outils électriques + - name: verification-rallonges-et-connecteurs + date: 2026-05-01 + notes: Vérification des rallonges et connecteurs + - name: verification-compresseur-et-accessoires + date: 2026-05-15 + notes: Vérification du compresseur et accessoires + - name: revision-inventaire-outillage + date: 2026-06-01 + notes: Revue de l'inventaire d'outillage informatique-personnelle: - - name: verification-sauvegardes-personnelles - date: 2026-04-01 - notes: Vérification des sauvegardes personnelles - - - name: nettoyage-stockage-personnel - date: 2026-04-15 - notes: Nettoyage du stockage numérique personnel - - - name: verification-comptes-importants - date: 2026-05-01 - notes: Vérification des comptes numériques personnels importants - - - name: revue-mots-de-passe-personnels - date: 2026-06-01 - notes: Revue des mots de passe personnels critiques - - - name: verification-documents-cloud-personnels - date: 2026-05-15 - notes: Vérifier la cohérence des documents personnels sauvegardés - + - name: verification-sauvegardes-personnelles + date: 2026-04-01 + notes: Vérification des sauvegardes personnelles + - name: nettoyage-stockage-personnel + date: 2026-04-15 + notes: Nettoyage du stockage numérique personnel + - name: verification-comptes-importants + date: 2026-05-01 + notes: Vérification des comptes numériques personnels importants + - name: revue-mots-de-passe-personnels + date: 2026-06-01 + notes: Revue des mots de passe personnels critiques + - name: verification-documents-cloud-personnels + date: 2026-05-15 + notes: Vérifier la cohérence des documents personnels sauvegardés infrastructure-chezlepro: - - name: verification-proxmox - date: 2026-04-01 - notes: Vérification générale de l'environnement Proxmox - - - name: verification-ceph - date: 2026-04-01 - notes: Vérification générale de l'état Ceph - - - name: test-restauration-backups - date: 2026-04-15 - notes: Test de restauration des sauvegardes - - - name: verification-pbs-truenas - date: 2026-05-01 - notes: Vérification des solutions de sauvegarde et synchronisation - - - name: verification-ups-infrastructure - date: 2026-04-15 - notes: Vérification des UPS de l'infrastructure - - - name: verification-capacite-stockage - date: 2026-04-15 - notes: Vérifier capacité et croissance du stockage - - - name: verification-apt-cacher-ng - date: 2026-05-01 - notes: Vérification du bon fonctionnement d'apt-cacher-ng - - - name: verification-icinga2 - date: 2026-04-01 - notes: Vérification de la supervision Icinga2 - - - name: verification-keycloak-openldap - date: 2026-05-01 - notes: Vérification de l'identité et de l'authentification centralisées - - - name: verification-nextcloud - date: 2026-04-15 - notes: Vérification de l'état Nextcloud - - - name: verification-mailcow - date: 2026-05-01 - notes: Vérification de l'infrastructure Mailcow - - - name: verification-openvas - date: 2026-05-15 - notes: Vérification de la plateforme OpenVAS - - - name: verification-journaux-systemes - date: 2026-04-15 - notes: Revue des journaux systèmes critiques - + - name: verification-proxmox + date: 2026-04-01 + notes: Vérification générale de l'environnement Proxmox + - name: verification-ceph + date: 2026-04-01 + notes: Vérification générale de l'état Ceph + - name: test-restauration-backups + date: 2026-04-15 + notes: Test de restauration des sauvegardes + - name: verification-pbs-truenas + date: 2026-05-01 + notes: Vérification des solutions de sauvegarde et synchronisation + - name: verification-ups-infrastructure + date: 2026-04-15 + notes: Vérification des UPS de l'infrastructure + - name: verification-capacite-stockage + date: 2026-04-15 + notes: Vérifier capacité et croissance du stockage + - name: verification-apt-cacher-ng + date: 2026-05-01 + notes: Vérification du bon fonctionnement d'apt-cacher-ng + - name: verification-icinga2 + date: 2026-04-01 + notes: Vérification de la supervision Icinga2 + - name: verification-keycloak-openldap + date: 2026-05-01 + notes: Vérification de l'identité et de l'authentification centralisées + - name: verification-nextcloud + date: 2026-04-15 + notes: Vérification de l'état Nextcloud + - name: verification-mailcow + date: 2026-05-01 + notes: Vérification de l'infrastructure Mailcow + - name: verification-openvas + date: 2026-05-15 + notes: Vérification de la plateforme OpenVAS + - name: verification-journaux-systemes + date: 2026-04-15 + notes: Revue des journaux systèmes critiques reseau-chezlepro: - - name: verification-firewalls - date: 2026-04-01 - notes: Vérification des firewalls - - - name: verification-vpn-openvpn - date: 2026-04-15 - notes: Vérification des tunnels OpenVPN - - - name: verification-crl-certificats - date: 2026-04-15 - notes: Vérification de la CRL et des certificats - - - name: verification-switches - date: 2026-05-01 - notes: Vérification des switches et uplinks - - - name: verification-vlans-segmentation - date: 2026-05-01 - notes: Vérification de la segmentation réseau - - - name: verification-dns - date: 2026-05-15 - notes: Vérification DNS interne et externe - - - name: verification-dynamic-dns - date: 2026-05-15 - notes: Vérification du DNS dynamique si utilisé - - - name: audit-regles-firewall - date: 2026-06-01 - notes: Audit périodique des règles de firewall - - - name: verification-geoblocking - date: 2026-05-15 - notes: Vérifier le geoblocking et son effet attendu - - - name: verification-certificats-publics - date: 2026-06-01 - notes: Vérifier les expirations de certificats publics - + - name: verification-firewalls + date: 2026-04-01 + notes: Vérification des firewalls + - name: verification-vpn-openvpn + date: 2026-04-15 + notes: Vérification des tunnels OpenVPN + - name: verification-crl-certificats + date: 2026-04-15 + notes: Vérification de la CRL et des certificats + - name: verification-switches + date: 2026-05-01 + notes: Vérification des switches et uplinks + - name: verification-vlans-segmentation + date: 2026-05-01 + notes: Vérification de la segmentation réseau + - name: verification-dns + date: 2026-05-15 + notes: Vérification DNS interne et externe + - name: verification-dynamic-dns + date: 2026-05-15 + notes: Vérification du DNS dynamique si utilisé + - name: audit-regles-firewall + date: 2026-06-01 + notes: Audit périodique des règles de firewall + - name: verification-geoblocking + date: 2026-05-15 + notes: Vérifier le geoblocking et son effet attendu + - name: verification-certificats-publics + date: 2026-06-01 + notes: Vérifier les expirations de certificats publics securite-chezlepro: - - name: verification-mises-a-jour-securite - date: 2026-04-01 - notes: Vérification des mises à jour de sécurité - - - name: audit-comptes-acces - date: 2026-05-01 - notes: Audit des comptes et accès privilégiés - - - name: verification-ids-snort - date: 2026-05-01 - notes: Vérification des IDS et de leur état - - - name: revue-pki-privee - date: 2026-05-15 - notes: Revue de la PKI privée et des autorités intermédiaires - - - name: revue-politiques-securite - date: 2026-06-01 - notes: Revue des politiques et pratiques de sécurité numérique - - - name: verification-sauvegardes-configuration - date: 2026-04-15 - notes: Vérifier les sauvegardes des configurations critiques - + - name: verification-mises-a-jour-securite + date: 2026-04-01 + notes: Vérification des mises à jour de sécurité + - name: audit-comptes-acces + date: 2026-05-01 + notes: Audit des comptes et accès privilégiés + - name: verification-ids-snort + date: 2026-05-01 + notes: Vérification des IDS et de leur état + - name: revue-pki-privee + date: 2026-05-15 + notes: Revue de la PKI privée et des autorités intermédiaires + - name: revue-politiques-securite + date: 2026-06-01 + notes: Revue des politiques et pratiques de sécurité numérique + - name: verification-sauvegardes-configuration + date: 2026-04-15 + notes: Vérifier les sauvegardes des configurations critiques exploitation-chezlepro: - - name: revision-playbooks-ansible - date: 2026-05-01 - notes: Revue des playbooks Ansible - - - name: verification-inventaires-ansible - date: 2026-05-01 - notes: Vérification des inventaires Ansible - - - name: revision-documentation-technique - date: 2026-05-15 - notes: Revue de la documentation technique Chezlepro - - - name: verification-procedures-reprise - date: 2026-06-01 - notes: Vérifier les procédures de reprise et restauration - - - name: revue-capacite-ressources - date: 2026-06-15 - notes: Revue CPU RAM stockage et charge de l'infrastructure - - - name: verification-jobs-automatises - date: 2026-05-15 - notes: Vérification des jobs automatisés et scripts périodiques - + - name: revision-playbooks-ansible + date: 2026-05-01 + notes: Revue des playbooks Ansible + - name: verification-inventaires-ansible + date: 2026-05-01 + notes: Vérification des inventaires Ansible + - name: revision-documentation-technique + date: 2026-05-15 + notes: Revue de la documentation technique Chezlepro + - name: verification-procedures-reprise + date: 2026-06-01 + notes: Vérifier les procédures de reprise et restauration + - name: revue-capacite-ressources + date: 2026-06-15 + notes: Revue CPU RAM stockage et charge de l'infrastructure + - name: verification-jobs-automatises + date: 2026-05-15 + notes: Vérification des jobs automatisés et scripts périodiques obligations-chezlepro: - - name: verification-registraire-entreprise - date: 2026-06-15 - notes: Vérifier les obligations au Registraire des entreprises - - - name: verification-declarations-taxes - date: 2026-04-30 - notes: Vérifier les obligations de taxes de l'entreprise si applicables - - - name: verification-dossier-comptable-entreprise - date: 2026-04-15 - notes: Vérifier l'ordre du dossier comptable Chezlepro - - - name: verification-facturation-clients - date: 2026-04-10 - notes: Vérifier la facturation et son suivi - - - name: verification-paiements-fournisseurs - date: 2026-04-10 - notes: Vérifier les paiements fournisseurs - - - name: verification-contrats-ententes - date: 2026-05-15 - notes: Vérifier contrats, ententes et obligations associées - - - name: verification-assurances-entreprise - date: 2026-06-01 - notes: Vérifier les assurances de l'entreprise - - - name: archivage-documents-entreprise - date: 2026-05-31 - notes: Archiver les documents administratifs et financiers de l'entreprise - + - name: verification-registraire-entreprise + date: 2026-06-15 + notes: Vérifier les obligations au Registraire des entreprises + - name: verification-declarations-taxes + date: 2026-04-30 + notes: Vérifier les obligations de taxes de l'entreprise si applicables + - name: verification-dossier-comptable-entreprise + date: 2026-04-15 + notes: Vérifier l'ordre du dossier comptable Chezlepro + - name: verification-facturation-clients + date: 2026-04-10 + notes: Vérifier la facturation et son suivi + - name: verification-paiements-fournisseurs + date: 2026-04-10 + notes: Vérifier les paiements fournisseurs + - name: verification-contrats-ententes + date: 2026-05-15 + notes: Vérifier contrats, ententes et obligations associées + - name: verification-assurances-entreprise + date: 2026-06-01 + notes: Vérifier les assurances de l'entreprise + - name: archivage-documents-entreprise + date: 2026-05-31 + notes: Archiver les documents administratifs et financiers de l'entreprise actifs-chezlepro: - - name: revision-inventaire-materiel - date: 2026-05-01 - notes: Revoir l'inventaire du matériel de Chezlepro - - - name: verification-amortissables - date: 2026-06-01 - notes: Vérifier le registre des biens amortissables - - - name: verification-serveurs-et-composants - date: 2026-05-15 - notes: Vérifier l'état des serveurs et composants matériels - - - name: verification-reserve-pieces - date: 2026-06-01 - notes: Vérifier les pièces de rechange critiques - - - name: revision-actifs-transferts - date: 2026-06-15 - notes: Réviser les actifs transférés ou à transférer à l'entreprise - + - name: revision-inventaire-materiel + date: 2026-05-01 + notes: Revoir l'inventaire du matériel de Chezlepro + - name: verification-amortissables + date: 2026-06-01 + notes: Vérifier le registre des biens amortissables + - name: verification-serveurs-et-composants + date: 2026-05-15 + notes: Vérifier l'état des serveurs et composants matériels + - name: verification-reserve-pieces + date: 2026-06-01 + notes: Vérifier les pièces de rechange critiques + - name: revision-actifs-transferts + date: 2026-06-15 + notes: Réviser les actifs transférés ou à transférer à l'entreprise projets: - - name: revision-life-noc - date: 2026-04-01 - notes: Révision du projet Life-NOC - - - name: revision-alliance-boreale - date: 2026-04-15 - notes: Révision du projet Alliance Boréale - - - name: revision-erplibre - date: 2026-05-01 - notes: Révision du projet ERPLibre - - - name: revision-semence-numerique - date: 2026-05-15 - notes: Révision du projet semence numérique - - - name: revision-ortrux-1 - date: 2026-05-15 - notes: Révision du système Ortrux-1 - - - name: revision-district16 - date: 2026-05-01 - notes: Révision du projet DISTRICT16 - + - name: revision-life-noc + date: 2026-04-01 + notes: Révision du projet Life-NOC + - name: revision-alliance-boreale + date: 2026-04-15 + notes: Révision du projet Alliance Boréale + - name: revision-erplibre + date: 2026-05-01 + notes: Révision du projet ERPLibre + - name: revision-semence-numerique + date: 2026-05-15 + notes: Révision du projet semence numérique + - name: revision-ortrux-1 + date: 2026-05-15 + notes: Révision du système Ortrux-1 + - name: revision-district16 + date: 2026-05-01 + notes: Révision du projet DISTRICT16 communaute: - - name: verification-outils-aa - date: 2026-05-01 - notes: Vérifier les outils numériques liés aux activités communautaires - - - name: verification-espace-87-16 - date: 2026-05-01 - notes: Vérifier l'espace Nextcloud du district - - - name: verification-salles-visio-groupes - date: 2026-05-15 - notes: Vérifier les salles de visioconférence des groupes - - - name: verification-depots-rapports-rsg - date: 2026-05-15 - notes: Vérifier les dépôts de rapports RSG - - - name: revision-outils-communication-communaute - date: 2026-06-01 - notes: Réviser les moyens de communication communautaires - + - name: verification-outils-aa + date: 2026-05-01 + notes: Vérifier les outils numériques liés aux activités communautaires + - name: verification-espace-87-16 + date: 2026-05-01 + notes: Vérifier l'espace Nextcloud du district + - name: verification-salles-visio-groupes + date: 2026-05-15 + notes: Vérifier les salles de visioconférence des groupes + - name: verification-depots-rapports-rsg + date: 2026-05-15 + notes: Vérifier les dépôts de rapports RSG + - name: revision-outils-communication-communaute + date: 2026-06-01 + notes: Réviser les moyens de communication communautaires documentation: - - name: revue-docs-personnelles-importantes - date: 2026-05-15 - notes: Revoir l'organisation des documents personnels importants - - - name: revue-wiki-technique - date: 2026-05-15 - notes: Revoir le wiki technique et sa cohérence - - - name: revue-base-connaissances - date: 2026-06-01 - notes: Revoir la base de connaissances globale - - - name: verification-sauvegarde-docs-cles - date: 2026-05-15 - notes: Vérifier la sauvegarde des documents clés - + - name: revue-docs-personnelles-importantes + date: 2026-05-15 + notes: Revoir l'organisation des documents personnels importants + - name: revue-wiki-technique + date: 2026-05-15 + notes: Revoir le wiki technique et sa cohérence + - name: revue-base-connaissances + date: 2026-06-01 + notes: Revoir la base de connaissances globale + - name: verification-sauvegarde-docs-cles + date: 2026-05-15 + notes: Vérifier la sauvegarde des documents clés animaux: - - name: verification-stock-nourriture-chats - date: 2026-04-15 - notes: Vérification du stock de nourriture pour chats - - - name: verification-friandises-et-litiere - date: 2026-04-15 - notes: Vérification des stocks de friandises et de litière - - - name: revision-routine-soins-animaux - date: 2026-05-01 - notes: Revue de la routine de soins et des besoins matériels des chats + - name: verification-stock-nourriture-chats + date: 2026-04-15 + notes: Vérification du stock de nourriture pour chats + - name: verification-friandises-et-litiere + date: 2026-04-15 + notes: Vérification des stocks de friandises et de litière + - name: revision-routine-soins-animaux + date: 2026-05-01 + notes: Revue de la routine de soins et des besoins matériels des chats diff --git a/icinga/commands/check_life_noc_probe.conf b/icinga/commands/check_life_noc_probe.conf index 2c5b33b..48603bb 100644 --- a/icinga/commands/check_life_noc_probe.conf +++ b/icinga/commands/check_life_noc_probe.conf @@ -8,10 +8,19 @@ object CheckCommand "check_life_noc_probe" { "--inputs-file" = "$life_noc_inputs_file$" "--item-key" = "$life_noc_item_key$" "--unit" = "$life_noc_metric_unit$" + "--unknown-lt" = "$life_noc_threshold_unknown_lt$" + "--unknown-gte" = "$life_noc_threshold_unknown_gte$" + "--ok-gte" = "$life_noc_threshold_ok_gte$" + "--ok-lt" = "$life_noc_threshold_ok_lt$" + "--warning-gte" = "$life_noc_threshold_warning_gte$" + "--warning-lt" = "$life_noc_threshold_warning_lt$" + "--critical-gte" = "$life_noc_threshold_critical_gte$" + "--critical-lt" = "$life_noc_threshold_critical_lt$" + "--on-error" = "$life_noc_on_error$" "--label" = "$life_noc_label$" } diff --git a/icinga/services/obligations-legales-personnelles.conf b/icinga/services/obligations-legales-personnelles.conf index dfd723c..55ae0a7 100644 --- a/icinga/services/obligations-legales-personnelles.conf +++ b/icinga/services/obligations-legales-personnelles.conf @@ -45,12 +45,21 @@ apply Service "obligations-legales-personnelles-verification-papiers-identite" { } apply Service "obligations-legales-personnelles-renouvellement-permis-conduire" { - import "service_echeance" - vars.date_echeance = "2027-01-01" - vars.mock_state = "OK" - vars.mock_message = "Sous contrôle" + import "service_life_noc_probe" + vars.life_noc_probe_type = "days_until_due" + vars.life_noc_source_type = "manual_date" + vars.life_noc_source_value = "" + vars.life_noc_inputs_file = "/opt/life-noc/data/inputs/obligations-legales-personnelles.yaml" + vars.life_noc_item_key = "renouvellement-permis-conduire" + vars.life_noc_metric_unit = "days" + vars.life_noc_label = "renouvellement-permis-conduire" groups = [ "OBLIGATIONS-LEGALES-PERSONNELLES" ] - notes = "Vérifier le renouvellement du permis de conduire" + vars.life_noc_threshold_unknown_gte = "90" + vars.life_noc_threshold_ok_lt = "90" + vars.life_noc_threshold_warning_lt = "30" + vars.life_noc_threshold_critical_lt = "7" + vars.life_noc_on_error = "critical" + notes = "Vérifier la proximité de l’échéance du permis" assign where host.name == "life-noc" } diff --git a/patch_days_until_due.sh b/patch_days_until_due.sh new file mode 100755 index 0000000..4bd5dcc --- /dev/null +++ b/patch_days_until_due.sh @@ -0,0 +1,283 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT="${1:-.}" + +need_file() { + local f="$1" + if [[ ! -f "$ROOT/$f" ]]; then + echo "Fichier introuvable: $f" >&2 + exit 1 + fi +} + +echo "==> Vérification du dépôt" +need_file "checks/check_life_noc_probe.py" +need_file "icinga/commands/check_life_noc_probe.conf" +need_file "scripts/generate_services.py" +need_file "domains.yaml" + +echo "==> Sauvegarde" +mkdir -p "$ROOT/.patch-backup-days-until-due" +cp -a "$ROOT/checks/check_life_noc_probe.py" "$ROOT/.patch-backup-days-until-due/check_life_noc_probe.py.bak" +cp -a "$ROOT/icinga/commands/check_life_noc_probe.conf" "$ROOT/.patch-backup-days-until-due/check_life_noc_probe.conf.bak" +cp -a "$ROOT/scripts/generate_services.py" "$ROOT/.patch-backup-days-until-due/generate_services.py.bak" +cp -a "$ROOT/domains.yaml" "$ROOT/.patch-backup-days-until-due/domains.yaml.bak" + +echo "==> Réécriture de checks/check_life_noc_probe.py" +cat > "$ROOT/checks/check_life_noc_probe.py" <<'PYEOF' +#!/usr/bin/env python3 + +import argparse +from datetime import datetime, timezone +from pathlib import Path +import yaml + + +def exit_with(code: int, text: str) -> None: + print(text) + raise SystemExit(code) + + +def parse_date(value: str) -> datetime: + return datetime.strptime(value, "%Y-%m-%d").replace(tzinfo=timezone.utc) + + +def load_input_value(inputs_file: str, item_key: str) -> str: + path = Path(inputs_file) + if not path.exists(): + raise ValueError(f"inputs file introuvable: {inputs_file}") + + data = yaml.safe_load(path.read_text(encoding="utf-8")) + if not isinstance(data, dict): + raise ValueError(f"inputs file invalide: {inputs_file}") + + if item_key not in data: + raise ValueError(f"item_key introuvable dans le store: {item_key}") + + item = data[item_key] + if not isinstance(item, dict): + raise ValueError(f"entrée invalide pour item_key: {item_key}") + + if "value" not in item: + raise ValueError(f"champ 'value' absent pour item_key: {item_key}") + + return str(item["value"]).strip() + + +def main() -> int: + ap = argparse.ArgumentParser() + ap.add_argument("--probe-type", required=True) + ap.add_argument("--source-type", required=True) + ap.add_argument("--source-value") + ap.add_argument("--inputs-file") + ap.add_argument("--item-key") + ap.add_argument("--unit", required=True) + + ap.add_argument("--unknown-lt", type=float) + ap.add_argument("--unknown-gte", type=float) + + ap.add_argument("--ok-gte", type=float) + ap.add_argument("--ok-lt", type=float) + + ap.add_argument("--warning-gte", type=float) + ap.add_argument("--warning-lt", type=float) + + ap.add_argument("--critical-gte", type=float) + ap.add_argument("--critical-lt", type=float) + + ap.add_argument("--on-error", default="critical") + ap.add_argument("--label", default="life-noc") + args = ap.parse_args() + + try: + if args.source_type != "manual_date": + exit_with(2, f"CRITICAL - source_type non supporté: {args.source_type}") + + if args.unit != "days": + exit_with(2, f"CRITICAL - unité non supportée: {args.unit}") + + if args.inputs_file and args.item_key: + source_value = load_input_value(args.inputs_file, args.item_key) + elif args.source_value: + source_value = args.source_value + else: + raise ValueError("aucune source fournie: inputs-file/item-key ou source-value requis") + + dt = parse_date(source_value) + now = datetime.now(timezone.utc) + + if args.probe_type == "elapsed_time": + metric = (now - dt).total_seconds() / 86400.0 + + if args.critical_gte is not None and metric >= args.critical_gte: + exit_with(2, f"CRITICAL - {args.label}: {metric:.1f} jours") + if args.warning_gte is not None and metric >= args.warning_gte: + exit_with(1, f"WARNING - {args.label}: {metric:.1f} jours") + if args.ok_gte is not None and metric >= args.ok_gte: + exit_with(0, f"OK - {args.label}: {metric:.1f} jours") + if args.unknown_lt is not None and metric < args.unknown_lt: + exit_with(3, f"UNKNOWN - {args.label}: {metric:.1f} jours") + + exit_with(2, f"CRITICAL - {args.label}: seuils incohérents") + + elif args.probe_type == "days_until_due": + metric = (dt - now).total_seconds() / 86400.0 + + if args.critical_lt is not None and metric < args.critical_lt: + exit_with(2, f"CRITICAL - {args.label}: {metric:.1f} jours restants") + if args.warning_lt is not None and metric < args.warning_lt: + exit_with(1, f"WARNING - {args.label}: {metric:.1f} jours restants") + if args.ok_lt is not None and metric < args.ok_lt: + exit_with(0, f"OK - {args.label}: {metric:.1f} jours restants") + if args.unknown_gte is not None and metric >= args.unknown_gte: + exit_with(3, f"UNKNOWN - {args.label}: {metric:.1f} jours restants") + + exit_with(2, f"CRITICAL - {args.label}: seuils incohérents") + + else: + exit_with(2, f"CRITICAL - probe_type non supporté: {args.probe_type}") + + except Exception as exc: + if args.on_error == "critical": + exit_with(2, f"CRITICAL - erreur sonde: {exc}") + exit_with(3, f"UNKNOWN - erreur sonde: {exc}") + + +if __name__ == "__main__": + raise SystemExit(main()) +PYEOF +chmod +x "$ROOT/checks/check_life_noc_probe.py" + +echo "==> Réécriture de icinga/commands/check_life_noc_probe.conf" +cat > "$ROOT/icinga/commands/check_life_noc_probe.conf" <<'CONFEOF' +object CheckCommand "check_life_noc_probe" { + command = [ PluginDir + "/check_life_noc_probe.py" ] + + arguments = { + "--probe-type" = "$life_noc_probe_type$" + "--source-type" = "$life_noc_source_type$" + "--source-value" = "$life_noc_source_value$" + "--inputs-file" = "$life_noc_inputs_file$" + "--item-key" = "$life_noc_item_key$" + "--unit" = "$life_noc_metric_unit$" + + "--unknown-lt" = "$life_noc_threshold_unknown_lt$" + "--unknown-gte" = "$life_noc_threshold_unknown_gte$" + + "--ok-gte" = "$life_noc_threshold_ok_gte$" + "--ok-lt" = "$life_noc_threshold_ok_lt$" + + "--warning-gte" = "$life_noc_threshold_warning_gte$" + "--warning-lt" = "$life_noc_threshold_warning_lt$" + + "--critical-gte" = "$life_noc_threshold_critical_gte$" + "--critical-lt" = "$life_noc_threshold_critical_lt$" + + "--on-error" = "$life_noc_on_error$" + "--label" = "$life_noc_label$" + } +} +CONFEOF + +echo "==> Patch de scripts/generate_services.py" +python3 - "$ROOT/scripts/generate_services.py" <<'PYEOF' +from pathlib import Path +import sys + +path = Path(sys.argv[1]) +text = path.read_text(encoding="utf-8") + +old = ' if "critical_gte" in thresholds:\n lines.append(f\' vars.life_noc_threshold_critical_gte = "{icinga_escape(str(thresholds["critical_gte"]))}"\')\n' +new = old + ' if "unknown_gte" in thresholds:\n lines.append(f\' vars.life_noc_threshold_unknown_gte = "{icinga_escape(str(thresholds["unknown_gte"]))}"\')\n if "ok_lt" in thresholds:\n lines.append(f\' vars.life_noc_threshold_ok_lt = "{icinga_escape(str(thresholds["ok_lt"]))}"\')\n if "warning_lt" in thresholds:\n lines.append(f\' vars.life_noc_threshold_warning_lt = "{icinga_escape(str(thresholds["warning_lt"]))}"\')\n if "critical_lt" in thresholds:\n lines.append(f\' vars.life_noc_threshold_critical_lt = "{icinga_escape(str(thresholds["critical_lt"]))}"\')\n' +if old not in text: + raise SystemExit("Bloc seuils introuvable dans generate_services.py") +text = text.replace(old, new, 1) + +old2 = ' probe_type = str(probe.get("type", "")).strip()\n if probe_type not in {"elapsed_time"}:\n raise ValueError("seul probe.type=elapsed_time est supporté en v1")\n' +new2 = ' probe_type = str(probe.get("type", "")).strip()\n if probe_type not in {"elapsed_time", "days_until_due"}:\n raise ValueError("seuls probe.type=elapsed_time et days_until_due sont supportés")\n' +if old2 in text: + text = text.replace(old2, new2, 1) +else: + old3 = ' probe_type = str(probe.get("type", "")).strip()\n if probe_type not in {"elapsed_time", "days_until_due"}:\n raise ValueError("seuls probe.type=elapsed_time et days_until_due sont supportés")\n' + if old3 not in text: + raise SystemExit("Bloc validate_probe introuvable ou inattendu dans generate_services.py") + +path.write_text(text, encoding="utf-8") +print("generate_services.py patché") +PYEOF + +echo "==> Création du store data/inputs/obligations-legales-personnelles.yaml" +mkdir -p "$ROOT/data/inputs" +cat > "$ROOT/data/inputs/obligations-legales-personnelles.yaml" <<'YAMLEOF' +renouvellement-permis-conduire: + value: "2026-09-20" + captured_at: "2026-03-14T23:30:00Z" + origin: manual +YAMLEOF + +echo "==> Mise à jour de domains.yaml" +python3 - "$ROOT/domains.yaml" <<'PYEOF' +from pathlib import Path +import sys +import yaml + +path = Path(sys.argv[1]) +data = yaml.safe_load(path.read_text(encoding="utf-8")) + +domain = "obligations-legales-personnelles" +items = data.get("domains", {}).get(domain) +if not isinstance(items, list): + raise SystemExit(f"Domaine introuvable ou invalide: {domain}") + +target = None +for item in items: + if isinstance(item, dict) and item.get("name") == "renouvellement-permis-conduire": + target = item + break + +if target is None: + raise SystemExit("Item 'renouvellement-permis-conduire' introuvable dans domains.yaml") + +target["date"] = "2026-09-20" +target["notes"] = "Vérifier la proximité de l’échéance du permis" +target["probe"] = { + "type": "days_until_due", + "source": { + "type": "manual_date", + "inputs_file": "/opt/life-noc/data/inputs/obligations-legales-personnelles.yaml", + "item_key": "renouvellement-permis-conduire", + }, + "metric": { + "unit": "days", + }, + "thresholds": { + "critical_lt": 7, + "warning_lt": 30, + "ok_lt": 90, + "unknown_gte": 90, + }, + "policy": { + "on_error": "critical", + }, +} + +path.write_text(yaml.safe_dump(data, sort_keys=False, allow_unicode=True), encoding="utf-8") +print("domains.yaml mis à jour") +PYEOF + +echo "==> Régénération" +( + cd "$ROOT" + python3 scripts/generate_services.py +) + +echo +echo "Patch terminé." +echo "Étapes suivantes :" +echo " python3 scripts/generate_services.py" +echo " make check" +echo " make deploy-with-bpm" +echo +echo "Test utile ensuite :" +echo " python3 scripts/life_noc_input.py set obligations-legales-personnelles renouvellement-permis-conduire 2026-03-20" diff --git a/patch_days_until_due_v2.sh b/patch_days_until_due_v2.sh new file mode 100755 index 0000000..385d3f6 --- /dev/null +++ b/patch_days_until_due_v2.sh @@ -0,0 +1,145 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT="${1:-.}" + +need_file() { + local f="$1" + if [[ ! -f "$ROOT/$f" ]]; then + echo "Fichier introuvable: $f" >&2 + exit 1 + fi +} + +echo "==> Vérification" +need_file "scripts/generate_services.py" +need_file "domains.yaml" + +echo "==> Sauvegarde" +mkdir -p "$ROOT/.patch-backup-days-until-due-v2" +cp -a "$ROOT/scripts/generate_services.py" "$ROOT/.patch-backup-days-until-due-v2/generate_services.py.bak" +cp -a "$ROOT/domains.yaml" "$ROOT/.patch-backup-days-until-due-v2/domains.yaml.bak" + +echo "==> Patch de scripts/generate_services.py" +python3 - "$ROOT/scripts/generate_services.py" <<'PYEOF' +from pathlib import Path +import sys + +path = Path(sys.argv[1]) +text = path.read_text(encoding="utf-8") + +# 1) Ajouter les seuils *_lt / unknown_gte si absents +needle = ' if "critical_gte" in thresholds:\n lines.append(f\' vars.life_noc_threshold_critical_gte = "{icinga_escape(str(thresholds["critical_gte"]))}"\')\n' +addition = ( + ' if "unknown_gte" in thresholds:\n' + ' lines.append(f\' vars.life_noc_threshold_unknown_gte = "{icinga_escape(str(thresholds["unknown_gte"]))}"\')\n' + ' if "ok_lt" in thresholds:\n' + ' lines.append(f\' vars.life_noc_threshold_ok_lt = "{icinga_escape(str(thresholds["ok_lt"]))}"\')\n' + ' if "warning_lt" in thresholds:\n' + ' lines.append(f\' vars.life_noc_threshold_warning_lt = "{icinga_escape(str(thresholds["warning_lt"]))}"\')\n' + ' if "critical_lt" in thresholds:\n' + ' lines.append(f\' vars.life_noc_threshold_critical_lt = "{icinga_escape(str(thresholds["critical_lt"]))}"\')\n' +) + +if 'vars.life_noc_threshold_unknown_gte' not in text: + if needle not in text: + raise SystemExit("Impossible de trouver le bloc des seuils dans generate_services.py") + text = text.replace(needle, needle + addition, 1) + +# 2) Élargir validate_probe aux deux types +old_variants = [ + ' probe_type = str(probe.get("type", "")).strip()\n if probe_type not in {"elapsed_time"}:\n raise ValueError("seul probe.type=elapsed_time est supporté en v1")\n', + ' probe_type = str(probe.get("type", "")).strip()\n if probe_type not in {"elapsed_time"}:\n raise ValueError("seul probe.type=elapsed_time est supporté en v1")\r\n', +] +new_block = ' probe_type = str(probe.get("type", "")).strip()\n if probe_type not in {"elapsed_time", "days_until_due"}:\n raise ValueError("seuls probe.type=elapsed_time et days_until_due sont supportés")\n' + +replaced = False +for old in old_variants: + if old in text: + text = text.replace(old, new_block, 1) + replaced = True + break + +if not replaced: + # si déjà patché, on accepte + if new_block.strip() not in text: + raise SystemExit("Bloc validate_probe introuvable ou déjà trop différent dans generate_services.py") + +path.write_text(text, encoding="utf-8") +print("generate_services.py patché") +PYEOF + +echo "==> Création du store data/inputs/obligations-legales-personnelles.yaml" +mkdir -p "$ROOT/data/inputs" +cat > "$ROOT/data/inputs/obligations-legales-personnelles.yaml" <<'YAMLEOF' +renouvellement-permis-conduire: + value: "2026-09-20" + captured_at: "2026-03-14T23:30:00Z" + origin: manual +YAMLEOF + +echo "==> Mise à jour de domains.yaml" +python3 - "$ROOT/domains.yaml" <<'PYEOF' +from pathlib import Path +import sys +import yaml + +path = Path(sys.argv[1]) +data = yaml.safe_load(path.read_text(encoding="utf-8")) + +domain = "obligations-legales-personnelles" +items = data.get("domains", {}).get(domain) +if not isinstance(items, list): + raise SystemExit(f"Domaine introuvable ou invalide: {domain}") + +target = None +for item in items: + if isinstance(item, dict) and item.get("name") == "renouvellement-permis-conduire": + target = item + break + +if target is None: + raise SystemExit("Item 'renouvellement-permis-conduire' introuvable") + +target["date"] = "2026-09-20" +target["notes"] = "Vérifier la proximité de l’échéance du permis" +target["probe"] = { + "type": "days_until_due", + "source": { + "type": "manual_date", + "inputs_file": "/opt/life-noc/data/inputs/obligations-legales-personnelles.yaml", + "item_key": "renouvellement-permis-conduire", + }, + "metric": { + "unit": "days", + }, + "thresholds": { + "critical_lt": 7, + "warning_lt": 30, + "ok_lt": 90, + "unknown_gte": 90, + }, + "policy": { + "on_error": "critical", + }, +} + +path.write_text(yaml.safe_dump(data, sort_keys=False, allow_unicode=True), encoding="utf-8") +print("domains.yaml mis à jour") +PYEOF + +echo "==> Régénération" +( + cd "$ROOT" + python3 scripts/generate_services.py +) + +echo +echo "Patch terminé." +echo "Étapes suivantes :" +echo " python3 scripts/generate_services.py" +echo " make check" +echo " make deploy-with-bpm" +echo +echo "Test utile ensuite :" +echo " python3 scripts/life_noc_input.py set obligations-legales-personnelles renouvellement-permis-conduire 2026-03-20" diff --git a/patch_days_until_due_v3.sh b/patch_days_until_due_v3.sh new file mode 100755 index 0000000..818cf52 --- /dev/null +++ b/patch_days_until_due_v3.sh @@ -0,0 +1,161 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT="${1:-.}" + +need_file() { + local f="$1" + if [[ ! -f "$ROOT/$f" ]]; then + echo "Fichier introuvable: $f" >&2 + exit 1 + fi +} + +echo "==> Vérification" +need_file "scripts/generate_services.py" +need_file "domains.yaml" + +echo "==> Sauvegarde" +mkdir -p "$ROOT/.patch-backup-days-until-due-v3" +cp -a "$ROOT/scripts/generate_services.py" "$ROOT/.patch-backup-days-until-due-v3/generate_services.py.bak" +cp -a "$ROOT/domains.yaml" "$ROOT/.patch-backup-days-until-due-v3/domains.yaml.bak" + +echo "==> Patch robuste de scripts/generate_services.py" +python3 - "$ROOT/scripts/generate_services.py" <<'PYEOF' +from pathlib import Path +import re +import sys + +path = Path(sys.argv[1]) +text = path.read_text(encoding="utf-8") + +# 1) Ajouter les seuils lt/gte manquants dans render_probe_service, juste avant on_error +if 'vars.life_noc_threshold_unknown_gte' not in text: + marker = ' on_error = str(policy.get("on_error", "critical")).strip()\n' + inject = ( + ' if "unknown_gte" in thresholds:\n' + ' lines.append(f\' vars.life_noc_threshold_unknown_gte = "{icinga_escape(str(thresholds["unknown_gte"]))}"\')\n' + ' if "ok_lt" in thresholds:\n' + ' lines.append(f\' vars.life_noc_threshold_ok_lt = "{icinga_escape(str(thresholds["ok_lt"]))}"\')\n' + ' if "warning_lt" in thresholds:\n' + ' lines.append(f\' vars.life_noc_threshold_warning_lt = "{icinga_escape(str(thresholds["warning_lt"]))}"\')\n' + ' if "critical_lt" in thresholds:\n' + ' lines.append(f\' vars.life_noc_threshold_critical_lt = "{icinga_escape(str(thresholds["critical_lt"]))}"\')\n' + ) + if marker not in text: + raise SystemExit("Impossible de trouver le point d'injection des seuils dans render_probe_service") + text = text.replace(marker, inject + marker, 1) + +# 2) Remplacer entièrement validate_probe(...) +new_validate = '''def validate_probe(item: dict) -> None: + probe = item["probe"] + if not isinstance(probe, dict): + raise ValueError("probe doit être un objet") + + probe_type = str(probe.get("type", "")).strip() + if probe_type not in {"elapsed_time", "days_until_due"}: + raise ValueError("seuls probe.type=elapsed_time et days_until_due sont supportés") + + source = probe.get("source") + if not isinstance(source, dict): + raise ValueError("probe.source doit être un objet") + if str(source.get("type", "")).strip() != "manual_date": + raise ValueError("seul probe.source.type=manual_date est supporté en v1") + + has_inline_value = "value" in source + has_store_ref = "inputs_file" in source and "item_key" in source + if not has_inline_value and not has_store_ref: + raise ValueError("probe.source.value ou probe.source.inputs_file + item_key requis") + + metric = probe.get("metric") + if not isinstance(metric, dict): + raise ValueError("probe.metric doit être un objet") + if str(metric.get("unit", "")).strip() != "days": + raise ValueError("seul probe.metric.unit=days est supporté en v1") + + thresholds = probe.get("thresholds") + if not isinstance(thresholds, dict): + raise ValueError("probe.thresholds doit être un objet") +''' + +pattern = r'def validate_probe\(item: dict\) -> None:\n(?: .*\n)+?(?=\ndef render_servicegroup|\ndef main\()' +new_text, count = re.subn(pattern, new_validate + "\n", text, flags=re.MULTILINE) +if count == 0: + raise SystemExit("Impossible de remplacer validate_probe(...) dans generate_services.py") +text = new_text + +path.write_text(text, encoding="utf-8") +print("generate_services.py patché") +PYEOF + +echo "==> Création du store" +mkdir -p "$ROOT/data/inputs" +cat > "$ROOT/data/inputs/obligations-legales-personnelles.yaml" <<'YAMLEOF' +renouvellement-permis-conduire: + value: "2026-09-20" + captured_at: "2026-03-14T23:30:00Z" + origin: manual +YAMLEOF + +echo "==> Mise à jour de domains.yaml" +python3 - "$ROOT/domains.yaml" <<'PYEOF' +from pathlib import Path +import sys +import yaml + +path = Path(sys.argv[1]) +data = yaml.safe_load(path.read_text(encoding="utf-8")) + +domain = "obligations-legales-personnelles" +items = data.get("domains", {}).get(domain) +if not isinstance(items, list): + raise SystemExit(f"Domaine introuvable ou invalide: {domain}") + +target = None +for item in items: + if isinstance(item, dict) and item.get("name") == "renouvellement-permis-conduire": + target = item + break + +if target is None: + raise SystemExit("Item 'renouvellement-permis-conduire' introuvable") + +target["date"] = "2026-09-20" +target["notes"] = "Vérifier la proximité de l’échéance du permis" +target["probe"] = { + "type": "days_until_due", + "source": { + "type": "manual_date", + "inputs_file": "/opt/life-noc/data/inputs/obligations-legales-personnelles.yaml", + "item_key": "renouvellement-permis-conduire", + }, + "metric": { + "unit": "days", + }, + "thresholds": { + "critical_lt": 7, + "warning_lt": 30, + "ok_lt": 90, + "unknown_gte": 90, + }, + "policy": { + "on_error": "critical", + }, +} + +path.write_text(yaml.safe_dump(data, sort_keys=False, allow_unicode=True), encoding="utf-8") +print("domains.yaml mis à jour") +PYEOF + +echo "==> Régénération" +( + cd "$ROOT" + python3 scripts/generate_services.py +) + +echo +echo "Patch terminé." +echo "Étapes suivantes :" +echo " python3 scripts/generate_services.py" +echo " make check" +echo " make deploy-with-bpm" diff --git a/scripts/generate_services.py b/scripts/generate_services.py index e7373a9..691846c 100644 --- a/scripts/generate_services.py +++ b/scripts/generate_services.py @@ -144,6 +144,14 @@ def render_probe_service(domain: str, group_name: str, item: dict) -> str: lines.append(f' vars.life_noc_threshold_warning_gte = "{icinga_escape(str(thresholds["warning_gte"]))}"') if "critical_gte" in thresholds: lines.append(f' vars.life_noc_threshold_critical_gte = "{icinga_escape(str(thresholds["critical_gte"]))}"') + if "unknown_gte" in thresholds: + lines.append(f' vars.life_noc_threshold_unknown_gte = "{icinga_escape(str(thresholds["unknown_gte"]))}"') + if "ok_lt" in thresholds: + lines.append(f' vars.life_noc_threshold_ok_lt = "{icinga_escape(str(thresholds["ok_lt"]))}"') + if "warning_lt" in thresholds: + lines.append(f' vars.life_noc_threshold_warning_lt = "{icinga_escape(str(thresholds["warning_lt"]))}"') + if "critical_lt" in thresholds: + lines.append(f' vars.life_noc_threshold_critical_lt = "{icinga_escape(str(thresholds["critical_lt"]))}"') on_error = str(policy.get("on_error", "critical")).strip() lines.append(f' vars.life_noc_on_error = "{icinga_escape(on_error)}"') @@ -167,8 +175,9 @@ def validate_probe(item: dict) -> None: if not isinstance(probe, dict): raise ValueError("probe doit être un objet") - if str(probe.get("type", "")).strip() != "elapsed_time": - raise ValueError("seul probe.type=elapsed_time est supporté en v1") + probe_type = str(probe.get("type", "")).strip() + if probe_type not in {"elapsed_time", "days_until_due"}: + raise ValueError("seuls probe.type=elapsed_time et days_until_due sont supportés") source = probe.get("source") if not isinstance(source, dict):