#!/bin/bash

set -eu
. /opt/fox_utils/crab_sys.sh
. /opt/fox_vz7/vz7_env \
	|| . /opt/fox_vz/vz_env
[ "${1:---help}" = "--help" ] && sys::usage "$@"
### --help Info: stop vz
### --help Usage: fox_vz stop $VM_NAME
### --help Example:
sys::arg_parse "$@"
SRC_VM="$ARG_1"
DST_NODE="$ARG_2"
DST_NODE="$( . "/opt/fox_conf/node/${DST_NODE}/node.conf"; echo "$NODE_IP"; )"

. /opt/fox_utils/fox_conf vm get "$SRC_VM"

VM_STATUS=

if [ "$VM_TYPE" = "vz" ]; then
	PLOOP_NAME="$VM_NAME"
	PLOOP_PRIVATE="$VM_DISK"
	PLOOP_ROOTFS="/vz/root/${VM_CTID}"
	status="$(vzctl status $PLOOP_NAME)"
	if [[ "$status" == *' running'* ]]; then
		VM_STATUS=running
	fi
elif [ "$VM_TYPE" = "vz7" ]; then
	PLOOP_NAME="$VM_NAME"
	PLOOP_PRIVATE="$VM_DISK"
	PLOOP_ROOTFS="/vz/root/${VM_UUID}"
	status="$(vzctl status $PLOOP_NAME)"
	if [[ "$status" == *' running'* ]]; then
		VM_STATUS=running
	fi
elif [ "$VM_TYPE" = "kvm" ]; then
	PLOOP_NAME="kvm-$VM_NAME"
	PLOOP_PRIVATE="${VM_DISK/root/private}"
	PLOOP_ROOTFS="/vz/root/${VM_CTID}"
	dominfo=$( virsh dominfo "$VM_NAME" ) || true
	if [[ "$dominfo" == *running* ]]; then
		VM_STATUS=running
		echo "LOG_ERROR остановите kvm"
		exit 1
	fi
fi


if [[ "${ARG_ONLINE:-}" != TRUE && "$VM_STATUS" = 'running' ]]; then
	/opt/fox_utils/vm stop "$SRC_VM"
fi

ploop_status="$(vzctl status "$PLOOP_NAME")"
if [ "$ploop_status" != 'mount' ]; then
	vzctl mount "$PLOOP_NAME"
fi

ploop_status="$(vzctl status "$PLOOP_NAME")"
if [[ "$ploop_status" != *' mount'* ]]; then
	exit 1
fi

DST_VM="${SRC_VM}-NEW"
__rsync(){
	# --sparse и --inplace нужно передать аргументом.
	# Т.к. --sparse нужно использовать только при первом копировании, а потом --inplace
	rsync -avP ${1:-} ${2:-} --compress-level=1 --numeric-ids --one-file-system --hard-links \
		--xattrs --acls --delete \
		"${PLOOP_ROOTFS}/" "$DST_NODE:/opt/fox_conf/vm/$DST_VM/rootfs/" || return 1
	return 0
}
# tar в 2 раза быстрее, но сложно сделать повторную попытку
# set -o pipefail
# tar --numeric-owner --xattrs -vc -C "/opt/fox_conf/vm/$SRC_VM/rootfs" ./ \
#	| lzop -1 -c | /opt/fox_utils/crab_ssh "$DST_NODE" \
#	"lzop -d -c | tar --numeric-owner --xattrs -x -C /opt/fox_conf/vm/$DST_VM/rootfs/"
# set +o pipefail

__rsync -z --sparse \
	|| __rsync --inplace

/opt/fox_utils/vm stop "$SRC_VM"
vzctl mount "$PLOOP_NAME"
ploop_status="$(vzctl status "$PLOOP_NAME")"
if [[ "$ploop_status" != *' mount'* ]]; then
	exit 1
fi

__rsync --inplace

VM_NODE_BACKUP="$( . "/opt/fox_conf/node/${VM_NODE_BACKUP}/node.conf"; echo "$NODE_IP"; )"
sec="$(date +%s)"
/opt/fox_utils/crab_ssh "$VM_NODE_BACKUP" "test -d /vz/backup/$SRC_VM && \
	mv -f \"/vz/backup/$SRC_VM\" \"/vz/.trash/${SRC_VM}.migrated.$sec\"|| exit 0"
vzctl umount "$PLOOP_NAME"
vm remove "$SRC_VM"

exit 0
