From 947dd43c618e208f091948eb6a85f3806b77de5c Mon Sep 17 00:00:00 2001 From: patrick Date: Fri, 30 May 2025 00:13:42 +0200 Subject: [PATCH] =?UTF-8?q?miyagi-backup.sh=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- miyagi-backup.sh | 164 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 miyagi-backup.sh diff --git a/miyagi-backup.sh b/miyagi-backup.sh new file mode 100644 index 0000000..870f308 --- /dev/null +++ b/miyagi-backup.sh @@ -0,0 +1,164 @@ +#!/bin/bash +set -euo pipefail +IFS=$'\n\t' + +PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin" +SCRIPT_NAME=$(basename "$0") +LOGFILE="/var/log/${SCRIPT_NAME%.sh}.log" + +log() { + echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOGFILE" +} + +usage() { + echo "Usage:" + echo " $0 -c /path/to/config # Full backup run" + echo " $0 [function] # Run individual function" + echo " $0 help # Show available functions" + exit 1 +} + +# Konfigurationsdatei initialisieren (nur wenn -c übergeben) +CONFIG_FILE="" +while getopts "c:" opt; do + case "$opt" in + c) CONFIG_FILE="$OPTARG" ;; + *) usage ;; + esac +done + +# Bei Einzelaufruf muss Konfiguration geladen sein +if [[ -n "${CONFIG_FILE:-}" ]]; then + if [[ ! -f "$CONFIG_FILE" ]]; then + log "ERROR: Configuration file not found: $CONFIG_FILE" + exit 1 + fi + source "$CONFIG_FILE" +fi + +# Funktionen + +write_zsync_config() { + local conf_file="/etc/bashclub/$SOURCEHOST.conf" + log "Writing zsync config to $conf_file" + { + echo "target=$ZFSTRGT" + echo "source=root@$SOURCEHOST" + echo "sshport=$SSHPORT" + echo "tag=$ZPUSHTAG" + echo "snapshot_filter=$ZPUSHFILTER" + echo "min_keep=$ZPUSHMINKEEP" + echo "zfs_auto_snapshot_keep=$ZPUSHKEEP" + echo "zfs_auto_snapshot_label=$ZPUSHLABEL" + echo "zfs_auto_snapshot_engine=internal" + echo "checkzfs_disabled=0" + echo "checkzfs_local=0" + echo "checkzfs_prefix=miyagi-$SOURCEHOSTNAME-$(hostname)-$ZPUSHTAG" + echo "checkzfs_max_age=1500,2000" + echo "checkzfs_max_snapshot_count=180,200" + echo "checkzfs_spool=1" + echo "checkzfs_spool_maxage=90000" + } > "$conf_file" +} + +run_zsync() { + if [[ "$ZSYNC" != "no" ]]; then + /usr/bin/bashclub-zsync -c "/etc/bashclub/$SOURCEHOST.conf" + else + log "Zsync is disabled" + fi +} + +run_updates() { + log "Running updates..." + apt update && apt dist-upgrade -y + apt autopurge -y +} + +run_remote_updates() { + if [[ "$UPDATES" == "yes" ]]; then + ssh "$PBSHOST" apt update && apt dist-upgrade -y + else + log "Remote updates disabled" + fi +} + +send_piggyback_data() { + local fname="90000_miyagi-$SOURCEHOSTNAME-$(hostname)" + log "Sending piggyback data to $SOURCEHOST..." + echo "<<<>>" > "$fname" + /usr/bin/check_mk_agent >> "$fname" + echo "<<<<>>>>" >> "$fname" + scp "$fname" "$SOURCEHOST:/var/lib/check_mk_agent/spool/" +} + +run_pbs_backup() { + log "Running PBS vzdump job..." + ssh root@"$SOURCEHOST" vzdump --pbs-change-detection-mode metadata \ + --node "$SOURCEHOSTNAME" --storage "$BACKUPSTORE" \ + --exclude "$BACKUPEXCLUDE" --mode snapshot --all 1 \ + --notes-template '{{guestname}}' + + if [[ $? -eq 0 ]]; then + echo "0 DailyPBS - Daily Backup" > /tmp/cmk_tmp.out + else + echo "2 DailyPBS - Daily Backup FAILED" > /tmp/cmk_tmp.out + fi + + ( echo "<<>>" ; cat /tmp/cmk_tmp.out ) > /tmp/90000_checkpbs + scp /tmp/90000_checkpbs root@"$SOURCEHOST":/var/lib/check_mk_agent/spool +} + +run_maintenance() { + if [[ "$(date +%u)" == "$MAINTDAY" ]]; then + log "Running maintenance..." + PRUNEJOB=$(ssh "$PBSHOST" proxmox-backup-manager prune-job list --output-format json-pretty | grep -m 1 "id" | cut -d'"' -f4) + ssh root@"$PBSHOST" proxmox-backup-manager prune-job run "$PRUNEJOB" + ssh root@"$PBSHOST" proxmox-backup-manager garbage-collection start "$BACKUPSTOREPBS" + ssh root@"$PBSHOST" proxmox-backup-manager verify backup + else + log "No maintenance scheduled for today." + fi +} + +run_scrub() { + ssh root@"$SOURCEHOST" zpool scrub -s "$ZPOOLSRC" + zpool scrub -s "$ZPOOLDST" +} + +shutdown_if_requested() { + if [[ "$SHUTDOWN" == "yes" ]]; then + send_piggyback_data + log "Shutting down now..." + shutdown now + else + log "No shutdown requested." + fi +} + +main() { + log "Starting full backup routine..." + + SOURCEHOSTNAME=$(ssh "$SOURCEHOST" hostname) + + write_zsync_config + run_zsync + run_updates + run_maintenance + run_scrub + run_pbs_backup + run_remote_updates + shutdown_if_requested +} + +# Funktionsbasierter Aufruf +if [[ "${1:-}" == "help" ]]; then + echo "Verfügbare Funktionen:" + declare -F | awk '{print " - " $3}' | grep -v "^ - _" + exit 0 +elif [[ "${1:-}" =~ ^[a-zA-Z0-9_]+$ && "$(type -t "$1")" == "function" ]]; then + shift + "$@" +else + main +fi