#!/usr/bin/env python3 """Regles partagees pour les inventaires statiques Set-OPS.""" from __future__ import annotations from pathlib import Path import yaml GROUPES_OPERATIONNELS_PREFIXES = ("serveurs_", "clients_") GROUPE_HOTES_ACTIFS = "hotes_actifs" GROUPE_HOTES_PLANIFIES = "hotes_planifies" GROUPES_ETAT_HOTE = {GROUPE_HOTES_ACTIFS, GROUPE_HOTES_PLANIFIES} def est_groupe_operationnel(groupe: str) -> bool: return groupe.startswith(GROUPES_OPERATIONNELS_PREFIXES) def groupes_operationnels_connus(enfants: dict, dossier_playbooks: Path) -> list[str]: groupes = set(enfants) groupes.update(playbook.stem for playbook in dossier_playbooks.glob("*.yml")) return sorted(groupe for groupe in groupes if est_groupe_operationnel(groupe)) def charger_nomenclature(path: Path | None) -> dict: """Charge le registre de nomenclature (domaines, categories, adressage).""" if not path or not path.exists(): return {} with path.open("r", encoding="utf-8") as fichier: data = yaml.safe_load(fichier) or {} if not isinstance(data, dict): raise ValueError(f"{path} ne contient pas une table YAML.") return data def charger_dependances(path: Path | None) -> dict: if not path: return {} if not path.exists(): raise ValueError(f"Fichier de dependances introuvable: {path}") with path.open("r", encoding="utf-8") as dependencies_file: data = yaml.safe_load(dependencies_file) or {} if not isinstance(data, dict): raise ValueError(f"{path} ne contient pas une table YAML.") groups = data.get("groupes", {}) if not isinstance(groups, dict): raise ValueError(f"{path} doit contenir une cle 'groupes' de type table.") for group, config in groups.items(): if not est_groupe_operationnel(group): raise ValueError(f"Groupe de dependance non operationnel: {group}") if not isinstance(config, dict): raise ValueError(f"Dependance invalide pour {group}: table attendue.") required = config.get("requiert_groupes_actifs", []) if required is None: required = [] if not isinstance(required, list) or not all(isinstance(item, str) for item in required): raise ValueError(f"requiert_groupes_actifs doit etre une liste de groupes pour {group}.") for required_group in required: if not est_groupe_operationnel(required_group): raise ValueError(f"Prerequis non operationnel pour {group}: {required_group}") return groups