Add new vzdump hook to hardlink latest backup
This commit is contained in:
parent
70bf10ab59
commit
9f9ef99f1a
|
@ -0,0 +1,169 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Purpose {{{
|
||||||
|
# This script will hardlink latest Proxmox's backup with a explicit name.
|
||||||
|
#
|
||||||
|
# This script is intended to be used as a hook script for the Proxmox
|
||||||
|
# VZDump utility.
|
||||||
|
#
|
||||||
|
# In order to use it, use the configuration directive "script" of the
|
||||||
|
# vzdump utility. This can be done for scheduled backups by putting
|
||||||
|
# "script: /path/to/this/script" in /etc/vzdump.conf. Don't forget to
|
||||||
|
# set executable permission for the script file.
|
||||||
|
#
|
||||||
|
# Based on RobHost's vzdump_hook script :
|
||||||
|
# https://github.com/robhost/proxmox-scripts/blob/master/vzdump_hook.sh
|
||||||
|
# }}}
|
||||||
|
# Vars {{{
|
||||||
|
readonly PROGNAME=$(basename "${0}")
|
||||||
|
readonly ARGS="${*}"
|
||||||
|
[ -z "${DEBUG}" ] && DEBUG=0
|
||||||
|
## Export DEBUG for sub-script
|
||||||
|
export DEBUG
|
||||||
|
|
||||||
|
## Colors
|
||||||
|
readonly PURPLE='\033[1;35m'
|
||||||
|
readonly RED='\033[0;31m'
|
||||||
|
readonly RESET='\033[0m'
|
||||||
|
readonly COLOR_DEBUG="${PURPLE}"
|
||||||
|
# }}}
|
||||||
|
usage() { # {{{
|
||||||
|
|
||||||
|
cat <<- HELP
|
||||||
|
usage: ${PROGNAME} [-h]
|
||||||
|
|
||||||
|
Hardlink latest Proxmox's backup with a explicit name.
|
||||||
|
|
||||||
|
OPTIONS :
|
||||||
|
-h,--help
|
||||||
|
Print this help message.
|
||||||
|
HELP
|
||||||
|
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
debug_message() { # {{{
|
||||||
|
|
||||||
|
local_debug_message="${1}"
|
||||||
|
|
||||||
|
## Print message if DEBUG is enable (=0)
|
||||||
|
[ "${DEBUG}" -eq "0" ] && printf '\e[1;35m%-6b\e[m\n' "DEBUG − ${PROGNAME} : ${local_debug_message}"
|
||||||
|
|
||||||
|
unset local_debug_message
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
error_message() { # {{{
|
||||||
|
|
||||||
|
local_error_message="${1}"
|
||||||
|
local_error_code="${2}"
|
||||||
|
|
||||||
|
## Print message
|
||||||
|
printf '%b\n' "ERROR − ${PROGNAME} : ${RED}${local_error_message}${RESET}"
|
||||||
|
|
||||||
|
exit "${local_error_code:=66}"
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
main() { # {{{
|
||||||
|
|
||||||
|
# If backup is complete {{{
|
||||||
|
if [ "${phase}" = "backup-end" ]; then
|
||||||
|
## Get TARGET's file extension
|
||||||
|
target_archive_extension="$(printf '%s' "${TARGET}" | cut --delimiter="." --fields=1 --complement)"
|
||||||
|
## Set path for LATEST archive file
|
||||||
|
latest_archive="${dumpdir}/vzdump-${vmtype}-${vmid}-latest.${target_archive_extension}"
|
||||||
|
|
||||||
|
## hardlink TARGET archive to LATEST
|
||||||
|
debug_message "hardlink TARGET archive (${target_archive}) to \
|
||||||
|
LATEST (${latest_archive})." >> "${temp_log_file}"
|
||||||
|
ln --force "${target_archive}" "${latest_archive}"
|
||||||
|
fi
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# If log is complete {{{
|
||||||
|
if [ "${phase}" = "log-end" ]; then
|
||||||
|
## Set path for LATEST log file
|
||||||
|
latest_log="${dumpdir}/vzdump-${vmtype}-${vmid}-latest.log"
|
||||||
|
|
||||||
|
## hardlink TARGET log to LATEST
|
||||||
|
debug_message "hardlink TARGET logs (${logfile}) to \
|
||||||
|
LATEST (${latest_log})." >> "${temp_log_file}"
|
||||||
|
ln --force "${logfile}" "${latest_log}"
|
||||||
|
fi
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
debug_message "main − \
|
||||||
|
ARGS=${ARGS}
|
||||||
|
env=$(env)
|
||||||
|
---"
|
||||||
|
|
||||||
|
}
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# Manage arguments # {{{
|
||||||
|
# This code can't be in a function due to argument management
|
||||||
|
|
||||||
|
phase="${1}" # (job|backup)-(start|end|abort)|log-end|pre-(stop|restart)|post-restart
|
||||||
|
|
||||||
|
case "${phase}" in
|
||||||
|
# set variables for the phases
|
||||||
|
#backup-start|backup-end|backup-abort|log-end|pre-stop|pre-restart|post-restart)
|
||||||
|
#;;
|
||||||
|
# do work
|
||||||
|
job-start|job-end|job-abort)
|
||||||
|
# Available vars {{{
|
||||||
|
# Arguments : job-start
|
||||||
|
#LVM_SUPPRESS_FD_WARNINGS=1
|
||||||
|
#DUMPDIR=/path/to/backup/dump
|
||||||
|
#STOREID=backup.id.from.storage.cfg
|
||||||
|
# }}}
|
||||||
|
;;
|
||||||
|
backup-start|backup-end|backup-abort)
|
||||||
|
# Available vars {{{
|
||||||
|
#ARGS=backup-start stop vm.id
|
||||||
|
#HOSTNAME=hostname.domain.tld
|
||||||
|
#TARGET=/path/to/backup/dump/vzdump-$VMTYPE_VALUE-$2_VALUE-YYYY_MM_DD-hh-mm-ss.tar.zst
|
||||||
|
#LOGFILE=/path/to/backup/dump/vzdump-$VMTYPE_VALUE-$2_VALUE-YYYY_MM_DD-hh-mm-ss.log
|
||||||
|
#LVM_SUPPRESS_FD_WARNINGS=1
|
||||||
|
#DUMPDIR=/path/to/backup/dump
|
||||||
|
#VMTYPE=lxc|qemu
|
||||||
|
#STOREID=backup.id.from.storage.cfg
|
||||||
|
# }}}
|
||||||
|
vmid="${3}"
|
||||||
|
target_archive="${TARGET}"
|
||||||
|
dumpdir="${DUMPDIR}"
|
||||||
|
vmtype="${VMTYPE}"
|
||||||
|
;;
|
||||||
|
log-end)
|
||||||
|
# Available vars {{{
|
||||||
|
#ARGS=log-end stop vm.id
|
||||||
|
#HOSTNAME=hostname.domain.tld
|
||||||
|
#TARGET=/path/to/backup/dump/vzdump-$VMTYPE_VALUE-$2_VALUE-YYYY_MM_DD-hh-mm-ss.tar.zst
|
||||||
|
#LOGFILE=/path/to/backup/dump/vzdump-$VMTYPE_VALUE-$2_VALUE-YYYY_MM_DD-hh-mm-ss.log
|
||||||
|
#LVM_SUPPRESS_FD_WARNINGS=1
|
||||||
|
#DUMPDIR=/path/to/backup/dump
|
||||||
|
#VMTYPE=lxc|qemu
|
||||||
|
#STOREID=backup.id.from.storage.cfg
|
||||||
|
# }}}
|
||||||
|
vmid="${3}"
|
||||||
|
logfile="${LOGFILE}"
|
||||||
|
dumpdir="${DUMPDIR}"
|
||||||
|
vmtype="${VMTYPE}"
|
||||||
|
;;
|
||||||
|
pre-stop)
|
||||||
|
;;
|
||||||
|
pre-restart)
|
||||||
|
;;
|
||||||
|
post-restart)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
error_message "Unknown phase ${phase}." 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
main
|
||||||
|
|
||||||
|
exit 0
|
Loading…
Reference in New Issue