From 3139e69114fb495bcf1125fd0b1323153076738d Mon Sep 17 00:00:00 2001 From: Christoph Date: Thu, 11 Dec 2025 12:09:03 +0100 Subject: [PATCH] add scripts: check_inet_iface_curl.sh, check_inet_iface_ping.sh . --- check_inet_iface_curl.sh | 71 ++++++++++++++++++++++++++++++++++++++++ check_inet_iface_ping.sh | 66 +++++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100755 check_inet_iface_curl.sh create mode 100755 check_inet_iface_ping.sh diff --git a/check_inet_iface_curl.sh b/check_inet_iface_curl.sh new file mode 100755 index 0000000..d415295 --- /dev/null +++ b/check_inet_iface_curl.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash + +# Testet ein Interface mit curl gegen drei HTTP/HTTPS-Ziele. +# Es gilt erst als offline, wenn alle drei Ziele fehlschlagen. +# Erst der zweite Fehlversuch erzeugt eine Fehlermeldung. +# +# Aufruf: check_inet_iface_curl.sh + +IFACE="$1" + +# Drei Ziele - alles HTTP/HTTPS, damit echte TCP-Verbindungen getestet werden. +TARGETS=("https://1.1.1.1" "https://8.8.8.8" "https://www.debian.org" "https//oopen.de") + +CURL_BIN="$(which curl)" +DATE_BIN="$(which date)" + +STATE_DIR="/run/check_inet" +STATE_FILE="$STATE_DIR/$IFACE.fail" + +mkdir -p "$STATE_DIR" + +if [ -z "$IFACE" ]; then + echo "" + echo " Usage: $0 " >&2 + echo "" + exit 2 +fi + +# ---------------------------------------------------------- +# Funktion: Testet ein HTTP(S)-Ziel mit Interface-Bindung +# ---------------------------------------------------------- +test_target() { + local target="$1" + + # -4 erzwingt IPv4, --interface bindet Source-Interface, + # --max-time 8 begrenzt Timeout, -s silent, -o /dev/null keine Ausgabe + $CURL_BIN -4 --interface "$IFACE" --max-time 8 -s -o /dev/null "$target" + return $? +} + +# ---------------------------------------------------------- +# Tests durchführen +# ---------------------------------------------------------- + +FAILED=0 + +for TG in "${TARGETS[@]}"; do + test_target "$TG" + if [ $? -ne 0 ]; then + FAILED=$((FAILED + 1)) + fi +done + +# Wenn mindestens EIN Ziel funktioniert → online +if [ $FAILED -lt 3 ]; then + [ -f "$STATE_FILE" ] && rm -f "$STATE_FILE" + exit 0 +fi + +# Wenn ALLE drei fehlschlagen → offline +if [ -f "$STATE_FILE" ]; then + TS="$($DATE_BIN '+%F %T')" + echo "" + echo "$TS - Interface $IFACE: TCP/HTTP nicht erreichbar (curl-Test; Targets: ${TARGETS[*]})!" >&2 + echo "" + exit 1 +else + # Erster Fehlschlag — noch keine Meldung + touch "$STATE_FILE" + exit 0 +fi diff --git a/check_inet_iface_ping.sh b/check_inet_iface_ping.sh new file mode 100755 index 0000000..1be782a --- /dev/null +++ b/check_inet_iface_ping.sh @@ -0,0 +1,66 @@ +#!/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