104 lines
3.2 KiB
Bash
Executable File
104 lines
3.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# Eigenständiges Script: schreibt PBS-Backup-Status als lokale Check_MK-Spooldatei.
|
||
# Wird von miyagi-backup.sh (write_pbs_status()) als eigener Prozess aufgerufen.
|
||
# Erwartet folgende Umgebungsvariablen: PBSHOST, BACKUPSTOREPBS, PBS_REPO_USER,
|
||
# PBS_PASSWORD, PBSBACKUP_STATUS (optional), SPOOL_MAXAGE_PBS_STATUS (optional).
|
||
set -uo pipefail
|
||
IFS=$'\n\t'
|
||
|
||
log() {
|
||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
|
||
}
|
||
|
||
epoch_to_str() {
|
||
local epoch="$1"
|
||
case "$(uname -s)" in
|
||
FreeBSD) date -r "$epoch" "+%Y-%m-%d %H:%M:%S" ;;
|
||
*) date -d "@$epoch" "+%Y-%m-%d %H:%M:%S" ;;
|
||
esac
|
||
}
|
||
|
||
if [[ -z "${SPOOL_MAXAGE_PBS_STATUS:-}" ]]; then
|
||
log "SPOOL_MAXAGE_PBS_STATUS nicht gesetzt – PBS-Status-Ausgabe übersprungen."
|
||
exit 1
|
||
fi
|
||
spool_file="/var/lib/check_mk_agent/spool/${SPOOL_MAXAGE_PBS_STATUS}_checkpbs_local"
|
||
repo="${PBS_REPO_USER:-}@${PBSHOST:-}:${BACKUPSTOREPBS:-}"
|
||
|
||
if ! command -v proxmox-backup-client >/dev/null 2>&1; then
|
||
log "proxmox-backup-client nicht installiert – PBS-Status-Ausgabe übersprungen."
|
||
exit 0
|
||
fi
|
||
|
||
if [[ -z "${PBS_REPO_USER:-}" || -z "${PBS_PASSWORD:-}" ]]; then
|
||
log "PBS_REPO_USER oder PBS_PASSWORD nicht gesetzt – PBS-Status-Ausgabe übersprungen."
|
||
exit 1
|
||
fi
|
||
|
||
tmpfile=$(mktemp)
|
||
echo "<<<local>>>" > "$tmpfile"
|
||
|
||
now=$(date +%s)
|
||
|
||
# === Schwellenwert(e) parsen ===
|
||
warn_threshold=0
|
||
crit_threshold=86400 # Default kritisch ab 24h
|
||
|
||
if [[ -n "${PBSBACKUP_STATUS:-}" ]]; then
|
||
IFS=',' read -r t1 t2 <<< "$PBSBACKUP_STATUS"
|
||
if [[ "$t1" =~ ^[0-9]+$ && -z "$t2" ]]; then
|
||
# Nur ein Wert vorhanden
|
||
crit_threshold=$t1
|
||
log "Verwende einfachen Schwellenwert: CRIT=${crit_threshold}s"
|
||
elif [[ "$t1" =~ ^[0-9]+$ && "$t2" =~ ^[0-9]+$ ]]; then
|
||
warn_threshold=$t1
|
||
crit_threshold=$t2
|
||
log "Verwende gestaffelte Schwellenwerte: WARN=${warn_threshold}s, CRIT=${crit_threshold}s"
|
||
else
|
||
log "WARNUNG: Ungültiges PBSBACKUP_STATUS-Format – Fallback: CRIT=${crit_threshold}s"
|
||
fi
|
||
fi
|
||
|
||
# Backup-Daten extrahieren (direkt vom Skript-Host gegen PBSHOST, mit PBS_PASSWORD authentifiziert)
|
||
PBS_PASSWORD="$PBS_PASSWORD" proxmox-backup-client list --repository "$repo" --output-format json 2>/dev/null | \
|
||
grep -E '"backup-id"|"backup-type"|"backup-time"' | \
|
||
sed -E 's/[",]//g; s/^ *//' > "$tmpfile.json"
|
||
|
||
backup_type="" backup_id="" backup_time=""
|
||
while read -r line; do
|
||
case "$line" in
|
||
backup-type:*)
|
||
backup_type="${line#*: }"
|
||
;;
|
||
backup-id:*)
|
||
backup_id="${line#*: }"
|
||
;;
|
||
backup-time:*)
|
||
backup_time="${line#*: }"
|
||
|
||
if [[ -n "$backup_type" && -n "$backup_id" && -n "$backup_time" ]]; then
|
||
age=$((now - backup_time))
|
||
timestamp=$(epoch_to_str "$backup_time")
|
||
|
||
if (( age < warn_threshold )); then
|
||
status=0
|
||
elif (( age < crit_threshold )); then
|
||
status=1
|
||
else
|
||
status=2
|
||
fi
|
||
|
||
msg="$backup_type/$backup_id last backup $timestamp (age: $((age / 3600))h)"
|
||
echo "$status PBS_${backup_type}_${backup_id} - $msg" >> "$tmpfile"
|
||
|
||
# Reset
|
||
backup_type="" backup_id="" backup_time=""
|
||
fi
|
||
;;
|
||
esac
|
||
done < "$tmpfile.json"
|
||
|
||
rm -f "$tmpfile.json"
|
||
mv "$tmpfile" "$spool_file"
|
||
log "PBS Backup Status lokal geschrieben: $spool_file"
|