Files
monitoring/check_inet_iface_curl.sh

72 lines
1.8 KiB
Bash
Executable File

#!/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 <interface>
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 <interface>" >&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