PKG_DIR="/var/packages/${SYNOPKG_PKGNAME}"
CCC_PKG_TOOL="/var/packages/Virtualization/target/bin/synoccctool"
CCC_GUEST_TOOL="/var/packages/Virtualization/target/bin/synocccguest"
SYNO_NET_TOOL="/usr/syno/sbin/synonet"
SYNO_DR_CRED_TOOL="/usr/syno/synodr/sbin/synodrcred"
PKG_TAG="VirtualMachineManager"
PKG_APP_LINK_PATH="/usr/syno/synoman/webman/3rdparty/${SYNOPKG_PKGNAME}"
PKG_UPSTART_JOB_PREFIX="pkg-"
NGINX_CONF_SRC="/var/packages/Virtualization/target/etc/nginx/conf.d/dsm.Virtualization.conf"
NGINX_CONF_DST="/usr/local/etc/nginx/conf.d/dsm.Virtualization.conf"
UDEV_RULES_PATH="/usr/lib/udev/rules.d"
CCC_ETC_PATH="/usr/syno/etc/ccc"
DS_VER_PATH="/etc.defaults/VERSION"
SESS_CUR_USR="/usr/syno/etc/private/session/current.users"

SaveSPK()
{
	if [ -f ${SYNOPKG_TEMP_SPKFILE} ]; then
		cp -f "${SYNOPKG_TEMP_SPKFILE}" "${SYNOPKG_PKGDEST}/virtualization-${SYNOPKG_PKGVER}.spk"
	fi
}

RegisterUsedVolume()
{
	if [ -f ${CCC_PKG_TOOL} ]; then
		${CCC_PKG_TOOL} --used-vol-register-pkg-path
	fi
}

InstallNginxConf()
{
	if [ -f ${NGINX_CONF_SRC} ]; then
		cp -f "${NGINX_CONF_SRC}" "${NGINX_CONF_DST}"
	fi
}

UninstallNginxConf()
{
	if [ -f "${NGINX_CONF_DST}" ]; then
		rm -f "${NGINX_CONF_DST}"
	fi
}

LinkLibvirt()
{
	# libvirt's config need fixed location, so link path from package to root system
	UnlinkLibvirt

	# etc
	cp -rf ${PKG_DIR}/target/etc/libvirt ${PKG_DIR}/etc/
	ln -sf ${PKG_DIR}/etc/libvirt /etc/
	mkdir -p /etc/sasl2
	ln -sf ${PKG_DIR}/target/etc/sasl2/libvirt.conf /etc/sasl2

	# lib
	ln -s ${PKG_DIR}/target/lib/libvirt /lib/
	ln -s ${PKG_DIR}/target/lib/qemu /lib/

	# share
	ln -s ${PKG_DIR}/target/usr/share/libvirt /usr/share/
	ln -s ${PKG_DIR}/target/usr/share/qemu /usr/share/

	# bin
	mkdir -p /usr/local/bin
	ln -s ${PKG_DIR}/target/usr/local/bin/libvirtd /usr/local/bin
	ln -s ${PKG_DIR}/target/usr/local/bin/virsh /usr/local/bin
	ln -s ${PKG_DIR}/target/usr/local/bin/virt-host-validate /usr/local/bin
	ln -s ${PKG_DIR}/target/usr/local/bin/virt-pki-validate /usr/local/bin
	ln -s ${PKG_DIR}/target/usr/local/bin/virt-xml-validate /usr/local/bin
	ln -s ${PKG_DIR}/target/usr/local/bin/virtlockd /usr/local/bin
	ln -s ${PKG_DIR}/target/bin/qemu-system-x86_64 /usr/local/bin
	ln -s ${PKG_DIR}/target/bin/etcdctl /usr/local/bin
	ln -s ${PKG_DIR}/target/bin/synoetcd /usr/local/bin

	# var
	mkdir -p /var/log/libvirt
	mkdir -p /var/log/libvirt/qemu
}

UnlinkLibvirt()
{
	# etc
	rm -rf /etc/libvirt
	rm -rf ${PKG_DIR}/etc/libvirt
	/bin/rm -f /etc/sasl2/libvirt.conf
	/bin/rmdir --ignore-fail-on-non-empty /etc/sasl2

	# lib
	rm -rf /lib/libvirt
	rm -rf /lib/qemu

	# share
	rm -rf /usr/share/libvirt
	rm -rf /usr/share/qemu

	# bin
	rm -f /usr/local/bin/libvirtd
	rm -f /usr/local/bin/virsh
	rm -f /usr/local/bin/virt-host-validate
	rm -f /usr/local/bin/virt-pki-validate
	rm -f /usr/local/bin/virt-xml-validate
	rm -f /usr/local/bin/virtlockd
	rm -f /usr/local/bin/qemu-system-x86_64
	rm -f /usr/local/bin/etcdctl
	rm -f /usr/local/bin/synoetcd
}

CheckGuestRunning()
{
	local isAnyGuestRunning=0

	if ! [ -x "${CCC_GUEST_TOOL}" ]; then
		logger -p err -t "${PKG_TAG}" "Failed to get vm status"
		return 0
	fi

	# return 1 if any running guests using repo on this host or any guests running on this host, 0 otherwise
	${CCC_GUEST_TOOL} -s > /dev/null 2>&1
	return $?
}

InstallUdevRules()
{
	if [ -d "${PKG_DIR}/target/${UDEV_RULES_PATH}" ]; then
		cp -a ${PKG_DIR}/target/${UDEV_RULES_PATH}/. "${UDEV_RULES_PATH}"
	fi
}

RemoveUdevRules()
{
	rm -f "${UDEV_RULES_PATH}/55-usb-virtualization-unplug.rules"
}

ForceRemoveCluster()
{
	# save current IFS
	local saveIFS=$IFS
	local servs="pkg-synovncrelayd pkg-synohostcmdd pkg-synohostcommd pkg-synocccd pkg-libvirtd pkg-etcd_hyper pkg-etcd pkg-synocccstated"

	IFS=$'\n'
	for ovsIf in $(/bin/ovs-vsctl list-br); do
		${SYNO_NET_TOOL} --set_block ${ovsIf} virtualization false
	done
	IFS=$saveIFS

	synosetkeyvalue ${CCC_ETC_PATH}/cccinfo.conf runccc no

	majorVer=$(synogetkeyvalue ${DS_VER_PATH} majorversion)
	for serv in ${servs}; do
		if [ ${majorVer} -le 6 ]; then
			initctl stop ${serv}
		else
			systemctl stop ${serv}
		fi
	done

	/bin/rm -rf ${CCC_ETC_PATH}
	/bin/rm -rf ${CCC_ETC_PATH}.backup.txz
	/bin/rm -rf /tmp/ccc.stated.data
	/bin/rm -rf /tmp/ccc.stated.index
	/bin/rm -rf /tmp/synohostvmcomm
	/bin/rm -rf /tmp/ccc.memsize.allocation.record
	/bin/rm -rf /tmp/ccc.cpucore.allocation.record
	/bin/rm -rf /tmp/ccc

	for sid in $(/bin/cat ${SESS_CUR_USR} | jq -r "select(.name==\"Virtualization\")|.id"); do
		${SYNO_DR_CRED_TOOL} session delete ${sid}
	done
}
