#!/bin/bash
set -e

if [ $# -lt 4 ]; then
	echo "Usage: $0 <oldname> <newname> <lvsize> <extip>"
	echo ""
	echo "i.e.: $0 vm-svn vm-svn 10G 172.16.2.15" 
	exit 1
fi

OLDNAME=$1
NEWNAME=$2
LVNAME=${NEWNAME//-/--}
SHORTNAME=${NEWNAME##vm-}
LVSIZE=$3
EXTIP=$4

if [ -x /var/lib/lxc/${NEWNAME} ]; then
	echo "${NEWNAME} already exists"
	exit 2
fi

sudo lvcreate -L $LVSIZE -v -n "$NEWNAME" infra02
sudo mkfs.ext4 -m 0.1 /dev/mapper/infra02-${LVNAME}

read -r -d '' awkscript <<EOF || true
/UUID/ { printf ("UUID=%s\t/var/lib/lxc/${NEWNAME}\text4\tdefaults\t0\t2\n", \$3) }
EOF

sudo tune2fs -l /dev/mapper/infra02-${LVNAME} | \
awk -f <( echo $awkscript ) | \
sudo tee -a /etc/fstab

sudo mkdir /var/lib/lxc/${NEWNAME}
sudo mount -a

ssh migrate sudo tar cz -C /var/lib/lxc/${OLDNAME} . --numeric-owner |
sudo tar xzv -C /var/lib/lxc/${NEWNAME} --numeric-owner

sudo ln -s /var/lib/lxc/${NEWNAME}/config /etc/lxc/auto/${NEWNAME}

ssh migrate sudo cat /etc/ferm/ferm.d/${SHORTNAME}.conf | \
sudo tee /etc/ferm/ferm.d/${SHORTNAME}.conf
sudo chmod 0600 /etc/ferm/ferm.d/${SHORTNAME}.conf
sudo service ferm restart

cat <<EOD
run the following on infra01:

sudo lxc-stop -n ${SHORTNAME}
sudo rm -f /etc/lxc/${SHORTNAME}.conf /etc/ferm/ferm.d/${SHORTNAME}.conf
sudo service ferm reload
EOD

if [ -n "${EXTIP}" ]; then
	echo sudo ip -4 addr del ${EXTIP}/32 dev eth0
fi

read -p "Press enter when ready to go "
sudo rsync -chavzP --rsync-path="sudo rsync" --progress --stats --numeric-ids migrate:/var/lib/lxc/${OLDNAME}/rootfs/ /var/lib/lxc/${NEWNAME}/rootfs/
sudo lxc-start -d -n ${NEWNAME}

if [ -n "${EXTIP}" ]; then
	sudo ip -4 addr add ${EXTIP}/32 dev eth0
	sudo arping -I eth0 -c 3 -s ${EXTIP} 172.16.2.1 || true

	cat <<EOD
to finish the migration you should:

add the following to /etc/network/interfaces' eth0 stanza:

	# ${SHORTNAME} ip addresses
        post-up ip -4 addr add ${EXTIP}/32 dev eth0
        pre-down ip -4 addr del ${EXTIP}/32 dev eth0

remove/comment the same on infra01 and do etckeeper commit on both machines.
EOD
else
	echo "perform etckeeper commit on infra01 and infra02"
fi

cat <<EOD
backup and remove contents of on infra01 /var/lib/lxc/${OLDNAME} using:

sudo tar czf /var/lib/lxc/_backups/${SHORTNAME}.tar.gz -C /var/lib/lxc/ ${OLDNAME} && sudo rm -rf /var/lib/lxc/${OLDNAME}
EOD
