Files
lan_checker/checkers/dns.py
Antoine Van Elstraete b0d571ae26 Add French docstrings and README
- Docstrings for all modules, classes and methods
- README.md with installation and usage instructions
- Update CLAUDE.md with dns.py

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 18:25:20 +01:00

101 lines
3.2 KiB
Python

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