#!/bin/sh
# devel.a0fs.net: zfsbackup.bin.cron - v0.1 by awgur
# ---
# Файл должен запускаться через crond. Здесь содержится вся логика,
# выполняющая функции резервирования

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
export PATH

dir_root="$(dirname "$(dirname "$(readlink -f "$0")")")"
dir_lib="${dir_root}/lib"   # Директория с библиотеками

arg_timeMark="$(date '+%Y%m%d-%H%M%S')"
arg_timeDate="$(date '+%Y%m%d')"
arg_timeHour="$(date '+%H')"

sys_backupCnt_d=90
sys_backupCnt_h=48

. "${dir_lib}/main.sh"

worker () {
    # Исполнительная процедура. Содержит логику работы с определённым набором данных ZFS
    # Выполняя функции обработки
    local ds="$1"
    local lastSnap       # Последняя резервная копия
    local cnt            # Сконфигурированое количество резервных копий
    local cnt_default    # Количество резервных копий по умолчанию
    local backupType     # Тип резервного копирования
    local curSnap        # Имя текущего снимка
    local zfs_ret        # Код возврата комманды zfs
    local lp="cron.worker():"   # префикс для системы логирования,
                                # выносим отдельно, так как логов будем писать много
    if ! [ "$ds" ] ; then
        return 1
    fi

    if zfs_isBackup "$ds" ; then
        log "$lp Working with '$ds'"
        lastSnap=$(zfs_getLastSnap "$ds")
        if ! svc_date_isToday "${lastSnap}" ; then
            backupType="${sys_backupType_d}"
            cnt_default="${sys_backupCnt_d}"
        elif ! svc_date_isThisHour "${lastSnap}" ; then
            backupType="${sys_backupType_h}"
            cnt_default="${sys_backupCnt_h}"
        else
            return 0
        fi

        cnt=$(zfs_getProp "$ds" "${backupType}")
        if ! [ "$cnt" ] ; then
            cnt="${cnt_default}"
        fi

        if [ "$cnt" -eq 0 -a "${backupType}" = "${sys_backupType_d}" ] ; then
            backupType="${sys_backupType_h}"
            cnt=$(zfs_getProp "$ds" "${sys_backupType_h}")
            if ! [ "$cnt" ] ; then
                cnt="${sys_backupCnt_h}"
            fi
        fi


        if [ "$cnt" -gt 0 ]; then
            curSnap="$(svc_makeName "$ds" "${backupType}" "${sys_date_now}")"
            log "$lp Make snapshot '$curSnap'"
            {
                zfs snapshot "${curSnap}" 2>&1
                zfs_ret=$?
                if [ "$zfs_ret" -eq 0 ] ; then
                    zfs_clean "$ds" "${backupType}" "${cnt}"
                else
                    log_err "$lp Make snapshot '$curSnap' fail with return code '$zfs_ret'"
                fi
            } 2>&1 | log_err
        fi
    fi
}

zfs list -Ho name | while read fs ; do worker "$fs"; done