#!/bin/bash
set -eu
. /opt/fox_utils/crab_sys.sh
[ "${1:-}" = "--help" ] && sys::usage "$@"
### --help Info: info по vz
### --help Usage:
### --help Example:
sys::arg_parse "$@"

if /opt/fox_utils/fox_conf vm exists "$ARG_1"; then
	. /opt/fox_utils/fox_conf vm get "$ARG_1"

	if [ -z "${VM_NODE_BACKUP:-}" ]; then
		echo 'LOG_INFO Не выбрана нода для бекапа' >&2
		exit 0
	fi
	if [ "$VM_NODE_BACKUP" = "FALSE" ]; then
		echo 'LOG_INFO Бекап отключен' >&2
		exit 0
	fi

	BACKUP_SERVER="${VM_NODE_BACKUP}"
	if [ -f "/opt/fox_conf/node/${VM_NODE_BACKUP}/node.conf" ]; then
		BACKUP_SERVER=$( . "/opt/fox_conf/node/${VM_NODE_BACKUP}/node.conf"; echo $NODE_IP; )
	fi

	if [ "$VM_TYPE" = "vz" ]; then
		PLOOP_NAME="$VM_NAME"
	elif [ "$VM_TYPE" = "vz7" ]; then
		PLOOP_NAME="$VM_NAME"
	elif [ "$VM_TYPE" = "kvm" ]; then
		PLOOP_NAME="kvm-$VM_NAME"
	fi
elif [[ -d /vz/backup/$ARG_1 ]]; then
	VM_NAME="$ARG_1"
	PLOOP_NAME="$VM_NAME"
	BACKUP_SERVER=
elif [[ -d /vz/backup/kvm-$ARG_1 ]]; then
	VM_NAME="$ARG_1"
	PLOOP_NAME="kvm-$VM_NAME"
	BACKUP_SERVER=
else
	echo "LOG_WARNING VM or Backup not found" >&2
	exit 0
fi

BK_VM_DIR_DST="/vz/backup/$PLOOP_NAME/disk"
declare -a shell_cmd

if [[ -n $BACKUP_SERVER ]]; then
	SSH_OPT='-oStrictHostKeyChecking=no -oBatchMode=yes '
	if [ -s "${VM_DIR}/backup_id_rsa" ]; then
		echo "TODO0 вернуть работу через ${VM_DIR}/backup_id_rsa" >&2
		# SSH_OPT="${SSH_OPT} -i${VM_DIR}/backup_id_rsa "
	fi
	SHELL_CMD=("/opt/fox_utils/crab_ssh" ${SSH_OPT} "${BACKUP_SERVER}")
else
	SHELL_CMD=(/bin/bash -c)
fi

list_snapshots() {
	local snap_list dt snap_size snapshot dt_human script
	script="
	for f in \$(ls $BK_VM_DIR_DST/root.hdd/ | grep \"root.hd[ds][.].*\"); do
		snap_create_file='0'
		for blog in \$(ls $BK_VM_DIR_DST/root.hdd/.BLOG/ | sort -n); do
			if [ -d \"$BK_VM_DIR_DST/root.hdd/.BLOG/\${blog}/\${f}\" ]; then
				snap_create_file=\"\${blog}\"
				break
			fi
		done
		# skip strongbash034
		snap_size=\$(du \"$BK_VM_DIR_DST/root.hdd/\${f}\" | cut -f 1)
		echo \"\$snap_create_file \$snap_size \$f\"
		# skip strongbash034
	done | sort -n"
	snap_list="$("${SHELL_CMD[@]}" "$script")"
	if [[ -n "$snap_list" ]]; then
		echo "$snap_list" | while read -r dt snap_size snapshot; do
			dt_human="$(date -d "@$dt" +%Y-%m-%d)"
			echo "$dt $dt_human $((snap_size/1024/1024))Gb $snapshot"
		done
	fi
	return 0
}

if [[ "${ARG_LIST_SNAPSHOTS:-}" == TRUE ]]; then
	list_snapshots
	exit 0
fi

bk_list="$("${SHELL_CMD[@]}" "[ -d $BK_VM_DIR_DST/.INFO ] && ls $BK_VM_DIR_DST/.INFO; exit 0")"
if [ "${ARG_LAST:-}" = TRUE ]; then
	# Выводим только последний бекап
	bk_list="$(echo "${bk_list}" | tail -n 1)"
fi
for bk in $bk_list; do
	echo "$bk $(date -d "@$bk" "+%Y-%m-%d %H:%M") ${BACKUP_SERVER}${BK_VM_DIR_DST}/.INFO/$bk"
done

exit 0
