- 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>
101 lines
3.2 KiB
Python
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
|
|
)
|