""" Checker DNS. Vérifie la disponibilité d'un serveur DNS et sa capacité à résoudre des requêtes. """ import time import dns.resolver from .base import BaseChecker, CheckResult from .ping import PingChecker class DnsChecker(BaseChecker): """ Vérifie la disponibilité d'un serveur DNS. Effectue d'abord un ping pour vérifier que le serveur est joignable, puis exécute une requête DNS configurable. Configuration YAML: host: Adresse IP du serveur DNS (obligatoire). query: Nom de domaine à résoudre (obligatoire). record_type: Type d'enregistrement DNS (défaut: A). Valeurs possibles: A, AAAA, MX, TXT, CNAME, etc. timeout: Délai d'attente en secondes (défaut: 5). """ def check(self) -> CheckResult: """ Vérifie le serveur DNS. Étapes: 1. Ping du serveur DNS pour vérifier sa disponibilité. 2. Requête DNS du type configuré. Returns: CheckResult avec success=True si le serveur répond et la requête DNS aboutit. """ host = self.config["host"] query_name = self.config["query"] query_type = self.config.get("record_type", "A") timeout = self.config.get("timeout", 5) # Vérifie d'abord que le serveur est joignable ping_checker = PingChecker(self.name, {"host": host, "timeout": timeout}) ping_result = ping_checker.check() if not ping_result.success: return CheckResult( success=False, message=f"DNS server unreachable: {ping_result.message}", response_time=None ) # Exécute la requête DNS resolver = dns.resolver.Resolver() resolver.nameservers = [host] resolver.timeout = timeout resolver.lifetime = timeout start = time.time() try: answers = resolver.resolve(query_name, query_type) response_time = (time.time() - start) * 1000 # ms records = [str(rdata) for rdata in answers] return CheckResult( success=True, message=f"DNS {query_type} query OK ({len(records)} record(s))", response_time=response_time, details={"records": records, "query": query_name, "type": query_type} ) except dns.resolver.NXDOMAIN: return CheckResult( success=False, message=f"DNS query failed: {query_name} does not exist", response_time=None ) except dns.resolver.NoAnswer: return CheckResult( success=False, message=f"DNS query failed: no {query_type} record for {query_name}", response_time=None ) except dns.resolver.Timeout: return CheckResult( success=False, message="DNS query timeout", response_time=None ) except Exception as e: return CheckResult( success=False, message=f"DNS error: {e}", response_time=None )