commit 9f41236ee175c2f1ab8ab8c21f6045e6dda93f2a Author: patrick Date: Thu May 29 23:43:55 2025 +0200 miyagi-backup.sh hinzugefügt diff --git a/miyagi-backup.sh b/miyagi-backup.sh new file mode 100644 index 0000000..c564470 --- /dev/null +++ b/miyagi-backup.sh @@ -0,0 +1,145 @@ +#!/bin/bash +set -euo pipefail +IFS=$'\n\t' + +PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin" + +if [[ "${1:-}" == "help" ]]; then + echo "Verfügbare Funktionen:" + declare -F | awk '{print " - " $3}' + exit 0 +fi + +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: $0 -c /path/to/config" + exit 1 +} + +# Argument parsing +CONFIG_FILE="" +while getopts "c:" opt; do + case "$opt" in + c) CONFIG_FILE="$OPTARG" ;; + *) usage ;; + esac +done + +if [[ -z "$CONFIG_FILE" || ! -f "$CONFIG_FILE" ]]; then + log "ERROR: Configuration file is missing or invalid." + usage +fi + +source "$CONFIG_FILE" + +# 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() { + if [[ "$UPDATES" == "yes" ]]; then + log "Running system updates..." + apt update && apt dist-upgrade -y + apt autopurge -y + else + log "No system updates configured" + 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}}' + + local status=$? + if [[ $status -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 tasks..." + 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" + else + log "No maintenance today." + fi +} + +main() { + log "Starting Miyagi backup process..." + + SOURCEHOSTNAME=$(ssh "$SOURCEHOST" hostname) + + write_zsync_config + run_zsync + run_updates + run_maintenance + run_pbs_backup + + if [[ "$SHUTDOWN" == "yes" ]]; then + send_piggyback_data + shutdown now + elif [[ "$BACKUPSERVER" == "no" ]]; then + log "No backup configured and no shutdown requested. Exiting." + exit 0 + fi +} + +if [[ "${1:-}" == "" ]]; then + main +else + "$@" +fi \ No newline at end of file