Compare commits
No commits in common. "54f7c8c3000524f8efce1882a6846efb9c089023" and "aa3ebf329415794293a8c604e9575b80a30d85b5" have entirely different histories.
54f7c8c300
...
aa3ebf3294
31 changed files with 767 additions and 6805 deletions
|
|
@ -1,768 +0,0 @@
|
||||||
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
|
|
||||||
|
|
@ -1,768 +0,0 @@
|
||||||
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
|
|
||||||
|
|
@ -1,298 +0,0 @@
|
||||||
#!/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())
|
|
||||||
|
|
@ -1,768 +0,0 @@
|
||||||
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
|
|
||||||
|
|
@ -1,298 +0,0 @@
|
||||||
#!/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())
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
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$"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,97 +0,0 @@
|
||||||
#!/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())
|
|
||||||
|
|
@ -1,768 +0,0 @@
|
||||||
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
|
|
||||||
|
|
@ -1,298 +0,0 @@
|
||||||
#!/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())
|
|
||||||
|
|
@ -9,12 +9,3 @@
|
||||||
state: reloaded
|
state: reloaded
|
||||||
when: life_noc_reload_icinga | bool
|
when: life_noc_reload_icinga | bool
|
||||||
listen: validate and reload icinga
|
listen: validate and reload icinga
|
||||||
|
|
||||||
- name: reload systemd
|
|
||||||
ansible.builtin.systemd:
|
|
||||||
daemon_reload: true
|
|
||||||
|
|
||||||
- name: restart life-noc input api
|
|
||||||
ansible.builtin.service:
|
|
||||||
name: life-noc-input-api
|
|
||||||
state: restarted
|
|
||||||
|
|
|
||||||
|
|
@ -221,29 +221,3 @@
|
||||||
when:
|
when:
|
||||||
- life_noc_bpm_deploy_enabled | bool
|
- life_noc_bpm_deploy_enabled | bool
|
||||||
- life_noc_bpm_destination_dir is defined
|
- life_noc_bpm_destination_dir is defined
|
||||||
|
|
||||||
- name: install api dependencies for inputs service
|
|
||||||
ansible.builtin.apt:
|
|
||||||
name:
|
|
||||||
- python3-fastapi
|
|
||||||
- python3-uvicorn
|
|
||||||
- python3-multipart
|
|
||||||
state: present
|
|
||||||
update_cache: true
|
|
||||||
|
|
||||||
- name: deploy life-noc input api systemd unit
|
|
||||||
ansible.builtin.template:
|
|
||||||
src: life-noc-input-api.service.j2
|
|
||||||
dest: /etc/systemd/system/life-noc-input-api.service
|
|
||||||
owner: root
|
|
||||||
group: root
|
|
||||||
mode: "0644"
|
|
||||||
notify:
|
|
||||||
- reload systemd
|
|
||||||
- restart life-noc input api
|
|
||||||
|
|
||||||
- name: enable and start life-noc input api
|
|
||||||
ansible.builtin.service:
|
|
||||||
name: life-noc-input-api
|
|
||||||
enabled: true
|
|
||||||
state: started
|
|
||||||
|
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
[Unit]
|
|
||||||
Description=Life-NOC Input API
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
User=root
|
|
||||||
Group=root
|
|
||||||
WorkingDirectory={{ life_noc_project_root }}
|
|
||||||
ExecStart=/usr/bin/python3 -m uvicorn scripts.life_noc_input_api:app --host 127.0.0.1 --port 8787
|
|
||||||
Restart=on-failure
|
|
||||||
RestartSec=3
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
|
|
@ -1,121 +0,0 @@
|
||||||
#!/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"
|
|
||||||
89
checks/check_life_noc_probe.py
Executable file → Normal file
89
checks/check_life_noc_probe.py
Executable file → Normal file
|
|
@ -2,8 +2,6 @@
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
from pathlib import Path
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
|
|
||||||
def exit_with(code: int, text: str) -> None:
|
def exit_with(code: int, text: str) -> None:
|
||||||
|
|
@ -15,101 +13,44 @@ def parse_date(value: str) -> datetime:
|
||||||
return datetime.strptime(value, "%Y-%m-%d").replace(tzinfo=timezone.utc)
|
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:
|
def main() -> int:
|
||||||
ap = argparse.ArgumentParser()
|
ap = argparse.ArgumentParser()
|
||||||
ap.add_argument("--probe-type", required=True)
|
ap.add_argument("--probe-type", required=True)
|
||||||
ap.add_argument("--source-type", required=True)
|
ap.add_argument("--source-type", required=True)
|
||||||
ap.add_argument("--source-value")
|
ap.add_argument("--source-value", required=True)
|
||||||
ap.add_argument("--inputs-file")
|
|
||||||
ap.add_argument("--item-key")
|
|
||||||
ap.add_argument("--unit", required=True)
|
ap.add_argument("--unit", required=True)
|
||||||
|
|
||||||
ap.add_argument("--unknown-lt", type=float)
|
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-gte", type=float)
|
||||||
ap.add_argument("--ok-lt", type=float)
|
|
||||||
|
|
||||||
ap.add_argument("--warning-gte", 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-gte", type=float)
|
||||||
ap.add_argument("--critical-lt", type=float)
|
|
||||||
|
|
||||||
ap.add_argument("--on-error", default="critical")
|
ap.add_argument("--on-error", default="critical")
|
||||||
ap.add_argument("--label", default="life-noc")
|
ap.add_argument("--label", default="life-noc")
|
||||||
args = ap.parse_args()
|
args = ap.parse_args()
|
||||||
|
|
||||||
try:
|
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":
|
if args.source_type != "manual_date":
|
||||||
exit_with(2, f"CRITICAL - source_type non supporté: {args.source_type}")
|
exit_with(2, f"CRITICAL - source_type non supporté: {args.source_type}")
|
||||||
|
|
||||||
if args.unit != "days":
|
if args.unit != "days":
|
||||||
exit_with(2, f"CRITICAL - unité non supportée: {args.unit}")
|
exit_with(2, f"CRITICAL - unité non supportée: {args.unit}")
|
||||||
|
|
||||||
if args.inputs_file and args.item_key:
|
dt = parse_date(args.source_value)
|
||||||
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)
|
now = datetime.now(timezone.utc)
|
||||||
|
delta_days = (now - dt).total_seconds() / 86400.0
|
||||||
|
|
||||||
if args.probe_type == "elapsed_time":
|
if args.critical_gte is not None and delta_days >= args.critical_gte:
|
||||||
metric = (now - dt).total_seconds() / 86400.0
|
exit_with(2, f"CRITICAL - {args.label}: {delta_days:.1f} jours")
|
||||||
|
if args.warning_gte is not None and delta_days >= args.warning_gte:
|
||||||
if args.critical_gte is not None and metric >= args.critical_gte:
|
exit_with(1, f"WARNING - {args.label}: {delta_days:.1f} jours")
|
||||||
exit_with(2, f"CRITICAL - {args.label}: {metric:.1f} jours")
|
if args.ok_gte is not None and delta_days >= args.ok_gte:
|
||||||
if args.warning_gte is not None and metric >= args.warning_gte:
|
exit_with(0, f"OK - {args.label}: {delta_days:.1f} jours")
|
||||||
exit_with(1, f"WARNING - {args.label}: {metric:.1f} jours")
|
if args.unknown_lt is not None and delta_days < args.unknown_lt:
|
||||||
if args.ok_gte is not None and metric >= args.ok_gte:
|
exit_with(3, f"UNKNOWN - {args.label}: {delta_days:.1f} jours")
|
||||||
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:
|
except Exception as exc:
|
||||||
if args.on_error == "critical":
|
if args.on_error == "critical":
|
||||||
exit_with(2, f"CRITICAL - erreur sonde: {exc}")
|
exit_with(2, f"CRITICAL - erreur sonde: {exc}")
|
||||||
|
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
renouvellement-permis-conduire:
|
|
||||||
value: "2026-09-20"
|
|
||||||
captured_at: "2026-03-14T23:30:00Z"
|
|
||||||
origin: manual
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
revue-quotidienne-life-noc:
|
|
||||||
value: '2026-03-14'
|
|
||||||
captured_at: '2026-03-14T08:00:00Z'
|
|
||||||
origin: manual
|
|
||||||
revue-hebdomadaire-priorites:
|
|
||||||
value: '2026-03-14'
|
|
||||||
captured_at: '2026-03-14T23:16:41Z'
|
|
||||||
origin: manual
|
|
||||||
|
|
@ -1,315 +0,0 @@
|
||||||
# Life-NOC — Inputs Store Model v1
|
|
||||||
|
|
||||||
## 1. Objet
|
|
||||||
|
|
||||||
Ce document définit le **modèle de stockage des intrants** de Life-NOC.
|
|
||||||
|
|
||||||
L’objectif est de séparer clairement :
|
|
||||||
|
|
||||||
- la **définition** des services, des sondes et des seuils
|
|
||||||
- les **valeurs vivantes** utilisées par les sondes
|
|
||||||
- les **mécanismes d’ingestion** de ces valeurs
|
|
||||||
|
|
||||||
Dans Life-NOC :
|
|
||||||
|
|
||||||
- `domains.yaml` définit les domaines, les items, les seuils, les politiques et le type de sonde
|
|
||||||
- `data/inputs/` contient les **intrants vivants**
|
|
||||||
- les sondes lisent ces intrants pour produire les états Icinga
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 2. Principe général
|
|
||||||
|
|
||||||
La source de vérité des **intrants** ne doit pas être mélangée avec la définition des services.
|
|
||||||
|
|
||||||
### Séparation voulue
|
|
||||||
|
|
||||||
- `domains.yaml` = **configuration**
|
|
||||||
- `data/inputs/*.yaml` = **valeurs**
|
|
||||||
- les interfaces = **moyens d’alimentation**
|
|
||||||
- les sondes = **mécanismes d’évaluation**
|
|
||||||
|
|
||||||
Cela permet :
|
|
||||||
|
|
||||||
- de modifier une valeur sans régénérer toute la définition du système
|
|
||||||
- d’alimenter une sonde par saisie manuelle, MQTT, API ou autre
|
|
||||||
- de garder un dépôt stable même lorsque les valeurs changent
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 3. Convention de structure
|
|
||||||
|
|
||||||
Le modèle standard v1 des intrants est :
|
|
||||||
|
|
||||||
```text
|
|
||||||
data/inputs/<domaine>.yaml
|
|
||||||
````
|
|
||||||
|
|
||||||
Exemples :
|
|
||||||
|
|
||||||
* `data/inputs/revue.yaml`
|
|
||||||
* `data/inputs/voiture.yaml`
|
|
||||||
* `data/inputs/maison.yaml`
|
|
||||||
* `data/inputs/energie.yaml`
|
|
||||||
|
|
||||||
Cette convention est **canonique** pour Life-NOC v1.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 4. Pourquoi un fichier par domaine
|
|
||||||
|
|
||||||
Le domaine constitue la bonne granularité pour les intrants car :
|
|
||||||
|
|
||||||
* il regroupe des items de même nature métier
|
|
||||||
* il tend à partager un profil d’ingestion commun
|
|
||||||
* il facilite la lecture humaine
|
|
||||||
* il permet d’introduire des interfaces cohérentes par domaine
|
|
||||||
|
|
||||||
Le domaine fournit donc le **cadre d’ingestion**.
|
|
||||||
Chaque item garde sa propre source logique à l’intérieur de ce cadre.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 5. Structure d’un fichier d’intrants de domaine
|
|
||||||
|
|
||||||
Chaque fichier `data/inputs/<domaine>.yaml` contient un mapping dont les clés correspondent aux `item_key`.
|
|
||||||
|
|
||||||
Exemple :
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
revue-quotidienne-life-noc:
|
|
||||||
value: "2026-03-14"
|
|
||||||
captured_at: "2026-03-14T08:00:00Z"
|
|
||||||
origin: manual
|
|
||||||
|
|
||||||
revue-hebdomadaire-priorites:
|
|
||||||
value: "2026-03-10"
|
|
||||||
captured_at: "2026-03-14T08:00:00Z"
|
|
||||||
origin: manual
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 6. Champs minimaux v1
|
|
||||||
|
|
||||||
### `value`
|
|
||||||
|
|
||||||
Valeur métier utilisée par la sonde.
|
|
||||||
|
|
||||||
Exemples :
|
|
||||||
|
|
||||||
* date de dernière exécution
|
|
||||||
* compteur
|
|
||||||
* niveau de stock
|
|
||||||
* valeur mesurée
|
|
||||||
|
|
||||||
### `captured_at`
|
|
||||||
|
|
||||||
Horodatage de capture ou de mise à jour de l’intrant.
|
|
||||||
|
|
||||||
Format recommandé :
|
|
||||||
|
|
||||||
* ISO 8601 UTC
|
|
||||||
|
|
||||||
Exemple :
|
|
||||||
|
|
||||||
```text
|
|
||||||
2026-03-14T08:00:00Z
|
|
||||||
```
|
|
||||||
|
|
||||||
### `origin`
|
|
||||||
|
|
||||||
Origine de l’intrant.
|
|
||||||
|
|
||||||
Valeurs typiques :
|
|
||||||
|
|
||||||
* `manual`
|
|
||||||
* `mqtt`
|
|
||||||
* `api`
|
|
||||||
* `derived`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 7. Champs optionnels
|
|
||||||
|
|
||||||
Des champs complémentaires pourront être ajoutés selon les besoins :
|
|
||||||
|
|
||||||
* `unit`
|
|
||||||
* `source_ref`
|
|
||||||
* `notes`
|
|
||||||
* `quality`
|
|
||||||
* `comment`
|
|
||||||
* `updated_by`
|
|
||||||
|
|
||||||
Ils ne font pas partie du noyau minimal v1.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 8. Rôle du domaine et rôle de l’item
|
|
||||||
|
|
||||||
### Le domaine
|
|
||||||
|
|
||||||
Le domaine définit le **cadre général** :
|
|
||||||
|
|
||||||
* structure d’intrants dominante
|
|
||||||
* profil d’ingestion principal
|
|
||||||
* interfaces cohérentes
|
|
||||||
* conventions de stockage
|
|
||||||
|
|
||||||
### L’item
|
|
||||||
|
|
||||||
L’item définit le **cas particulier** :
|
|
||||||
|
|
||||||
* type de sonde
|
|
||||||
* seuils
|
|
||||||
* unité
|
|
||||||
* clé de lookup
|
|
||||||
* paramètres propres
|
|
||||||
|
|
||||||
Autrement dit :
|
|
||||||
|
|
||||||
* le domaine dit **comment on travaille**
|
|
||||||
* l’item dit **quoi on surveille**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 9. Référence entre un item et son intrant
|
|
||||||
|
|
||||||
Un item sondé peut référencer un intrant du store avec :
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
probe:
|
|
||||||
type: elapsed_time
|
|
||||||
source:
|
|
||||||
type: manual_date
|
|
||||||
inputs_file: "/opt/life-noc/data/inputs/revue.yaml"
|
|
||||||
item_key: "revue-hebdomadaire-priorites"
|
|
||||||
```
|
|
||||||
|
|
||||||
La sonde résout alors :
|
|
||||||
|
|
||||||
* `inputs_file` → fichier de domaine
|
|
||||||
* `item_key` → clé à l’intérieur du fichier
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 10. Compatibilité et migration
|
|
||||||
|
|
||||||
Le store des intrants est introduit progressivement.
|
|
||||||
|
|
||||||
### Règle de compatibilité
|
|
||||||
|
|
||||||
Si la sonde reçoit :
|
|
||||||
|
|
||||||
* `inputs_file`
|
|
||||||
* `item_key`
|
|
||||||
|
|
||||||
elle lit le store.
|
|
||||||
|
|
||||||
Sinon, elle peut utiliser une valeur inline fournie dans `domains.yaml`.
|
|
||||||
|
|
||||||
Cela permet une migration sans rupture.
|
|
||||||
|
|
||||||
### Conséquence
|
|
||||||
|
|
||||||
Il n’est pas nécessaire de migrer tous les domaines en même temps.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 11. Portée v1
|
|
||||||
|
|
||||||
### Convention cible
|
|
||||||
|
|
||||||
Tous les domaines Life-NOC sont destinés à utiliser, à terme, cette structure :
|
|
||||||
|
|
||||||
```text
|
|
||||||
data/inputs/<domaine>.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
### Mise en œuvre initiale
|
|
||||||
|
|
||||||
La migration effective commence seulement par les domaines réellement sondés avec la nouvelle méthode.
|
|
||||||
|
|
||||||
En v1, il est recommandé de commencer par :
|
|
||||||
|
|
||||||
* `data/inputs/revue.yaml`
|
|
||||||
|
|
||||||
Les autres domaines seront migrés progressivement, au fur et à mesure de l’introduction de vraies sondes.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 12. Pourquoi ne pas tout migrer d’un coup
|
|
||||||
|
|
||||||
Une migration brutale de tous les domaines augmenterait le risque de régression et compliquerait inutilement le dépôt.
|
|
||||||
|
|
||||||
Le modèle retenu privilégie :
|
|
||||||
|
|
||||||
* une convention unique
|
|
||||||
* une adoption graduelle
|
|
||||||
* une compatibilité arrière
|
|
||||||
* une progression domaine par domaine
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 13. Interfaces d’alimentation possibles
|
|
||||||
|
|
||||||
Les intrants stockés dans `data/inputs/*.yaml` peuvent provenir de différentes interfaces :
|
|
||||||
|
|
||||||
* édition manuelle
|
|
||||||
* script CLI
|
|
||||||
* interface web
|
|
||||||
* API
|
|
||||||
* ingestion MQTT
|
|
||||||
* calcul dérivé
|
|
||||||
|
|
||||||
Le store d’intrants constitue la **couche commune de persistance**, indépendamment du mode d’ingestion.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 14. Positionnement architectural
|
|
||||||
|
|
||||||
Le modèle de store d’intrants s’inscrit dans l’architecture Life-NOC suivante :
|
|
||||||
|
|
||||||
1. **définition**
|
|
||||||
|
|
||||||
* `domains.yaml`
|
|
||||||
* types de sondes
|
|
||||||
* seuils
|
|
||||||
* politiques
|
|
||||||
|
|
||||||
2. **ingestion**
|
|
||||||
|
|
||||||
* GUI
|
|
||||||
* API
|
|
||||||
* MQTT
|
|
||||||
* scripts
|
|
||||||
|
|
||||||
3. **persistance**
|
|
||||||
|
|
||||||
* `data/inputs/<domaine>.yaml`
|
|
||||||
|
|
||||||
4. **évaluation**
|
|
||||||
|
|
||||||
* sondes
|
|
||||||
* calcul de métrique
|
|
||||||
* états Icinga
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 15. Conclusion
|
|
||||||
|
|
||||||
Le répertoire `data/inputs/` devient le modèle canonique de stockage des intrants Life-NOC.
|
|
||||||
|
|
||||||
Le format standard v1 est :
|
|
||||||
|
|
||||||
```text
|
|
||||||
data/inputs/<domaine>.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
Cette convention permet :
|
|
||||||
|
|
||||||
* une séparation claire entre définition et valeurs
|
|
||||||
* une gestion cohérente domaine par domaine
|
|
||||||
* une migration graduelle
|
|
||||||
* une intégration future avec GUI, API et MQTT
|
|
||||||
|
|
||||||
|
|
@ -1,711 +0,0 @@
|
||||||
# Life-NOC — Modèle des sondes et des intrants v1
|
|
||||||
|
|
||||||
## 1. Objet
|
|
||||||
|
|
||||||
Ce document définit le **modèle canonique des sondes** et le **modèle de gestion des intrants** de Life-NOC.
|
|
||||||
|
|
||||||
L’objectif est de séparer clairement :
|
|
||||||
|
|
||||||
- la **définition** des services, des sondes et des seuils
|
|
||||||
- les **intrants vivants** utilisés par les sondes
|
|
||||||
- les **mécanismes d’ingestion** de ces intrants
|
|
||||||
- la **traduction en états Life-NOC**
|
|
||||||
|
|
||||||
Ce modèle doit permettre :
|
|
||||||
|
|
||||||
- de faire coexister des suivis encore **mockés** et des suivis **réels**
|
|
||||||
- d’introduire progressivement des sondes réelles sans casser l’existant
|
|
||||||
- d’unifier les méthodes d’évaluation par grandes familles de suivis
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 2. Principes de design
|
|
||||||
|
|
||||||
### 2.1 Stabilité d’abord
|
|
||||||
|
|
||||||
Le dépôt existant doit rester fonctionnel et déployable pendant toute l’introduction des sondes réelles.
|
|
||||||
|
|
||||||
Aucune migration brutale ne doit être exigée.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 2.2 Une sonde par nature de calcul, pas par item
|
|
||||||
|
|
||||||
Les services Life-NOC ne doivent pas reposer sur une multitude de scripts ad hoc.
|
|
||||||
|
|
||||||
Ils doivent être des **instances paramétrées** d’un petit nombre de types de sondes génériques.
|
|
||||||
|
|
||||||
Autrement dit :
|
|
||||||
|
|
||||||
- un item décrit **quoi mesurer**
|
|
||||||
- la sonde décrit **comment l’évaluer**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 2.3 Les sources de données sont multiples
|
|
||||||
|
|
||||||
Life-NOC doit pouvoir recevoir des données à partir de plusieurs mécanismes :
|
|
||||||
|
|
||||||
- saisie manuelle
|
|
||||||
- MQTT
|
|
||||||
- fichiers
|
|
||||||
- API
|
|
||||||
- commandes locales
|
|
||||||
- valeurs dérivées
|
|
||||||
|
|
||||||
MQTT est un **mécanisme de transport**, pas une mémoire durable.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 2.4 L’ambiguïté technique est critique
|
|
||||||
|
|
||||||
Dans Life-NOC, l’impossibilité de conclure techniquement ne doit pas être interprétée comme un état neutre.
|
|
||||||
|
|
||||||
Une erreur de lecture, de parsing ou d’accès à la donnée doit produire un état **CRITICAL**, afin de forcer la correction de la sonde ou de sa source.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 3. Sémantique des états Life-NOC
|
|
||||||
|
|
||||||
Life-NOC utilise la sémantique suivante :
|
|
||||||
|
|
||||||
- **UNKNOWN** : pas encore dû, pas encore à faire
|
|
||||||
- **OK** : actionnable maintenant
|
|
||||||
- **WARNING** : il faut se presser
|
|
||||||
- **CRITICAL** : en retard, anormal, ou impossible à évaluer
|
|
||||||
|
|
||||||
Cette convention diffère volontairement de l’usage classique de Nagios/Icinga.
|
|
||||||
|
|
||||||
Dans Life-NOC :
|
|
||||||
|
|
||||||
- le vert n’exprime pas l’absence de travail
|
|
||||||
- il exprime le **bon moment pour agir**
|
|
||||||
- le gris `UNKNOWN` signifie que l’item n’est pas encore dans sa fenêtre d’action
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 4. Taxonomie des sondes v1
|
|
||||||
|
|
||||||
Le modèle conceptuel v1 couvre cinq types de sondes.
|
|
||||||
|
|
||||||
### 4.1 `elapsed_time`
|
|
||||||
|
|
||||||
Mesure le **temps écoulé** depuis un événement ou une exécution précédente.
|
|
||||||
|
|
||||||
#### Exemples
|
|
||||||
- revue quotidienne
|
|
||||||
- revue hebdomadaire
|
|
||||||
- inspection trimestrielle
|
|
||||||
- test détecteurs
|
|
||||||
- vérification sauvegardes
|
|
||||||
|
|
||||||
#### Donnée de base
|
|
||||||
- date de dernière exécution
|
|
||||||
|
|
||||||
#### Métrique typique
|
|
||||||
- jours écoulés
|
|
||||||
|
|
||||||
#### Logique générale
|
|
||||||
Plus le temps écoulé augmente, plus l’item devient dû.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 4.2 `elapsed_distance`
|
|
||||||
|
|
||||||
Mesure une **distance écoulée** depuis un événement passé.
|
|
||||||
|
|
||||||
#### Exemples
|
|
||||||
- kilométrage depuis vidange
|
|
||||||
- kilométrage depuis entretien pneus
|
|
||||||
- kilométrage depuis vérification freins
|
|
||||||
- kilomètres depuis changement de courroie
|
|
||||||
|
|
||||||
#### Données de base
|
|
||||||
- compteur courant
|
|
||||||
- compteur lors de la dernière exécution
|
|
||||||
|
|
||||||
#### Métrique typique
|
|
||||||
- kilomètres écoulés
|
|
||||||
|
|
||||||
#### Logique générale
|
|
||||||
Plus la distance écoulée augmente, plus l’item devient dû.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 4.3 `current_value`
|
|
||||||
|
|
||||||
Mesure une **valeur instantanée** comparée à des seuils.
|
|
||||||
|
|
||||||
#### Exemples
|
|
||||||
- tension batterie
|
|
||||||
- température
|
|
||||||
- humidité
|
|
||||||
- espace disque libre
|
|
||||||
- charge électrique
|
|
||||||
- niveau de tension
|
|
||||||
|
|
||||||
#### Donnée de base
|
|
||||||
- valeur actuelle observée
|
|
||||||
|
|
||||||
#### Métriques typiques
|
|
||||||
- volts
|
|
||||||
- pourcentage
|
|
||||||
- degrés
|
|
||||||
- gigaoctets
|
|
||||||
- watts
|
|
||||||
|
|
||||||
#### Logique générale
|
|
||||||
L’état dépend d’un positionnement par rapport à un ou plusieurs seuils.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 4.4 `remaining_quantity`
|
|
||||||
|
|
||||||
Mesure ce qu’il **reste** d’un stock, d’une réserve ou d’une autonomie.
|
|
||||||
|
|
||||||
#### Exemples
|
|
||||||
- nourriture chats restante
|
|
||||||
- réserve d’eau
|
|
||||||
- vitamines restantes
|
|
||||||
- carburant restant
|
|
||||||
- consommables
|
|
||||||
|
|
||||||
#### Donnée de base
|
|
||||||
- quantité restante
|
|
||||||
|
|
||||||
#### Métriques typiques
|
|
||||||
- jours d’autonomie
|
|
||||||
- litres
|
|
||||||
- unités
|
|
||||||
- kilogrammes
|
|
||||||
- pourcentage
|
|
||||||
|
|
||||||
#### Logique générale
|
|
||||||
Plus la quantité restante diminue, plus l’item devient critique.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 4.5 `days_until_due`
|
|
||||||
|
|
||||||
Mesure le **temps restant avant une échéance fixe**.
|
|
||||||
|
|
||||||
#### Exemples
|
|
||||||
- permis de conduire
|
|
||||||
- carte d’assurance maladie
|
|
||||||
- passeport
|
|
||||||
- assurances
|
|
||||||
- échéance fiscale
|
|
||||||
- rendez-vous
|
|
||||||
|
|
||||||
#### Donnée de base
|
|
||||||
- date d’échéance
|
|
||||||
|
|
||||||
#### Métrique typique
|
|
||||||
- jours restants
|
|
||||||
|
|
||||||
#### Logique générale
|
|
||||||
Plus on approche de la date, plus l’item entre dans la fenêtre d’action, puis dans l’urgence.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 5. Sources de données
|
|
||||||
|
|
||||||
Le modèle distingue le **type de sonde** de la **source de données**.
|
|
||||||
|
|
||||||
### 5.1 Sources conceptuellement prévues
|
|
||||||
|
|
||||||
- `manual_date`
|
|
||||||
- `manual_counter`
|
|
||||||
- `manual_value`
|
|
||||||
- `mqtt`
|
|
||||||
- `file_json`
|
|
||||||
- `file_text`
|
|
||||||
- `csv`
|
|
||||||
- `api`
|
|
||||||
- `command`
|
|
||||||
- `derived`
|
|
||||||
|
|
||||||
### 5.2 Sources v1 à faible risque
|
|
||||||
|
|
||||||
Pour l’implémentation initiale, seules les sources suivantes sont retenues :
|
|
||||||
|
|
||||||
- `manual_date`
|
|
||||||
|
|
||||||
Les autres sources sont **réservées** au modèle, mais non implémentées dans la première tranche.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 6. Schéma canonique d’un item
|
|
||||||
|
|
||||||
Chaque item peut, à terme, porter une description de sonde structurée.
|
|
||||||
|
|
||||||
Exemple canonique :
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
probe:
|
|
||||||
type: elapsed_time
|
|
||||||
source:
|
|
||||||
type: manual_date
|
|
||||||
value: "2026-03-10"
|
|
||||||
metric:
|
|
||||||
unit: days
|
|
||||||
thresholds:
|
|
||||||
unknown_lt: 5
|
|
||||||
ok_gte: 5
|
|
||||||
warning_gte: 7
|
|
||||||
critical_gte: 10
|
|
||||||
policy:
|
|
||||||
on_error: critical
|
|
||||||
````
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 7. Règles générales de seuils
|
|
||||||
|
|
||||||
### 7.1 Cas où la métrique augmente avec l’urgence
|
|
||||||
|
|
||||||
Exemples :
|
|
||||||
|
|
||||||
* jours écoulés
|
|
||||||
* kilomètres écoulés
|
|
||||||
|
|
||||||
Ordre d’évaluation recommandé :
|
|
||||||
|
|
||||||
1. `critical_gte`
|
|
||||||
2. `warning_gte`
|
|
||||||
3. `ok_gte`
|
|
||||||
4. sinon `unknown`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 7.2 Cas où la métrique diminue avec la gravité
|
|
||||||
|
|
||||||
Exemples :
|
|
||||||
|
|
||||||
* quantité restante
|
|
||||||
* tension minimale
|
|
||||||
* autonomie restante
|
|
||||||
|
|
||||||
Ordre d’évaluation recommandé :
|
|
||||||
|
|
||||||
1. `critical_lt`
|
|
||||||
2. `warning_lt`
|
|
||||||
3. `ok_gte`
|
|
||||||
4. sinon `unknown`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 7.3 Cas où la métrique est une échéance future
|
|
||||||
|
|
||||||
Exemples :
|
|
||||||
|
|
||||||
* jours avant expiration
|
|
||||||
* jours avant rendez-vous
|
|
||||||
* jours avant renouvellement
|
|
||||||
|
|
||||||
Ordre d’évaluation recommandé :
|
|
||||||
|
|
||||||
1. `critical_lt`
|
|
||||||
2. `warning_lt`
|
|
||||||
3. `ok_lt`
|
|
||||||
4. sinon `unknown`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 8. Politique d’erreur
|
|
||||||
|
|
||||||
La politique d’erreur par défaut de Life-NOC est :
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
policy:
|
|
||||||
on_error: critical
|
|
||||||
```
|
|
||||||
|
|
||||||
Cela signifie que les situations suivantes doivent produire `CRITICAL` :
|
|
||||||
|
|
||||||
* donnée absente
|
|
||||||
* donnée invalide
|
|
||||||
* parsing impossible
|
|
||||||
* source inaccessible
|
|
||||||
* seuils incohérents
|
|
||||||
* type de sonde non supporté
|
|
||||||
* unité non supportée
|
|
||||||
* configuration incomplète
|
|
||||||
|
|
||||||
Cette règle vise à éviter que des erreurs techniques demeurent invisibles.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 9. Modèle de stockage des intrants
|
|
||||||
|
|
||||||
La source de vérité des **intrants** ne doit pas être mélangée avec la définition des services.
|
|
||||||
|
|
||||||
### Séparation voulue
|
|
||||||
|
|
||||||
* `domains.yaml` = **configuration**
|
|
||||||
* `data/inputs/*.yaml` = **valeurs**
|
|
||||||
* les interfaces = **moyens d’alimentation**
|
|
||||||
* les sondes = **mécanismes d’évaluation**
|
|
||||||
|
|
||||||
Cela permet :
|
|
||||||
|
|
||||||
* de modifier une valeur sans régénérer toute la définition du système
|
|
||||||
* d’alimenter une sonde par saisie manuelle, MQTT, API ou autre
|
|
||||||
* de garder un dépôt stable même lorsque les valeurs changent
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 10. Convention de structure du store
|
|
||||||
|
|
||||||
Le modèle standard v1 des intrants est :
|
|
||||||
|
|
||||||
```text
|
|
||||||
data/inputs/<domaine>.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
Exemples :
|
|
||||||
|
|
||||||
* `data/inputs/revue.yaml`
|
|
||||||
* `data/inputs/voiture.yaml`
|
|
||||||
* `data/inputs/maison.yaml`
|
|
||||||
* `data/inputs/energie.yaml`
|
|
||||||
|
|
||||||
Cette convention est **canonique** pour Life-NOC v1.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 11. Pourquoi un fichier par domaine
|
|
||||||
|
|
||||||
Le domaine constitue la bonne granularité pour les intrants car :
|
|
||||||
|
|
||||||
* il regroupe des items de même nature métier
|
|
||||||
* il tend à partager un profil d’ingestion commun
|
|
||||||
* il facilite la lecture humaine
|
|
||||||
* il permet d’introduire des interfaces cohérentes par domaine
|
|
||||||
|
|
||||||
Le domaine fournit donc le **cadre d’ingestion**.
|
|
||||||
Chaque item garde sa propre source logique à l’intérieur de ce cadre.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 12. Structure d’un fichier d’intrants de domaine
|
|
||||||
|
|
||||||
Chaque fichier `data/inputs/<domaine>.yaml` contient un mapping dont les clés correspondent aux `item_key`.
|
|
||||||
|
|
||||||
Exemple :
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
revue-quotidienne-life-noc:
|
|
||||||
value: "2026-03-14"
|
|
||||||
captured_at: "2026-03-14T08:00:00Z"
|
|
||||||
origin: manual
|
|
||||||
|
|
||||||
revue-hebdomadaire-priorites:
|
|
||||||
value: "2026-03-10"
|
|
||||||
captured_at: "2026-03-14T08:00:00Z"
|
|
||||||
origin: manual
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 13. Champs minimaux v1 du store
|
|
||||||
|
|
||||||
### `value`
|
|
||||||
|
|
||||||
Valeur métier utilisée par la sonde.
|
|
||||||
|
|
||||||
Exemples :
|
|
||||||
|
|
||||||
* date de dernière exécution
|
|
||||||
* compteur
|
|
||||||
* niveau de stock
|
|
||||||
* valeur mesurée
|
|
||||||
|
|
||||||
### `captured_at`
|
|
||||||
|
|
||||||
Horodatage de capture ou de mise à jour de l’intrant.
|
|
||||||
|
|
||||||
Format recommandé :
|
|
||||||
|
|
||||||
* ISO 8601 UTC
|
|
||||||
|
|
||||||
Exemple :
|
|
||||||
|
|
||||||
```text
|
|
||||||
2026-03-14T08:00:00Z
|
|
||||||
```
|
|
||||||
|
|
||||||
### `origin`
|
|
||||||
|
|
||||||
Origine de l’intrant.
|
|
||||||
|
|
||||||
Valeurs typiques :
|
|
||||||
|
|
||||||
* `manual`
|
|
||||||
* `mqtt`
|
|
||||||
* `api`
|
|
||||||
* `derived`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 14. Champs optionnels du store
|
|
||||||
|
|
||||||
Des champs complémentaires pourront être ajoutés selon les besoins :
|
|
||||||
|
|
||||||
* `unit`
|
|
||||||
* `source_ref`
|
|
||||||
* `notes`
|
|
||||||
* `quality`
|
|
||||||
* `comment`
|
|
||||||
* `updated_by`
|
|
||||||
|
|
||||||
Ils ne font pas partie du noyau minimal v1.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 15. Rôle du domaine et rôle de l’item
|
|
||||||
|
|
||||||
### Le domaine
|
|
||||||
|
|
||||||
Le domaine définit le **cadre général** :
|
|
||||||
|
|
||||||
* structure d’intrants dominante
|
|
||||||
* profil d’ingestion principal
|
|
||||||
* interfaces cohérentes
|
|
||||||
* conventions de stockage
|
|
||||||
|
|
||||||
### L’item
|
|
||||||
|
|
||||||
L’item définit le **cas particulier** :
|
|
||||||
|
|
||||||
* type de sonde
|
|
||||||
* seuils
|
|
||||||
* unité
|
|
||||||
* clé de lookup
|
|
||||||
* paramètres propres
|
|
||||||
|
|
||||||
Autrement dit :
|
|
||||||
|
|
||||||
* le domaine dit **comment on travaille**
|
|
||||||
* l’item dit **quoi on surveille**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 16. Référence entre un item et son intrant
|
|
||||||
|
|
||||||
Un item sondé peut référencer un intrant du store avec :
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
probe:
|
|
||||||
type: elapsed_time
|
|
||||||
source:
|
|
||||||
type: manual_date
|
|
||||||
inputs_file: "/opt/life-noc/data/inputs/revue.yaml"
|
|
||||||
item_key: "revue-hebdomadaire-priorites"
|
|
||||||
```
|
|
||||||
|
|
||||||
La sonde résout alors :
|
|
||||||
|
|
||||||
* `inputs_file` → fichier de domaine
|
|
||||||
* `item_key` → clé à l’intérieur du fichier
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 17. Compatibilité et migration
|
|
||||||
|
|
||||||
Le store des intrants est introduit progressivement.
|
|
||||||
|
|
||||||
### Règle de compatibilité
|
|
||||||
|
|
||||||
Si la sonde reçoit :
|
|
||||||
|
|
||||||
* `inputs_file`
|
|
||||||
* `item_key`
|
|
||||||
|
|
||||||
elle lit le store.
|
|
||||||
|
|
||||||
Sinon, elle peut utiliser une valeur inline fournie dans `domains.yaml`.
|
|
||||||
|
|
||||||
Cela permet une migration sans rupture.
|
|
||||||
|
|
||||||
### Conséquence
|
|
||||||
|
|
||||||
Il n’est pas nécessaire de migrer tous les domaines en même temps.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 18. Portée v1
|
|
||||||
|
|
||||||
### Convention cible
|
|
||||||
|
|
||||||
Tous les domaines Life-NOC sont destinés à utiliser, à terme, cette structure :
|
|
||||||
|
|
||||||
```text
|
|
||||||
data/inputs/<domaine>.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
### Mise en œuvre initiale
|
|
||||||
|
|
||||||
La migration effective commence seulement par les domaines réellement sondés avec la nouvelle méthode.
|
|
||||||
|
|
||||||
En v1, il est recommandé de commencer par :
|
|
||||||
|
|
||||||
* `data/inputs/revue.yaml`
|
|
||||||
|
|
||||||
Les autres domaines seront migrés progressivement, au fur et à mesure de l’introduction de vraies sondes.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 19. Pourquoi ne pas tout migrer d’un coup
|
|
||||||
|
|
||||||
Une migration brutale de tous les domaines augmenterait le risque de régression et compliquerait inutilement le dépôt.
|
|
||||||
|
|
||||||
Le modèle retenu privilégie :
|
|
||||||
|
|
||||||
* une convention unique
|
|
||||||
* une adoption graduelle
|
|
||||||
* une compatibilité arrière
|
|
||||||
* une progression domaine par domaine
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 20. Interfaces d’alimentation possibles
|
|
||||||
|
|
||||||
Les intrants stockés dans `data/inputs/*.yaml` peuvent provenir de différentes interfaces :
|
|
||||||
|
|
||||||
* édition manuelle
|
|
||||||
* script CLI
|
|
||||||
* interface web
|
|
||||||
* API
|
|
||||||
* ingestion MQTT
|
|
||||||
* calcul dérivé
|
|
||||||
|
|
||||||
Le store d’intrants constitue la **couche commune de persistance**, indépendamment du mode d’ingestion.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 21. Positionnement architectural
|
|
||||||
|
|
||||||
Le modèle des sondes et des intrants s’inscrit dans l’architecture Life-NOC suivante :
|
|
||||||
|
|
||||||
1. **définition**
|
|
||||||
|
|
||||||
* `domains.yaml`
|
|
||||||
* types de sondes
|
|
||||||
* seuils
|
|
||||||
* politiques
|
|
||||||
|
|
||||||
2. **ingestion**
|
|
||||||
|
|
||||||
* GUI
|
|
||||||
* API
|
|
||||||
* MQTT
|
|
||||||
* scripts
|
|
||||||
|
|
||||||
3. **persistance**
|
|
||||||
|
|
||||||
* `data/inputs/<domaine>.yaml`
|
|
||||||
|
|
||||||
4. **évaluation**
|
|
||||||
|
|
||||||
* sondes
|
|
||||||
* calcul de métrique
|
|
||||||
* états Icinga
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 22. Coexistence avec le modèle mocké
|
|
||||||
|
|
||||||
Le dépôt actuel repose sur une preuve de concept initialement mockée.
|
|
||||||
|
|
||||||
L’introduction du modèle de sonde ne doit pas casser cette base.
|
|
||||||
|
|
||||||
### Règle de compatibilité
|
|
||||||
|
|
||||||
* si un item **ne définit pas** de bloc `probe`, il continue de fonctionner selon la logique mock existante
|
|
||||||
* si un item **définit** un bloc `probe`, il peut être pris en charge par la nouvelle sonde générique, selon les types réellement supportés par le moteur
|
|
||||||
|
|
||||||
Cette compatibilité permet une migration progressive, item par item.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 23. Portée de l’implémentation initiale
|
|
||||||
|
|
||||||
Le **modèle conceptuel v1** couvre cinq types de sondes.
|
|
||||||
|
|
||||||
Cependant, afin de préserver la stabilité du dépôt, l’**implémentation initiale** est volontairement limitée à :
|
|
||||||
|
|
||||||
* `probe.type = elapsed_time`
|
|
||||||
* `source.type = manual_date`
|
|
||||||
* `metric.unit = days`
|
|
||||||
|
|
||||||
Tous les autres types restent **documentés mais non encore codés**.
|
|
||||||
|
|
||||||
Cette décision est volontaire. Elle permet :
|
|
||||||
|
|
||||||
* de garder le dépôt stable
|
|
||||||
* de valider la mécanique sur un seul cas simple
|
|
||||||
* de faciliter le débogage
|
|
||||||
* de réduire le risque de régression
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 24. Exemple complet
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
revue:
|
|
||||||
- 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
|
|
||||||
```
|
|
||||||
|
|
||||||
Et dans le store :
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
revue-hebdomadaire-priorites:
|
|
||||||
value: "2026-03-10"
|
|
||||||
captured_at: "2026-03-14T08:00:00Z"
|
|
||||||
origin: manual
|
|
||||||
```
|
|
||||||
|
|
||||||
Interprétation :
|
|
||||||
|
|
||||||
* moins de 5 jours depuis la dernière revue : `UNKNOWN`
|
|
||||||
* à partir de 5 jours : `OK`
|
|
||||||
* à partir de 7 jours : `WARNING`
|
|
||||||
* à partir de 10 jours : `CRITICAL`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 25. Conclusion
|
|
||||||
|
|
||||||
Life-NOC dispose maintenant d’un cadre unifié pour :
|
|
||||||
|
|
||||||
* définir les types de sondes
|
|
||||||
* structurer les seuils
|
|
||||||
* normaliser les intrants
|
|
||||||
* séparer configuration et valeurs
|
|
||||||
* préparer l’intégration future avec GUI, API et MQTT
|
|
||||||
|
|
||||||
Le modèle standard v1 repose sur :
|
|
||||||
|
|
||||||
* une taxonomie de cinq types de sondes
|
|
||||||
* une convention de store d’intrants par domaine
|
|
||||||
* une migration progressive, compatible avec l’existant
|
|
||||||
|
|
||||||
1319
domains.yaml
1319
domains.yaml
File diff suppressed because it is too large
Load diff
|
|
@ -5,22 +5,11 @@ object CheckCommand "check_life_noc_probe" {
|
||||||
"--probe-type" = "$life_noc_probe_type$"
|
"--probe-type" = "$life_noc_probe_type$"
|
||||||
"--source-type" = "$life_noc_source_type$"
|
"--source-type" = "$life_noc_source_type$"
|
||||||
"--source-value" = "$life_noc_source_value$"
|
"--source-value" = "$life_noc_source_value$"
|
||||||
"--inputs-file" = "$life_noc_inputs_file$"
|
|
||||||
"--item-key" = "$life_noc_item_key$"
|
|
||||||
"--unit" = "$life_noc_metric_unit$"
|
"--unit" = "$life_noc_metric_unit$"
|
||||||
|
|
||||||
"--unknown-lt" = "$life_noc_threshold_unknown_lt$"
|
"--unknown-lt" = "$life_noc_threshold_unknown_lt$"
|
||||||
"--unknown-gte" = "$life_noc_threshold_unknown_gte$"
|
|
||||||
|
|
||||||
"--ok-gte" = "$life_noc_threshold_ok_gte$"
|
"--ok-gte" = "$life_noc_threshold_ok_gte$"
|
||||||
"--ok-lt" = "$life_noc_threshold_ok_lt$"
|
|
||||||
|
|
||||||
"--warning-gte" = "$life_noc_threshold_warning_gte$"
|
"--warning-gte" = "$life_noc_threshold_warning_gte$"
|
||||||
"--warning-lt" = "$life_noc_threshold_warning_lt$"
|
|
||||||
|
|
||||||
"--critical-gte" = "$life_noc_threshold_critical_gte$"
|
"--critical-gte" = "$life_noc_threshold_critical_gte$"
|
||||||
"--critical-lt" = "$life_noc_threshold_critical_lt$"
|
|
||||||
|
|
||||||
"--on-error" = "$life_noc_on_error$"
|
"--on-error" = "$life_noc_on_error$"
|
||||||
"--label" = "$life_noc_label$"
|
"--label" = "$life_noc_label$"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -45,21 +45,12 @@ apply Service "obligations-legales-personnelles-verification-papiers-identite" {
|
||||||
}
|
}
|
||||||
|
|
||||||
apply Service "obligations-legales-personnelles-renouvellement-permis-conduire" {
|
apply Service "obligations-legales-personnelles-renouvellement-permis-conduire" {
|
||||||
import "service_life_noc_probe"
|
import "service_echeance"
|
||||||
vars.life_noc_probe_type = "days_until_due"
|
vars.date_echeance = "2027-01-01"
|
||||||
vars.life_noc_source_type = "manual_date"
|
vars.mock_state = "OK"
|
||||||
vars.life_noc_source_value = ""
|
vars.mock_message = "Sous contrôle"
|
||||||
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" ]
|
groups = [ "OBLIGATIONS-LEGALES-PERSONNELLES" ]
|
||||||
vars.life_noc_threshold_unknown_gte = "90"
|
notes = "Vérifier le renouvellement du permis de conduire"
|
||||||
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"
|
assign where host.name == "life-noc"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,7 @@ apply Service "revue-revue-quotidienne-life-noc" {
|
||||||
import "service_life_noc_probe"
|
import "service_life_noc_probe"
|
||||||
vars.life_noc_probe_type = "elapsed_time"
|
vars.life_noc_probe_type = "elapsed_time"
|
||||||
vars.life_noc_source_type = "manual_date"
|
vars.life_noc_source_type = "manual_date"
|
||||||
vars.life_noc_source_value = ""
|
vars.life_noc_source_value = "2026-03-13"
|
||||||
vars.life_noc_inputs_file = "/opt/life-noc/data/inputs/revue.yaml"
|
|
||||||
vars.life_noc_item_key = "revue-quotidienne-life-noc"
|
|
||||||
vars.life_noc_metric_unit = "days"
|
vars.life_noc_metric_unit = "days"
|
||||||
vars.life_noc_label = "revue-quotidienne-life-noc"
|
vars.life_noc_label = "revue-quotidienne-life-noc"
|
||||||
groups = [ "REVUE" ]
|
groups = [ "REVUE" ]
|
||||||
|
|
@ -27,9 +25,7 @@ apply Service "revue-revue-hebdomadaire-priorites" {
|
||||||
import "service_life_noc_probe"
|
import "service_life_noc_probe"
|
||||||
vars.life_noc_probe_type = "elapsed_time"
|
vars.life_noc_probe_type = "elapsed_time"
|
||||||
vars.life_noc_source_type = "manual_date"
|
vars.life_noc_source_type = "manual_date"
|
||||||
vars.life_noc_source_value = ""
|
vars.life_noc_source_value = "2026-03-10"
|
||||||
vars.life_noc_inputs_file = "/opt/life-noc/data/inputs/revue.yaml"
|
|
||||||
vars.life_noc_item_key = "revue-hebdomadaire-priorites"
|
|
||||||
vars.life_noc_metric_unit = "days"
|
vars.life_noc_metric_unit = "days"
|
||||||
vars.life_noc_label = "revue-hebdomadaire-priorites"
|
vars.life_noc_label = "revue-hebdomadaire-priorites"
|
||||||
groups = [ "REVUE" ]
|
groups = [ "REVUE" ]
|
||||||
|
|
|
||||||
|
|
@ -1,70 +0,0 @@
|
||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
from datetime import datetime, timezone
|
|
||||||
from pathlib import Path
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
INPUTS_DIR = Path("data/inputs")
|
|
||||||
|
|
||||||
|
|
||||||
def utc_now_iso() -> str:
|
|
||||||
return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
||||||
|
|
||||||
|
|
||||||
def utc_today_date() -> str:
|
|
||||||
return datetime.now(timezone.utc).strftime("%Y-%m-%d")
|
|
||||||
|
|
||||||
|
|
||||||
def domain_file(domain: str) -> Path:
|
|
||||||
return INPUTS_DIR / f"{domain}.yaml"
|
|
||||||
|
|
||||||
|
|
||||||
def load_domain(domain: str) -> dict:
|
|
||||||
path = domain_file(domain)
|
|
||||||
if not path.exists():
|
|
||||||
return {}
|
|
||||||
data = yaml.safe_load(path.read_text(encoding="utf-8"))
|
|
||||||
if data is None:
|
|
||||||
return {}
|
|
||||||
if not isinstance(data, dict):
|
|
||||||
raise ValueError(f"Fichier invalide: {path}")
|
|
||||||
return data
|
|
||||||
|
|
||||||
|
|
||||||
def save_domain(domain: str, data: dict) -> Path:
|
|
||||||
path = domain_file(domain)
|
|
||||||
path.parent.mkdir(parents=True, exist_ok=True)
|
|
||||||
path.write_text(
|
|
||||||
yaml.safe_dump(data, sort_keys=False, allow_unicode=True),
|
|
||||||
encoding="utf-8",
|
|
||||||
)
|
|
||||||
return path
|
|
||||||
|
|
||||||
|
|
||||||
def list_items(domain: str) -> list[str]:
|
|
||||||
return list(load_domain(domain).keys())
|
|
||||||
|
|
||||||
|
|
||||||
def get_item(domain: str, item_key: str) -> dict:
|
|
||||||
data = load_domain(domain)
|
|
||||||
if item_key not in data:
|
|
||||||
raise KeyError(item_key)
|
|
||||||
item = data[item_key]
|
|
||||||
if not isinstance(item, dict):
|
|
||||||
raise ValueError(f"Entrée invalide pour {item_key}")
|
|
||||||
return item
|
|
||||||
|
|
||||||
|
|
||||||
def set_item(domain: str, item_key: str, value: str, origin: str = "manual") -> dict:
|
|
||||||
data = load_domain(domain)
|
|
||||||
data[item_key] = {
|
|
||||||
"value": value,
|
|
||||||
"captured_at": utc_now_iso(),
|
|
||||||
"origin": origin,
|
|
||||||
}
|
|
||||||
save_domain(domain, data)
|
|
||||||
return data[item_key]
|
|
||||||
|
|
||||||
|
|
||||||
def complete_item(domain: str, item_key: str, origin: str = "manual") -> dict:
|
|
||||||
return set_item(domain, item_key, utc_today_date(), origin=origin)
|
|
||||||
|
|
@ -1,283 +0,0 @@
|
||||||
#!/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"
|
|
||||||
|
|
@ -1,145 +0,0 @@
|
||||||
#!/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"
|
|
||||||
|
|
@ -1,161 +0,0 @@
|
||||||
#!/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"
|
|
||||||
|
|
@ -128,9 +128,7 @@ def render_probe_service(domain: str, group_name: str, item: dict) -> str:
|
||||||
f' import "{PROBE_TEMPLATE}"',
|
f' import "{PROBE_TEMPLATE}"',
|
||||||
f' vars.life_noc_probe_type = "{icinga_escape(probe_type)}"',
|
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_type = "{icinga_escape(str(source["type"]).strip())}"',
|
||||||
f' vars.life_noc_source_value = "{icinga_escape(str(source.get("value", "")).strip())}"',
|
f' vars.life_noc_source_value = "{icinga_escape(str(source["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_metric_unit = "{icinga_escape(str(metric["unit"]).strip())}"',
|
||||||
f' vars.life_noc_label = "{icinga_escape(name)}"',
|
f' vars.life_noc_label = "{icinga_escape(name)}"',
|
||||||
f' groups = [ "{icinga_escape(group_name)}" ]',
|
f' groups = [ "{icinga_escape(group_name)}" ]',
|
||||||
|
|
@ -144,14 +142,6 @@ 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"]))}"')
|
lines.append(f' vars.life_noc_threshold_warning_gte = "{icinga_escape(str(thresholds["warning_gte"]))}"')
|
||||||
if "critical_gte" in thresholds:
|
if "critical_gte" in thresholds:
|
||||||
lines.append(f' vars.life_noc_threshold_critical_gte = "{icinga_escape(str(thresholds["critical_gte"]))}"')
|
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()
|
on_error = str(policy.get("on_error", "critical")).strip()
|
||||||
lines.append(f' vars.life_noc_on_error = "{icinga_escape(on_error)}"')
|
lines.append(f' vars.life_noc_on_error = "{icinga_escape(on_error)}"')
|
||||||
|
|
@ -175,21 +165,16 @@ def validate_probe(item: dict) -> None:
|
||||||
if not isinstance(probe, dict):
|
if not isinstance(probe, dict):
|
||||||
raise ValueError("probe doit être un objet")
|
raise ValueError("probe doit être un objet")
|
||||||
|
|
||||||
probe_type = str(probe.get("type", "")).strip()
|
if str(probe.get("type", "")).strip() != "elapsed_time":
|
||||||
if probe_type not in {"elapsed_time", "days_until_due"}:
|
raise ValueError("seul probe.type=elapsed_time est supporté en v1")
|
||||||
raise ValueError("seuls probe.type=elapsed_time et days_until_due sont supportés")
|
|
||||||
|
|
||||||
source = probe.get("source")
|
source = probe.get("source")
|
||||||
if not isinstance(source, dict):
|
if not isinstance(source, dict):
|
||||||
raise ValueError("probe.source doit être un objet")
|
raise ValueError("probe.source doit être un objet")
|
||||||
if str(source.get("type", "")).strip() != "manual_date":
|
if str(source.get("type", "")).strip() != "manual_date":
|
||||||
raise ValueError("seul probe.source.type=manual_date est supporté en v1")
|
raise ValueError("seul probe.source.type=manual_date est supporté en v1")
|
||||||
|
if "value" not in source:
|
||||||
has_inline_value = "value" in source
|
raise ValueError("probe.source.value est requis")
|
||||||
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")
|
metric = probe.get("metric")
|
||||||
if not isinstance(metric, dict):
|
if not isinstance(metric, dict):
|
||||||
|
|
|
||||||
|
|
@ -1,91 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
from pathlib import Path
|
|
||||||
import sys
|
|
||||||
import argparse
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
ROOT = Path(__file__).resolve().parents[1]
|
|
||||||
if str(ROOT) not in sys.path:
|
|
||||||
sys.path.insert(0, str(ROOT))
|
|
||||||
|
|
||||||
from lib.life_noc_inputs import list_items, get_item, set_item, complete_item
|
|
||||||
|
|
||||||
def cmd_set(args: argparse.Namespace) -> int:
|
|
||||||
set_item(args.domain, args.item_key, args.value, origin=args.origin)
|
|
||||||
print(f"Mis à jour: {args.domain} -> {args.item_key}")
|
|
||||||
return 0
|
|
||||||
|
|
||||||
|
|
||||||
def cmd_complete(args: argparse.Namespace) -> int:
|
|
||||||
complete_item(args.domain, args.item_key, origin=args.origin)
|
|
||||||
print(f"Complété: {args.domain} -> {args.item_key}")
|
|
||||||
return 0
|
|
||||||
|
|
||||||
|
|
||||||
def cmd_get(args: argparse.Namespace) -> int:
|
|
||||||
try:
|
|
||||||
item = get_item(args.domain, args.item_key)
|
|
||||||
except KeyError:
|
|
||||||
print(f"Item introuvable: {args.item_key}", file=sys.stderr)
|
|
||||||
return 1
|
|
||||||
|
|
||||||
print(
|
|
||||||
yaml.safe_dump(
|
|
||||||
{args.item_key: item},
|
|
||||||
sort_keys=False,
|
|
||||||
allow_unicode=True,
|
|
||||||
).strip()
|
|
||||||
)
|
|
||||||
return 0
|
|
||||||
|
|
||||||
|
|
||||||
def cmd_list(args: argparse.Namespace) -> int:
|
|
||||||
for key in list_items(args.domain):
|
|
||||||
print(key)
|
|
||||||
return 0
|
|
||||||
|
|
||||||
|
|
||||||
def build_parser() -> argparse.ArgumentParser:
|
|
||||||
parser = argparse.ArgumentParser(description="Gestion des intrants Life-NOC")
|
|
||||||
sub = parser.add_subparsers(dest="command", required=True)
|
|
||||||
|
|
||||||
p_set = sub.add_parser("set", help="Met à jour un intrant")
|
|
||||||
p_set.add_argument("domain")
|
|
||||||
p_set.add_argument("item_key")
|
|
||||||
p_set.add_argument("value")
|
|
||||||
p_set.add_argument("--origin", default="manual")
|
|
||||||
p_set.set_defaults(func=cmd_set)
|
|
||||||
|
|
||||||
p_complete = sub.add_parser("complete", help="Marque un item comme complété maintenant")
|
|
||||||
p_complete.add_argument("domain")
|
|
||||||
p_complete.add_argument("item_key")
|
|
||||||
p_complete.add_argument("--origin", default="manual")
|
|
||||||
p_complete.set_defaults(func=cmd_complete)
|
|
||||||
|
|
||||||
p_get = sub.add_parser("get", help="Lit un intrant")
|
|
||||||
p_get.add_argument("domain")
|
|
||||||
p_get.add_argument("item_key")
|
|
||||||
p_get.set_defaults(func=cmd_get)
|
|
||||||
|
|
||||||
p_list = sub.add_parser("list", help="Liste les intrants d’un domaine")
|
|
||||||
p_list.add_argument("domain")
|
|
||||||
p_list.set_defaults(func=cmd_list)
|
|
||||||
|
|
||||||
return parser
|
|
||||||
|
|
||||||
|
|
||||||
def main() -> int:
|
|
||||||
parser = build_parser()
|
|
||||||
args = parser.parse_args()
|
|
||||||
try:
|
|
||||||
return args.func(args)
|
|
||||||
except ValueError as exc:
|
|
||||||
print(f"Erreur: {exc}", file=sys.stderr)
|
|
||||||
return 1
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
raise SystemExit(main())
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
from pathlib import Path
|
|
||||||
import sys
|
|
||||||
|
|
||||||
from fastapi import FastAPI, HTTPException
|
|
||||||
from pydantic import BaseModel
|
|
||||||
|
|
||||||
ROOT = Path(__file__).resolve().parents[1]
|
|
||||||
if str(ROOT) not in sys.path:
|
|
||||||
sys.path.insert(0, str(ROOT))
|
|
||||||
|
|
||||||
from lib.life_noc_inputs import list_items, get_item, set_item, complete_item # noqa: E402
|
|
||||||
|
|
||||||
|
|
||||||
class SetInputRequest(BaseModel):
|
|
||||||
value: str
|
|
||||||
origin: str = "manual"
|
|
||||||
|
|
||||||
|
|
||||||
class CompleteInputRequest(BaseModel):
|
|
||||||
origin: str = "manual"
|
|
||||||
|
|
||||||
|
|
||||||
app = FastAPI(title="Life-NOC Input API", version="1.0.0")
|
|
||||||
|
|
||||||
|
|
||||||
@app.get("/health")
|
|
||||||
def health() -> dict:
|
|
||||||
return {"status": "ok"}
|
|
||||||
|
|
||||||
|
|
||||||
@app.get("/inputs/{domain}")
|
|
||||||
def api_list_inputs(domain: str) -> dict:
|
|
||||||
return {"domain": domain, "items": list_items(domain)}
|
|
||||||
|
|
||||||
|
|
||||||
@app.get("/inputs/{domain}/{item_key}")
|
|
||||||
def api_get_input(domain: str, item_key: str) -> dict:
|
|
||||||
try:
|
|
||||||
item = get_item(domain, item_key)
|
|
||||||
except KeyError:
|
|
||||||
raise HTTPException(status_code=404, detail="item introuvable")
|
|
||||||
except ValueError as exc:
|
|
||||||
raise HTTPException(status_code=400, detail=str(exc))
|
|
||||||
return {"domain": domain, "item_key": item_key, **item}
|
|
||||||
|
|
||||||
|
|
||||||
@app.post("/inputs/{domain}/{item_key}")
|
|
||||||
def api_set_input(domain: str, item_key: str, req: SetInputRequest) -> dict:
|
|
||||||
item = set_item(domain, item_key, req.value, origin=req.origin)
|
|
||||||
return {"domain": domain, "item_key": item_key, **item}
|
|
||||||
|
|
||||||
|
|
||||||
@app.post("/inputs/{domain}/{item_key}/complete")
|
|
||||||
def api_complete_input(domain: str, item_key: str, req: CompleteInputRequest | None = None) -> dict:
|
|
||||||
origin = "manual" if req is None else req.origin
|
|
||||||
item = complete_item(domain, item_key, origin=origin)
|
|
||||||
return {"domain": domain, "item_key": item_key, **item}
|
|
||||||
Loading…
Reference in a new issue