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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user