#! /bin/bash

##- Clones an existing vServer into a new one
##: source destination ipaddress [size]
##+ source       Name of the vServer used as source for cloning
##+ destination  Name (and hostname of the new vServer
##+ ipaddress    Network address in [iface:]A.B.C.D[/BB] format
##+ size         Size of the created logical volume

[ "${__vsa_bindir}" ] || exec "$(dirname "$0")/vserver-admin" clone "$@"
[[ $# -lt 3 ]] && __vsa_usage_and_exit

__vsa_run_locked
__vsa_config "$1" src
__vsa_config "$2" dst


vnet=$(__vsa_guess_vnet "$3")
size=${4:-${dst_lvm_default_size}}


# List of files to copy from source to destination vServer configuration
# directory. If they do not exist in the source machine, they are silently
# ignored.
#
copy_etc_files=(
	nice
	cflags
	nflags
	personality
	capabilities
	bcapabilities
	ccapabilities
	ncapabilities

	apps/init/style
	apps/init/environment

	cgroup/name

	uts/machine

	ionice/class
	ionice/priority

	cpuset/name
	cpuset/cpus
	cpuset/mems
	cpuset/nocreate
	cpuset/cpu_exclusive
	cpuset/mems_exclusive
)


copy-whitelist-files ()
{
	local file
	for file in "${copy_etc_files[@]}" ; do
		[ -r "/etc/vservers/${dst_vserver}/${file}" ] && continue
		[ -r "/etc/vservers/${src_vserver}/${file}" ] || continue

		mkdir -p "$(dirname "/etc/vservers/${dst_vserver}/${file}")"
		cp "/etc/vservers/${src_vserver}/${file}" \
	 		 "/etc/vservers/${dst_vserver}/${file}"
	done
}


add-fstab-entry ()
{
	local entry="/dev/${dst_lvm_group}/${dst_lvm_volume}" # device
	entry="${entry} ${__vsa_vdir}/${dst_vserver}"         # mount point
	entry="${entry} ${dst_lvm_fstab_filesystem}"          # filesystem
	entry="${entry} ${dst_lvm_fstab_options} 0 3"         # options

	# Now put the entry in place
	echo "${entry}" >> "${dst_lvm_fstab}"
}


if [[ -d ${dst_fsroot} || -d ${__vsa_vdir}/${dst_vserver} ]] ; then
	__vsa_die "A vServer named '${dst_vserver}' already exists!"
fi


if [ "${dst_lvm_group}" ] ; then
	__vsa_do mkdir "${__vsa_vdir}/${dst_vserver}"
	__vsa_do lvcreate -L "${size}" -n "${dst_lvm_volume}" "${dst_lvm_group}"
	__vsa_do __vsa_wait_fs "/dev/${dst_lvm_group}/${dst_lvm_volume}"
	if [ "${dst_lvm_volume_create_hook}" ] ; then
		eval __vsa_do "${dst_lvm_volume_create_hook}"
	fi
	__vsa_do add-fstab-entry
	__vsa_do mount "${__vsa_vdir}/${dst_vserver}"
fi

__vsa_do vserver --silent "${dst_vserver}" build -m clone \
	--hostname "${dst_vserver}" \
	--interface "${vnet}" \
	--force \
	-- \
	--source "${__vsa_vdir}/${src_vserver}"

__vsa_do copy-whitelist-files

