#!/usr/bin/env bash # Prüft ein Interface gegen drei Internet-Ziele. # Es wird nur dann ein Fehler gemeldet, wenn alle drei Ziele nicht erreichbar sind. # Zudem erfolgt die Meldung erst beim zweiten aufeinanderfolgenden Offline-Test. # # Aufruf: check_inet_iface.sh IFACE="$1" # Drei Ziele, beliebig anpassbar (IPs oder Hostnames) TARGETS=("1.1.1.1" "8.8.8.8" "www.debian.org" "oopen.de") PING_BIN="/bin/ping" TIMEOUT_BIN="/usr/bin/timeout" DATE_BIN="/bin/date" STATE_DIR="/var/run/check_inet" STATE_FILE="$STATE_DIR/$IFACE.fail" mkdir -p "$STATE_DIR" if [ -z "$IFACE" ]; then echo "Usage: $0 " >&2 exit 2 fi # ---------------------------------------------------------- # Funktion: Teste ein Ziel über das Interface # ---------------------------------------------------------- test_target() { local target="$1" $TIMEOUT_BIN 10 $PING_BIN -I "$IFACE" -c 2 -W 2 "$target" >/dev/null 2>&1 return $? } # ---------------------------------------------------------- # Alle drei Ziele testen # ---------------------------------------------------------- FAILED=0 for TG in "${TARGETS[@]}"; do test_target "$TG" if [ $? -ne 0 ]; then FAILED=$((FAILED + 1)) fi done # Wenn mindestens ein Ziel erreichbar ist → online if [ $FAILED -lt 3 ]; then # Erfolg: State zurücksetzen [ -f "$STATE_FILE" ] && rm -f "$STATE_FILE" exit 0 fi # Wenn alle Ziele fehlschlagen → offline if [ -f "$STATE_FILE" ]; then # Zweiter Fehlschlag → Meldung TS="$($DATE_BIN '+%F %T')" echo "$TS - Interface $IFACE: Internet nicht erreichbar (Targets: ${TARGETS[*]})!" >&2 exit 1 else # Erster Fehlschlag - Still, aber State setzen touch "$STATE_FILE" exit 0 fi