#!/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