remove some complexity by dropping support for (quite) old distros
[build.git] / lbuild-initvm.sh
index 04a0607..2bee313 100755 (executable)
@@ -13,7 +13,7 @@ BUILD_DIR=$(pwd)
 # pkgs parsing utilities + lbuild-bridge.sh
 export PATH=$(dirname $0):$PATH
 
 # pkgs parsing utilities + lbuild-bridge.sh
 export PATH=$(dirname $0):$PATH
 
-# old guests have e.g. mount in /bin but this is no longer part of 
+# old guests have e.g. mount in /bin but this is no longer part of
 # the standard PATH in recent hosts after usrmove, so let's keep it simple
 export PATH=$PATH:/bin:/sbin
 
 # the standard PATH in recent hosts after usrmove, so let's keep it simple
 export PATH=$PATH:/bin:/sbin
 
@@ -30,10 +30,10 @@ function lxcroot () {
 
 # XXX fixme : when creating a 32bits VM we need to call linux32 as appropriate...s
 
 
 # XXX fixme : when creating a 32bits VM we need to call linux32 as appropriate...s
 
-DEFAULT_FCDISTRO=f21
+DEFAULT_FCDISTRO=f29
 DEFAULT_PLDISTRO=lxc
 DEFAULT_PERSONALITY=linux64
 DEFAULT_PLDISTRO=lxc
 DEFAULT_PERSONALITY=linux64
-DEFAULT_MEMORY=2048
+DEFAULT_MEMORY=3072
 
 ##########
 # constant
 
 ##########
 # constant
@@ -45,7 +45,7 @@ VIF_GUEST=eth0
 ##########
 FEDORA_MIRROR_BASE="http://mirror.onelab.eu/fedora/"
 FEDORA_MIRROR_KEYS="http://mirror.onelab.eu/keys/"
 ##########
 FEDORA_MIRROR_BASE="http://mirror.onelab.eu/fedora/"
 FEDORA_MIRROR_KEYS="http://mirror.onelab.eu/keys/"
-FEDORA_PREINSTALLED="yum initscripts passwd rsyslog vim-minimal dhclient chkconfig rootfiles policycoreutils openssh-server openssh-clients"
+FEDORA_PREINSTALLED="dnf dnf-yum passwd rsyslog vim-minimal dhclient chkconfig rootfiles policycoreutils openssh-server openssh-clients"
 DEBIAN_PREINSTALLED="openssh-server openssh-client"
 
 ########## networking utilities
 DEBIAN_PREINSTALLED="openssh-server openssh-client"
 
 ########## networking utilities
@@ -60,7 +60,7 @@ function masklen_to_netmask () {
     python <<EOF
 import sys
 masklen=$masklen
     python <<EOF
 import sys
 masklen=$masklen
-if not (masklen>=1 and masklen<=32): 
+if not (masklen>=1 and masklen<=32):
   print "Wrong masklen",masklen
   exit(1)
 result=[]
   print "Wrong masklen",masklen
   exit(1)
 result=[]
@@ -72,19 +72,22 @@ for i in range(4):
        result.append(masklen)
        masklen=0
 print ".".join([ str(256-2**(8-i)) for i in result ])
        result.append(masklen)
        masklen=0
 print ".".join([ str(256-2**(8-i)) for i in result ])
-  
+
 EOF
 }
 
 ##############################
 EOF
 }
 
 ##############################
-# return yum or debootstrap
+# return dnf or debootstrap
 function package_method () {
     fcdistro=$1; shift
     case $fcdistro in
 function package_method () {
     fcdistro=$1; shift
     case $fcdistro in
-       f[0-9]*|centos[0-9]*|sl[0-9]*) echo yum ;;
-       squeeze|wheezy|jessie|oneiric|precise|quantal|raring|saucy|trusty|utopic|vivid) echo debootstrap ;;
-       *) echo Unknown distro $fcdistro ;;
-    esac 
+        f[0-9]*|centos[0-9]*|sl[0-9]*)
+            echo dnf ;;
+        wheezy|jessie|precise|trusty|utopic|vivid|wily|xenial)
+            echo debootstrap ;;
+        *)
+            echo Unknown distro $fcdistro ;;
+    esac
 }
 
 # return arch from debian distro and personality
 }
 
 # return arch from debian distro and personality
@@ -92,22 +95,30 @@ function canonical_arch () {
     personality=$1; shift
     fcdistro=$1; shift
     case $(package_method $fcdistro) in
     personality=$1; shift
     fcdistro=$1; shift
     case $(package_method $fcdistro) in
-       yum)
-           case $personality in *32) echo i386 ;; *64) echo x86_64 ;; *) echo Unknown-arch-1 ;; esac ;;
-       debootstrap)
-           case $personality in *32) echo i386 ;; *64) echo amd64 ;; *) echo Unknown-arch-2 ;; esac ;;
-       *)
-           echo Unknown-arch-3 ;;
+        dnf)
+            case $personality in
+                *32) echo i386 ;;
+                *64) echo x86_64 ;;
+                *) echo Unknown-arch-1 ;;
+            esac ;;
+        debootstrap)
+            case $personality in
+                *32) echo i386 ;;
+                *64) echo amd64 ;;
+                *) echo Unknown-arch-2 ;;
+            esac ;;
+        *)
+            echo Unknown-arch-3 ;;
     esac
 }
 
 # the new test framework creates /timestamp in /vservers/<name> *before* populating it
     esac
 }
 
 # the new test framework creates /timestamp in /vservers/<name> *before* populating it
-function almost_empty () { 
-    dir="$1"; shift ; 
+function almost_empty () {
+    dir="$1"; shift ;
     # non existing is fine
     # non existing is fine
-    [ ! -d $dir ] && return 0; 
+    [ ! -d $dir ] && return 0;
     # need to have at most one file
     # need to have at most one file
-    count=$(cd $dir; ls | wc -l); [ $count -le 1 ]; 
+    count=$(cd $dir; ls | wc -l); [ $count -le 1 ];
 }
 
 ##############################
 }
 
 ##############################
@@ -118,9 +129,9 @@ function fedora_install() {
     lxc=$1; shift
     lxc_root=$(lxcroot $lxc)
 
     lxc=$1; shift
     lxc_root=$(lxcroot $lxc)
 
-    cache=/var/cache/lxc/fedora/$arch/$release
+    cache=/var/cache/lxc/fedora/$arch/${fedora_release}
     mkdir -p $cache
     mkdir -p $cache
-    
+
     (
         flock --exclusive --timeout 60 200 || { echo "Cache repository is busy." ; return 1 ; }
 
     (
         flock --exclusive --timeout 60 200 || { echo "Cache repository is busy." ; return 1 ; }
 
@@ -129,7 +140,7 @@ function fedora_install() {
             fedora_download $cache || { echo "Failed to download 'fedora base'"; return 1; }
         else
             echo "Updating cache $cache/rootfs ..."
             fedora_download $cache || { echo "Failed to download 'fedora base'"; return 1; }
         else
             echo "Updating cache $cache/rootfs ..."
-           if ! yum --installroot $cache/rootfs -y --nogpgcheck update ; then
+            if ! dnf --installroot $cache/rootfs --releasever ${fedora_release} -y --nogpgcheck update ; then
                 echo "Failed to update 'fedora base', continuing with last known good cache"
             else
                 echo "Update finished"
                 echo "Failed to update 'fedora base', continuing with last known good cache"
             else
                 echo "Update finished"
@@ -137,8 +148,8 @@ function fedora_install() {
         fi
 
         echo "Filling $lxc_root from $cache/rootfs ... "
         fi
 
         echo "Filling $lxc_root from $cache/rootfs ... "
-       rsync -a $cache/rootfs/ $lxc_root/
-       
+        rsync -a $cache/rootfs/ $lxc_root/
+
         return 0
 
         ) 200> $cache/lock
         return 0
 
         ) 200> $cache/lock
@@ -160,7 +171,7 @@ function fedora_download() {
 
     mkdir -p $INSTALL_ROOT || { echo "Failed to create '$INSTALL_ROOT' directory" ; return 1; }
 
 
     mkdir -p $INSTALL_ROOT || { echo "Failed to create '$INSTALL_ROOT' directory" ; return 1; }
 
-    mkdir -p $INSTALL_ROOT/etc/yum.repos.d   
+    mkdir -p $INSTALL_ROOT/etc/yum.repos.d
     mkdir -p $INSTALL_ROOT/dev
     mknod -m 0444 $INSTALL_ROOT/dev/random c 1 8
     mknod -m 0444 $INSTALL_ROOT/dev/urandom c 1 9
     mkdir -p $INSTALL_ROOT/dev
     mknod -m 0444 $INSTALL_ROOT/dev/random c 1 8
     mknod -m 0444 $INSTALL_ROOT/dev/urandom c 1 9
@@ -169,48 +180,49 @@ function fedora_download() {
     cp /etc/yum.conf $INSTALL_ROOT/etc/
     cp /etc/yum.repos.d/fedora* $INSTALL_ROOT/etc/yum.repos.d/
 
     cp /etc/yum.conf $INSTALL_ROOT/etc/
     cp /etc/yum.repos.d/fedora* $INSTALL_ROOT/etc/yum.repos.d/
 
-    # append fedora repo files with desired $release and $basearch
+    # append fedora repo files with desired ${fedora_release} and $basearch
     for f in $INSTALL_ROOT/etc/yum.repos.d/* ; do
     for f in $INSTALL_ROOT/etc/yum.repos.d/* ; do
-      sed -i "s/\$basearch/$arch/g; s/\$releasever/$release/g;" $f
-    done 
+      sed -i "s/\$basearch/$arch/g; s/\$releasever/${fedora_release}/g;" $f
+    done
 
 
-    MIRROR_URL=$FEDORA_MIRROR_BASE/releases/$release/Everything/$arch/os
-    RELEASE_URL1="$MIRROR_URL/Packages/fedora-release-$release-1.noarch.rpm"
-    # with fedora18 the rpms are scattered by first name
+    MIRROR_URL=$FEDORA_MIRROR_BASE/releases/${fedora_release}/Everything/$arch/os
+    # since fedora18 the rpms are scattered by first name
     # first try the second version of fedora-release first
     # first try the second version of fedora-release first
-    RELEASE_URL2="$MIRROR_URL/Packages/f/fedora-release-$release-2.noarch.rpm"
-    RELEASE_URL3="$MIRROR_URL/Packages/f/fedora-release-$release-1.noarch.rpm"
-   
-    RELEASE_TARGET=$INSTALL_ROOT/fedora-release-$release.noarch.rpm
+    RELEASE_URLS=""
+    for subindex in 3 2 1; do
+        RELEASE_URLS="$RELEASE_URLS $MIRROR_URL/Packages/f/fedora-release-${fedora_release}-1.noarch.rpm"
+    done
+
+    RELEASE_TARGET=$INSTALL_ROOT/fedora-release-${fedora_release}.noarch.rpm
     found=""
     found=""
-    for attempt in $RELEASE_URL1 $RELEASE_URL2 $RELEASE_URL3; do
-       if curl -f $attempt -o $RELEASE_TARGET ; then
-           echo "Retrieved $attempt"
-           found=true
-           break
-       else
-           echo "Failed attempt $attempt"
-       fi
+    for attempt in $RELEASE_URLS; do
+        if curl --silent --fail $attempt -o $RELEASE_TARGET; then
+            echo "Successfully Retrieved $attempt"
+            found=true
+            break
+        else
+            echo "Failed (not to worry about) with attempt $attempt"
+        fi
     done
     [ -n "$found" ] || { echo "Could not retrieve fedora-release rpm - exiting" ; exit 1; }
     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
     # when installing f12 this apparently is already present, so ignore result
     mkdir -p $INSTALL_ROOT/var/lib/rpm
     rpm --root $INSTALL_ROOT  --initdb
     # when installing f12 this apparently is already present, so ignore result
-    rpm --root $INSTALL_ROOT -ivh $INSTALL_ROOT/fedora-release-$release.noarch.rpm || :
+    rpm --root $INSTALL_ROOT -ivh $INSTALL_ROOT/fedora-release-${fedora_release}.noarch.rpm || :
     # however f12 root images won't get created on a f18 host
     # (the issue here is the same as the one we ran into when dealing with a vs-box)
     # in a nutshell, in f12 the glibc-common and filesystem rpms have an apparent conflict
     # however f12 root images won't get created on a f18 host
     # (the issue here is the same as the one we ran into when dealing with a vs-box)
     # in a nutshell, in f12 the glibc-common and filesystem rpms have an apparent conflict
-    # >>> file /usr/lib/locale from install of glibc-common-2.11.2-3.x86_64 conflicts 
+    # >>> file /usr/lib/locale from install of glibc-common-2.11.2-3.x86_64 conflicts
     #          with file from package filesystem-2.4.30-2.fc12.x86_64
     #          with file from package filesystem-2.4.30-2.fc12.x86_64
-    # in fact this was - of course - allowed by f12's rpm but later on a fix was made 
+    # in fact this was - of course - allowed by f12's rpm but later on a fix was made
     #   http://rpm.org/gitweb?p=rpm.git;a=commitdiff;h=cf1095648194104a81a58abead05974a5bfa3b9a
     # So ideally if we want to be able to build f12 images from f18 we need an rpm that has
     # this patch undone, like we have in place on our f14 boxes (our f14 boxes need a f18-like rpm)
 
     #   http://rpm.org/gitweb?p=rpm.git;a=commitdiff;h=cf1095648194104a81a58abead05974a5bfa3b9a
     # So ideally if we want to be able to build f12 images from f18 we need an rpm that has
     # this patch undone, like we have in place on our f14 boxes (our f14 boxes need a f18-like rpm)
 
-    YUM="yum --installroot=$INSTALL_ROOT --nogpgcheck -y"
-    echo "$YUM install $FEDORA_PREINSTALLED"
-    $YUM install $FEDORA_PREINSTALLED || { echo "Failed to download rootfs, aborting." ; return 1; }
+    DNF="dnf --installroot=$INSTALL_ROOT --releasever=${fedora_release} --nogpgcheck -y"
+    echo "$DNF install $FEDORA_PREINSTALLED"
+    $DNF install $FEDORA_PREINSTALLED || { echo "Failed to download rootfs, aborting." ; return 1; }
 
     mv "$INSTALL_ROOT" "$cache/rootfs"
     echo "Download complete."
 
     mv "$INSTALL_ROOT" "$cache/rootfs"
     echo "Download complete."
@@ -231,27 +243,13 @@ function fedora_configure() {
     mkdir -p $lxc_root/selinux
     echo 0 > $lxc_root/selinux/enforce
 
     mkdir -p $lxc_root/selinux
     echo 0 > $lxc_root/selinux/enforce
 
-    # set the hostname
-    case "$fcdistro" in 
-       f18|f2?)
-            cat <<EOF > ${lxc_root}/etc/sysconfig/network
+    # enable networking and set hostname
+    cat <<EOF > ${lxc_root}/etc/sysconfig/network
 NETWORKING=yes
 EOF
 NETWORKING=yes
 EOF
-           cat <<EOF > ${lxc_root}/etc/hostname
+    cat <<EOF > ${lxc_root}/etc/hostname
 $GUEST_HOSTNAME
 EOF
 $GUEST_HOSTNAME
 EOF
-           echo ;;
-       *)
-            cat <<EOF > ${lxc_root}/etc/sysconfig/network
-NETWORKING=yes
-HOSTNAME=$GUEST_HOSTNAME
-EOF
-            # set minimal hosts
-           cat <<EOF > $lxc_root/etc/hosts
-127.0.0.1 localhost $GUEST_HOSTNAME
-EOF
-           echo ;;
-    esac
 
     dev_path="${lxc_root}/dev"
     rm -rf $dev_path
 
     dev_path="${lxc_root}/dev"
     rm -rf $dev_path
@@ -273,11 +271,7 @@ EOF
     mknod -m 600 ${dev_path}/initctl p
     mknod -m 666 ${dev_path}/ptmx c 5 2
 
     mknod -m 600 ${dev_path}/initctl p
     mknod -m 666 ${dev_path}/ptmx c 5 2
 
-    if [ "$(echo $fcdistro | cut -d"f" -f2)" -le "14" ]; then
-       fedora_configure_init $lxc
-    else
-       fedora_configure_systemd $lxc
-    fi
+    fedora_configure_systemd $lxc
 
     guest_ifcfg=${lxc_root}/etc/sysconfig/network-scripts/ifcfg-$VIF_GUEST
     ( [ -n "$NAT_MODE" ] && write_guest_ifcfg_natip || write_guest_ifcfg_publicip ) > $guest_ifcfg
 
     guest_ifcfg=${lxc_root}/etc/sysconfig/network-scripts/ifcfg-$VIF_GUEST
     ( [ -n "$NAT_MODE" ] && write_guest_ifcfg_natip || write_guest_ifcfg_publicip ) > $guest_ifcfg
@@ -287,21 +281,6 @@ EOF
     return 0
 }
 
     return 0
 }
 
-function fedora_configure_init() {
-    set -e
-    set -x
-    lxc=$1; shift
-    lxc_root=$(lxcroot $lxc)
-
-    sed -i 's|.sbin.start_udev||' ${lxc_root}/etc/rc.sysinit
-    sed -i 's|.sbin.start_udev||' ${lxc_root}/etc/rc.d/rc.sysinit
-    # don't mount devpts, for pete's sake
-    sed -i 's/^.*dev.pts.*$/#\0/' ${lxc_root}/etc/rc.sysinit
-    sed -i 's/^.*dev.pts.*$/#\0/' ${lxc_root}/etc/rc.d/rc.sysinit
-    chroot ${lxc_root} $personality chkconfig udev-post off
-    chroot ${lxc_root} $personality chkconfig network on
-}
-
 # this code of course is for guests that do run on systemd
 function fedora_configure_systemd() {
     set -e
 # this code of course is for guests that do run on systemd
 function fedora_configure_systemd() {
     set -e
@@ -309,7 +288,7 @@ function fedora_configure_systemd() {
     lxc=$1; shift
     lxc_root=$(lxcroot $lxc)
 
     lxc=$1; shift
     lxc_root=$(lxcroot $lxc)
 
-    # so ignore if we can't find /etc/systemd at all 
+    # so ignore if we can't find /etc/systemd at all
     [ -d ${lxc_root}/etc/systemd ] || return 0
     # otherwise let's proceed
     ln -sf /lib/systemd/system/multi-user.target ${lxc_root}/etc/systemd/system/default.target
     [ -d ${lxc_root}/etc/systemd ] || return 0
     # otherwise let's proceed
     ln -sf /lib/systemd/system/multi-user.target ${lxc_root}/etc/systemd/system/default.target
@@ -326,8 +305,8 @@ function fedora_configure_systemd() {
 
 # overwrite container yum config
 function fedora_configure_yum () {
 
 # overwrite container yum config
 function fedora_configure_yum () {
-    set -x 
-    set -e 
+    set -x
+    set -e
     trap failure ERR INT
 
     lxc=$1; shift
     trap failure ERR INT
 
     lxc=$1; shift
@@ -348,7 +327,7 @@ baseurl=$FEDORA_MIRROR_BASE/releases/\$releasever/Everything/\$basearch/os/
 enabled=1
 metadata_expire=7d
 gpgcheck=1
 enabled=1
 metadata_expire=7d
 gpgcheck=1
-gpgkey=$FEDORA_MIRROR_KEYS/RPM-GPG-KEY-fedora-$release-primary
+gpgkey=$FEDORA_MIRROR_KEYS/RPM-GPG-KEY-fedora-${fedora_release}-primary
 
 [updates]
 name=Fedora \$releasever - \$basearch - Updates
 
 [updates]
 name=Fedora \$releasever - \$basearch - Updates
@@ -356,31 +335,35 @@ baseurl=$FEDORA_MIRROR_BASE/updates/\$releasever/\$basearch/
 enabled=1
 metadata_expire=7d
 gpgcheck=1
 enabled=1
 metadata_expire=7d
 gpgcheck=1
-gpgkey=$FEDORA_MIRROR_KEYS/RPM-GPG-KEY-fedora-$release-primary
+gpgkey=$FEDORA_MIRROR_KEYS/RPM-GPG-KEY-fedora-${fedora_release}-primary
 EOF
 
 EOF
 
+    # import fedora key so that gpgckeck does not whine or require stdin
+    # required since fedora24
+    rpm --root $lxc_root --import $FEDORA_MIRROR_KEYS/RPM-GPG-KEY-fedora-${fedora_release}-primary
+
     # for using this script as a general-purpose lxc creation wrapper
     # just mention 'none' as the repo url
     if [ -n "$REPO_URL" ] ; then
     # for using this script as a general-purpose lxc creation wrapper
     # just mention 'none' as the repo url
     if [ -n "$REPO_URL" ] ; then
-       if [ ! -d $lxc_root/etc/yum.repos.d ] ; then
-           echo "WARNING : cannot create myplc repo"
-       else
-            # exclude kernel from fedora repos 
-           yumexclude=$(pl_plcyumexclude $fcdistro $pldistro $DIRNAME)
-           for repo in $lxc_root/etc/yum.repos.d/* ; do
-               [ -f $repo ] && yumconf_exclude $repo "exclude=$yumexclude" 
-           done
-           # the build repo is not signed at this stage
-           cat > $lxc_root/etc/yum.repos.d/myplc.repo <<EOF
+        if [ ! -d $lxc_root/etc/yum.repos.d ] ; then
+            echo "WARNING : cannot create myplc repo"
+        else
+            # exclude kernel from fedora repos
+            yumexclude=$(pl_plcyumexclude $fcdistro $pldistro $DIRNAME)
+            for repo in $lxc_root/etc/yum.repos.d/* ; do
+                [ -f $repo ] && yumconf_exclude $repo "exclude=$yumexclude"
+            done
+            # the build repo is not signed at this stage
+            cat > $lxc_root/etc/yum.repos.d/myplc.repo <<EOF
 [myplc]
 name= MyPLC
 baseurl=$REPO_URL
 enabled=1
 gpgcheck=0
 EOF
 [myplc]
 name= MyPLC
 baseurl=$REPO_URL
 enabled=1
 gpgcheck=0
 EOF
-       fi
+        fi
     fi
     fi
-}    
+}
 
 ##############################
 # apparently ubuntu exposes a mirrors list by country at
 
 ##############################
 # apparently ubuntu exposes a mirrors list by country at
@@ -389,12 +372,11 @@ EOF
 function debian_mirror () {
     fcdistro=$1; shift
     case $fcdistro in
 function debian_mirror () {
     fcdistro=$1; shift
     case $fcdistro in
-       squeeze|wheezy|jessie) 
-           echo http://ftp2.fr.debian.org/debian/ ;;
-       oneiric|precise|quantal|raring|saucy|trusty|utopic|vivid) 
-#          echo http://mir1.ovh.net/ubuntu/ubuntu/ ;;
-           echo http://www-ftp.lip6.fr/pub/linux/distributions/Ubuntu/archive/ ;;
-       *) echo unknown distro $fcdistro; exit 1;;
+        wheezy|jessie)
+            echo http://ftp2.fr.debian.org/debian/ ;;
+        precise|trusty|utopic|vivid|wily|xenial)
+            echo http://www-ftp.lip6.fr/pub/linux/distributions/Ubuntu/archive/ ;;
+        *) echo unknown distro $fcdistro; exit 1;;
     esac
 }
 
     esac
 }
 
@@ -417,7 +399,7 @@ function debian_install () {
     cat <<EOF > ${lxc_root}/etc/hostname
 $GUEST_HOSTNAME
 EOF
     cat <<EOF > ${lxc_root}/etc/hostname
 $GUEST_HOSTNAME
 EOF
-    
+
 }
 
 function debian_configure () {
 }
 
 function debian_configure () {
@@ -455,38 +437,43 @@ function setup_lxc() {
 
     lxc_root=$(lxcroot $lxc)
 
 
     lxc_root=$(lxcroot $lxc)
 
-    # create lxc container 
-    
+    # create lxc container
+
     pkg_method=$(package_method $fcdistro)
     case $pkg_method in
     pkg_method=$(package_method $fcdistro)
     case $pkg_method in
-       yum)
+        dnf)
             if [ -z "$IMAGE" ]; then
                 fedora_install $lxc ||  { echo "failed to install fedora root image"; exit 1 ; }
             if [ -z "$IMAGE" ]; then
                 fedora_install $lxc ||  { echo "failed to install fedora root image"; exit 1 ; }
+                # this appears to be safer; observed in Jan. 2016 on a f23 host and a f14 cached image
+                # we were getting this message when attempting the first chroot dnf install
+                # rpmdb: Program version 4.8 doesn't match environment version 5.3
+                chroot $(lxcroot $lxc) $personality rm -rf /var/lib/rpm/__db.00{0,1,2,3,4,5,6,7,8,9}
+                chroot $(lxcroot $lxc) $personality rpm --rebuilddb
             fi
             fi
-           fedora_configure $lxc || { echo "failed to configure fedora for a container"; exit 1 ; }
-           ;;
-       debootstrap)
+            fedora_configure $lxc || { echo "failed to configure fedora for a container"; exit 1 ; }
+            ;;
+        debootstrap)
             if [ -z "$IMAGE" ]; then
             if [ -z "$IMAGE" ]; then
-               debian_install $lxc || { echo "failed to install debian/ubuntu root image"; exit 1 ; }
+                debian_install $lxc || { echo "failed to install debian/ubuntu root image"; exit 1 ; }
             fi
             fi
-           debian_configure || { echo "failed to configure debian/ubuntu for a container"; exit 1 ; }
-           ;;
-       *)
-           echo "$COMMAND:: unknown package_method - exiting"
-           exit 1
-           ;;
+            debian_configure || { echo "failed to configure debian/ubuntu for a container"; exit 1 ; }
+            ;;
+        *)
+            echo "$COMMAND:: unknown package_method - exiting"
+            exit 1
+            ;;
     esac
 
     # Enable cgroup -- xxx -- is this really useful ?
     [ -d $lxc_root/cgroup ] || mkdir $lxc_root/cgroup
     esac
 
     # Enable cgroup -- xxx -- is this really useful ?
     [ -d $lxc_root/cgroup ] || mkdir $lxc_root/cgroup
-    
+
     ### set up resolv.conf from host
     # ubuntu precise and on, /etc/resolv.conf is a symlink to ../run/resolvconf/resolv.conf
     [ -h $lxc_root/etc/resolv.conf ] && rm -f $lxc_root/etc/resolv.conf
     cp /etc/resolv.conf $lxc_root/etc/resolv.conf
     ### and /etc/hosts for at least localhost
     [ -f $lxc_root/etc/hosts ] || echo "127.0.0.1 localhost localhost.localdomain" > $lxc_root/etc/hosts
     ### set up resolv.conf from host
     # ubuntu precise and on, /etc/resolv.conf is a symlink to ../run/resolvconf/resolv.conf
     [ -h $lxc_root/etc/resolv.conf ] && rm -f $lxc_root/etc/resolv.conf
     cp /etc/resolv.conf $lxc_root/etc/resolv.conf
     ### and /etc/hosts for at least localhost
     [ -f $lxc_root/etc/hosts ] || echo "127.0.0.1 localhost localhost.localdomain" > $lxc_root/etc/hosts
-    
+
     # grant ssh access from host to guest
     mkdir -p $lxc_root/root/.ssh
     cat /root/.ssh/id_rsa.pub >> $lxc_root/root/.ssh/authorized_keys
     # grant ssh access from host to guest
     mkdir -p $lxc_root/root/.ssh
     cat /root/.ssh/id_rsa.pub >> $lxc_root/root/.ssh/authorized_keys
@@ -496,7 +483,7 @@ function setup_lxc() {
     # don't keep the input xml, this can be retrieved at all times with virsh dumpxml
     config_xml=/tmp/$lxc.xml
     ( [ -n "$NAT_MODE" ] && write_lxc_xml_natip $lxc || write_lxc_xml_publicip $lxc ) > $config_xml
     # don't keep the input xml, this can be retrieved at all times with virsh dumpxml
     config_xml=/tmp/$lxc.xml
     ( [ -n "$NAT_MODE" ] && write_lxc_xml_natip $lxc || write_lxc_xml_publicip $lxc ) > $config_xml
-    
+
     # define lxc container for libvirt
     virsh -c lxc:/// define $config_xml
 
     # define lxc container for libvirt
     virsh -c lxc:/// define $config_xml
 
@@ -548,7 +535,7 @@ EOF
 }
 
 # grant build guests the ability to do mknods
 }
 
 # grant build guests the ability to do mknods
-function write_lxc_xml_natip () { 
+function write_lxc_xml_natip () {
     lxc=$1; shift
     lxc_root=$(lxcroot $lxc)
     cat <<EOF
     lxc=$1; shift
     lxc_root=$(lxcroot $lxc)
     cat <<EOF
@@ -615,8 +602,8 @@ EOF
 
 function devel_or_test_tools () {
 
 
 function devel_or_test_tools () {
 
-    set -x 
-    set -e 
+    set -x
+    set -e
     trap failure ERR INT
 
     lxc=$1; shift
     trap failure ERR INT
 
     lxc=$1; shift
@@ -632,7 +619,7 @@ function devel_or_test_tools () {
 
     ### install individual packages, then groups
     # get target arch - use uname -i here (we want either x86_64 or i386)
 
     ### install individual packages, then groups
     # get target arch - use uname -i here (we want either x86_64 or i386)
-   
+
     lxc_arch=$(chroot ${lxc_root} $personality uname -i)
     # on debian systems we get arch through the 'arch' command
     [ "$lxc_arch" = "unknown" ] && lxc_arch=$(chroot ${lxc_root} $personality arch)
     lxc_arch=$(chroot ${lxc_root} $personality uname -i)
     # on debian systems we get arch through the 'arch' command
     [ "$lxc_arch" = "unknown" ] && lxc_arch=$(chroot ${lxc_root} $personality arch)
@@ -641,43 +628,56 @@ function devel_or_test_tools () {
     groups=$(pl_getGroups -a $lxc_arch $fcdistro $pldistro $pkgsfile)
 
     case "$pkg_method" in
     groups=$(pl_getGroups -a $lxc_arch $fcdistro $pldistro $pkgsfile)
 
     case "$pkg_method" in
-       yum)
-           [ -n "$packages" ] && chroot ${lxc_root} $personality yum -y install $packages
-           for group_plus in $groups; do
-               group=$(echo $group_plus | sed -e "s,+++, ,g")
-               chroot ${lxc_root} $personality yum -y groupinstall "$group"
-           done
-           # store current rpm list in /init-lxc.rpms in case we need to check the contents
-           chroot ${lxc_root} $personality rpm -aq > $lxc_root/init-lxc.rpms
-           ;;
-       debootstrap)
-           # for ubuntu
-           if grep -iq ubuntu /vservers/$lxc/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/$lxc/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/$lxc/etc/apt ; head -1 sources.list | sed -e 's, main,-updates main,' > sources.list.d/updates.list )
-               # tell apt about the changes
-               chroot /vservers/$lxc apt-get update
-           fi
-           for package in $packages ; do
-               # container not started yet
-               #virsh -c lxc:/// lxc-enter-namespace $lxc /usr/bin/$personality /bin/bash -c "apt-get install -y $package" || :
-               chroot ${lxc_root} $personality apt-get install -y $package || :
-           done
-           ### xxx todo install groups with apt..
-           ;;
-       *)
-           echo "unknown pkg_method $pkg_method"
-           ;;
+        dnf)
+            # --allowerasing required starting with fedora24
+            #
+            has_dnf=""
+            chroot ${lxc_root} $personality dnf --version && has_dnf=true
+            if [ -n "$has_dnf" ]; then
+                echo "container has dnf - invoking with --allowerasing"
+                pkg_installer="dnf -y install --allowerasing"
+                grp_installer="dnf -y groupinstall --allowerasing"
+            else
+                echo "container has only dnf"
+                pkg_installer="dnf -y install"
+                grp_installer="dnf -y groupinstall"
+            fi
+            [ -n "$packages" ] && chroot ${lxc_root} $personality $pkg_installer $packages
+            for group_plus in $groups; do
+                group=$(echo $group_plus | sed -e "s,+++, ,g")
+                chroot ${lxc_root} $personality $grp_installer "$group"
+            done
+            # store current rpm list in /init-lxc.rpms in case we need to check the contents
+            chroot ${lxc_root} $personality rpm -aq > $lxc_root/init-lxc.rpms
+            ;;
+        debootstrap)
+            # for ubuntu
+            if grep -iq ubuntu /vservers/$lxc/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/$lxc/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/$lxc/etc/apt ; head -1 sources.list | sed -e 's, main,-updates main,' > sources.list.d/updates.list )
+                # tell apt about the changes
+                chroot /vservers/$lxc apt-get update
+            fi
+            for package in $packages ; do
+                # container not started yet
+                #virsh -c lxc:/// lxc-enter-namespace $lxc /usr/bin/$personality /bin/bash -c "apt-get install -y $package" || :
+                chroot ${lxc_root} $personality apt-get install -y $package || :
+            done
+            ### xxx todo install groups with apt..
+            ;;
+        *)
+            echo "unknown pkg_method $pkg_method"
+            ;;
     esac
 
     return 0
 }
 
 function post_install () {
     esac
 
     return 0
 }
 
 function post_install () {
-    lxc=$1; shift 
+    lxc=$1; shift
     personality=$1; shift
     lxc_root=$(lxcroot $lxc)
     # setup localtime from the host
     personality=$1; shift
     lxc_root=$(lxcroot $lxc)
     # setup localtime from the host
@@ -687,28 +687,28 @@ function post_install () {
     [ -n "$NAT_MODE" ] && post_install_natip $lxc $personality || post_install_myplc $lxc $personality
     # start the VM unless specified otherwise
     if [ -n "$START_VM" ] ; then
     [ -n "$NAT_MODE" ] && post_install_natip $lxc $personality || post_install_myplc $lxc $personality
     # start the VM unless specified otherwise
     if [ -n "$START_VM" ] ; then
-       echo Starting guest $lxc
-       virsh -c lxc:/// start $lxc
-       if [ -n "$NAT_MODE" ] ; then
-           wait_for_ssh $lxc
-       else
-           wait_for_ssh $lxc $GUEST_IP
-       fi
+        echo Starting guest $lxc
+        virsh -c lxc:/// start $lxc
+        if [ -n "$NAT_MODE" ] ; then
+            wait_for_ssh $lxc
+        else
+            wait_for_ssh $lxc $GUEST_IP
+        fi
     fi
 }
 
 # just in case, let's stay on the safe side
 function sshd_disable_password_auth () {
     fi
 }
 
 # just in case, let's stay on the safe side
 function sshd_disable_password_auth () {
-    lxc=$1; shift 
+    lxc=$1; shift
     lxc_root=$(lxcroot $lxc)
     lxc_root=$(lxcroot $lxc)
-    sed --inplace=.password -e 's,^#\?PasswordAuthentication.*,PasswordAuthentication no,' \
-       $lxc_root/etc/ssh/sshd_config
+    sed --in-place=.password -e 's,^#\?PasswordAuthentication.*,PasswordAuthentication no,' \
+        $lxc_root/etc/ssh/sshd_config
 }
 
 function post_install_natip () {
 
 }
 
 function post_install_natip () {
 
-    set -x 
-    set -e 
+    set -x
+    set -e
     trap failure ERR INT
 
     lxc=$1; shift
     trap failure ERR INT
 
     lxc=$1; shift
@@ -718,19 +718,19 @@ function post_install_natip () {
 ### From myplc-devel-native.spec
 # be careful to backslash $ in this, otherwise it's the root context that's going to do the evaluation
     cat << EOF | chroot ${lxc_root} $personality bash -x
 ### From myplc-devel-native.spec
 # be careful to backslash $ in this, otherwise it's the root context that's going to do the evaluation
     cat << EOF | chroot ${lxc_root} $personality bash -x
-    
+
     # customize root's prompt
     /bin/cat << PROFILE > /root/.profile
 export PS1="[$lxc] \\w # "
 PROFILE
 
 EOF
     # customize root's prompt
     /bin/cat << PROFILE > /root/.profile
 export PS1="[$lxc] \\w # "
 PROFILE
 
 EOF
-       
+
 }
 
 function post_install_myplc  () {
 }
 
 function post_install_myplc  () {
-    set -x 
-    set -e 
+    set -x
+    set -e
     trap failure ERR INT
 
     lxc=$1; shift
     trap failure ERR INT
 
     lxc=$1; shift
@@ -777,24 +777,24 @@ function wait_for_ssh () {
     # if run in public_ip mode, we know the IP of the guest and it is specified here
     [ -n "$1" ] && { guest_ip=$1; shift; }
 
     # if run in public_ip mode, we know the IP of the guest and it is specified here
     [ -n "$1" ] && { guest_ip=$1; shift; }
 
-    #wait max 2 min for sshd to start 
+    #wait max 2 min for sshd to start
     success=""
     current_time=$(date +%s)
     stop_time=$(($current_time + 120))
     success=""
     current_time=$(date +%s)
     stop_time=$(($current_time + 120))
-    
+
     counter=1
     while [ "$current_time" -lt "$stop_time" ] ; do
          echo "$counter-th attempt to reach sshd in container $lxc ..."
     counter=1
     while [ "$current_time" -lt "$stop_time" ] ; do
          echo "$counter-th attempt to reach sshd in container $lxc ..."
-        [ -z "$guest_ip" ] && guest_ip=$(guest_ipv4 $lxc)
-        [ -n "$guest_ip" ] && ssh -o "StrictHostKeyChecking no" $guest_ip 'uname -i' && { 
-                success=true; echo "SSHD in container $lxc is UP on IP $guest_ip"; break ; } || :
+         [ -z "$guest_ip" ] && guest_ip=$(guest_ipv4 $lxc)
+         [ -n "$guest_ip" ] && ssh -o "StrictHostKeyChecking no" $guest_ip 'uname -i' && {
+                 success=true; echo "SSHD in container $lxc is UP on IP $guest_ip"; break ; } || :
          counter=$(($counter+1))
          sleep 10
          counter=$(($counter+1))
          sleep 10
-        current_time=$(date +%s)
+         current_time=$(date +%s)
     done
 
     # Thierry: this is fatal, let's just exit with a failure here
     done
 
     # Thierry: this is fatal, let's just exit with a failure here
-    [ -z $success ] && { echo "SSHD in container $lxc could not be reached (guest_ip=$guest_ip)" ; exit 1 ; } 
+    [ -z $success ] && { echo "SSHD in container $lxc could not be reached (guest_ip=$guest_ip)" ; exit 1 ; }
     return 0
 }
 
     return 0
 }
 
@@ -805,7 +805,7 @@ function failure () {
 }
 
 function usage () {
 }
 
 function usage () {
-    set +x 
+    set +x
     echo "Usage: $COMMAND [options] lxc-name             (aka build mode)"
     echo "Usage: $COMMAND -n hostname [options] lxc-name (aka test mode)"
     echo "Description:"
     echo "Usage: $COMMAND [options] lxc-name             (aka build mode)"
     echo "Usage: $COMMAND -n hostname [options] lxc-name (aka test mode)"
     echo "Description:"
@@ -828,7 +828,7 @@ function usage () {
     exit 1
 }
 
     exit 1
 }
 
-### parse args and 
+### parse args and
 function main () {
 
     #set -e
 function main () {
 
     #set -e
@@ -841,21 +841,21 @@ function main () {
 
     START_VM=true
     while getopts "n:f:d:p:r:P:i:m:sv" opt ; do
 
     START_VM=true
     while getopts "n:f:d:p:r:P:i:m:sv" opt ; do
-       case $opt in
-           n) GUEST_HOSTNAME=$OPTARG;;
-           f) fcdistro=$OPTARG;;
-           d) pldistro=$OPTARG;;
-           p) personality=$OPTARG;;
-           r) REPO_URL=$OPTARG;;
-           P) PREINSTALLED=$OPTARG;;
+        case $opt in
+            n) GUEST_HOSTNAME=$OPTARG;;
+            f) fcdistro=$OPTARG;;
+            d) pldistro=$OPTARG;;
+            p) personality=$OPTARG;;
+            r) REPO_URL=$OPTARG;;
+            P) PREINSTALLED=$OPTARG;;
             i) IMAGE=$OPTARG;;
             m) MEMORY=$OPTARG;;
             i) IMAGE=$OPTARG;;
             m) MEMORY=$OPTARG;;
-           s) START_VM= ;;
-           v) VERBOSE=true; set -x;;
-           *) usage ;;
-       esac
+            s) START_VM= ;;
+            v) VERBOSE=true; set -x;;
+            *) usage ;;
+        esac
     done
     done
-       
+
     shift $(($OPTIND - 1))
 
     # parse fixed arguments
     shift $(($OPTIND - 1))
 
     # parse fixed arguments
@@ -865,9 +865,9 @@ function main () {
 
     # rainchecks
     almost_empty $lxc_root || \
 
     # rainchecks
     almost_empty $lxc_root || \
-       { echo "container $lxc already exists in $lxc_root - exiting" ; exit 1 ; }
+        { echo "container $lxc already exists in $lxc_root - exiting" ; exit 1 ; }
     virsh -c lxc:/// domuuid $lxc >& /dev/null && \
     virsh -c lxc:/// domuuid $lxc >& /dev/null && \
-       { echo "container $lxc already exists in libvirt - exiting" ; exit 1 ; }
+        { echo "container $lxc already exists in libvirt - exiting" ; exit 1 ; }
     mkdir -p $lxc_root
 
     # if IMAGE, copy the provided rootfs to lxc_root
     mkdir -p $lxc_root
 
     # if IMAGE, copy the provided rootfs to lxc_root
@@ -888,35 +888,35 @@ function main () {
     [ -z "$pldistro" ] && pldistro=$DEFAULT_PLDISTRO
     [ -z "$personality" ] && personality=$DEFAULT_PERSONALITY
     [ -z "$MEMORY" ] && MEMORY=$DEFAULT_MEMORY
     [ -z "$pldistro" ] && pldistro=$DEFAULT_PLDISTRO
     [ -z "$personality" ] && personality=$DEFAULT_PERSONALITY
     [ -z "$MEMORY" ] && MEMORY=$DEFAULT_MEMORY
-    
+
     # set memory in KB
     MEMORY=$(($MEMORY * 1024))
     # set memory in KB
     MEMORY=$(($MEMORY * 1024))
-    
+
     # the set of preinstalled packages - depends on mode
     if [ -z "$PREINSTALLED" ] ; then
     # the set of preinstalled packages - depends on mode
     if [ -z "$PREINSTALLED" ] ; then
-       if [ -n "$NAT_MODE" ] ; then
-           PREINSTALLED=devel.pkgs
-       else
-           PREINSTALLED=runtime.pkgs
-       fi
+        if [ -n "$NAT_MODE" ] ; then
+            PREINSTALLED=devel.pkgs
+        else
+            PREINSTALLED=runtime.pkgs
+        fi
     fi
 
     if [ -n "$NAT_MODE" ] ; then
     fi
 
     if [ -n "$NAT_MODE" ] ; then
-       # we can now set GUEST_HOSTNAME safely
+        # we can now set GUEST_HOSTNAME safely
         [ -z "$GUEST_HOSTNAME" ] && GUEST_HOSTNAME=$(echo $lxc | sed -e 's,\.,-,g')
     else
         [ -z "$GUEST_HOSTNAME" ] && GUEST_HOSTNAME=$(echo $lxc | sed -e 's,\.,-,g')
     else
-       # as this command can be used in other contexts, not specifying
-       # a repo is considered a warning
-       # use -r none to get rid of this warning
-       if [ "$REPO_URL" == "none" ] ; then
-           REPO_URL=""
-       elif [ -z "$REPO_URL" ] ; then
-           echo "WARNING -- setting up a yum repo is recommended" 
-       fi
+        # as this command can be used in other contexts, not specifying
+        # a repo is considered a warning
+        # use -r none to get rid of this warning
+        if [ "$REPO_URL" == "none" ] ; then
+            REPO_URL=""
+        elif [ -z "$REPO_URL" ] ; then
+            echo "WARNING -- setting up a yum repo is recommended"
+        fi
     fi
 
     ##########
     fi
 
     ##########
-    release=$(echo $fcdistro | cut -df -f2)
+    fedora_release=$(echo $fcdistro | cut -df -f2)
 
     if [ "$personality" == "linux32" ]; then
         arch=i386
 
     if [ "$personality" == "linux32" ]; then
         arch=i386
@@ -932,18 +932,18 @@ function main () {
     # (build mode relies entirely on dhcp on the private subnet)
     if [ -z "$NAT_MODE" ] ; then
 
     # (build mode relies entirely on dhcp on the private subnet)
     if [ -z "$NAT_MODE" ] ; then
 
-       #create_bridge_if_needed $PUBLIC_BRIDGE
-       lbuild-bridge.sh $PUBLIC_BRIDGE
+        #create_bridge_if_needed $PUBLIC_BRIDGE
+        lbuild-bridge.sh $PUBLIC_BRIDGE
 
 
-       GUEST_IP=$(gethostbyname $GUEST_HOSTNAME)
-       # use same NETMASK as bridge interface br0
-       masklen=$(ip addr show $PUBLIC_BRIDGE | grep -v inet6 | grep inet | awk '{print $2;}' | cut -d/ -f2)
+        GUEST_IP=$(gethostbyname $GUEST_HOSTNAME)
+        # use same NETMASK as bridge interface br0
+        masklen=$(ip addr show $PUBLIC_BRIDGE | grep -v inet6 | grep inet | awk '{print $2;}' | cut -d/ -f2)
         NETMASK=$(masklen_to_netmask $masklen)
         GATEWAY=$(ip route show | grep default | awk '{print $3}' | head -1)
         VIF_HOST="vif$(echo $GUEST_HOSTNAME | cut -d. -f1)"
     fi
 
         NETMASK=$(masklen_to_netmask $masklen)
         GATEWAY=$(ip route show | grep default | awk '{print $3}' | head -1)
         VIF_HOST="vif$(echo $GUEST_HOSTNAME | cut -d. -f1)"
     fi
 
-    setup_lxc $lxc $fcdistro $pldistro $personality 
+    setup_lxc $lxc $fcdistro $pldistro $personality
 
     # historically this command is for setting up a build or a test VM
     # kind of patchy right now though
 
     # historically this command is for setting up a build or a test VM
     # kind of patchy right now though
@@ -951,7 +951,7 @@ function main () {
 
     # container gets started here
     post_install $lxc $personality
 
     # container gets started here
     post_install $lxc $personality
-    
+
     echo $COMMAND Done
 
     exit 0
     echo $COMMAND Done
 
     exit 0