#/bin/bash
#
# (C)opyright 2003 Martin List-Petersen (martin at list-petersen dot dk)
# Variation of a script originally created for TuxBox
#
# Script for deploying vservers from guest images
#
# $Id: deploy-vserver.sh,v 1.2 2005/02/05 04:17:02 marlow Exp $
#

function header_output()
{
	echo "`basename $0` - (C)opyright 2003 Martin List-Petersen (martin at list-petersen dot dk)"
	echo "    -- licensed under GPLv2"
	echo "    -- for a copy of the license go to http://www.marlow.dk/site.php/tech/gpl"
	echo
}	

# defaults

IPROOTDEV=eth0
IPROOTMASK=
IPROOTBCAST=
ONBOOT=yes

VSETC=/etc/vservers
VSROOT=/var/lib/vservers

IMGMIRROR=ftp://debian.marlow.dk/vserver/guest
IMGDIR=/root/img

# vars from commandline

VSNAME=$1
HOSTNAME=$2
IP=$3
PLATFORM=$4

# validating input
#

case "$PLATFORM" in 
	woody)
		# debian woody
		IMGBASE="_debian_woody_*.tb2"
		IMGDIFF="none"
		PLATFORM=debian
		;;
	sarge)
		# debian sarge
		IMGBASE="_debian_sarge_*.tb2"
		IMGDIFF="none"
		PLATFORM=debian
		;;
	fc2)
		# fedora core 2
		IMGBASE="_fedora_c2_apt_*.tb2"
		IMGDIFF="_fedora_c2.diff"
		;;
	mdk92)
		# mandrake 9.2
		IMGBASE="_mdk_92_*.tb2"
		IMGDIFF="_mdk_92.diff"
		;;
	redhat9)
		# redhat 9 / shrike
		IMGBASE="_redhat_9_apt_*.tb2"
		IMGDIFF="_redhat_9.diff"
		;;
	slack10)
		# slackware 10
		IMGBASE="_slack_10_*.tb2"
		IMGDIFF="_slack_10.diff"
		;;
	suse92)
		# suse 9.2
		IMGBASE="_suse_92_apt_*.tb2"
		IMGDIFF="_suse_92.diff"
		;;
	debian)
		# dummy, if debian is set, everything is in place
		;;
	*)
		# nope .. we don't know that guest image, yet
		header_output
		echo "SYNTAX: `basename $0` vserver_name hostname vserver_ip platform"
		echo
                echo "Available platforms:"
                echo "- woody   (Debian Woody)"
                echo "- sarge   (Debian Sarge)"
                echo "- fc2     (Fedora Core 2)"
                echo "- mdk92   (Mandrake 9.2)"
                echo "- redhat9 (Redhat 9)"
                echo "- slack10 (Slackware 10)"
                echo "- suse92  (SuSE 9.2)"
                echo

		exit 1
		;;
esac

#
# BEYOND THIS POINT NO CHANGES SHOULD BE NEEDED
#
#

# functions
#
vserver_mknod()
{
	mknod $1 $2 $3 $4
	chmod $5 $1
}

if [ -z "$IPROOTMASK" ]; then
	header_output
	echo "You need to edit the script and set the defaults !!!"
	echo
	
	exit 1
fi

if [ ! -d "$IMGDIR" -o -z "$IMGDIR" ]; then
	header_output
	echo "You need to create the guest images directory ($IMGDIR)"
	echo
	
	exit 1
fi

# distro was right, but image is not avaiable !
PLATFORMIMG=`ls -1 $IMGDIR/$IMGBASE | tail -n1`
if [ ! -e "$PLATFORMIMG" ]; then
	echo
	echo "Image not in place, trying to download it."
	echo
	cd $IMGDIR && wget $IMGMIRROR/$IMGBASE
	PLATFORMIMG=`ls -1 $IMGDIR/$IMGBASE | tail -n1`
	if [ ! -e "$PLATFORMIMG" ]; then
		echo "Download did not work out. Exiting."
		exit 1
	fi
fi

# diff is not available ?
PLATFORMDIFF=`ls -1 $IMGDIR/$IMGDIFF | tail -n1`
if [ ! -e "$PLATFORMDIFF" -a $IMGDIFF != none ]; then
	echo
	echo "Diff not in place, trying to download it."
	echo
	cd $IMGDIR && wget $IMGMIRROR/$IMGDIFF
	PLATFORMDIFF=`ls -1 $IMGDIR/$IMGDIFF | tail -n1`
	if [ ! -e "$PLATFORMDIFF" ]; then
		echo "Download did not work out. Exiting."
		exit 1
	fi
fi

# check if vserver maybe exists allready
if [ -e "$VSROOT/$VSNAME" ]; then
	header_output
	echo "vserver $VSNAME exists allready ..."
	echo
	
	exit 1
fi

#
# unpacking, preparing and starting vserver
#

cd $VSROOT
mkdir $VSNAME
cd $VSNAME
tar -xvjf $PLATFORMIMG
echo $HOSTNAME > etc/hostname
if [ -e $VSROOT/$VSNAME/dev ]; then
	rm -fr $VSROOT/$VSNAME/dev
fi
mkdir $VSROOT/$VSNAME/dev && chmod 755 $VSROOT/$VSNAME/dev
mkdir $VSROOT/$VSNAME/dev/pts
vserver_mknod $VSROOT/$VSNAME/dev/full c 1 7 666
vserver_mknod $VSROOT/$VSNAME/dev/hdv1 b 4 1 600
vserver_mknod $VSROOT/$VSNAME/dev/null c 1 3 666
vserver_mknod $VSROOT/$VSNAME/dev/ptmx c 5 2 666
vserver_mknod $VSROOT/$VSNAME/dev/random c 1 8 644
vserver_mknod $VSROOT/$VSNAME/dev/tty c 5 0 666
vserver_mknod $VSROOT/$VSNAME/dev/urandom c 1 9 644
vserver_mknod $VSROOT/$VSNAME/dev/zero c 1 5 666
cd $VSROOT/$VSNAME/dev
ln -s /proc/self/fd
ln -s fd/0 stdout
ln -s fd/1 stdin
ln -s fd/2 stderr

#
# generating vserver config
#

if [ -e "$VSETC/$VSNAME.conf" ]; then
	echo
	echo "vserver $VSNAME configuration not replaced ..."
	echo
else
	(
	cat <<EOF-VSERVER
S_HOSTNAME=$HOSTNAME
IPROOT=$IP
IPROOTDEV=$IPROOTDEV
IPROOTMASK=$IPROOTMASK
IPROOTBCAST=$IPROOTBCAST
ONBOOT=$ONBOOT

S_FLAGS="lock nproc"
ULIMIT="-H -u 1000"
S_CAPS="CAP_NET_RAW"
EOF-VSERVER
	) > $VSETC/$VSNAME.conf
fi

if [ -e /etc/init.d/rebootmgr ]; then
	/etc/init.d/rebootmgr restart
else
	killall rebootmgr
	rebootmgr
fi
echo "$IP $HOSTNAME" >> $VSROOT/$VSNAME/etc/hosts
# /etc/resolv.conf
(
cat <<EOF-RESOLV
search tuxbox.nu
nameserver 216.88.76.6
nameserver 216.88.77.7
EOF-RESOLV
) > $VSROOT/$VSNAME/etc/resolv.conf
# /etc/fstab
(
cat <<EOF-FSTAB
proc		/proc	proc	defaults	0 0
/dev/hdv1	/	ext3	defaults	1 1
EOF-FSTAB
) > $VSROOT/$VSNAME/etc/fstab

# Mandrake 9.2 only stuff
#
if [ "$PLATFORM" = "mdk92" ]; then
	cd $VSROOT/$VSNAME && cat $IMGDIR/$IMGDIFF | patch -p1
	vserver $VSNAME suexec root useradd -d /home/admin -m admin
	
	vserver $VSNAME enter <<EOF-MDK
rpm -ivh tmp/openssh-server-3.6.1p2-8mdk.i586.rpm
rm tmp/openssh-server-3.6.1p2-8mdk.i586.rpm
chkconfig --del alsa
chkconfig --del dm
chkconfig --del keytable
chkconfig --del sound
chkconfig --del rawdevices
chkconfig --del network
chkconfig --del random 
chkconfig --del partmon
rm etc/rc.d/init.d/mandrake_consmap
pwconv
exit
EOF-MDK
fi

# SuSE 9.2 only stuff
#
if [ "$PLATFORM" = "suse92" ]; then
	cd $VSROOT/$VSNAME && cat $IMGDIR/$IMGDIFF | patch -p1
	sed -r "s/#PermitRootLogin yes/PermitRootLogin no/" < $VSROOT/$VSNAME/etc/ssh/sshd_config > /tmp/sshd_config
	vserver $VSNAME suexec root useradd -d /home/admin -m admin

	(
        cat <<EOF-NETWORK
#!/bin/bash
#
# dummy network script for SuSE vserver guests
#
exit 0
EOF-NETWORK
	) > $VSROOT/$VSNAME/etc/init.d/network
	chmod 700 $VSROOT/$VSNAME/etc/init.d/network

	(
	cat <<EOF-APT
GPG::Check false;
EOF-APT
	) > $VSROOT/$VSNAME/etc/apt/apt.conf

	(
	cat <<EOF-APT-SOURCE
rpm http://ftp.uni-erlangen.de/pub/Linux/MIRROR.suse/apt/ SuSE/9.2-i686 base
rpm http://ftp.uni-erlangen.de/pub/Linux/MIRROR.suse/apt/ SuSE/9.2-i586 base
EOF-APT-SOURCE
	) > $VSROOT/$VSNAME/etc/apt/sources.list

	vserver $VSNAME enter <<"EOF-SUSE"
chkconfig -d random
insserv -f network
insserv -f syslog
insserv -f sshd
insserv -f cron
insserv -f postfix
SuSEconfig
exit
EOF-SUSE
fi

# Slackware 10 only stuff
#
if [ "$PLATFORM" = "slack10" ]; then
	cd $VSROOT/$VSNAME && cat $IMGDIR/$IMGDIFF | patch -p1
	rm $VSROOT/$VSNAME/etc/hostname
	echo $HOSTNAME > $VSROOT/$VSNAME/etc/HOSTNAME
	sed -r "s/#PermitRootLogin yes/PermitRootLogin no/" < $VSROOT/$VSNAME/etc/ssh/sshd_config > /tmp/sshd_config
	rm $VSROOT/$VSNAME/etc/group.new
	mv $VSROOT/$VSNAME/etc/inittab.new $VSROOT/$VSNAME/etc/inittab
	mv $VSROOT/$VSNAME/etc/login.defs.new $VSROOT/$VSNAME/etc/login.defs
	mv $VSROOT/$VSNAME/etc/nsswitch.conf.new $VSROOT/$VSNAME/etc/nsswitch.conf
	mv $VSROOT/$VSNAME/etc/profile.new $VSROOT/$VSNAME/etc/profile
	rm $VSROOT/$VSNAME/etc/securetty.new
	mv $VSROOT/$VSNAME/etc/services.new $VSROOT/$VSNAME/etc/services
	cat $VSROOT/$VSNAME/etc/shadow.new > $VSROOT/$VSNAME/etc/shadow
	rm $VSROOT/$VSNAME/etc/shadow.new
	mv $VSROOT/$VSNAME/etc/syslog.conf.new $VSROOT/$VSNAME/etc/syslog.conf
	rm $VSROOT/$VSNAME/etc/rc.d/rc.S.new 
	rm $VSROOT/$VSNAME/etc/rc.d/rc.S
	mv $VSROOT/$VSNAME/etc/rc.d/rc.font.new $VSROOT/$VSNAME/etc/rc.d/rc.font
	rm $VSROOT/$VSNAME/etc/rc.d/rc.ieee1394
	rm $VSROOT/$VSNAME/etc/rc.d/rc.inet1
	rm $VSROOT/$VSNAME/etc/rc.d/rc.inet1.new
	rm $VSROOT/$VSNAME/etc/rc.d/rc.serial
	rm $VSROOT/$VSNAME/etc/rc.d/rc.usb
	vserver $VSNAME suexec root useradd -d /home/admin -m admin
fi

# start the vserver
#

vserver $VSNAME start

# Debian only stuff
#
if [ "$PLATFORM" = "debian" ]; then

	vserver $VSNAME enter <<"EOF-SSH"
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get -y upgrade
DEBIAN_FRONTEND=noninteractive apt-get -qqqqq install ssh
apt-get clean
apt-get autoclean
exit
EOF-SSH

	sed -r "s/PermitRootLogin yes/PermitRootLogin no/" < $VSROOT/$VSNAME/etc/ssh/sshd_config > /tmp/sshd_config
	cat /tmp/sshd_config > $VSROOT/$VSNAME/etc/ssh/sshd_config
	rm /tmp/sshd_config
	vserver $VSNAME suexec root /etc/init.d/ssh restart
	rm $VSROOT/$VSNAME/root/.bash_history
	vserver $VSNAME suexec root adduser --quiet --disabled-login --gecos "" admin
fi

# Fedora Core 2 stuff
#
if [ "$PLATFORM" = "fc2" ]; then
	cd $VSROOT/$VSNAME && cat $IMGDIR/$IMGDIFF | patch -p1
	sed -r "s/#PermitRootLogin yes/PermitRootLogin no/" < $VSROOT/$VSNAME/etc/ssh/sshd_config > /tmp/sshd_config

	(
	cat <<EOF-NETWORK
NETWORKING=yes
HOSTNAME=$HOSTNAME
EOF-NETWORK
	) > $VSROOT/$VSNAME/etc/sysconfig/network

        (
        cat <<EOF-APT-SOURCE
# Fedora Linux 2
rpm http://ayo.ie.freshrpms.net fedora/linux/2/i386 core updates freshrpms
#rpm http://ayo.ie.freshrpms.net fedora/linux/2/i386 tupdates
rpm-src http://ayo.ie.freshrpms.net fedora/linux/2/i386 core updates freshrpms
#rpm-src http://ayo.ie.freshrpms.net fedora/linux/2/i386 tupdates
EOF-APT-SOURCE
        ) > $VSROOT/$VSNAME/etc/apt/sources.list

	vserver $VSNAME suexec root adduser admin
	vserver $VSNAME enter <<EOF-APT
chkconfig --del network
apt-get update
apt-get -y upgrade
apt-get clean
apt-get autoclean
exit
EOF-APT

fi

# Redhat only stuff
#
if [ "$PLATFORM" = "redhat9" ]; then
	cd $VSROOT/$VSNAME && cat $IMGDIR/$IMGDIFF | patch -p1
	sed -r "s/#PermitRootLogin yes/PermitRootLogin no/" < $VSROOT/$VSNAME/etc/ssh/sshd_config > /tmp/sshd_config

	(
	cat <<EOF-NETWORK
NETWORKING=yes
HOSTNAME=$HOSTNAME
EOF-NETWORK
	) > $VSROOT/$VSNAME/etc/sysconfig/network

	(
	cat <<EOF-APT-SOURCE
# Red Hat Linux 9
rpm http://ayo.ie.freshrpms.net redhat/9/i386 os updates freshrpms
rpm-src http://ayo.ie.freshrpms.net redhat/9/i386 os updates freshrpms
EOF-APT-SOURCE
	) > $VSROOT/$VSNAME/etc/apt/sources.list

	vserver $VSNAME suexec root adduser admin
	vserver $VSNAME enter <<EOF-APT
chkconfig --del network
apt-get update
apt-get -y upgrade
apt-get clean
apt-get autoclean
exit
EOF-APT

fi

#
# fix a few things in the vserver
#

rm $VSROOT/$VSNAME/sbin/halt
rm $VSROOT/$VSNAME/sbin/poweroff
rm $VSROOT/$VSNAME/sbin/reboot
if [ -e /usr/lib/vserver/vreboot ]; then
	cp /usr/lib/vserver/vreboot $VSROOT/$VSNAME/sbin/reboot
else
	cp /usr/lib/util-vserver/vreboot $VSROOT/$VSNAME/sbin/reboot
fi
cd $VSROOT/$VSNAME/sbin/
ln -s reboot halt
ln -s reboot poweroff

# custom deployment script ?
#
if [ -e $IMGDIR/deploy-vserver.inc ]; then
	. $IMGDIR/deploy-vserver.inc
else
	echo
	echo "Please enter password for root in the vserver"
	echo
	vserver $VSNAME suexec root passwd root
	echo
	echo "Please enter password for admin in the vserver"
	echo
	vserver $VSNAME suexec root passwd admin
fi

echo
header_output
echo "Vserver $VSNAME deployed ..."
echo
# end of script
