#!/bin/sh
# This is a script to control a virtual server
vserver_mknod(){
	mknod $1 $2 $3 $4
	chmod $5 $1
}
mountproc()
{
	mkdir -p proc dev/pts
	if [ ! -d proc/1 ] ; then
		mount -t proc none proc
		mount -t devpts none dev/pts
	fi
}
umountproc()
{
	if [ -d proc/1 ] ; then
		umount proc
		umount dev/pts
	fi
}

if [ $# -lt 2 ] ; then
	echo vserver server_root_directory command ...
elif [ "$2" = "build" ] ; then
	if [ -d /vservers/$1 ] ; then
		echo Virtual server /vservers/$1 already exist
	else
		mkdir -p /vservers/$1
		cp -ax /sbin /bin /etc /boot /usr /var /lib /vservers/$1/.
		cd /vservers/$1
		rm -f var/spool/mail/*
		rm -fr var/run/*
		rm -f var/log/*
		mkdir proc tmp home root
		chmod 1777 tmp
		chmod 750 root
		# Create a minimal dev so the virtual server can't grab
		# more privileges
		mkdir dev dev/pts
		vserver_mknod dev/null c 1 3 666
		vserver_mknod dev/zero c 1 5 666
		vserver_mknod dev/full c 1 7 666
		vserver_mknod dev/random c 1 8 644
		vserver_mknod dev/urandom c 1 9 644
		vserver_mknod dev/tty c 5 0 666
		vserver_mknod dev/ptmx c 5 2 666
		
		echo Directory /vservers/$1 has been populated
		if [ ! -d /etc/vservers ] ; then
			mkdir /etc/vservers
			chmod 600 /etc/vservers
			echo Directory /etc/vservers has been created
		fi
		if [ ! -f /etc/vservers/$1.conf ] ; then
			CONF=/etc/vservers/$1.conf
			cat >$CONF <<-EOF
# Select an unused context (this is optional)
# The default is to allocate a free context on the fly
# In general you don't need to force a context
#S_CONTEXT=
# Select the IP number assigned to the virtual server
# This IP must be one IP of the server, either an interface
# or an IP alias
IPROOT=1.2.3.4
# Uncomment the onboot line if you want to enable this
# virtual server at boot time
#ONBOOT=yes
# You can set a different host name for the vserver
# If empty, the host name of the main server is used
S_HOSTNAME=
# You can set a different NIS domain for the vserver
# If empty, the current on is kept
S_DOMAINNAME=
			EOF
			echo $CONF has been created. Look at it\!
		fi
	fi
elif [ ! -d /vservers/$1 ] ; then
	echo Directory /vservers/$1 does not exist
elif [ "$2" = "start" ] ; then
	if ! /usr/sbin/vserver $1 running
	then
		. /etc/vservers/$1.conf
		cd /vservers/$1
		mountproc
		rm -f var/lock/subsys/*
		CTXOPT=
		HOSTOPT=
		DOMAINOPT=
		if [ "$S_CONTEXT" != "" ] ; then
			CTXOPT="--ctx $S_CONTEXT"
		fi
		if [ "$S_HOSTNAME" != "" ] ; then
			HOSTOPT="--hostname $S_HOSTNAME"
			export HOSTNAME=$S_HOSTNAME
		fi
		if [ "$S_DOMAINNAME" != "" ] ; then
			DOMAINOPT="--domainname $S_DOMAINNAME"
		fi
		mkdir -p /var/run/vservers
		chmod 700 /var/run/vservers
		/usr/sbin/chcontext $CTXOPT $HOSTOPT $DOMAINOPT --secure /usr/sbin/chbind --ip $IPROOT \
			/usr/lib/vserver/save_s_context /var/run/vservers/$1.ctx \
			/usr/sbin/chroot /vservers/$1 /etc/rc.d/rc 3 
	fi
elif [ "$2" = "running" ] ; then
	if [ ! -f /var/run/vservers/$1.ctx ] ; then
		echo Server $1 is not running
		exit 1
	else
		. /var/run/vservers/$1.ctx
		NB=`/usr/sbin/chcontext --silent --ctx $S_CONTEXT ps ax | wc -l`
		NB=`eval expr $NB + 0`
		if [ "$NB" -gt 3 ] ; then
			echo Server $1 is running
			exit 0
		else
			echo Server $1 is not running
			exit 1
		fi
	fi
elif [ "$2" = "stop" ] ; then
	if /usr/sbin/vserver $1 running
	then
		. /etc/vservers/$1.conf
		. /var/run/vservers/$1.ctx
		cd /vservers/$1
		mountproc
		/usr/sbin/chcontext --secure --ctx $S_CONTEXT /usr/sbin/chbind --ip $IPROOT \
			/usr/sbin/chroot /vservers/$1 /etc/rc.d/rc 6
		echo Killing all processes
		/usr/sbin/chcontext --secure --silent --ctx $S_CONTEXT \
			/usr/sbin/chbind --silent --ip $IPROOT \
			/usr/lib/vserver/vserverkillall
		umountproc
	fi
elif [ "$2" = "restart" ] ; then
	if /usr/sbin/vserver $1 running
	then
		$0 $1 stop
		$0 $1 start
	fi
elif [ "$2" = "enter" ] ; then
	. /etc/vservers/$1.conf
	cd /vservers/$1
	mountproc
	PS1="[\u@vserver:$1 \W]"
	export PS1
	if $0 $1 running
	then
		. /var/run/vservers/$1.ctx
		/usr/sbin/chcontext --secure --ctx $S_CONTEXT \
			/usr/sbin/chbind --ip $IPROOT \
			/usr/sbin/chroot /vservers/$1 /bin/sh
	else
		CTXOPT=
		HOSTOPT=
		DOMAINOPT=
		if [ "$S_CONTEXT" != "" ] ; then
			CTXOPT="--ctx $S_CONTEXT"
		fi
		if [ "$S_HOSTNAME" != "" ] ; then
			HOSTOPT="--hostname $S_HOSTNAME"
			export HOSTNAME=$S_HOSTNAME
		fi
		if [ "$S_DOMAINNAME" != "" ] ; then
			DOMAINOPT="--domainname $S_DOMAINNAME"
		fi
		mkdir -p /var/run/vservers
		/usr/sbin/chcontext --secure $CTXOPT $HOSTOPT $DOMAINOPT /usr/sbin/chbind --ip $IPROOT \
			/usr/lib/vserver/save_s_context /var/run/vservers/$1.ctx \
			/usr/sbin/chroot /vservers/$1 /bin/sh
	fi
else
	echo Command unknown $2
fi

