Files
lan_checker/checkers/ping.py
Antoine Van Elstraete 06e1d683b3 Fix ping latency to use actual RTT instead of subprocess time
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>
2026-01-26 19:38:37 +01:00

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
)