#!/bin/sh VSERVER=$1 if [ -z "$VSERVER" ] then echo "Usage: $0 server" exit 1 fi IP="`perl -MSocket -le 'print inet_ntoa(scalar(gethostbyname("'\"$VSERVER\"'")))' 2>/dev/null`" if [ -z "$IP" ] then echo Please first add the machine to /etc/hosts and DNS exit 1 fi echo "Setting up new vserver $VSERVER on $IP" # quit this script if any command returns an error code... set -e VG=`uname -n` echo Creating logical volume... lvcreate -L 150m -n $VSERVER $VG echo Formatting filesystem... mke2fs -j /dev/$VG/$VSERVER echo Adding to /etc/fstab echo "/dev/$VG/$VSERVER /vservers/$VSERVER ext3 defaults 1 3" >> /etc/fstab mkdir /vservers/$VSERVER mount /vservers/$VSERVER echo Copying skeleton into /vservers/$VSERVER cp -a /vservers/skeleton/. /vservers/$VSERVER/. echo Copying shadow of skeleton in /vservers/shadow/$VSERVER immucp -il /vservers/shadow/skeleton /vservers/shadow/$VSERVER echo Copying skeleton config to /etc/vservers/$VSERVER cp -a /etc/vservers/skeleton /etc/vservers/$VSERVER echo Setting up /etc/vservers/$VSERVER cd /etc/vservers/$VSERVER perl -MFile::Find -le '$vsname = shift; $ip = shift; find(sub{ ( -l ) && do { $dest = readlink; if ($dest =~ s/skeleton/$vsname/g) { print "$File::Find::name - $dest"; unlink($_) or die $!; symlink($dest, $_) or die $!; } }; ( -f ) && do { my $fn = $_; open FILE, $fn or die $!; open NEW, ">$fn.new" or die $!; my $changed; while () { $changed += s/skeleton/$vsname/g; $changed += s/192\.168\.255\.254/$ip/g; print NEW; } close FILE; close NEW; if ($changed) { print "$File::Find::name - updating"; rename("$fn.new", $fn) or die $!; } else { unlink("$fn.new") or die $!; } }; },".");' $VSERVER $IP echo running postcopy... postcopy.pl $VSERVER