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>
This commit is contained in:
2026-01-26 18:25:20 +01:00
parent 9f3c052e2a
commit b0d571ae26
8 changed files with 341 additions and 18 deletions

View File

@@ -1,3 +1,10 @@
"""
Module de base pour les checkers.
Définit la classe abstraite BaseChecker et le dataclass CheckResult
utilisés par tous les checkers.
"""
from abc import ABC, abstractmethod
from dataclasses import dataclass
from typing import Any
@@ -5,6 +12,15 @@ from typing import Any
@dataclass
class CheckResult:
"""
Résultat d'une vérification.
Attributes:
success: True si la vérification a réussi, False sinon.
message: Message décrivant le résultat.
response_time: Temps de réponse en millisecondes (None si échec).
details: Informations supplémentaires (optionnel).
"""
success: bool
message: str
response_time: float | None = None
@@ -12,10 +28,34 @@ class CheckResult:
class BaseChecker(ABC):
"""
Classe abstraite de base pour tous les checkers.
Chaque checker doit hériter de cette classe et implémenter
la méthode check().
Attributes:
name: Nom du checker (pour l'affichage).
config: Configuration du checker (depuis le fichier YAML).
"""
def __init__(self, name: str, config: dict):
"""
Initialise le checker.
Args:
name: Nom du checker.
config: Dictionnaire de configuration.
"""
self.name = name
self.config = config
@abstractmethod
def check(self) -> CheckResult:
"""
Exécute la vérification.
Returns:
CheckResult contenant le résultat de la vérification.
"""
pass

View File

@@ -1,3 +1,10 @@
"""
Checker DNS.
Vérifie la disponibilité d'un serveur DNS et sa capacité à résoudre
des requêtes.
"""
import time
import dns.resolver
@@ -7,13 +14,38 @@ 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)
# First check if host is reachable via ping
# Vérifie d'abord que le serveur est joignable
ping_checker = PingChecker(self.name, {"host": host, "timeout": timeout})
ping_result = ping_checker.check()
@@ -24,7 +56,7 @@ class DnsChecker(BaseChecker):
response_time=None
)
# Now perform DNS query
# Exécute la requête DNS
resolver = dns.resolver.Resolver()
resolver.nameservers = [host]
resolver.timeout = timeout

View File

@@ -1,3 +1,9 @@
"""
Checker HTTP.
Vérifie la disponibilité d'un service web via requête HTTP.
"""
import time
import requests
@@ -6,7 +12,26 @@ from .base import BaseChecker, CheckResult
class HttpChecker(BaseChecker):
"""
Vérifie la disponibilité d'un service web.
Configuration YAML:
url: URL à vérifier (obligatoire).
method: Méthode HTTP (défaut: GET).
expected_status: Code HTTP attendu (défaut: 200).
timeout: Délai d'attente en secondes (défaut: 10).
verify_ssl: Vérifier le certificat SSL (défaut: true).
headers: En-têtes HTTP additionnels (optionnel).
"""
def check(self) -> CheckResult:
"""
Exécute une requête HTTP vers l'URL configurée.
Returns:
CheckResult avec success=True si le code HTTP correspond
à expected_status.
"""
url = self.config["url"]
method = self.config.get("method", "GET").upper()
timeout = self.config.get("timeout", 10)

View File

@@ -1,3 +1,9 @@
"""
Checker Ping.
Vérifie la disponibilité d'un hôte via ICMP ping.
"""
import subprocess
import time
import platform
@@ -6,12 +12,30 @@ from .base import BaseChecker, CheckResult
class PingChecker(BaseChecker):
"""
Vérifie la disponibilité d'un hôte via ping ICMP.
Configuration YAML:
host: Adresse IP ou nom d'hôte à vérifier (obligatoire).
count: Nombre de paquets à envoyer (défaut: 1).
timeout: Délai d'attente en secondes (défaut: 5).
"""
def check(self) -> CheckResult:
"""
Exécute un ping vers l'hôte configuré.
Adapte automatiquement la commande ping selon le système
d'exploitation (Windows ou Linux/macOS).
Returns:
CheckResult avec success=True si l'hôte répond.
"""
host = self.config["host"]
count = self.config.get("count", 1)
timeout = self.config.get("timeout", 5)
# Adapt ping command for OS
# Adapte la commande ping selon l'OS
if platform.system().lower() == "windows":
cmd = ["ping", "-n", str(count), "-w", str(timeout * 1000), host]
else:

View File

@@ -1,3 +1,10 @@
"""
Checker SNMP.
Vérifie la disponibilité d'un équipement réseau via SNMP et peut
récupérer sa température.
"""
import asyncio
import time
@@ -11,10 +18,47 @@ from .base import BaseChecker, CheckResult
class SnmpChecker(BaseChecker):
"""
Vérifie la disponibilité d'un équipement via SNMP.
Utilise SNMPv2c pour interroger un OID et optionnellement
récupérer la température de l'équipement.
Configuration YAML:
host: Adresse IP de l'équipement (obligatoire).
port: Port SNMP (défaut: 161).
community: Communauté SNMP (défaut: public).
oid: OID à interroger (défaut: sysDescr).
temperature_oid: OID de la température (optionnel).
Note: Utiliser l'OID complet (feuille, pas branche).
Exemples:
- Mikrotik: 1.3.6.1.4.1.14988.1.1.3.100.1.3.52.0
- Synology: 1.3.6.1.4.1.6574.1.2.0
timeout: Délai d'attente en secondes (défaut: 5).
"""
def check(self) -> CheckResult:
"""
Exécute la vérification SNMP.
Wrapper synchrone autour de _async_check() pour compatibilité
avec l'interface BaseChecker.
Returns:
CheckResult avec success=True si l'équipement répond.
"""
return asyncio.run(self._async_check())
async def _async_check(self) -> CheckResult:
"""
Exécute la requête SNMP de manière asynchrone.
Interroge l'OID principal et optionnellement l'OID de température
en une seule requête SNMP GET.
Returns:
CheckResult contenant le résultat et la température si configurée.
"""
host = self.config["host"]
port = self.config.get("port", 161)
community = self.config.get("community", "public")
@@ -25,7 +69,7 @@ class SnmpChecker(BaseChecker):
start = time.time()
try:
with Slim() as slim:
# Build list of OIDs to query
# Construit la liste des OIDs à interroger
oids = [ObjectType(ObjectIdentity(oid))]
if temperature_oid:
oids.append(ObjectType(ObjectIdentity(temperature_oid)))
@@ -54,15 +98,15 @@ class SnmpChecker(BaseChecker):
response_time=None
)
else:
# Only include main OID in details, not temperature
# Inclut uniquement l'OID principal dans les détails
details = {str(var_binds[0][0]): str(var_binds[0][1])}
# Extract temperature if configured (second OID in response)
# Extrait la température si configurée (deuxième OID)
if temperature_oid and len(var_binds) >= 2:
try:
details["temperature"] = int(var_binds[1][1])
except (ValueError, TypeError):
pass # Ignore if not a valid integer
pass # Ignore si la valeur n'est pas un entier
return CheckResult(
success=True,