Parse the real RTT from ping output instead of measuring subprocess execution time, which included process startup overhead. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
80 lines
2.3 KiB
Python
80 lines
2.3 KiB
Python
"""
|
|
Checker Ping.
|
|
|
|
Vérifie la disponibilité d'un hôte via ICMP ping.
|
|
"""
|
|
|
|
import re
|
|
import subprocess
|
|
import platform
|
|
|
|
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)
|
|
|
|
# Adapte la commande ping selon l'OS
|
|
if platform.system().lower() == "windows":
|
|
cmd = ["ping", "-n", str(count), "-w", str(timeout * 1000), host]
|
|
else:
|
|
cmd = ["ping", "-c", str(count), "-W", str(timeout), host]
|
|
|
|
try:
|
|
result = subprocess.run(
|
|
cmd,
|
|
capture_output=True,
|
|
text=True,
|
|
timeout=timeout + 5
|
|
)
|
|
|
|
if result.returncode == 0:
|
|
# Parse RTT from ping output (e.g., "time=0.32 ms" or "time=0.32ms")
|
|
match = re.search(r"time[=<]([\d.]+)\s*ms", result.stdout)
|
|
response_time = float(match.group(1)) if match else None
|
|
|
|
return CheckResult(
|
|
success=True,
|
|
message="Host is reachable",
|
|
response_time=response_time
|
|
)
|
|
else:
|
|
return CheckResult(
|
|
success=False,
|
|
message="Host is unreachable",
|
|
response_time=None
|
|
)
|
|
except subprocess.TimeoutExpired:
|
|
return CheckResult(
|
|
success=False,
|
|
message="Ping timeout",
|
|
response_time=None
|
|
)
|
|
except Exception as e:
|
|
return CheckResult(
|
|
success=False,
|
|
message=f"Ping error: {e}",
|
|
response_time=None
|
|
)
|