diff --git a/script/host/zfs/snapshot.sh b/script/host/zfs/snapshot.sh index 33d4848..345aa31 100755 --- a/script/host/zfs/snapshot.sh +++ b/script/host/zfs/snapshot.sh @@ -1,31 +1,22 @@ #!/bin/bash source /cis/core/base.module.sh +base.loadModule composition +base.loadModule print function cleanup() { - local _MIN_MIN _HOUR_MIN _DAY_MIN _MONTH_MIN - _MINUTELY_MIN=5 - _HOURLY_MIN=24 - _DAILY_MIN=7 - _MONTHLY_MIN=36 - readonly _MIN_MIN _HOUR_MIN _DAY_MIN _MONTH_MIN + local _KEEP_MINUTELY _KEEP_HOURLY _KEEP_DAILY _KEEP_MONTHLY + _KEEP_MINUTELY=5 + _KEEP_HOURLY=24 + _KEEP_DAILY=7 + _KEEP_MONTHLY=36 + readonly _KEEP_MINUTELY _KEEP_HOURLY _KEEP_DAILY _KEEP_MONTHLY - local _COMPOSITION _CURRENT_HOST _ZFS_BRANCH _ZFS - ls -d "${CIS[COMPOSITIONS]:?"Missing CIS_COMPOSITIONS"}"*/ | while read -r _COMPOSITION - do - _COMPOSITION="${_COMPOSITION%/}" #Remove tailing '/' if exists - _COMPOSITION="${_COMPOSITION##*/}" #Remove leading parts - _CURRENT_HOST="$(cat "${CIS[COMPOSITIONS]}${_COMPOSITION}/current-host" 2> /dev/null)" - _ZFS_BRANCH="$(cat "${CIS[COMPOSITIONS]}${_COMPOSITION}/zfs-branch" 2> /dev/null)" - _ZFS_BRANCH="${_ZFS_BRANCH%/}" #Remove tailing '/' if exists - - if [ "${_CURRENT_HOST}" == "${CIS[HOST]:?"Missing CIS_HOST"}" ]; then - _ZFS="$(zfs list -H -o name "${_ZFS_BRANCH:-"zpool1/persistent"}/${_COMPOSITION}" 2> /dev/null)" - else - _ZFS="$(zfs list -H -o name "${_ZFS_BRANCH:-"zpool1/persistent"}/${_COMPOSITION}-BACKUP" 2> /dev/null)" - fi + local _COMPOSITION _ZFS + composition.printAll | while read -r _COMPOSITION; do + _ZFS="$(composition.printZFS "${_COMPOSITION}")" [ -n "${_ZFS}" ] \ && printf -- "Cleaning snapshots of: '%b'\n" "${_ZFS}" \ && local _LIST=( $(zfs list -t snap -H -o name -S creation "${_ZFS}" | grep -F '@SNAP' ) ) @@ -42,38 +33,38 @@ function cleanup() { case "${_SNAPSHOT}" in *"@SNAPMINUTELY_"*) ((_COUNT_MINUTELY++)) - if [ ${_COUNT_MINUTELY} -gt ${_MINUTELY_MIN} ]; then - printf -- " - remove snapshot (%s): '@%s' ... " "${_COUNT_MINUTELY}" "${_SNAPSHOT#*@}" >&2 + if [ ${_COUNT_MINUTELY} -gt ${_KEEP_MINUTELY} ]; then + print.message " - remove snapshot (${_COUNT_MINUTELY}): '@${_SNAPSHOT#*@}' ... " zfs destroy "${_SNAPSHOT}" \ - && printf -- '(done)\n' \ - || printf -- '(FAIL)\n' + && print.done \ + || print.fail fi ;; *"@SNAPHOURLY_"*) ((_COUNT_HOURLY++)) - if [ ${_COUNT_HOURLY} -gt ${_HOURLY_MIN} ]; then - printf -- " - remove snapshot (%s): '@%s' ... " "${_COUNT_HOURLY}" "${_SNAPSHOT#*@}" >&2 + if [ ${_COUNT_HOURLY} -gt ${_KEEP_HOURLY} ]; then + print.message " - remove snapshot (${_COUNT_HOURLY}): '@${_SNAPSHOT#*@}' ... " zfs destroy "${_SNAPSHOT}" \ - && printf -- '(done)\n' \ - || printf -- '(FAIL)\n' + && print.done \ + || print.fail fi ;; *"@SNAPDAILY_"*) ((_COUNT_DAILY++)) - if [ ${_COUNT_DAILY} -gt ${_DAILY_MIN} ]; then - printf -- " - remove snapshot (%s): '@%s' ... " "${_COUNT_DAILY}" "${_SNAPSHOT#*@}" >&2 + if [ ${_COUNT_DAILY} -gt ${_KEEP_DAILY} ]; then + print.message " - remove snapshot (${_COUNT_DAILY}): '@${_SNAPSHOT#*@}' ... " zfs destroy "${_SNAPSHOT}" \ - && printf -- '(done)\n' \ - || printf -- '(FAIL)\n' + && print.done \ + || print.fail fi ;; *"@SNAPMONTHLY_"*) ((_COUNT_MONTHLY++)) - if [ ${_COUNT_MONTHLY} -gt ${_MONTHLY_MIN} ]; then - printf -- " - remove snapshot ($s): '@%s' ... " "${_COUNT_MONTHLY}" "${_SNAPSHOT#*@}" >&2 + if [ ${_COUNT_MONTHLY} -gt ${_KEEP_MONTHLY} ]; then + print.message " - remove snapshot (${_COUNT_MONTHLY}): '@${_SNAPSHOT#*@}' ... " zfs destroy "${_SNAPSHOT}" \ - && printf -- '(done)\n' \ - || printf -- '(FAIL)\n' + && print.done \ + || print.fail fi ;; esac @@ -91,45 +82,31 @@ function snapshot() { [ ! -d /tmp/locks ] && mkdir /tmp/locks - local _COMPOSITION _CURRENT_HOST _MODE _ZFS_BRANCH _ZFS - ls -d "${CIS[COMPOSITIONS]:?"Missing CIS_COMPOSITIONS"}"*/ | while read -r _COMPOSITION - do - _COMPOSITION="${_COMPOSITION%/}" #Remove tailing '/' if exists - _COMPOSITION="${_COMPOSITION##*/}" #Remove leading parts - _CURRENT_HOST="$(cat "${CIS[COMPOSITIONS]}${_COMPOSITION}/current-host" 2> /dev/null)" + local _COMPOSITION _MODE _ZFS + composition.printAllRunningOnThisHost | while read -r _COMPOSITION; do _MODE="${1:-"$(cat "${CIS[COMPOSITIONS]}${_COMPOSITION}/snapshot-mode" 2> /dev/null)"}" _MODE="${_MODE:-"HOURLY"}" - _ZFS_BRANCH="$(cat "${CIS[COMPOSITIONS]}${_COMPOSITION}/zfs-branch" 2> /dev/null)" - _ZFS_BRANCH="${_ZFS_BRANCH%/}" #Remove tailing '/' if exists - [ "${_CURRENT_HOST}" != "${CIS[HOST]:?"Missing CIS_HOST"}" ] \ - && printf -- "ZFS will be skipped, because this host '%b' is not running the composition:\n" "${CIS[HOST]}" >&2 \ - && printf -- " - Composition : %b\n" "${_COMPOSITION}" >&2 \ - && printf -- " - Current host: %b\n" "${_CURRENT_HOST}" >&2 \ - && continue + _ZFS="$(composition.printZFS "${_COMPOSITION}")" + if [ -n "${_ZFS}" ]; then + ( + flock -n 9 || return 1 - _ZFS="$(zfs list -H -o name "${_ZFS_BRANCH:-"zpool1/persistent"}/${_COMPOSITION}" 2> /dev/null)" - [ -z "${_ZFS}" ] \ - && printf -- "FAILURE - ZFS not found: %b/%b\n" "${_ZFS_BRANCH:-"zpool1/persistent"}" "${_COMPOSITION}" >&2 \ - && continue + case "${_MODE:?"Missing MODE"}" in + MINUTELY) zfs snapshot "${_ZFS}@SNAPMINUTELY_${_MINUTE}" 2> /dev/null \ + && print.success "Snapshot created: '${_ZFS}@SNAPMINUTELY_${_MINUTE}'" ;& # Forces execution to continue in the next block + HOURLY) zfs snapshot "${_ZFS}@SNAPHOURLY_${_HOUR}" 2> /dev/null \ + && print.success "Snapshot created: '${_ZFS}@SNAPHOURLY_${_HOUR}'" ;& + DAILY) zfs snapshot "${_ZFS}@SNAPDAILY_${_DAY}" 2> /dev/null \ + && print.success "Snapshot created: '${_ZFS}@SNAPDAILY_${_DAY}'" ;& + MONTHLY) zfs snapshot "${_ZFS}@SNAPMONTHLY_${_MONTH}" 2> /dev/null \ + && print.success "Snapshot created: '${_ZFS}@SNAPMONTHLY_${_MONTH}'" ;; + NONE) ;; + *) print.warn "No valid mode to create snapshots: '${_MODE}'" ;; + esac - ( - flock -n 9 || return 1 - - case "${_MODE:?"Missing MODE"}" in - MINUTELY) zfs snapshot "${_ZFS}@SNAPMINUTELY_${_MINUTE}" 2> /dev/null \ - && echo "Snapshot created: '${_ZFS}@SNAPMINUTELY_${_MINUTE}'" >&2 ;& # Forces execution to continue in the next block - HOURLY) zfs snapshot "${_ZFS}@SNAPHOURLY_${_HOUR}" 2> /dev/null \ - && echo "Snapshot created: '${_ZFS}@SNAPHOURLY_${_HOUR}'" >&2 ;& - DAILY) zfs snapshot "${_ZFS}@SNAPDAILY_${_DAY}" 2> /dev/null \ - && echo "Snapshot created: '${_ZFS}@SNAPDAILY_${_DAY}'" >&2 ;& - MONTHLY) zfs snapshot "${_ZFS}@SNAPMONTHLY_${_MONTH}" 2> /dev/null \ - && echo "Snapshot created: '${_ZFS}@SNAPMONTHLY_${_MONTH}'" >&2 ;; - NONE) ;; - *) echo "No valid mode to create snapshots: '${_MODE}'" >&2 ;; - esac - - ) 9>>/tmp/locks/snapshot.${_COMPOSITION}.lock + ) 9>>/tmp/locks/snapshot.${_COMPOSITION}.lock + fi done }