diff --git a/miyagi-backup.sh b/miyagi-backup.sh index 5343741..2f62ec9 100644 --- a/miyagi-backup.sh +++ b/miyagi-backup.sh @@ -18,7 +18,6 @@ usage() { exit 1 } -# Konfigurationsdatei initialisieren (nur wenn -c übergeben) CONFIG_FILE="" while getopts "c:" opt; do case "$opt" in @@ -35,7 +34,52 @@ if [[ -n "${CONFIG_FILE:-}" ]]; then log "ERROR: Configuration file not found: $CONFIG_FILE" exit 1 fi + source "$CONFIG_FILE" + + # ========================== + # Konfigurationsprüfung + # ========================== + REQUIRED_VARS=( + SSHPORT + BACKUPSERVER + ZSYNC + MAINTDAY + SHUTDOWN + UPDATES + SOURCEHOST + ZFSROOT + ZFSSECOND + ZFSTRGT + ZPUSHTAG + ZPUSHMINKEEP + ZPUSHKEEP + ZPUSHLABEL + ZPUSHFILTER + PBSHOST + BACKUPSTORE + BACKUPSTOREPBS + BACKUPEXCLUDE + REPLEXCLUDE + ) + + MISSING_VARS=() + for var in "${REQUIRED_VARS[@]}"; do + if [[ -z "${!var:-}" ]]; then + MISSING_VARS+=("$var") + fi + done + + if [[ "${#MISSING_VARS[@]}" -ne 0 ]]; then + log "Fehlende Konfigurationsvariablen:" + for var in "${MISSING_VARS[@]}"; do + log " - $var" + done + log "Breche ab – bitte Konfigurationsdatei prüfen." + exit 1 + else + log "Alle erforderlichen Konfigurationsvariablen sind gesetzt." + fi fi # Funktionen @@ -128,10 +172,17 @@ run_remote_updates() { } send_piggyback_data() { + # Falls SOURCEHOSTNAME leer ist, ueber SSH vom Zielhost ermitteln + if [[ -z "${SOURCEHOSTNAME:-}" ]]; then + log "SOURCEHOSTNAME is empty retrieving via SSH from $SOURCEHOST..." + SOURCEHOSTNAME=$(ssh "$SOURCEHOST" hostname) + log "Detected SOURCEHOSTNAME: $SOURCEHOSTNAME" + fi + local combined_host="miyagi-${SOURCEHOSTNAME}-$(hostname)" local filename="90000_${combined_host}" - log "Do not forget to add a Host in CMK named: ${combined_host} (without Agent, Piggyback enabled)!" + log "Do nott forget to add a Host in CMK named: ${combined_host} (without Agent, Piggyback enabled)!" log "Creating piggyback file: $filename" { @@ -157,12 +208,16 @@ run_pbs_backup() { # PBS-Storage ggf. aktivieren log "Checking if PBS storage '$BACKUPSTORE' is enabled on $SOURCEHOST..." if ssh root@"$SOURCEHOST" "pvesm status | grep -w '$BACKUPSTORE' | grep -q 'disabled'"; then - log "PBS storage '$BACKUPSTORE' is disabled. Attempting to enable..." - ssh root@"$SOURCEHOST" "pvesm set '$BACKUPSTORE' --disable 0 && sleep 2" + log "PBS storage '$BACKUPSTORE' is disabled. Attempting to enable...sleep 10 Sekunden" + ssh root@"$SOURCEHOST" "pvesm set '$BACKUPSTORE' --disable 0 && sleep 10" + pbs_enabled_by_script=true else log "PBS storage '$BACKUPSTORE' is already enabled." + pbs_enabled_by_script=false fi + vzdump_success=false + # Hauptversuch mit --pbs-change-detection-mode if ssh root@"$SOURCEHOST" vzdump --pbs-change-detection-mode metadata \ --node "$SOURCEHOSTNAME" --storage "$BACKUPSTORE" \ @@ -170,6 +225,7 @@ run_pbs_backup() { --notes-template '{{guestname}}'; then log "vzdump with change-detection-mode succeeded" + vzdump_success=true else log "Fallback: vzdump with change-detection-mode failed, trying without it..." @@ -180,14 +236,21 @@ run_pbs_backup() { --notes-template '{{guestname}}'; then log "Fallback vzdump succeeded" + vzdump_success=true else log "ERROR: vzdump failed even after fallback" fi fi - # Monitoring-Output - if [[ $? -eq 0 ]]; then + # PBS-Storage wieder deaktivieren, wenn zuvor aktiviert und erfolgreich + if [[ "$vzdump_success" == true && "$pbs_enabled_by_script" == true ]]; then + log "Disabling PBS storage '$BACKUPSTORE' again on $SOURCEHOST..." + ssh root@"$SOURCEHOST" "pvesm set '$BACKUPSTORE' --disable 1" + fi + + # Monitoring-Output für Checkmk + if [[ "$vzdump_success" == true ]]; then echo "0 DailyPBS - Daily Backup" > /tmp/cmk_tmp.out else echo "2 DailyPBS - Daily Backup FAILED" > /tmp/cmk_tmp.out @@ -197,6 +260,7 @@ run_pbs_backup() { scp /tmp/90000_checkpbs root@"$SOURCEHOST":/var/lib/check_mk_agent/spool || log "Fehler beim SCP des Monitoring-Outputs" } + run_maintenance() { if [[ "$(date +%u)" == "$MAINTDAY" ]]; then log "Running maintenance..." @@ -240,7 +304,9 @@ run_scrub_stop_local() { } shutdown_if_requested() { - if [[ "$SHUTDOWN" == "yes" ]]; then + log "SHUTDOWN-Variable: '${SHUTDOWN:-nicht gesetzt}'" + #if [[ "${SHUTDOWN,,}" == "yes" ]]; then + if [[ "$(echo "$SHUTDOWN" | tr '[:upper:]' '[:lower:]')" == "yes" ]]; then send_piggyback_data log "Shutting down now..." shutdown now @@ -250,6 +316,8 @@ shutdown_if_requested() { } main() { + log "Backup-Routine startet in 60 Sekunden..." + sleep 60 log "Starting full backup routine..." SOURCEHOSTNAME=$(ssh "$SOURCEHOST" hostname)