#!/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"