#!/bin/sh
# devel.a0fs.net: zfsbackup.bin.main - v0.1 by awgur
# ---
# Файл, содержащий скрипт управления системой резервного копирования

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"   # Директория с библиотеками

. "${dir_lib}/main.sh"

usage () {
	# Вывод справки по аргементам скрипта
	cat << EOF
$0 ZFS_Dataset_name команда [аргументы]
  Настройка резервного копирования наборов данных (dataset) ZFS
  Комманды:
    enable  : Включение копий для текущего набора данных
            : и вложенных в него наборов, если у них эта настройка
            : не заданна отдельно
    disable : Отключение резервного копирования для набора данных ZFS
            : и вложенных в него наборов, если у них эта насройка
            : не заданна отдельно
    set backup_type number : Установить количество хранимых копий для
            : заданного типа копирования.
            : Поддерживаются типы (backup_type):
            :  - h - почасовое копирование, делается раз в час, в основном
            :        в начале каждого часа
            :  - d - ежедневное копирование, делается раз в день, в основном
            :        в 00 часов 00 минут по локальному времени системы
            : number - Число резервных копий - неотрицательное целое число.
            :        Если число равно 0 данный тип резервного копирования
            :        для набора отключается.
EOF
}

err_usr () {
	# Возбуждение исключения, с аварийным завершением работы скрипта
	# и выдачей сообщения на терминал.
	# Аргументы:
	#  [exit_code] : Код завершения, по-умолчанию 1
	#  message     : Сообщение пользователю
	local exit_code="$1"
	local msg="$2"

	if ! [ "$msg" ] ; then
		msg="$exit_code"
		exit_code=1
	fi

	echo "ERROR: $msg"
	usage
	exit "${exit_code}"
}

cmd_eanble() {
	# Обработчик комманды включения резервного попирования
	zfs_setProp "$arg_ds" "enable" "yes"
}

cmd_disable() {
	# Обработчик комманды отключения резервного попирования
	zfs_setProp "$arg_ds" "enable" "no"
}

cmd_set() {
	# Обработчик комманды на установку количества резервных копий
	# аргументы:
	#  backup_type : Тип резервного копирования
	#  count       : Коилчество копий, целое положительное число
	local backupType
	case "$1" in
		d )
			backupType="${sys_backupType_d}"
		;;
		h )
			backupType="${sys_backupType_h}"
		;;
		* )
			err_usr 2 "Не вреный тип резервного копирования, для которого устанавливается значение: '$1'"
		;;
	esac

	if ! svc_isNum "$2" ; then
		err_usr 3 "Число резервных копий не является неотрицательным числом: '$2'"
	fi

	zfs_setProp "$arg_ds" "$backupType" $2
}

# ===
# Проверяем в порядке ли аргументы
# - Присутствует ли набор данных
if ! zfs list -Ho name "$1" > /dev/null 2>&1 ; then
	err_usr "Набор данных '$1' не существует"
fi
arg_ds="$1"
shift

# - Проверка комманд
arg_cmd="$1"
shift

case "$arg_cmd" in
	enable )
		cmd_eanble
	;;
	disable )
		cmd_disable
	;;
	set )
		cmd_set "$@"
	;;
	* )
		err_usr 4 "Комманда не распознана: '$cmd'"
	;;
esac



