#!/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