From: Matthijs Kooijman Date: Thu, 16 Oct 2008 14:10:07 +0000 (+0200) Subject: vserver: Add script for adding and setting up new vservers. X-Git-Url: https://git.stderr.nl/gitweb?a=commitdiff_plain;h=ac7f343523148982f67138b69b940fe04098bb06;p=matthijs%2Fservers%2Ftika.git vserver: Add script for adding and setting up new vservers. --- diff --git a/usr/local/bin/vserver-create b/usr/local/bin/vserver-create new file mode 100755 index 0000000..10f6d39 --- /dev/null +++ b/usr/local/bin/vserver-create @@ -0,0 +1,96 @@ +#!/bin/sh + +# The dir containing vserver configuration +VSERVERS_CONF=/etc/vservers +# The vserver to use as a template +TEMPLATE=template +# A file containing files (or masks) to not copy from the template vserver. +EXCLUDE_FILE="$VSERVERS_CONF/clone-exclude" +# The ip range to use for creating a new vserver. A number between 2 and 253 +# will be appended to this, until an address is found that is not used by +# another vserver.. +IP_RANGE=10.42.0. +# The interface on which to create the vserver +INTERFACE=dummy0 +# The netmask for the address +NETMASK=24 +# The DNS vserver gets a new entry in its /etc/hosts +DNS_VSERVER=dns + +function usage() +{ + echo "Usage: $0 name" + echo "Creates a new vserver with the specified name, which is a clone" + echo "from the vserver \`\`$TEMPLATE'' with some post-processing done." +} + +function find_ip() +{ + IP_FILES="$VSERVERS_CONF/*/interfaces/*/ip" + for i in {2..53}; do + IP=${IP_RANGE}$i + if ! grep ^$IP$ $IP_FILES &>/dev/null; then + return 0 + fi + done + return 1 +} + +if [ "`id -u`" -eq 0 ]; then + echo "$0 should not be run as root, it will use sudo where appropriate" + exit 1 +fi + +# Check arguments +if [ ! "$#" -eq 1 ]; then + usage + exit 1 +fi + +NAME=$1 + +if ! echo $NAME | grep "^[a-zA-Z0-9-]*$" &>/dev/null; then + echo "Name can only contain alphanumerics and dashes" + exit 1 +fi + +HOST="$NAME.`hostname --fqdn`" + +# Set the IP var +if ! find_ip; then + echo "No available ip address found, aborting" + exit 1 +fi; + +echo "Creating vserver $NAME with address $IP..." +sudo vserver $NAME build -m clone --hostname $HOST --interface $INTERFACE:$IP/$NETMASK -- --source $TEMPLATE --exclude-from $EXCLUDE_FILE + +echo "Vserver created, configuring..." +sudo vserver $NAME start +# Regen ssh keys +sudo vserver $NAME exec dpkg-reconfigure openssh-server +# Setup git - Add a branch for this vserver +sudo vserver $NAME exec git branch $NAME origin/$TEMPLATE +sudo vserver $NAME exec git checkout $NAME +# Remove the template branch, to prevent pushing it back later on +sudo vserver $NAME exec git branch -d $TEMPLATE +# Push our new branch upstream so it can be pushed with "git push" afterwards. +sudo vserver $NAME exec git push origin $NAME:$NAME +# Enable vhashify/vunify +sudo mkdir $VSERVER_CONF/$NAME/apps/vunify +sudo touch $VSERVER_CONF/$NAME/apps/vunify/dummy # For git + +# Remove trailing slashes from the confdir. git only works when we're using +# relative paths and the cwd is / for some reason... +CONF_FOR_GIT=`echo $VSERVERS_CONF/$NAME | sed "s#^/*##"` +# Commit the configuration +(cd /; git add $CONF_FOR_GIT) +(cd /; git commit $CONF_FOR_GIT --edit --message "vserver: Add $NAME vserver configuration.") + +# Add this new vserver to the hosts file in the dns vserver and in the host +for file in /etc/hosts "$VSERVERS_CONF/$DNS_VSERVER/vdir/etc/hosts"; do + sudo sh -c "echo '$IP $NAME' >> '$file'" +done + +# Restart dnsmasq in the dns vserver +sudo vserver $DNS_VSERVER exec /usr/bin/killall -HUP dnsmasq"