Ohne Script oder irgendwas wirds nicht gehen. Die Frage ist auch: was soll denn ausgelöst werden, wenn sich die Route ändert? Einfach nur ein Log schreiben, in welchem das vermerkt wird? Benachrichtigungen per Mail, Messenger, Webhook?
Wenn es direkt auf Linux laufen soll, wäre mtr als Paket die einfachste Wahl.
Ein Script könnte so aussehen:
Code:
#!/usr/bin/env bash
declare -A TARGETS
TARGETS["vm01"]="192.168.1.100"
TARGETS["vm02"]="192.168.1.101"
TARGETS["vm03"]="192.168.1.102"
BASELINE_DIR="/opt/routecheck/baseline"
CURRENT_DIR="/tmp/routecheck"
mkdir -p "$BASELINE_DIR" "$CURRENT_DIR"
for VM in "${!TARGETS[@]}"; do
IP="${TARGETS[$VM]}"
echo "== Prüfe $VM ($IP) =="
mtr -r -c 5 -n "$IP" \
| awk 'NR > 1 {print $2}' \
| grep -E '^[0-9]+\.' \
> "$CURRENT_DIR/$VM.route"
if [[ ! -f "$BASELINE_DIR/$VM.route" ]]; then
echo "Keine Baseline vorhanden, lege an."
cp "$CURRENT_DIR/$VM.route" "$BASELINE_DIR/$VM.route"
continue
fi
if diff -u "$BASELINE_DIR/$VM.route" "$CURRENT_DIR/$VM.route" >/dev/null; then
echo "OK: Route unverändert"
else
echo "WARNUNG: Route geändert!"
diff -u "$BASELINE_DIR/$VM.route" "$CURRENT_DIR/$VM.route"
fi
echo
done
Erweitert mit Log und State:
Code:
#!/usr/bin/env bash
declare -A TARGETS
TARGETS["vm01"]="192.168.1.100"
TARGETS["vm02"]="192.168.1.101"
TARGETS["vm03"]="192.168.1.102"
BASELINE_DIR="/opt/routecheck/baseline"
CURRENT_DIR="/tmp/routecheck"
STATE_DIR="/opt/routecheck/state"
LOGFILE="/var/log/routecheck.log"
mkdir -p "$BASELINE_DIR"
mkdir -p "$CURRENT_DIR"
mkdir -p "$STATE_DIR"
log_msg() {
echo "$(date '+%F %T') $1" >> "$LOGFILE"
}
for VM in "${!TARGETS[@]}"
do
IP="${TARGETS[$VM]}"
CURRENT="$CURRENT_DIR/$VM.route"
BASELINE="$BASELINE_DIR/$VM.route"
STATE="$STATE_DIR/$VM.changed"
# Route ermitteln
mtr -r -c 5 -n "$IP" 2>/dev/null \
| awk 'NR > 1 {print $2}' \
| grep -E '^[0-9]+\.' \
> "$CURRENT"
# Ziel nicht erreichbar
if [[ ! -s "$CURRENT" ]]; then
if [[ ! -f "$STATE.unreachable" ]]; then
touch "$STATE.unreachable"
log_msg "[ERROR] $VM ($IP): Ziel nicht erreichbar"
fi
continue
fi
rm -f "$STATE.unreachable"
# Baseline anlegen
if [[ ! -f "$BASELINE" ]]; then
cp "$CURRENT" "$BASELINE"
log_msg "[INFO ] $VM ($IP): Baseline angelegt"
continue
fi
# Vergleich
if diff -u "$BASELINE" "$CURRENT" >/tmp/${VM}.diff
then
log_msg "[ OK ] $VM ($IP): Route unverändert"
if [[ -f "$STATE" ]]; then
rm -f "$STATE"
log_msg "[INFO ] $VM ($IP): Route wieder im Sollzustand"
fi
else
if [[ ! -f "$STATE" ]]; then
touch "$STATE"
log_msg "[WARN ] $VM ($IP): Route geändert"
while IFS= read -r line
do
log_msg "[DIFF ] $line"
done < /tmp/${VM}.diff
fi
fi
done
Beim ersten Start wird die Routingtabelle für jede VM unterhalb von /opt/routecheck/baseline automatisch angelegt und bei weiteren Läufen dann abgeglichen. Bei einer Variante mit Log würde ich noch logrotate setzen, bspw. via:
Code:
/etc/logrotate.d/routecheck
Mit 14 Tagen Vorhaltezeit:
Code:
/var/log/routecheck.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 root adm
}
Die Bingofrage ist halt: was willst Du damit erreichen oder ggf. bei Änderungen auslösen?