Setting tag nodemanager-7.0-0
[build.git] / lbuild-initvm.sh
index 2bee313..5dedf7f 100755 (executable)
@@ -24,7 +24,7 @@ export PATH=$PATH:/bin:/sbin
 # it works, but this really is poor practice
 # we should have an lxc_root function instead
 function lxcroot () {
 # it works, but this really is poor practice
 # we should have an lxc_root function instead
 function lxcroot () {
-    lxc=$1; shift
+    local lxc=$1; shift
     echo /vservers/$lxc
 }
 
     echo /vservers/$lxc
 }
 
@@ -43,43 +43,42 @@ PUBLIC_BRIDGE=br0
 VIF_GUEST=eth0
 
 ##########
 VIF_GUEST=eth0
 
 ##########
-FEDORA_MIRROR_BASE="http://mirror.onelab.eu/fedora/"
+FEDORA_MIRROR="http://mirror.onelab.eu/"
 FEDORA_MIRROR_KEYS="http://mirror.onelab.eu/keys/"
 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
 function gethostbyname () {
 FEDORA_MIRROR_KEYS="http://mirror.onelab.eu/keys/"
 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
 function gethostbyname () {
-    hostname=$1
-    python -c "import socket; print socket.gethostbyname('"$hostname"')" 2> /dev/null
+    local hostname=$1
+    python3 -c "import socket; print(socket.gethostbyname('"$hostname"'))" 2> /dev/null
 }
 
 # e.g. 21 -> 255.255.248.0
 function masklen_to_netmask () {
 }
 
 # e.g. 21 -> 255.255.248.0
 function masklen_to_netmask () {
-    masklen=$1; shift
-    python <<EOF
+    local masklen=$1; shift
+    python3 <<EOF
 import sys
 import sys
-masklen=$masklen
-if not (masklen>=1 and masklen<=32):
-  print "Wrong masklen",masklen
+masklen = $masklen
+if not (1 <= masklen <= 32):
+  print("Wrong masklen", masklen)
   exit(1)
   exit(1)
-result=[]
+result = []
 for i in range(4):
 for i in range(4):
-    if masklen>=8:
+    if masklen >= 8:
        result.append(8)
        result.append(8)
-       masklen-=8
+       masklen -= 8
     else:
        result.append(masklen)
     else:
        result.append(masklen)
-       masklen=0
-print ".".join([ str(256-2**(8-i)) for i in result ])
-
+       masklen = 0
+print(".".join([ str(256-2**(8-i)) for i in result ]))
 EOF
 }
 
 ##############################
 # return dnf or debootstrap
 function package_method () {
 EOF
 }
 
 ##############################
 # return dnf or debootstrap
 function package_method () {
-    fcdistro=$1; shift
+    local fcdistro=$1; shift
     case $fcdistro in
         f[0-9]*|centos[0-9]*|sl[0-9]*)
             echo dnf ;;
     case $fcdistro in
         f[0-9]*|centos[0-9]*|sl[0-9]*)
             echo dnf ;;
@@ -92,8 +91,8 @@ function package_method () {
 
 # return arch from debian distro and personality
 function canonical_arch () {
 
 # return arch from debian distro and personality
 function canonical_arch () {
-    personality=$1; shift
-    fcdistro=$1; shift
+    local personality=$1; shift
+    local fcdistro=$1; shift
     case $(package_method $fcdistro) in
         dnf)
             case $personality in
     case $(package_method $fcdistro) in
         dnf)
             case $personality in
@@ -114,11 +113,12 @@ function canonical_arch () {
 
 # the new test framework creates /timestamp in /vservers/<name> *before* populating it
 function almost_empty () {
 
 # the new test framework creates /timestamp in /vservers/<name> *before* populating it
 function almost_empty () {
-    dir="$1"; shift ;
+    local dir="$1"; shift ;
     # non existing is fine
     [ ! -d $dir ] && return 0;
     # need to have at most one file
     # non existing is fine
     [ ! -d $dir ] && return 0;
     # need to have at most one file
-    count=$(cd $dir; ls | wc -l); [ $count -le 1 ];
+    local count=$(cd $dir; ls | wc -l)
+    [ $count -le 1 ]
 }
 
 ##############################
 }
 
 ##############################
@@ -126,10 +126,10 @@ function fedora_install() {
     set -x
     set -e
 
     set -x
     set -e
 
-    lxc=$1; shift
-    lxc_root=$(lxcroot $lxc)
+    local lxc=$1; shift
+    local lxc_root=$(lxcroot $lxc)
 
 
-    cache=/var/cache/lxc/fedora/$arch/${fedora_release}
+    local cache=/var/cache/lxc/fedora/$arch/${fedora_release}
     mkdir -p $cache
 
     (
     mkdir -p $cache
 
     (
@@ -140,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 ! dnf --installroot $cache/rootfs --releasever ${fedora_release} -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"
@@ -160,7 +160,7 @@ function fedora_install() {
 function fedora_download() {
     set -x
 
 function fedora_download() {
     set -x
 
-    cache=$1; shift
+    local cache=$1; shift
 
     # check the mini fedora was not already downloaded
     INSTALL_ROOT=$cache/partial
 
     # check the mini fedora was not already downloaded
     INSTALL_ROOT=$cache/partial
@@ -178,38 +178,42 @@ function fedora_download() {
 
     # copy yum config and repo files
     cp /etc/yum.conf $INSTALL_ROOT/etc/
 
     # copy yum config and repo files
     cp /etc/yum.conf $INSTALL_ROOT/etc/
-    cp /etc/yum.repos.d/fedora* $INSTALL_ROOT/etc/yum.repos.d/
+    cp /etc/yum.repos.d/fedora{,-updates}.repo $INSTALL_ROOT/etc/yum.repos.d/
 
 
-    # append fedora repo files with desired ${fedora_release} and $basearch
+    # append fedora repo files with hardwired releasever and basearch
     for f in $INSTALL_ROOT/etc/yum.repos.d/* ; do
       sed -i "s/\$basearch/$arch/g; s/\$releasever/${fedora_release}/g;" $f
     done
 
     for f in $INSTALL_ROOT/etc/yum.repos.d/* ; do
       sed -i "s/\$basearch/$arch/g; s/\$releasever/${fedora_release}/g;" $f
     done
 
-    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
-    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=""
-    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; }
+# looks like all this business about fetching fedora-release is not needed
+# it does
+#    MIRROR_URL=$FEDORA_MIRROR/fedora/releases/${fedora_release}/Everything/$arch/os
+#    # since fedora18 the rpms are scattered by first name
+#    # first try the second version of fedora-release first
+#    RELEASE_URLS=""
+#    local subindex
+#    for subindex in 3 2 1; do
+#        RELEASE_URLS="$RELEASE_URLS $MIRROR_URL/Packages/f/fedora-release-${fedora_release}-${subindex}.noarch.rpm"
+#    done
+#
+#    RELEASE_TARGET=$INSTALL_ROOT/fedora-release-${fedora_release}.noarch.rpm
+#    local found=""
+#    local attempt
+#    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; }
 
     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-${fedora_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
@@ -220,7 +224,7 @@ function fedora_download() {
     # 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)
 
     # 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)
 
-    DNF="dnf --installroot=$INSTALL_ROOT --releasever=${fedora_release} --nogpgcheck -y"
+    DNF="dnf --installroot=$INSTALL_ROOT --nogpgcheck -y"
     echo "$DNF install $FEDORA_PREINSTALLED"
     $DNF install $FEDORA_PREINSTALLED || { echo "Failed to download rootfs, aborting." ; return 1; }
 
     echo "$DNF install $FEDORA_PREINSTALLED"
     $DNF install $FEDORA_PREINSTALLED || { echo "Failed to download rootfs, aborting." ; return 1; }
 
@@ -236,8 +240,9 @@ function fedora_configure() {
     set -x
     set -e
 
     set -x
     set -e
 
-    lxc=$1; shift
-    lxc_root=$(lxcroot $lxc)
+    local lxc=$1; shift
+    local fcdistro=$1; shift
+    local lxc_root=$(lxcroot $lxc)
 
     # disable selinux in fedora
     mkdir -p $lxc_root/selinux
 
     # disable selinux in fedora
     mkdir -p $lxc_root/selinux
@@ -251,7 +256,7 @@ EOF
 $GUEST_HOSTNAME
 EOF
 
 $GUEST_HOSTNAME
 EOF
 
-    dev_path="${lxc_root}/dev"
+    local dev_path="${lxc_root}/dev"
     rm -rf $dev_path
     mkdir -p $dev_path
     mknod -m 666 ${dev_path}/null c 1 3
     rm -rf $dev_path
     mkdir -p $dev_path
     mknod -m 666 ${dev_path}/null c 1 3
@@ -273,8 +278,15 @@ EOF
 
     fedora_configure_systemd $lxc
 
 
     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
+    local guest_ifcfg=${lxc_root}/etc/sysconfig/network-scripts/ifcfg-$VIF_GUEST
+    mkdir -p $(dirname ${guest_ifcfg})
+    # starting with f27, we go for NetworkManager
+    # no more NM_CONTROLLED nonsense
+    if [ -n "$NAT_MODE" ]; then
+        write_guest_ifcfg_natip
+    else
+        write_guest_ifcfg_publicip
+    fi > $guest_ifcfg
 
     [ -z "$IMAGE" ] && fedora_configure_yum $lxc $fcdistro $pldistro
 
 
     [ -z "$IMAGE" ] && fedora_configure_yum $lxc $fcdistro $pldistro
 
@@ -285,8 +297,8 @@ EOF
 function fedora_configure_systemd() {
     set -e
     set -x
 function fedora_configure_systemd() {
     set -e
     set -x
-    lxc=$1; shift
-    lxc_root=$(lxcroot $lxc)
+    local lxc=$1; shift
+    local lxc_root=$(lxcroot $lxc)
 
     # so ignore if we can't find /etc/systemd at all
     [ -d ${lxc_root}/etc/systemd ] || return 0
 
     # so ignore if we can't find /etc/systemd at all
     [ -d ${lxc_root}/etc/systemd ] || return 0
@@ -309,34 +321,23 @@ function fedora_configure_yum () {
     set -e
     trap failure ERR INT
 
     set -e
     trap failure ERR INT
 
-    lxc=$1; shift
-    fcdistro=$1; shift
-    pldistro=$1; shift
+    local lxc=$1; shift
+    local fcdistro=$1; shift
+    local pldistro=$1; shift
 
 
-    lxc_root=$(lxcroot $lxc)
+    local lxc_root=$(lxcroot $lxc)
     # rpm --rebuilddb
     chroot ${lxc_root} $personality rpm --rebuilddb
 
     echo "Initializing yum.repos.d in $lxc"
     rm -f $lxc_root/etc/yum.repos.d/*
 
     # rpm --rebuilddb
     chroot ${lxc_root} $personality rpm --rebuilddb
 
     echo "Initializing yum.repos.d in $lxc"
     rm -f $lxc_root/etc/yum.repos.d/*
 
-    cat > $lxc_root/etc/yum.repos.d/building.repo <<EOF
-[fedora]
-name=Fedora \$releasever - \$basearch
-baseurl=$FEDORA_MIRROR_BASE/releases/\$releasever/Everything/\$basearch/os/
-enabled=1
-metadata_expire=7d
-gpgcheck=1
-gpgkey=$FEDORA_MIRROR_KEYS/RPM-GPG-KEY-fedora-${fedora_release}-primary
-
-[updates]
-name=Fedora \$releasever - \$basearch - Updates
-baseurl=$FEDORA_MIRROR_BASE/updates/\$releasever/\$basearch/
-enabled=1
-metadata_expire=7d
-gpgcheck=1
-gpgkey=$FEDORA_MIRROR_KEYS/RPM-GPG-KEY-fedora-${fedora_release}-primary
-EOF
+    # use mirroring/ stuff instead of a hard-wired config
+    local repofile=$lxc_root/etc/yum.repos.d/building.repo
+    yumconf_mirrors $repofile ${DIRNAME} $fcdistro \
+        "" $FEDORA_MIRROR
+    # the keys stuff requires adjustment though
+    sed -i $repofile -e s,'gpgkey=.*',"gpgkey=${FEDORA_MIRROR_KEYS}/RPM-GPG-KEY-fedora-${fedora_release}-primary,"
 
     # import fedora key so that gpgckeck does not whine or require stdin
     # required since fedora24
 
     # import fedora key so that gpgckeck does not whine or require stdin
     # required since fedora24
@@ -370,7 +371,7 @@ EOF
 # http://mirrors.ubuntu.com/mirrors.txt
 # need to specify the right mirror for debian variants like ubuntu and the like
 function debian_mirror () {
 # http://mirrors.ubuntu.com/mirrors.txt
 # need to specify the right mirror for debian variants like ubuntu and the like
 function debian_mirror () {
-    fcdistro=$1; shift
+    local fcdistro=$1; shift
     case $fcdistro in
         wheezy|jessie)
             echo http://ftp2.fr.debian.org/debian/ ;;
     case $fcdistro in
         wheezy|jessie)
             echo http://ftp2.fr.debian.org/debian/ ;;
@@ -383,11 +384,11 @@ function debian_mirror () {
 function debian_install () {
     set -e
     set -x
 function debian_install () {
     set -e
     set -x
-    lxc=$1; shift
-    lxc_root=$(lxcroot $lxc)
+    local lxc=$1; shift
+    local lxc_root=$(lxcroot $lxc)
     mkdir -p $lxc_root
     mkdir -p $lxc_root
-    arch=$(canonical_arch $personality $fcdistro)
-    mirror=$(debian_mirror $fcdistro)
+    local arch=$(canonical_arch $personality $fcdistro)
+    local mirror=$(debian_mirror $fcdistro)
     debootstrap --no-check-gpg --arch $arch $fcdistro $lxc_root $mirror
     # just like with fedora we ensure a few packages get installed as well
     # not started yet
     debootstrap --no-check-gpg --arch $arch $fcdistro $lxc_root $mirror
     # just like with fedora we ensure a few packages get installed as well
     # not started yet
@@ -403,7 +404,7 @@ EOF
 }
 
 function debian_configure () {
 }
 
 function debian_configure () {
-    guest_interfaces=${lxc_root}/etc/network/interfaces
+    local guest_interfaces=${lxc_root}/etc/network/interfaces
     ( [ -n "$NAT_MODE" ] && write_guest_interfaces_natip || write_guest_interfaces_publicip ) > $guest_interfaces
 }
 
     ( [ -n "$NAT_MODE" ] && write_guest_interfaces_natip || write_guest_interfaces_publicip ) > $guest_interfaces
 }
 
@@ -430,12 +431,12 @@ function setup_lxc() {
     set -e
     #trap failure ERR INT
 
     set -e
     #trap failure ERR INT
 
-    lxc=$1; shift
-    fcdistro=$1; shift
-    pldistro=$1; shift
-    personality=$1; shift
+    local lxc=$1; shift
+    local fcdistro=$1; shift
+    local pldistro=$1; shift
+    local personality=$1; shift
 
 
-    lxc_root=$(lxcroot $lxc)
+    local lxc_root=$(lxcroot $lxc)
 
     # create lxc container
 
 
     # create lxc container
 
@@ -450,7 +451,7 @@ function setup_lxc() {
                 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
                 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
-            fedora_configure $lxc || { echo "failed to configure fedora for a container"; exit 1 ; }
+            fedora_configure $lxc $fcdistro || { echo "failed to configure fedora for a container"; exit 1 ; }
             ;;
         debootstrap)
             if [ -z "$IMAGE" ]; then
             ;;
         debootstrap)
             if [ -z "$IMAGE" ]; then
@@ -481,7 +482,7 @@ function setup_lxc() {
     chmod 600 $lxc_root/root/.ssh/authorized_keys
 
     # don't keep the input xml, this can be retrieved at all times with virsh dumpxml
     chmod 600 $lxc_root/root/.ssh/authorized_keys
 
     # don't keep the input xml, this can be retrieved at all times with virsh dumpxml
-    config_xml=/tmp/$lxc.xml
+    local 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
     ( [ -n "$NAT_MODE" ] && write_lxc_xml_natip $lxc || write_lxc_xml_publicip $lxc ) > $config_xml
 
     # define lxc container for libvirt
@@ -500,8 +501,8 @@ function setup_lxc() {
 #
 
 function write_lxc_xml_publicip () {
 #
 
 function write_lxc_xml_publicip () {
-    lxc=$1; shift
-    lxc_root=$(lxcroot $lxc)
+    local lxc=$1; shift
+    local lxc_root=$(lxcroot $lxc)
     cat <<EOF
 <domain type='lxc'>
   <name>$lxc</name>
     cat <<EOF
 <domain type='lxc'>
   <name>$lxc</name>
@@ -536,8 +537,8 @@ EOF
 
 # grant build guests the ability to do mknods
 function write_lxc_xml_natip () {
 
 # grant build guests the ability to do mknods
 function write_lxc_xml_natip () {
-    lxc=$1; shift
-    lxc_root=$(lxcroot $lxc)
+    local lxc=$1; shift
+    local lxc_root=$(lxcroot $lxc)
     cat <<EOF
 <domain type='lxc'>
   <name>$lxc</name>
     cat <<EOF
 <domain type='lxc'>
   <name>$lxc</name>
@@ -578,7 +579,6 @@ function write_guest_ifcfg_natip () {
 DEVICE=$VIF_GUEST
 BOOTPROTO=dhcp
 ONBOOT=yes
 DEVICE=$VIF_GUEST
 BOOTPROTO=dhcp
 ONBOOT=yes
-NM_CONTROLLED=no
 TYPE=Ethernet
 MTU=1500
 EOF
 TYPE=Ethernet
 MTU=1500
 EOF
@@ -594,7 +594,6 @@ HOSTNAME=$GUEST_HOSTNAME
 IPADDR=$GUEST_IP
 NETMASK=$NETMASK
 GATEWAY=$GATEWAY
 IPADDR=$GUEST_IP
 NETMASK=$NETMASK
 GATEWAY=$GATEWAY
-NM_CONTROLLED=no
 TYPE=Ethernet
 MTU=1500
 EOF
 TYPE=Ethernet
 MTU=1500
 EOF
@@ -606,45 +605,45 @@ function devel_or_test_tools () {
     set -e
     trap failure ERR INT
 
     set -e
     trap failure ERR INT
 
-    lxc=$1; shift
-    fcdistro=$1; shift
-    pldistro=$1; shift
-    personality=$1; shift
+    local lxc=$1; shift
+    local fcdistro=$1; shift
+    local pldistro=$1; shift
+    local personality=$1; shift
 
 
-    lxc_root=$(lxcroot $lxc)
+    local lxc_root=$(lxcroot $lxc)
 
 
-    pkg_method=$(package_method $fcdistro)
+    local pkg_method=$(package_method $fcdistro)
 
 
-    pkgsfile=$(pl_locateDistroFile $DIRNAME $pldistro $PREINSTALLED)
+    local pkgsfile=$(pl_locateDistroFile $DIRNAME $pldistro $PREINSTALLED)
 
     ### 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)
+    local 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)
 
     # on debian systems we get arch through the 'arch' command
     [ "$lxc_arch" = "unknown" ] && lxc_arch=$(chroot ${lxc_root} $personality arch)
 
-    packages=$(pl_getPackages -a $lxc_arch $fcdistro $pldistro $pkgsfile)
-    groups=$(pl_getGroups -a $lxc_arch $fcdistro $pldistro $pkgsfile)
+    local packages=$(pl_getPackages -a $lxc_arch $fcdistro $pldistro $pkgsfile)
+    local groups=$(pl_getGroups -a $lxc_arch $fcdistro $pldistro $pkgsfile)
 
     case "$pkg_method" in
         dnf)
             # --allowerasing required starting with fedora24
             #
 
     case "$pkg_method" in
         dnf)
             # --allowerasing required starting with fedora24
             #
-            has_dnf=""
+            local has_dnf=""
             chroot ${lxc_root} $personality dnf --version && has_dnf=true
             if [ -n "$has_dnf" ]; then
                 echo "container has dnf - invoking with --allowerasing"
             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"
+                local pkg_installer="dnf -y install --allowerasing"
+                local grp_installer="dnf -y groupinstall --allowerasing"
             else
                 echo "container has only dnf"
             else
                 echo "container has only dnf"
-                pkg_installer="dnf -y install"
-                grp_installer="dnf -y groupinstall"
+                local pkg_installer="dnf -y install"
+                local grp_installer="dnf -y groupinstall"
             fi
             [ -n "$packages" ] && chroot ${lxc_root} $personality $pkg_installer $packages
             for group_plus in $groups; do
             fi
             [ -n "$packages" ] && chroot ${lxc_root} $personality $pkg_installer $packages
             for group_plus in $groups; do
-                group=$(echo $group_plus | sed -e "s,+++, ,g")
+                local 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 $grp_installer "$group"
             done
             # store current rpm list in /init-lxc.rpms in case we need to check the contents
@@ -677,9 +676,9 @@ function devel_or_test_tools () {
 }
 
 function post_install () {
 }
 
 function post_install () {
-    lxc=$1; shift
-    personality=$1; shift
-    lxc_root=$(lxcroot $lxc)
+    local lxc=$1; shift
+    local personality=$1; shift
+    local lxc_root=$(lxcroot $lxc)
     # setup localtime from the host
     cp /etc/localtime $lxc_root/etc/localtime
     sshd_disable_password_auth $lxc
     # setup localtime from the host
     cp /etc/localtime $lxc_root/etc/localtime
     sshd_disable_password_auth $lxc
@@ -699,8 +698,8 @@ function post_install () {
 
 # just in case, let's stay on the safe side
 function sshd_disable_password_auth () {
 
 # just in case, let's stay on the safe side
 function sshd_disable_password_auth () {
-    lxc=$1; shift
-    lxc_root=$(lxcroot $lxc)
+    local lxc=$1; shift
+    local lxc_root=$(lxcroot $lxc)
     sed --in-place=.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
 }
@@ -711,9 +710,9 @@ function post_install_natip () {
     set -e
     trap failure ERR INT
 
     set -e
     trap failure ERR INT
 
-    lxc=$1; shift
-    personality=$1; shift
-    lxc_root=$(lxcroot $lxc)
+    local lxc=$1; shift
+    local personality=$1; shift
+    local lxc_root=$(lxcroot $lxc)
 
 ### From myplc-devel-native.spec
 # be careful to backslash $ in this, otherwise it's the root context that's going to do the evaluation
 
 ### From myplc-devel-native.spec
 # be careful to backslash $ in this, otherwise it's the root context that's going to do the evaluation
@@ -733,9 +732,9 @@ function post_install_myplc  () {
     set -e
     trap failure ERR INT
 
     set -e
     trap failure ERR INT
 
-    lxc=$1; shift
-    personality=$1; shift
-    lxc_root=$(lxcroot $lxc)
+    local lxc=$1; shift
+    local personality=$1; shift
+    local lxc_root=$(lxcroot $lxc)
 
 # 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
 
 # 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
@@ -760,9 +759,9 @@ EOF
 # however this was too fragile, would not work for fedora14 containers
 # WARNING: this code is duplicated in lbuild-nightly.sh
 function guest_ipv4() {
 # however this was too fragile, would not work for fedora14 containers
 # WARNING: this code is duplicated in lbuild-nightly.sh
 function guest_ipv4() {
-    lxc=$1; shift
+    local lxc=$1; shift
 
 
-    mac=$(virsh -c lxc:/// domiflist $lxc | egrep 'network|bridge' | awk '{print $5;}')
+    local mac=$(virsh -c lxc:/// domiflist $lxc | egrep 'network|bridge' | awk '{print $5;}')
     # sanity check
     [ -z "$mac" ] && return 0
     arp -en | grep "$mac" | awk '{print $1;}'
     # sanity check
     [ -z "$mac" ] && return 0
     arp -en | grep "$mac" | awk '{print $1;}'
@@ -772,25 +771,29 @@ function wait_for_ssh () {
     set -x
     set -e
 
     set -x
     set -e
 
-    lxc=$1; shift
+    local lxc=$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
 
     # 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
-    success=""
-    current_time=$(date +%s)
-    stop_time=$(($current_time + 120))
+    local success=""
+    local current_time=$(date +%s)
+    local stop_time=$(($current_time + 120))
 
 
-    counter=1
+    local counter=1
     while [ "$current_time" -lt "$stop_time" ] ; do
     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 ; } || :
-         counter=$(($counter+1))
-         sleep 10
-         current_time=$(date +%s)
+        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 ; } || :
+        # some of our boxes have gone through a long upgrade historically, and
+        # so they don't end up with the same gid mapping for the ssh_keys
+        # group as the ones in the guest that result from a fresh install
+        virsh -c lxc:/// lxc-enter-namespace $lxc /bin/bash -c "chown root:ssh_keys /etc/ssh/*_key" || :
+        counter=$(($counter+1))
+        sleep 10
+        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
@@ -860,10 +863,12 @@ function main () {
 
     # parse fixed arguments
     [[ -z "$@" ]] && usage
 
     # parse fixed arguments
     [[ -z "$@" ]] && usage
-    lxc=$1 ; shift
-    lxc_root=$(lxcroot $lxc)
+    local lxc=$1 ; shift
+    local lxc_root=$(lxcroot $lxc)
 
     # rainchecks
 
     # rainchecks
+    # when using with the -i option, checking that $lxc_root is void
+    # is a little too much stress..
     almost_empty $lxc_root || \
         { echo "container $lxc already exists in $lxc_root - exiting" ; exit 1 ; }
     virsh -c lxc:/// domuuid $lxc >& /dev/null && \
     almost_empty $lxc_root || \
         { echo "container $lxc already exists in $lxc_root - exiting" ; exit 1 ; }
     virsh -c lxc:/// domuuid $lxc >& /dev/null && \
@@ -872,9 +877,13 @@ function main () {
 
     # if IMAGE, copy the provided rootfs to lxc_root
     if [ -n "$IMAGE" ] ; then
 
     # if IMAGE, copy the provided rootfs to lxc_root
     if [ -n "$IMAGE" ] ; then
-        [ ! -d "$IMAGE" ] && \
-        { echo "$IMAGE rootfs folder does not exist - exiting" ; exit 1 ; }
-        rsync -a $IMAGE/ $lxc_root/
+        if [ ! -d "$IMAGE" ]; then
+            echo "$IMAGE rootfs folder does not exist - exiting"
+            exit 1
+        else
+            echo "Copying $IMAGE into $lxc_root with rsync --archive --delete"
+            rsync --archive --delete $IMAGE/ $lxc_root/
+        fi
     fi
 
     # check we've exhausted the arguments
     fi
 
     # check we've exhausted the arguments