use wsgi on all fedoras
[build.git] / vbuild-init-lxc.sh
index fa7d1a1..63c8381 100755 (executable)
@@ -5,6 +5,7 @@
 
 COMMAND=$(basename $0)
 DIRNAME=$(dirname $0)
+BUILD_DIR=$(pwd)
 
 # pkgs parsing utilities
 PATH=$(dirname $0):$PATH export PATH
@@ -18,7 +19,8 @@ DEFAULT_IFNAME=eth0
 COMMAND_VBUILD="vbuild-init-lxc.sh"
 COMMAND_MYPLC="vtest-init-lxc.sh"
 
-lxc_version="0.8.0-rc2"
+lxc_version="lxc-0.8.0"
+lxc_git_repo="git://lxc.git.sourceforge.net/gitroot/lxc/lxc"
 
 function bridge_init () {
 
@@ -81,7 +83,8 @@ broadcast=$(/sbin/ip addr show $INTERFACE_LAN | grep -v inet6 | grep inet | head
     sleep 2
     echo "Setting bridge address=$address broadcast=$broadcast"
     # static
-    /sbin/ifconfig $INTERFACE_BRIDGE $address broadcast $broadcast up
+    #/sbin/ifconfig $INTERFACE_BRIDGE $address broadcast $broadcast up
+    dhclient $INTERFACE_BRIDGE
     sleep 1
 
     #Reconfigure the routing table
@@ -148,12 +151,12 @@ function prepare_host() {
     #retrieve and install lxc from sources 
     raw_version=$(lxc-version ||: )
     lxc_installed_version=$(echo $raw_version | sed -e 's,.*: ,,')
-    if [ "$lxc_installed_version" != "$lxc_version" ] ; then
+    if [ "$lxc_installed_version" != "$(echo $lxc_version | cut -d'-' -f2)" ] ; then
        echo "Expecting version" '['$lxc_version']'
        echo "Found version" '['$lxc_installed_version']'
         echo "Installing lxc ..."
         cd /root
-       [ -d lxc ] || git clone git://lxc.git.sourceforge.net/gitroot/lxc/lxc 
+       [ -d lxc ] || git clone "$lxc_git_repo"
         cd lxc
        git pull
        git checkout $lxc_version
@@ -161,6 +164,9 @@ function prepare_host() {
         ./configure --prefix=/usr --exec-prefix=/usr
         make
         make install
+        mkdir -p /usr/var/lib/
+        [ -d /usr/var/lib/lxc ] || ln -s /var/lib/lxc /usr/var/lib/lxc
+       cd $BUILD_DIR
     fi
  
 #    #create a placeholder (just a hack to make lxc works)
@@ -172,7 +178,7 @@ function prepare_host() {
     isInstalled=$(netstat -rn | grep '^0.0.0.0' | awk '{print $8;}')
     if [ "$isInstalled" != "br0" ] ; then
        bridge_init
-        sleep5
+        sleep 5
     fi
 
     return 0
@@ -202,10 +208,16 @@ MTU=1500
 EOF
 
 # set the hostname
+if [[ "$fcdistro" == "f18" ]] ; then
+    cat <<EOF > ${rootfs_path}/etc/hostname
+$HOSTNAME
+EOF
+else
     cat <<EOF > ${rootfs_path}/etc/sysconfig/network
 NETWORKING=yes
 HOSTNAME=$HOSTNAME
 EOF
+fi
 
     # set minimal hosts
 #    cat <<EOF > $rootfs_path/etc/hosts
@@ -277,9 +289,21 @@ set -x
   
     
     MIRROR_URL=http://mirror.onelab.eu/fedora/releases/$release/Everything/$arch/os
-    RELEASE_URL="$MIRROR_URL/Packages/fedora-release-$release-1.noarch.rpm"
-    echo "Fetching from $RELEASE_URL"
-    curl -f "$RELEASE_URL" > $INSTALL_ROOT/fedora-release-$release.noarch.rpm
+    RELEASE_URL1="$MIRROR_URL/Packages/fedora-release-$release-1.noarch.rpm"
+    # with fedora18 the rpms are scattered by first name
+    RELEASE_URL2="$MIRROR_URL/Packages/f/fedora-release-$release-1.noarch.rpm"
+    RELEASE_TARGET=$INSTALL_ROOT/fedora-release-$release.noarch.rpm
+    found=""
+    for attempt in $RELEASE_URL1 $RELEASE_URL2; do
+       if curl -f $attempt -o $RELEASE_TARGET ; then
+           echo "Retrieved $attempt"
+           found=true
+           break
+       else
+           echo "Failed attempt $attempt"
+       fi
+    done
+    [ -n "$found" ] || { echo "Could not retrieve fedora-release rpm - exiting" ; exit 1; }
     
     mkdir -p $INSTALL_ROOT/var/lib/rpm
     rpm --root $INSTALL_ROOT  --initdb
@@ -376,6 +400,7 @@ lxc.network.link = $lxc_network_link
 lxc.network.name = $IFNAME
 lxc.network.mtu = 1500
 lxc.network.ipv4 = $IP/$CIDR
+lxc.network.veth.pair = $veth_pair
 #cgroups
 #lxc.cgroup.devices.deny = a
 # /dev/null and zero
@@ -550,10 +575,25 @@ function setup_lxc() {
     mkdir $rootfs_path/root/.ssh
     cat /root/.ssh/id_rsa.pub >> $rootfs_path/root/.ssh/authorized_keys
     
+    # start container
     lxc-start -d -n $lxc
 
-    sleep 20
+    echo $IP is up, waiting for ssh...
 
+    # wait max 5 min for sshd to start 
+    ssh_up=""
+    stop_time=$(($(date +%s) + 300))
+    current_time=$(date +%s)
+
+    while [ "$current_time" -lt "$stop_time" ] ; do
+         echo "ssh attempt ..."
+         ssh -o "StrictHostKeyChecking no" $IP 'uname -i' && { ssh_up=true; echo "SSHD in container $lxc is UP"; break ; } || :
+         sleep 10
+         current_time=$(($current_time + 10))
+    done
+
+    [ -z $ssh_up ] && echo "SSHD in container $lxc is not running"
+   
     # rpm --rebuilddb
     chroot $rootfs_path rpm --rebuilddb
     #ssh -o "StrictHostKeyChecking no" $IP "rpm --rebuilddb"
@@ -824,7 +864,10 @@ function main () {
         echo "Unknown personality: $personality"
     fi
 
-    
+    # need lxc installed before we can run lxc-ls
+    # need bridge installed
+    prepare_host    
+
     if [ -n "$VBUILD_MODE" ] ; then
 
        # Bridge IP affectation
@@ -838,6 +881,7 @@ function main () {
        
         lxc_network_type=veth
         lxc_network_link=virbr0
+       veth_pair="veth$z"
         echo "the IP address of container $lxc is $IP "
     else
         [[ -z "$REPO_URL" ]] && usage
@@ -847,6 +891,7 @@ function main () {
         [[ -z "$HOSTNAME" ]] && usage
         lxc_network_type=veth
         lxc_network_link=br0
+        veth_pair="i$(echo $HOSTNAME | cut -d. -f1)"
     fi
 
     CIDR=$(cidr_notation $NETMASK)
@@ -857,20 +902,16 @@ function main () {
           exit 1
     fi
 
-    # need lxc installed before we can run lxc-ls
-    prepare_host
-    
-    # be strict on lxc-lines matching name exactly using ^<name>$
-    # as otherwise the timestamps may show up here
-    lxc-ls | grep -q '^'"$lxc"'$' && { echo "container $lxc already exists - exiting" ; exit 1 ; }
-    
     path=/var/lib/lxc
     rootfs_path=$path/$lxc/rootfs
     config_path=$path/$lxc
     cache_base=/var/cache/lxc/fedora/$arch
     cache=$cache_base/$release
     root_password=root
-
+    
+    # check whether the rootfs directory is created to know if the container exists
+    # bacause /var/lib/lxc/$lxc is already created while putting $lxc.timestamp
+    [ -d $rootfs_path ] && { echo "container $lxc already exists - exiting" ; exit 1 ; }
 
     setup_lxc $lxc $fcdistro $pldistro $personality