67 lines
1.7 KiB
Bash
Executable File
67 lines
1.7 KiB
Bash
Executable File
#!/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 <interface>
|
|
|
|
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 <interface>" >&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
|