cosmetic
[build.git] / lbuild-initvm.sh
index 0b088f6..34c9115 100755 (executable)
@@ -30,6 +30,10 @@ PUBLIC_BRIDGE=br0
 # the network interface name as seen from the container
 VIF_GUEST=eth0
 
+##########
+FEDORA_PREINSTALLED="yum initscripts passwd rsyslog vim-minimal dhclient chkconfig rootfiles policycoreutils openssh-server openssh-clients"
+DEBIAN_PREINSTALLED="openssh-server openssh-client"
+
 ##############################
 ## stolen from tests/system/template-qemu/qemu-bridge-init
 # use /proc/net/dev instead of a hard-wired list
@@ -41,6 +45,7 @@ for line in file("/proc/net/dev"):
     if ifname.find("lo")==0: continue
     if ifname.find("br")==0: continue
     if ifname.find("virbr")==0: continue
+    if ifname.find("veth")==0: continue
     if ifname.find("tap")==0: continue
     print ifname
 EOF
@@ -174,7 +179,7 @@ function package_method () {
     fcdistro=$1; shift
     case $fcdistro in
        f[0-9]*|centos[0-9]*|sl[0-9]*) echo yum ;;
-       squeeze|wheezy|oneiric|precise|quantal|raring|saucy) echo debootstrap ;;
+       squeeze|wheezy|jessie|oneiric|precise|quantal|raring|saucy) echo debootstrap ;;
        *) echo Unknown distro $fcdistro ;;
     esac 
 }
@@ -303,9 +308,8 @@ function fedora_download() {
     # 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"
-    PKG_LIST="yum initscripts passwd rsyslog vim-minimal dhclient chkconfig rootfiles policycoreutils openssh-server openssh-clients"
-    echo "$YUM install $PKG_LIST"
-    $YUM install $PKG_LIST || { echo "Failed to download rootfs, aborting." ; return 1; }
+    echo "$YUM install $FEDORA_PREINSTALLED"
+    $YUM install $FEDORA_PREINSTALLED || { echo "Failed to download rootfs, aborting." ; return 1; }
 
     mv "$INSTALL_ROOT" "$cache/rootfs"
     echo "Download complete."
@@ -473,7 +477,7 @@ EOF
 function debian_mirror () {
     fcdistro=$1; shift
     case $fcdistro in
-       squeeze|wheezy) 
+       squeeze|wheezy|jessie
            echo http://ftp2.fr.debian.org/debian/ ;;
        oneiric|precise|quantal|raring|saucy) 
            echo http://mir1.ovh.net/ubuntu/ubuntu/ ;;
@@ -484,10 +488,22 @@ function debian_mirror () {
 function debian_install () {
     set -e
     set -x
+    lxc=$1; shift
     mkdir -p $lxc_root
     arch=$(canonical_arch $personality $fcdistro)
     mirror=$(debian_mirror $fcdistro)
     debootstrap --arch $arch $fcdistro $lxc_root $mirror
+    # just like with fedora we ensure a few packages get installed as well
+    # not started yet
+    #virsh -c lxc:/// lxc-enter-namespace $lxc /bin/bash -c "apt-get update"
+    #virsh -c lxc:/// lxc-enter-namespace $lxc /bin/bash -c "apt-get -y install $DEBIAN_PREINSTALLED"
+    chroot $lxc_root apt-get update
+    chroot $lxc_root apt-get -y install $DEBIAN_PREINSTALLED
+    # configure hostname
+    cat <<EOF > ${lxc_root}/etc/hostname
+$GUEST_HOSTNAME
+EOF
+    
 }
 
 function debian_configure () {
@@ -505,10 +521,10 @@ EOF
 function write_guest_interfaces_test () {
     cat <<EOF
 auto $VIF_GUEST
-iface $VIF_GUEST
-    address $GUEST_IP
-    netmask $NETMASK
-    gateway $GATEWAY
+iface $VIF_GUEST inet static
+address $GUEST_IP
+netmask $NETMASK
+gateway $GATEWAY
 EOF
 }
 ##############################
@@ -532,7 +548,7 @@ function setup_lxc() {
            fedora_configure || { echo "failed to configure fedora for a container"; exit 1 ; }
            ;;
        debootstrap)
-           debian_install || { echo "failed to install debian/ubuntu root image"; exit 1 ; }
+           debian_install $lxc || { echo "failed to install debian/ubuntu root image"; exit 1 ; }
            debian_configure || { echo "failed to configure debian/ubuntu for a container"; exit 1 ; }
            ;;
        *)
@@ -552,9 +568,11 @@ function setup_lxc() {
     # grant ssh access from host to guest
     mkdir $lxc_root/root/.ssh
     cat /root/.ssh/id_rsa.pub >> $lxc_root/root/.ssh/authorized_keys
-    
+    chmod 700 $lxc_root/root/.ssh
+    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
+    config_xml=/tmp/$lxc.xml
     ( [ -n "$BUILD_MODE" ] && write_lxc_xml_build $lxc || write_lxc_xml_test $lxc ) > $config_xml
     
     # define lxc container for libvirt
@@ -707,17 +725,10 @@ function devel_or_vtest_tools () {
                # 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 )
            fi
-           chroot $lxc_root apt-get update
            for package in $packages ; do
-               # close stdin in an attempt to avoid this hanging
-               # xxx also we ignore result for now, not sure if the kind of errors like below
-               # truly is serious or not
-#Setting up at (3.1.13-2ubuntu2) ...
-#initctl: Unable to connect to Upstart: Failed to connect to socket /com/ubuntu/upstart: Connection refused
-#initctl: Unable to connect to Upstart: Failed to connect to socket /com/ubuntu/upstart: Connection refused
-#start: Unable to connect to Upstart: Failed to connect to socket /com/ubuntu/upstart: Connection refused
-
-               chroot $lxc_root apt-get install -y $package < /dev/null || :
+               # container not started yet
+               #virsh -c lxc:/// lxc-enter-namespace $lxc /bin/bash -c "apt-get install -y $package" || :
+               chroot $lxc_root apt-get install -y $package || :
            done
            ### xxx todo install groups with apt..
            ;;
@@ -734,12 +745,15 @@ function post_install () {
     personality=$1; shift
     if [ -n "$BUILD_MODE" ] ; then
        post_install_build $lxc $personality
-       lxc_start $lxc
+       virsh -c lxc:/// start $lxc
        # manually run dhclient in guest - somehow this network won't start on its own
        virsh -c lxc:/// lxc-enter-namespace $lxc /bin/bash -c "dhclient $VIF_GUEST"
     else
        post_install_myplc $lxc $personality
-       lxc_start $lxc
+       virsh -c lxc:/// start $lxc
+# it sounds like we don't need ssh per se any more
+# it still makes sense to wait for network readiness though
+# some day maybe...
        wait_for_ssh $lxc
     fi
     # setup localtime from the host
@@ -758,50 +772,12 @@ function post_install_build () {
 ### 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 bash -x
-    # set up /dev/loop* in lxc
-    for i in \$(seq 0 255) ; do
-       /bin/mknod -m 640 /dev/loop\$i b 7 \$i
-    done
-    
-    # create symlink for /dev/fd
-    [ ! -e "/dev/fd" ] && /bin/ln -s /proc/self/fd /dev/fd
-
-    # modify /etc/rpm/macros to not use /sbin/new-kernel-pkg
-    /bin/sed -i 's,/sbin/new-kernel-pkg:,,' /etc/rpm/macros
-    if [ -h "/sbin/new-kernel-pkg" ] ; then
-       filename=\$(/bin/readlink -f /sbin/new-kernel-pkg)
-       if [ "\$filename" == "/sbin/true" ] ; then
-               /bin/echo "WARNING: /sbin/new-kernel-pkg symlinked to /sbin/true"
-               /bin/echo "\tmost likely /etc/rpm/macros has /sbin/new-kernel-pkg declared in _netsharedpath."
-               /bin/echo "\tPlease remove /sbin/new-kernel-pkg from _netsharedpath and reintall mkinitrd."
-               exit 1
-       fi
-    fi
     
     # customize root's prompt
     /bin/cat << PROFILE > /root/.profile
 export PS1="[$lxc] \\w # "
 PROFILE
 
-    uid=2000
-    gid=2000
-    
-    # add a "build" user to the system
-    builduser=\$(grep "^build:" /etc/passwd | wc -l)
-    if [ \$builduser -eq 0 ] ; then
-       groupadd -o -g \$gid build;
-       useradd -o -c 'Automated Build' -u \$uid -g \$gid -n -M -s /bin/bash build;
-    fi
-
-# Allow build user to build certain RPMs as root
-    if [ -f /etc/sudoers ] ; then
-       buildsudo=\$(grep "^build.*ALL=(ALL).*NOPASSWD:.*ALL"  /etc/sudoers | wc -l)
-       if [ \$buildsudo -eq 0 ] ; then
-           echo "build   ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers
-       fi
-        sed -i 's,^Defaults.*requiretty,#Defaults requiretty,' /etc/sudoers
-    fi
-#
 EOF
        
 }
@@ -820,15 +796,9 @@ function post_install_myplc  () {
     # create /etc/sysconfig/network if missing
     [ -f /etc/sysconfig/network ] || /bin/echo NETWORKING=yes > /etc/sysconfig/network
 
-    # create symlink for /dev/fd
-    [ ! -e "/dev/fd" ] && /bin/ln -s /proc/self/fd /dev/fd
-
     # turn off regular crond, as plc invokes plc_crond
     /sbin/chkconfig crond off
 
-    # take care of loginuid in /etc/pam.d 
-    /bin/sed -i "s,#*\(.*loginuid.*\),#\1," /etc/pam.d/*
-
     # customize root's prompt
     /bin/cat << PROFILE > /root/.profile
 export PS1="[$lxc] \\w # "
@@ -837,19 +807,6 @@ PROFILE
 EOF
 }
 
-function lxc_start() {
-
-    set -x
-    set -e
-    #trap failure ERR INT
-
-    lxc=$1; shift
-  
-    virsh -c lxc:/// start $lxc
-  
-    return 0
-}
-
 function wait_for_ssh () {
     set -x
     set -e
@@ -859,10 +816,10 @@ function wait_for_ssh () {
   
     echo network in guest is up, waiting for ssh...
 
-    #wait max 5 min for sshd to start 
+    #wait max 2 min for sshd to start 
     ssh_up=""
-    stop_time=$(($(date +%s) + 300))
     current_time=$(date +%s)
+    stop_time=$(($current_time + 120))
     
     counter=1
     while [ "$current_time" -lt "$stop_time" ] ; do
@@ -964,7 +921,7 @@ function main () {
 
     if [ -n "$BUILD_MODE" ] ; then
        # we can now set GUEST_HOSTNAME safely
-        [ -z "$GUEST_HOSTNAME" ] && GUEST_HOSTNAME=$lxc
+        [ -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
@@ -999,7 +956,7 @@ function main () {
        # 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}')
+        GATEWAY=$(ip route show | grep default | awk '{print $3}' | head -1)
         VIF_HOST="i$(echo $GUEST_HOSTNAME | cut -d. -f1)"
     fi
 
@@ -1007,6 +964,7 @@ function main () {
 
     devel_or_vtest_tools $lxc $fcdistro $pldistro $personality
 
+    # container gets started here
     post_install $lxc $personality
     
     echo $COMMAND Done