|
|
@@ -13,13 +13,13 @@ fn_firstcommand_set
|
|
|
# Trap to remove lockfile on quit.
|
|
|
fn_backup_trap() {
|
|
|
echo -e ""
|
|
|
- echo -en "backup ${backupname}.tar.gz..."
|
|
|
+ echo -en "backup ${backupname}.${compressext}..."
|
|
|
fn_print_canceled_eol_nl
|
|
|
- fn_script_log_info "Backup ${backupname}.tar.gz: CANCELED"
|
|
|
- rm -f "${backupdir:?}/${backupname}.tar.gz" | tee -a "${lgsmlog}"
|
|
|
- echo -en "backup ${backupname}.tar.gz..."
|
|
|
+ fn_script_log_info "Backup ${backupname}.${compressext}: CANCELED"
|
|
|
+ rm -f "${backupdir:?}/${backupname}.${compressext}" | tee -a "${lgsmlog}"
|
|
|
+ echo -en "backup ${backupname}.${compressext}..."
|
|
|
fn_print_removed_eol_nl
|
|
|
- fn_script_log_info "Backup ${backupname}.tar.gz: REMOVED"
|
|
|
+ fn_script_log_info "Backup ${backupname}.${compressext}: REMOVED"
|
|
|
# Remove backup lockfile.
|
|
|
rm -f "${lockdir:?}/backup.lock"
|
|
|
fn_backup_start_server
|
|
|
@@ -110,23 +110,47 @@ fn_backup_create_lockfile() {
|
|
|
trap fn_backup_trap INT
|
|
|
}
|
|
|
|
|
|
+fn_select_compression() {
|
|
|
+ if command -v zstd > /dev/null 2>&1; then
|
|
|
+ compressprog="zstd"
|
|
|
+ compressext="tar.zst"
|
|
|
+ compressflag="--zstd"
|
|
|
+ elif command -v pigz > /dev/null 2>&1; then
|
|
|
+ compressprog="pigz"
|
|
|
+ compressext="tar.gz"
|
|
|
+ compressflag="--use-compress-program=pigz"
|
|
|
+ elif command -v gzip > /dev/null 2>&1; then
|
|
|
+ compressprog="gzip"
|
|
|
+ compressext="tar.gz"
|
|
|
+ compressflag="--gzip"
|
|
|
+ else
|
|
|
+ compressprog=""
|
|
|
+ compressext="tar"
|
|
|
+ compressflag=""
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
# Compressing files.
|
|
|
fn_backup_compression() {
|
|
|
- # Tells how much will be compressed using rootdirduexbackup value from info_distro and prompt for continue.
|
|
|
+
|
|
|
fn_print_info "A total of ${rootdirduexbackup} will be compressed."
|
|
|
- fn_script_log_info "A total of ${rootdirduexbackup} will be compressed: ${backupdir}/${backupname}.tar.gz"
|
|
|
- fn_print_dots "Backup (${rootdirduexbackup}) ${backupname}.tar.gz, in progress ..."
|
|
|
- fn_script_log_info "Backup ${rootdirduexbackup} ${backupname}.tar.gz, in progress"
|
|
|
+ fn_script_log_info "A total of ${rootdirduexbackup} will be compressed: ${backupdir}/${backupname}.${compressext}"
|
|
|
+ fn_print_dots "Backup (${rootdirduexbackup}) ${backupname}.${compressext}, in progress ..."
|
|
|
+ fn_script_log_info "Backup ${rootdirduexbackup} ${backupname}.${compressext}, in progress"
|
|
|
excludedir=$(fn_backup_relpath)
|
|
|
|
|
|
- # Check that excludedir is a valid path.
|
|
|
if [ ! -d "${excludedir}" ]; then
|
|
|
fn_print_fail_nl "Problem identifying the previous backup directory for exclusion."
|
|
|
fn_script_log_fail "Problem identifying the previous backup directory for exclusion"
|
|
|
core_exit.sh
|
|
|
fi
|
|
|
|
|
|
- tar --use-compress-program=pigz -hcf "${backupdir}/${backupname}.tar.gz" -C "${rootdir}" --exclude "${excludedir}" --exclude "${lockdir}" --exclude "${tmpdir}" ./.
|
|
|
+ if [ -n "${compressflag}" ]; then
|
|
|
+ tar ${compressflag} -hcf "${backupdir}/${backupname}.${compressext}" -C "${rootdir}" --exclude "${excludedir}" --exclude "${lockdir}" --exclude "${tmpdir}" ./.
|
|
|
+ else
|
|
|
+ tar -hcf "${backupdir}/${backupname}.${compressext}" -C "${rootdir}" --exclude "${excludedir}" --exclude "${lockdir}" --exclude "${tmpdir}" ./.
|
|
|
+ fi
|
|
|
+
|
|
|
exitcode=$?
|
|
|
if [ "${exitcode}" -ne 0 ]; then
|
|
|
fn_print_fail_eol
|
|
|
@@ -136,8 +160,8 @@ fn_backup_compression() {
|
|
|
fn_script_log_fail "Starting backup"
|
|
|
else
|
|
|
fn_print_ok_eol
|
|
|
- fn_print_ok_nl "Completed: ${italic}${backupname}.tar.gz${default}, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')"
|
|
|
- fn_script_log_pass "Backup created: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')"
|
|
|
+ fn_print_ok "Completed: ${italic}${backupname}.${compressext}${default}, total size $(du -sh "${backupdir}/${backupname}.${compressext}" | awk '{print $1}')"
|
|
|
+ fn_script_log_pass "Backup created: ${backupname}.${compressext}, total size $(du -sh "${backupdir}/${backupname}.${compressext}" | awk '{print $1}')"
|
|
|
alert="backup"
|
|
|
alert.sh
|
|
|
fi
|
|
|
@@ -152,7 +176,7 @@ fn_backup_prune() {
|
|
|
# How many backups exceed maxbackups.
|
|
|
backupquotadiff=$((backupcount - maxbackups))
|
|
|
# How many backups exceed maxbackupdays.
|
|
|
- backupsoudatedcount=$(find "${backupdir}"/ -type f -name "*.tar.gz" -mtime +"${maxbackupdays}" | wc -l)
|
|
|
+ backupsoudatedcount=$(find "${backupdir}"/ -type f -name "*.tar.*" -mtime +"${maxbackupdays}" | wc -l)
|
|
|
# If anything can be cleared.
|
|
|
if [ "${backupquotadiff}" -gt "0" ] || [ "${backupsoudatedcount}" -gt "0" ]; then
|
|
|
fn_print_dots "Pruning"
|
|
|
@@ -167,7 +191,7 @@ fn_backup_prune() {
|
|
|
fn_print_dots "Pruning: Clearing ${backupquotadiff} backup(s)"
|
|
|
fn_script_log_info "Pruning: Clearing ${backupquotadiff} backup(s)"
|
|
|
# Clear backups over quota.
|
|
|
- find "${backupdir}"/ -type f -name "*.tar.gz" -printf '%T@ %p\n' | sort -rn | tail -${backupquotadiff} | cut -f2- -d" " | xargs rm
|
|
|
+ find "${backupdir}"/ -type f -name "*.tar.*" -printf '%T@ %p\n' | sort -rn | tail -${backupquotadiff} | cut -f2- -d" " | xargs rm
|
|
|
fn_print_ok_nl "Pruning: Clearing ${backupquotadiff} backup(s)"
|
|
|
fn_script_log_pass "Pruning: Cleared ${backupquotadiff} backup(s)"
|
|
|
# If maxbackupdays is used over maxbackups.
|
|
|
@@ -190,7 +214,7 @@ fn_backup_prune() {
|
|
|
fn_backup_relpath() {
|
|
|
# Written by CedarLUG as a "realpath --relative-to" alternative in bash.
|
|
|
# Populate an array of tokens initialized from the rootdir components.
|
|
|
- declare -a rdirtoks=($(readlink -f "${rootdir}" | sed "s/\// /g"))
|
|
|
+ mapfile -t rdirtoks < <(readlink -f "${rootdir}" | sed "s/\//\n/g")
|
|
|
if [ ${#rdirtoks[@]} -eq 0 ]; then
|
|
|
fn_print_fail_nl "Problem assessing rootdir during relative path assessment"
|
|
|
fn_script_log_fail "Problem assessing rootdir during relative path assessment: ${rootdir}"
|
|
|
@@ -198,7 +222,7 @@ fn_backup_relpath() {
|
|
|
fi
|
|
|
|
|
|
# Populate an array of tokens initialized from the backupdir components.
|
|
|
- declare -a bdirtoks=($(readlink -f "${backupdir}" | sed "s/\// /g"))
|
|
|
+ mapfile -t bdirtoks < <(readlink -f "${backupdir}" | sed "s/\//\n/g")
|
|
|
if [ ${#bdirtoks[@]} -eq 0 ]; then
|
|
|
fn_print_fail_nl "Problem assessing backupdir during relative path assessment"
|
|
|
fn_script_log_fail "Problem assessing backupdir during relative path assessment: ${rootdir}"
|
|
|
@@ -243,7 +267,7 @@ fn_backup_start_server() {
|
|
|
fn_print_dots ""
|
|
|
check.sh
|
|
|
core_logs.sh
|
|
|
-
|
|
|
+fn_select_compression
|
|
|
fn_backup_check_lockfile
|
|
|
fn_backup_init
|
|
|
fn_backup_stop_server
|