Ajoute days_until_due et consolide le noyau des intrants Life-NOC

This commit is contained in:
Daniel Allaire 2026-03-14 20:14:50 -04:00
parent a45f41bf03
commit 76f1b65a7e
19 changed files with 5447 additions and 765 deletions

View file

@ -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

View file

@ -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

View file

@ -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())

View file

@ -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

View file

@ -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())

View file

@ -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$"
}
}

View file

@ -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())

View file

@ -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

View file

@ -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())

121
apply_days_until_due_pilot.sh Executable file
View file

@ -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"

55
checks/check_life_noc_probe.py Normal file → Executable file
View file

@ -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}")

View file

@ -0,0 +1,4 @@
renouvellement-permis-conduire:
value: "2026-09-20"
captured_at: "2026-03-14T23:30:00Z"
origin: manual

File diff suppressed because it is too large Load diff

View file

@ -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$"
}

View file

@ -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"
}

283
patch_days_until_due.sh Executable file
View file

@ -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"

145
patch_days_until_due_v2.sh Executable file
View file

@ -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"

161
patch_days_until_due_v3.sh Executable file
View file

@ -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"

View file

@ -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):