#!/bin/bash

set -eu
# __SILENT=TRUE
. /opt/fox_utils/crab_sys.sh
[ "${1:---help}" = "--help" ] && sys::usage "$@"
### --help Info: migrate_out это миграция(через бекап) в другую ноду
### --help Info: потом там надо вызывать migrate_in
### --help Usage: vz_cli|kvm_cli migrate $VM_NAME $DST_NODE [--skip-check_node]
### --help Example:
echo 'TODO2 разбить файл на vm и vz части тк ssh отсюда делать нельзя'
sys::arg_parse "$@"
. /opt/fox_utils/fox_conf vm get "$ARG_1"
declare VM_CTID
ARG_DST_NODE="${ARG_2}"
if [ -f "/opt/fox_conf/node/${ARG_DST_NODE}/node.conf" ]; then
	ARG_DST_NODE=$( . "/opt/fox_conf/node/${ARG_DST_NODE}/node.conf"; echo $NODE_IP; )
fi

status='FALSE'
VM_STATUS='FALSE'
if [ "$VM_TYPE" = "vz" ] ; then
	VZ_PLOOP_NAME="$VM_NAME"
	PLOOP_PRIVATE="$VM_DISK"
	status="$(vzctl status "$VZ_PLOOP_NAME")"
	if [[ "$status" == *' running'* ]]; then
		VM_STATUS=running
	else
		VM_STATUS=stopped
	fi
elif [ "$VM_TYPE" = "kvm" ]; then
	VZ_PLOOP_NAME="kvm-$VM_NAME"
	PLOOP_PRIVATE="${VM_DISK/root/private}"
	dominfo=$( virsh dominfo "$VM_NAME" ) || true
	if [[ "$dominfo" == *running* ]]; then
		VM_STATUS=running
	fi
else
	echo "type=$VM_TYPE not support"
	exit 255
fi

SSH_OPT=""
if [ -n "${ARG_I:-}" ]; then
	SSH_OPT="-i${ARG_I} "
fi
SWAP_BACKUP="/vz/backup/${VZ_PLOOP_NAME}"

__backup(){
	/opt/fox_utils/vm backup "$VM_NAME" "$ARG_DST_NODE" --online "$@"
	if [ "$VM_STATUS" = running ]; then
		/opt/fox_utils/vm stop "$VM_NAME"
		/opt/fox_utils/vm backup "$VM_NAME" "$ARG_DST_NODE" "$SSH_OPT"
	fi
	return 0
}
__mv_swap(){
	mkdir -p "/vz/.trash/"
	[ -d "/vz/backup/${VZ_PLOOP_NAME}" ] \
		&& mv -f "/vz/backup/${VZ_PLOOP_NAME}" "/vz/.trash/${VZ_PLOOP_NAME}.$(date +%s)"
# текущую виртуалку поместим в /vz/backup/ чтобы можно было делать обратную миграцию
	mkdir -p "$SWAP_BACKUP"
	rsync -a --delete "$VM_DIR/" "$SWAP_BACKUP/conf/"
	mv -f $PLOOP_PRIVATE "$SWAP_BACKUP/disk"
	mkdir -p /var/tmp/vz_migrate_out/
	mv -f "/etc/vz/conf/${VM_CTID}.conf" "/var/tmp/vz_migrate_out/${VZ_PLOOP_NAME}_ct.conf.$(date +%s)"
	if [ "$VM_TYPE" = "kvm" ]; then
		cp -a "/etc/libvirt/qemu/${VM_NAME}.xml" "/var/tmp/vz_migrate_out/${VM_NAME}.xml.$(date +%s)"
		virsh undefine "$VM_NAME"
	fi
	return 0
}
__mv_bk_log(){
	# решено не делать тк в экстренных ситуациях только мешает
	# это сделает ближайший обратный бекап
	return 0
}

__mv_bk_meta(){
	local f
	rsync -v --progress -e "ssh $SSH_OPT" --delete -a \
		"$ARG_DST_NODE:/vz/backup/${VZ_PLOOP_NAME}/disk/.BMAP" "$SWAP_BACKUP/disk/"
	rsync -v --progress -e "ssh $SSH_OPT" --delete -a \
		"$ARG_DST_NODE:/vz/backup/${VZ_PLOOP_NAME}/disk/root.hdd/.BMAP" "$SWAP_BACKUP/disk/root.hdd/"
	for f in $SWAP_BACKUP/disk/.BMAP/*.bmap $SWAP_BACKUP/disk/root.hdd/.BMAP/*.bmap; do
		touch "$f"
		f="${f//.bmap/}"
		[ -f "${f}.src_modify" ] && mv -f "${f}.src_modify" "/${f}.src_modify_tmp"
		[ -f "${f}.dst_modify" ] && mv -f "${f}.dst_modify" "/${f}.src_modify"
		[ -f "${f}.src_modify_tmp" ] && mv -f "${f}.src_modify_tmp" "${f}.dst_modify"
	done
	return 0
}
__backup "$@"
__mv_swap
__mv_bk_meta
rm -rf --one-file-system "$VM_DIR"
exit 0
