sliver-ovs
[build.git] / vbuild-init-vserver.sh
index 96b588c..301b838 100755 (executable)
@@ -85,11 +85,25 @@ function package_method () {
     fcdistro=$1; shift
     case $fcdistro in
        f[0-9]*|centos[0-9]*|sl[0-9]*) echo yum ;;
-       lenny|squeeze|wheezy|jessie) echo debootstrap ;;
+       squeeze|wheezy|oneiric|precise|quantal|raring) echo debootstrap ;;
        *) echo Unknown distro $fcdistro ;;
     esac 
 }
 
+# need to specify the right mirror for debian variants like ubuntu and the like
+function debian_mirror () {
+    fcdistro=$1; shift
+    case $fcdistro in
+       squeeze|wheezy) 
+           echo http://ftp2.fr.debian.org/debian/ ;;
+       oneiric|precise|quantal|raring) 
+           echo http://mir1.ovh.net/ubuntu/ubuntu/ ;;
+       *) echo unknown distro $fcdistro; exit 1;;
+    esac
+}
+
+
+
 # return arch from debian distro and personality
 function canonical_arch () {
     personality=$1; shift
@@ -137,10 +151,11 @@ function setup_vserver () {
            ;;
        debootstrap)
            arch=$(canonical_arch $personality $fcdistro)
-           build_options="-m debootstrap -- -d $fcdistro -- --arch $arch"
+           debmirror=$(debian_mirror $fcdistro)
+           build_options="-m debootstrap -- -d $fcdistro -m $debmirror -- --arch $arch"
            ;;
        *)
-           build_options="something wrong" ;;
+           build_options="undefined-package_method" ;;
     esac
 
     # create it
@@ -219,19 +234,21 @@ function setup_vserver () {
     # + exec /usr/sbin/vspace --mount --fs --new -- /usr/sbin/vserver ----nonamespace debuild09 start
     # fakerunlevel: open("/var/run/utmp"): No such file or directory
     # so instead we bluntly create empty dirs and hope for the best
-    if [ "$pkg_method" = "debootstrap" ] ; then
+#    if [ "$pkg_method" = "debootstrap" ] ; then
        [ -h /vservers/$vserver/var/run ] && [ ! -d /vservers/$vserver/var/run ] && \
 #          { rm -f /vservers/$vserver/var/run ; ln -s ../run /vservers/$vserver/var/run ; }
            { rm -f /vservers/$vserver/var/run ; mkdir /vservers/$vserver/var/run ; }
        [ -h /vservers/$vserver/var/lock ] && [ ! -d /vservers/$vserver/var/lock ] && \
 #          { rm -f /vservers/$vserver/var/lock ; ln -s ../run/lock /vservers/$vserver/var/lock ; }
            { rm -f /vservers/$vserver/var/lock ; mkdir /vservers/$vserver/var/lock ; }
-    fi
+#    fi
 
     # start the vserver so we can do the following operations
     # redirect out/err to protect against the vserver's init sequence getting stalled 
     # mostly used for f10 vservers created remotely through ssh
-    $personality vserver $VERBOSE $vserver start >& /dev/null
+    # with ubuntu/raring, somehow this fails, so ignore retcod, 
+    # as subsequent vserver exec will fail anyway
+    $personality vserver $VERBOSE $vserver start >& /dev/null || :
 
     if [ "$pkg_method" == "yum" ] ; then
        $personality vserver $VERBOSE $vserver exec sh -c "rm -f /var/lib/rpm/__db*"
@@ -259,6 +276,10 @@ function setup_vserver () {
 
        # try the simple way, if that fails try to cross fix the rpm hashes
        $personality vserver $VERBOSE $vserver exec rpm --rebuilddb || translate_rpm_hashes $personality $vserver
+      
+    elif [ "$pkg_method" == "debootstrap" ] ; then
+       # just check the vm is running
+       $personality vserver $VERBOSE $vserver exec arch 
     fi
 
     # check if the vserver kernel is using VSERVER_DEVICE (vdevmap) support
@@ -275,6 +296,7 @@ function setup_vserver () {
 
     # set up resolv.conf
     cp /etc/resolv.conf /vservers/$vserver/etc/resolv.conf
+    cp /etc/resolv.conf /vservers/$vserver/etc/resolv.conf.preserve
     # and /etc/hosts for at least localhost
     [ -f /vservers/$vserver/etc/hosts ] || echo "127.0.0.1 localhost localhost.localdomain" > /vservers/$vserver/etc/hosts
 
@@ -315,11 +337,38 @@ function devel_or_vtest_tools () {
            $personality vserver $vserver exec rpm -aq > /vservers/$vserver/init-vserver.rpms
            ;;
        debootstrap)
+           # for ubuntu
+           if grep -iq ubuntu /vservers/$vserver/etc/lsb-release 2> /dev/null; then
+               # on ubuntu, at this point we end up with a single feed in /etc/apt/sources.list
+               # we need at least to add the 'universe' feed for python-rpm
+               ( cd /vservers/$vserver/etc/apt ; head -1 sources.list | sed -e s,main,universe, > sources.list.d/universe.list )
+               # also adding a link to updates sounds about right
+               ( cd /vservers/$vserver/etc/apt ; head -1 sources.list | sed -e 's, main,-updates main,' > sources.list.d/updates.list )
+           fi
            $personality vserver $vserver exec apt-get update
+           # ignore result because that one failed on precise
+sc         $personality vserver $vserver exec apt-get -y upgrade ||:
+           # handle this one firt off to be sure; mostly cosmetic but avoid a huge amount of warnings
            $personality vserver $vserver exec apt-get install -y locales
+           $personality vserver $vserver exec locale-gen en_US.UTF-8
+           # install required packages
+           # all in a single batch 
+           [ -n "$packages" ] && $personality vserver $vserver exec apt-get install -y --ignore-missing $packages || :
+           # of course, on ubuntu apt-get --ignore-missing .. does not ignore missing packages !
+           # check it up a bit 
            for package in $packages ; do 
-               $personality vserver $vserver exec apt-get install -y $package || \
-                   { echo "WARNING - missing package on debian $package - ignored" ; true; }
+               if $personality vserver $vserver exec dpkg -l $package >& /dev/null ; then
+                   echo "==========(debian) package $package OK (1)"
+               else
+                   # try to install it individually - so this is for ubuntu
+                   $personality vserver $vserver exec apt-get install -y $package || :
+                   # still not there ?
+                   if $personality vserver $vserver exec dpkg -l $package >& /dev/null ; then
+                       echo "==========(debian) package $package OK (2)"
+                   else
+                       echo "==========(debian) package $package MISSING - ignored" 
+                   fi
+               fi
            done
            ### xxx todo install groups with apt..
            ;;