#!/bin/sh # # Remove old incremtal inc of all jails # Usage: rm # # shellcheck source=./config LIBDIR="$(dirname $0)" && . "${LIBDIR}/includes" relative_date() { format=$(echo $1 | cut -d'.' -f1) time_jump=$(echo $1 | cut -d'.' -f2) reference_date=$(date "${format}") past_date=$(date --date "${reference_date} ${time_jump}" +"%Y-%m-%d") echo ${past_date} } delete_inc_btrfs() { jail_name=$1 inc_name=$2 inc_path=$(inc_path "${jail_name}" "${inc_name}") start=$(current_time) if dry_run; then echo "[dry-run] delete btrfs subvolume ${inc_path}" else /bin/btrfs subvolume delete "${inc_path}" | debug fi end=$(current_time) notice "${jail_name} : ${inc_name} inc deleted [${start}/${end}]" } delete_inc_ext() { jail_name=$1 inc_name=$2 inc_path=$(inc_path "${jail_name}" "${inc_name}") lock_file="${LOCKDIR}/rm-${jail_name}.lock" if [ -f "${lock_file}" ]; then warning "${jail_name} : skipping ${inc_name}, it is already being deleted." else ( mkdir --parents "${LOCKDIR}" && touch "${lock_file}" || error "Failed to acquire lock file '${lock_file}'" empty=$(mktemp -d --suffix ".${$}" bkctld.XXXXX) # shellcheck disable=SC2064 trap "rm -f ${lock_file}; rmdir ${empty}" 0 if dry_run; then echo "[dry-run] delete ${inc_path} with rsync from ${empty}" else rsync --archive --delete "${empty}/" "${inc_path}/" fi rmdir "${inc_path}/" end=$(current_time) notice "${jail_name} : ${inc_name} inc deleted [${start}/${end}]" ) fi } for jail_name in $(jails_list); do incs_policy_file=$(jail_incs_policy_file ${jail_name}) # If not incs policy if found, we don't remove incs if [ -n "${incs_policy_file}" ]; then incs_policy_keep_file="$(mktemp)" # shellcheck disable=SC2064 trap "rm ${incs_policy_keep_file}" 0 # loop for each line in jail configuration for incs_policy_line in $(cat ${incs_policy_file} | grep "^\+"); do # inc date in ISO format incs_policy_date=$(relative_date ${incs_policy_line}) echo ${incs_policy_date} >> "${incs_policy_keep_file}" done # shellcheck disable=SC2046 incs_to_delete=$(echo $(incs_list "${jail_name}") | grep -v -f "${incs_policy_keep_file}") for inc_name in ${incs_to_delete}; do inc_path=$(inc_path "${jail_name}" "${inc_name}") if is_btrfs "${inc_path}"; then delete_inc_btrfs "${jail_name}" "${inc_name}" else delete_inc_ext "${jail_name}" "${inc_name}" fi done fi done