#!/bin/bash
#
# mk-images
#
# Copyright (C) 2007  Red Hat, Inc.  All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#

LANG=C

PATH=$PATH:/sbin:/usr/sbin
IMAGEUUID=$(date +%Y%m%d%H%M).$(uname -i)
TMPDIR=${TMPDIR:-/tmp}

usage () {
    echo "usage: mk-images <pkgsrc> <toplevel> <template> <imgdir> <buildarch> <productname> <version> [<productpath>]"
    exit 0
}

DEBUG=""
BUILDARCH=`uname -m`
BOOTISO="boot.iso"

while [ $# -gt 0 ]; do
    case $1 in
        --debug)
            DEBUG="--debug"
            shift
        ;;
        --noiso)
            BOOTISO=""
            shift
        ;;
        --arch)
            BUILDARCH=$2
            shift; shift
        ;;
        --imgdir)
            IMGPATH=$2
            shift; shift
        ;;
        --product)
            PRODUCT=$2
            shift; shift
        ;;
        --version)
            VERSION=$2
            shift; shift
        ;;
        --bugurl)
            BUGURL=$2
            shift; shift
        ;;
        --output)
            TOPDESTPATH=$2
            shift; shift
        ;;
        --nogr)
            echo "*** DeprecationWarning: ignoring --nogr option." >&2
            shift
        ;;
        --mindir)
            echo "*** DeprecationWarning: ignoring --mindir option." >&2
            shift; shift
        ;;
        --stg2dir)
            echo "*** DeprecationWarning: please use --imgdir instead of --stg2dir." >&2
            shift; shift
        ;;
        *)
            yumconf=$1
            shift
        ;;
    esac
done

if [ -z "$TOPDESTPATH" -o -z "$IMGPATH" -o -z "$PRODUCT" -o -z "$VERSION" ]; then usage; fi

TOPDIR=$(echo $0 | sed "s,/[^/]*$,,")
if [ $TOPDIR = $0 ]; then
    $TOPDIR="."
fi
TOPDIR=$(cd $TOPDIR; pwd)

# modules that are needed.  this is the generic "needed for every arch" stuff
COMMONMODS="fat vfat nfs sunrpc lockd floppy cramfs loop edd pcspkr squashfs ipv6 virtio_pci netconsole"
USBMODS="ohci-hcd uhci-hcd ehci-hcd usbhid mousedev usb-storage sd_mod sr_mod ub appletouch bcm5974"
FIREWIREMODS="ohci1394 sbp2 fw-ohci fw-sbp2 firewire-sbp2 firewire-ohci"
SDMODS="mmc-block sdhci sdhci-pci"
IDEMODS="ide-cd ide-cd_mod"
ATAMODS="ata_generic ata_piix sata_nv sata_via sata_promise pata_via"
SCSIMODS="sr_mod sg st sd_mod scsi_mod iscsi_tcp iscsi_ibft"
FSMODS="fat msdos vfat ext2 ext3 ext4 reiserfs jfs xfs gfs2 cifs fuse btrfs hfsplus"
LVMMODS="dm-mod dm-zero dm-snapshot dm-mirror dm-multipath dm-round-robin dm-crypt"
RAIDMODS="raid0 raid1 raid5 raid6 raid456 raid10 linear"
CRYPTOMODS="sha256_generic cbc xts lrw aes_generic crypto_blkcipher crc32c ecb arc4"
PCMCIASOCKMODS="yenta_socket i82365 tcic pcmcia"
INITRDMODS="$USBMODS $FIREWIREMODS $IDEMODS $ATAMODS $SCSIMODS $FSMODS $LVMMODS $RAIDMODS $CRYPTOMODS $COMMONMODS $PCMCIASOCKMODS $SDMODS =scsi =net =drm"

. $(dirname $0)/buildinstall.functions

# Set, verify, and create paths
IMAGEPATH=$TOPDESTPATH/images
FULLMODPATH=$TMPDIR/instimagemods.$$
FINALFULLMODPATH=$IMGPATH/modules
INSTIMGPATH=$TOPDESTPATH/images
KERNELBASE=$TMPDIR/updboot.kernel.$$

KERNELNAME=vmlinuz
if [ "$BUILDARCH" = "ia64" ]; then
    KERNELDIR="/boot/efi/EFI/redhat"
else
    KERNELDIR="/boot"
fi

if [ "$BUILDARCH" = "sparc64" ]; then
    BASEARCH=sparc
elif [ "$BUILDARCH" = "ppc64" ]; then
    BASEARCH=ppc
else
    BASEARCH=$BUILDARCH
fi

# explicit block size setting for some arches (FIXME: we compose
# ppc64-ish trees as ppc, so we have to set the "wrong" block size)
if [ "$BUILDARCH" = "sparc64" ]; then
    CRAMBS="--blocksize 8192"
elif [ "$BUILDARCH" = "sparc" ]; then
    CRAMBS="--blocksize 4096"
else
    CRAMBS=""
fi

if [ "$BUILDARCH" = "x86_64" -o "$BUILDARCH" = "s390x" -o "$BUILDARCH" = "ppc64" ]; then
    LIBDIR=lib64
else
    LIBDIR=lib
fi

rm -rf $IMAGEPATH
rm -rf $FULLMODPATH
rm -rf $FINALFULLMODPATH
rm -rf $KERNELBASE
mkdir -p $IMAGEPATH
mkdir -p $FULLMODPATH
mkdir -p $FINALFULLMODPATH
mkdir -p $KERNELBASE
mkdir -p $INSTIMGPATH

# Stuff that we need
TRIMPCIIDS=$IMGPATH/usr/lib/anaconda-runtime/trimpciids
GETKEYMAPS=$IMGPATH/usr/lib/anaconda-runtime/getkeymaps
GENINITRDSZ=$IMGPATH/usr/lib/anaconda-runtime/geninitrdsz
MKS390CDBOOT=$IMGPATH/usr/lib/anaconda-runtime/mk-s390-cdboot
GENMODINFO=$IMGPATH/usr/lib/anaconda-runtime/genmodinfo
KEYMAPS=$TMPDIR/keymaps-$BUILDARCH.$$
SCREENFONT=$IMGPATH/usr/lib/anaconda-runtime/screenfont-${BASEARCH}.gz
MODLIST=$IMGPATH/usr/lib/anaconda-runtime/modlist
MODINFO=$TMPDIR/modinfo-$BUILDARCH.$$
LOADERBINDIR=$IMGPATH/usr/lib/anaconda-runtime/loader
BOOTDISKDIR=$IMGPATH/usr/lib/anaconda-runtime/boot
LANGTABLE=$IMGPATH/usr/lib/anaconda/lang-table
PCIIDS=$IMGPATH/usr/share/hwdata/pci.ids
XDRIVERS=$IMGPATH/usr/share/hwdata/videoaliases
XDRIVERDESCS=$IMGPATH/usr/share/hwdata/videodrivers

REQUIREMENTS="$TRIMPCIIDS $PCIIDS $XDRIVERDESCS $GENMODINFO
      $LANGTABLE $GETKEYMAPS"

dieLater=
for n in $REQUIREMENTS; do
    if [ ! -f $n ]; then
        echo "$n doesn't exist"
        dieLater=1
    fi
done

for n in $BOOTDISKDIR; do
    if [ ! -d $n ]; then
        echo "$n doesn't exist"
        dieLater=1
    fi
done

if [ -n "$dieLater" ]; then exit 1; fi

if [ "$BUILDARCH" != "s390" -a "$BUILDARCH" != "s390x" ]; then
    # go ahead and create the keymaps so we only have to do it once
    if [ -f $IMGPATH/usr/lib/anaconda-runtime/keymaps-override-$BASEARCH ]; then
        echo "Found keymap override, using it"
        cp $IMGPATH/usr/lib/anaconda-runtime/keymaps-override-$BASEARCH $KEYMAPS
    else
        echo "Running: $GETKEYMAPS $BUILDARCH $KEYMAPS $IMGPATH"
        $GETKEYMAPS $BUILDARCH $KEYMAPS $IMGPATH
        if [ $? != 0 ]; then
            echo "Unable to create keymaps and thus can't create initrd."
            exit 1
        fi
    fi
fi

findPackage() {
    name=$1

    pkg=$(repoquery --qf "%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}" -c $yumconf --archlist=$KERNELARCH $name.$KERNELARCH)
    if [ -n "$pkg" ]; then
        echo $pkg
        return
    fi
    echo "cannot find package $name" >&2
}

rundepmod () {
    where=$1

    $FAKEARCH /sbin/depmod -a -F $KERNELROOT/boot/System.map-$version \
            -b $where $version
}

# This loops to make sure it resolves dependencies of dependencies of...
resdeps () {
    items="$*"

    deplist=""
    for item in $items ; do
        deps=$(awk -F ':' "/$item.ko: / { print gensub(\".*/$item.ko: \",\"\",\"g\") }" $KERNELROOT/lib/modules/$version/modules.dep)
        for dep in $deps ; do
            depfile=${dep##*/}
            depname=${dep%%.ko}
            deplist="$deplist $depname"
        done
    done
    items=$(for n in $items $deplist; do echo $n; done | sort -u)
    echo $items
}

expandModuleSet() {
    SET=""
    for name in $1; do
        char=$(echo $name | cut -c1)
        if [ $char = '=' ]; then
	    NAME=$(echo $name | cut -c2-)
	    if [ "$NAME" = "ata" ]; then
		SET="$SET $(egrep '(ata|ahci)' $KERNELROOT/lib/modules/$version/modules.block |sed -e 's/.ko//')"
	    elif [ "$NAME" = "scsi" ]; then
		SET="$SET $(sed -e 's/.ko//' $KERNELROOT/lib/modules/$version/modules.block)"
	    elif [ "$NAME" = "net" ]; then
		SET="$SET $(sed -e 's/.ko//' $KERNELROOT/lib/modules/$version/modules.networking)"
	    else
                # Ignore if group list does not exist
                if [ -e $KERNELROOT/lib/modules/$version/modules.$NAME ]; then
		    SET="$SET $(sed -e 's/.ko//' $KERNELROOT/lib/modules/$version/modules.$NAME)"
                fi
            fi
        else
            SET="$SET $name"
        fi
    done

    echo $SET
}

makemoduletree() {
    MMB_DIR=$1
    MMB_MODULESET=$(resdeps $2)

    mkdir -p $MMB_DIR/lib
    mkdir -p $MMB_DIR/modules
    mkdir -p $MMB_DIR/firmware
    ln -snf ../modules $MMB_DIR/lib/modules
    ln -snf ../firmware $MMB_DIR/lib/firmware

    echo "Copying kernel modules..."
    cp -a $KERNELROOT/lib/modules/* $MMB_DIR/lib/modules/
    echo "Removing extraneous modules..."
    find $MMB_DIR/lib/modules/ -name *.ko | while read module ; do
        m=${module##*/}
        modname=${m%%.ko}
        echo $MMB_MODULESET | grep -wq $modname || {
            rm -f $module
        }
    done

    echo "Copying required firmware..."
    find $MMB_DIR/lib/modules/ -name *.ko | while read module ; do
        for fw in $(modinfo -F firmware $module); do
            dest=$MBD_DIR/firmware/$fw
            destdir=$(dirname $dest)

            # Some firmware files are expected to be in their own directories.
            if [ ! -d $destdir ]; then
                mkdir -p $destdir
            fi

            cp $KERNELROOT/lib/firmware/$fw $dest
        done
    done

    # Copy in driver firmware we know we'll want during installation. This is
    # required for modules which still don't (or can't) export information
    # about what firmware files they require.
    for module in $MODSET ; do
        case $module in
            ipw2100)
                cp $KERNELROOT/lib/firmware/ipw2100* $MBD_DIR/firmware
            ;;
            ipw2200)
                cp $KERNELROOT/lib/firmware/ipw2200* $MBD_DIR/firmware
            ;;
            iwl3945)
                cp $KERNELROOT/lib/firmware/iwlwifi-3945* $MBD_DIR/firmware
            ;;
            atmel)
                cp $KERNELROOT/lib/firmware/atmel_*.bin $MBD_DIR/firmware
            ;;
            zd1211rw)
                cp -r $KERNELROOT/lib/firmware/zd1211 $MBD_DIR/firmware
            ;;
        esac
    done

    # create depmod.conf to support DDs
    cat > $MMB_DIR/etc/depmod.conf << EOF
search /tmp/DD/lib/modules built-in
EOF

    # clean up leftover cruft
    find -H $MMB_DIR/lib/modules -type d -exec rmdir -f {} \; 2>/dev/null
    $MODLIST --modinfo-file $MODINFO --ignore-missing --modinfo \
    $MMB_MODULESET > $MMB_DIR/lib/modules/module-info
    # compress modules
    find -H $MMB_DIR/lib/modules -type f -name *.ko -exec gzip -9 {} \;
    rundepmod $MMB_DIR
    rm -f $MMB_DIR/lib/modules/*/modules.*map
    rm -rf $MMB_DIR/lib/modules/*/{build,source}

    # create the pci.ids, from modules.alias and the X driver aliases
    awk '!/^(\t\t|#)/ { print ;if ($0 == "ffff  Illegal Vendor ID") nextfile; }' < $PCIIDS | \
        $TRIMPCIIDS $MMB_DIR/lib/modules/*/modules.alias $XDRIVERS/* > ../pci.ids
}


makeproductfile() {
    root=$1

    rm -f $root/.buildstamp
    echo $IMAGEUUID > $root/.buildstamp
    echo $PRODUCT >> $root/.buildstamp
    echo $VERSION >> $root/.buildstamp
    if [ -n "$BUGURL" ]; then
        echo $BUGURL >> $root/.buildstamp
    fi
}

instbin() {
    ROOT=$1
    BIN=$2
    DIR=$3
    DEST=$4

    iself="$(file $ROOT/$BIN | grep ELF)"

    if [ -L $ROOT/$BIN ]; then
        cp -a $ROOT/$BIN $DIR/$DEST
    else
        if [ -z "$iself" ]; then
            install -m 755 $ROOT/$BIN $DIR/$DEST
        else
            install -s -m 755 $ROOT/$BIN $DIR/$DEST

            get_dso_deps $ROOT "$BIN"
            local DEPS="$DSO_DEPS"
            mkdir -p $DIR/$LIBDIR

            for x in $DEPS ; do
                cp -Lfp $ROOT/$x $DIR/$LIBDIR
            done

            pushd $DIR/$LIBDIR
            if [ -f ld-linux.so.2 -a ! -L ld-linux.so.2 ]; then
                rm -f ld-linux.so.2
                linker="$(ls -1 ld-*.*.*.so)"
                if [ -z "$linker" ]; then
                    linker="$(ls -1 ld-*.*.so)"
                fi
                found=$(echo $linker | wc -l)
                if [ $found -ne 1 ]; then
                    echo "Found too many dynamic linkers:" >&2
                    echo $linker >&2
                    exit 1
                fi
                ln -s $linker ld-linux.so.2
            fi
            popd
            if [ "$BUILDARCH" = "s390x" -a ! -h $DIR/lib/ld64.so.1 ]; then
                pushd $DIR/lib
                ln -s ../$LIBDIR/ld64.so.1
                popd
            fi
        fi
    fi
}

setupSshd() {
    cp -f $IMGPATH/etc/protocols $MBD_DIR/etc/protocols
    echo "sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin" \
    	>> $MBD_DIR/etc/passwd

    # enable root shell logins
    echo "root::14438:0:99999:7:::" >> $MBD_DIR/etc/shadow

    # enable 'install' account that starts anaconda on login
    echo "install:x:0:0:root:/root:/sbin/loader" >> $MBD_DIR/etc/passwd
    echo "install::14438:0:99999:7:::" >> $MBD_DIR/etc/shadow

    chmod 0400 $MBD_DIR/etc/shadow

    # PAM configuration
    for i in pam_limits.so pam_env.so pam_unix.so pam_deny.so; do
        cp -f $IMGPATH/$LIBDIR/security/$i $MBD_DIR/$LIBDIR/security
    done

    cp -f $IMGPATH/etc/pam.d/other $MBD_DIR/etc/pam.d
    cat > $MBD_DIR/etc/pam.d/login << EOF
#%PAM-1.0
auth        required      pam_env.so
auth        sufficient    pam_unix.so likeauth nullok
auth        required      pam_deny.so
account     required      pam_unix.so
password    sufficient    pam_unix.so nullok use_authtok md5 shadow
password    required      pam_deny.so
session     required      pam_limits.so
session     required      pam_unix.so
EOF
    cp -f $MBD_DIR/etc/pam.d/login $MBD_DIR/etc/pam.d/sshd
    cp -f $MBD_DIR/etc/pam.d/login $MBD_DIR/etc/pam.d/remote

    cp -f $IMGPATH/etc/security/{limits.conf,pam_env.conf} $MBD_DIR/etc/security/

    mkdir -m 0700 -p $MBD_DIR/etc/ssh
    if [ "$BUILDARCH" = "s390" -o "$BUILDARCH" = "s390x" ]; then
        # key generation takes ages on s390, you really don't want this
        # for every installation attempt. These are NOT the keys of the
        # installed system!
        echo -n "Generating SSH1 RSA host key: "
        /usr/bin/ssh-keygen -q -t rsa1 -f $MBD_DIR/etc/ssh/ssh_host_key \
                            -C '' -N '' >&/dev/null
        echo
        echo -n "Generating SSH2 RSA host key: "
        /usr/bin/ssh-keygen -q -t rsa -f $MBD_DIR/etc/ssh/ssh_host_rsa_key \
                            -C '' -N '' >&/dev/null
        echo
        echo -n "Generating SSH2 DSA host key: "
        /usr/bin/ssh-keygen -q -t dsa -f $MBD_DIR/etc/ssh/ssh_host_dsa_key \
                            -C '' -N '' >&/dev/null
        echo
        (cd $MBD_DIR/etc/ssh; \
         chmod 600 ssh_host_key ssh_host_rsa_key ssh_host_dsa_key; \
         chmod 644 ssh_host_key.pub ssh_host_rsa_key.pub ssh_host_dsa_key.pub; )
    fi

    cat > $MBD_DIR/etc/ssh/sshd_config.anaconda <<EOF
Port 22
HostKey /etc/ssh/ssh_host_key
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
PermitRootLogin yes
IgnoreRhosts yes
StrictModes yes
X11Forwarding yes
X11DisplayOffset 10
PrintMotd yes
XAuthLocation /sbin/xauth
KeepAlive yes
SyslogFacility AUTHPRIV
RSAAuthentication yes
PasswordAuthentication yes
PermitEmptyPasswords yes
PermitUserEnvironment yes
EOF
    chmod 600 $MBD_DIR/etc/ssh/sshd_config.anaconda

    # copy in the binaries
    instbin $IMGPATH /sbin/nologin $MBD_DIR /sbin/nologin
    instbin $IMGPATH /bin/login $MBD_DIR /sbin/login
    instbin $IMGPATH /usr/sbin/sshd $MBD_DIR /sbin/sshd
    instbin $IMGPATH /usr/bin/ssh-keygen $MBD_DIR /sbin/ssh-keygen
}


makeinitrd() {
    EXTRAINITRDPATH=""
    INITRDSIZE=""
    KEEP=""
    PADSIZE=""
    LOADERBIN=""
    INITRDMODULES=""
    MYLANGTABLE=$LANGTABLE
    MYLOADERTR=loader.tr
    while [ x$(echo $1 | cut -c1-2) = x"--" ]; do
        if [ $1 = "--initrdto" ]; then
            EXTRAINITRDPATH=$2
            shift; shift
            continue
        elif [ $1 = "--keep" ]; then
            KEEP=yes
            shift
            continue
        elif [ $1 = "--initrdsize" ]; then
            INITRDSIZE=$2
            shift; shift
            continue
        elif [ $1 = "--loaderbin" ]; then
            LOADERBIN=$2
            shift; shift
            continue
        elif [ $1 = "--modules" ]; then
            INITRDMODULES=$2
            shift; shift
            continue
        fi
        echo "Unknown option passed to makeinitrd"
        exit 1
    done
    if [ -z "$LOADERBIN" ]; then
        echo "no loader binary specified!" >&2
        exit 1
    fi
    if [ -z "$INITRDMODULES" ]; then
        echo "warning: no loader modules specified!" >&2
    fi
    if [ -z "$INITRDSIZE" ]; then
        echo "I don't know how big to make the initrd image!" >&2
        exit 1
    fi

    MBD_DIR=$TMPDIR/makebootdisk.dir.$$
    MBD_FSIMAGE=$TMPDIR/makebootdisk.initrdimage.$$
    MBD_BOOTTREE=$TMPDIR/makebootdisk.tree.$$

    rm -rf $MBD_DIR $MBD_FSIMAGE
    mkdir -p $MBD_DIR/modules
    mkdir -p $MBD_DIR/sbin
    mkdir -p $MBD_DIR/dev
    mkdir -p $MBD_DIR/etc
    mkdir -p $MBD_DIR/etc/udev/rules.d
    mkdir -p $MBD_DIR/lib/udev/rules.d
    mkdir -p $MBD_DIR/proc
    mkdir -p $MBD_DIR/selinux
    mkdir -p $MBD_DIR/sys
    mkdir -p $MBD_DIR/etc/terminfo/{a,b,d,l,s,v,x}
    mkdir -p $MBD_DIR/tmp
    mkdir -p $MBD_DIR/usr/libexec
    mkdir -p $MBD_DIR/usr/$LIBDIR/NetworkManager
    mkdir -p $MBD_DIR/$LIBDIR/rsyslog
    mkdir -p $MBD_DIR/usr/share/dbus-1/system-services
    mkdir -p $MBD_DIR/var/lib/dbus
    mkdir -p $MBD_DIR/var/lib/dhclient
    mkdir -p $MBD_DIR/etc/dhcp
    mkdir -p $MBD_DIR/var/lock/rpm
    mkdir -p $MBD_DIR/var/run
    mkdir -p $MBD_DIR/var/run/dbus
    mkdir -p $MBD_DIR/var/run/NetworkManager
    mkdir -p $MBD_DIR/etc/dbus-1/system.d
    mkdir -p $MBD_DIR/etc/modprobe.d
    mkdir -p $MBD_DIR/etc/NetworkManager/dispatcher.d
    mkdir -p $MBD_DIR/$LIBDIR/dbus-1
    mkdir -p $MBD_DIR/etc/sysconfig/network-scripts
    mkdir -p $MBD_DIR/usr/share/polkit-1/actions
    mkdir -p $MBD_DIR/etc/polkit-1/localauthority.conf.d
    mkdir -p $MBD_DIR/etc/polkit-1/nullbackend.conf.d
    mkdir -p $MBD_DIR/usr/share/hwdata
    mkdir -p $MBD_DIR/etc/rc.d/init.d
    mkdir -p $MBD_DIR/usr/sbin
    mkdir -p $MBD_DIR/var/run/wpa_supplicant
    mkdir -m 111 -p $MBD_DIR/var/empty/sshd
    mkdir -p $MBD_DIR/etc/{pam.d,security}
    mkdir -p $MBD_DIR/$LIBDIR/security

    for x in $IMGPATH/$LIBDIR/security/* ; do
	y=$(basename $x)
        instbin $IMGPATH $LIBDIR/security/$y $MBD_DIR $LIBDIR/security/$y
    done

    cp $IMGPATH/$LIBDIR/libpam_misc.so.0.* $MBD_DIR/$LIBDIR/libpam_misc.so.0
    cp $IMGPATH/$LIBDIR/libwrap*.so* $MBD_DIR/$LIBDIR/

    if [ "$BUILDARCH" = "s390" -o "$BUILDARCH" = "s390x" ]; then
        ln -s /tmp $MBD_DIR/var/state/xkb
        instbin $IMGPATH /usr/bin/xauth $MBD_DIR /sbin/xauth
        local cmsfsbin cmd
        for cmsfsbin in $IMGPATH/usr/sbin/cmsfs*; do
            cmd="$(basename $cmsfsbin)"
            instbin $IMGPATH /usr/sbin/$cmd $MBD_DIR /sbin/$cmd
        done

        # lsznet requirements
        mkdir -p $MBD_DIR/lib/s390-tools
        for lsznetbin in lsznet.raw znetcontrolunits ; do
            target="/lib/s390-tools/$lsznetbin"
            instbin $IMGPATH $target $MBD_DIR $target
        done

        # required for lsznet
        instbin $IMGPATH /usr/bin/sort $MBD_DIR /sbin/sort

        # required for lsznet and linuxrc.s390
        instbin $IMGPATH /usr/bin/uname $MBD_DIR /sbin/uname
        instbin $IMGPATH /usr/bin/find $MBD_DIR /sbin/find

        # required for linuxrc.s390
        for cmd in ping ping6 cat head tr wc echo printf cut mknod ; do
            instbin $IMGPATH /usr/bin/$cmd $MBD_DIR /sbin/$cmd
        done
        instbin $IMGPATH /usr/sbin/cmsfscat $MBD_DIR /sbin/cmsfscat
        instbin $IMGPATH /usr/sbin/sysctl $MBD_DIR /sbin/sysctl

        # usability and problem determination
        for cmd in cp chown chmod date dmesg ps ls less vi gzip tar scp \
                   ldd nslookup expr getopt basename dirname lsscsi ; do
            instbin $IMGPATH /usr/bin/$cmd $MBD_DIR /sbin/$cmd
        done
        for cmd in arp qetharp qetharp-2.6 qethconf lsqeth lscss lschp \
                   lsreipl lsdasd dasdview dasdinfo lszfcp ; do
            instbin $IMGPATH /usr/sbin/$cmd $MBD_DIR /sbin/$cmd
        done
    fi

    if [ -n "$INITRDMODULES" ]; then
        MODSET=`expandModuleSet "$INITRDMODULES"`
        makemoduletree $MBD_DIR "$MODSET"
    fi

    # set up the arch bits
    echo $arch > $MBD_DIR/etc/arch

    echo "Setting up arch bits"
    instbin $IMGPATH ${LOADERBINDIR##$IMGPATH}/$LOADERBIN $MBD_DIR /sbin/loader
    if [ "$BUILDARCH" != "s390" -a "$BUILDARCH" != "s390x" ]; then
        instbin $IMGPATH ${LOADERBINDIR##$IMGPATH}/init $MBD_DIR /sbin/init
        ln -s ./init $MBD_DIR/sbin/reboot
        ln -s ./init $MBD_DIR/sbin/halt
        ln -s ./init $MBD_DIR/sbin/poweroff
    else
        instbin $IMGPATH ${LOADERBINDIR##$IMGPATH}/shutdown $MBD_DIR /sbin/shutdown
        instbin $IMGPATH /usr/lib/anaconda-runtime/loader/linuxrc.s390 $MBD_DIR /sbin/init
        instbin $IMGPATH /usr/sbin/dasdfmt $MBD_DIR /sbin/dasdfmt
    fi

    if [ "$BUILDARCH" != "s390" -a "$BUILDARCH" != "s390x" ]; then
       install -m 644 $KEYMAPS $MBD_DIR/etc/keymaps.gz
       install -m 644 $SCREENFONT $MBD_DIR/etc/screenfont.gz
    fi

    install -m 644 $MYLANGTABLE $MBD_DIR/etc/lang-table
    install -m 644 $IMGPATH/etc/passwd $MBD_DIR/etc/passwd
    install -m 644 $IMGPATH/etc/group $MBD_DIR/etc/group
    install -m 644 $IMGPATH/etc/netconfig $MBD_DIR/etc/netconfig
    install -m 644 $IMGPATH/etc/nsswitch.conf $MBD_DIR/etc/nsswitch.conf
    install -m 644 $IMGPATH/etc/hosts $MBD_DIR/etc/hosts
    mkdir -p $MBD_DIR/usr/lib/locale
    localedef -c -i en_US -f UTF-8 --prefix $MBD_DIR en_US

    instbin $IMGPATH /usr/bin/mount $MBD_DIR /sbin/mount
    for mountcmd in $IMGPATH/usr/sbin/mount.* ; do
        cmd="$(basename $mountcmd)"
        instbin $IMGPATH /usr/sbin/$cmd $MBD_DIR /sbin/$cmd
    done
    instbin $IMGPATH /usr/bin/umount $MBD_DIR /sbin/umount
    for umountcmd in $IMGPATH/usr/sbin/umount.* ; do
        cmd="$(basename $umountcmd)"
        instbin $IMGPATH /usr/sbin/$cmd $MBD_DIR /sbin/$cmd
    done

    instbin $IMGPATH /usr/sbin/udevd $MBD_DIR /sbin/udevd
    instbin $IMGPATH /usr/sbin/udevadm $MBD_DIR /sbin/udevadm
    instbin $IMGPATH /usr/bin/udevinfo $MBD_DIR /sbin/udevinfo

    instbin $IMGPATH /usr/bin/bash $MBD_DIR /sbin/bash
    ( cd $MBD_DIR/sbin ; ln -sf bash sh )
    instbin $IMGPATH /usr/sbin/consoletype $MBD_DIR /sbin/consoletype
    instbin $IMGPATH /usr/bin/logger $MBD_DIR /sbin/logger

    ( cd $IMGPATH/etc/rc.d/init.d
      cp -a functions $MBD_DIR/etc/rc.d/init.d
    )

    ( cd $IMGPATH/etc/sysconfig/network-scripts
      cp -a network-functions $MBD_DIR/etc/sysconfig/network-scripts
      cp -a network-functions-ipv6 $MBD_DIR/etc/sysconfig/network-scripts
    )

    ( cd $MBD_DIR/etc ; ln -sf /etc/rc.d/init.d init.d )

    # DHCP and DHCPv6 client daemons and support programs
    instbin $IMGPATH /usr/sbin/dhclient $MBD_DIR /sbin/dhclient
    cp -a $IMGPATH/usr/sbin/dhclient-script $MBD_DIR/sbin/dhclient-script
    chmod 0755 $MBD_DIR/sbin/dhclient-script
    instbin $IMGPATH /usr/sbin/dhcp6c $MBD_DIR /sbin/dhcp6c
    instbin $IMGPATH /usr/sbin/arping $MBD_DIR /sbin/arping
    instbin $IMGPATH /usr/sbin/ifconfig $MBD_DIR /sbin/ifconfig
    instbin $IMGPATH /usr/sbin/ip $MBD_DIR /sbin/ip
    instbin $IMGPATH /usr/bin/ipcalc $MBD_DIR /sbin/ipcalc
    instbin $IMGPATH /usr/bin/hostname $MBD_DIR /sbin/hostname
    instbin $IMGPATH /usr/sbin/ethtool $MBD_DIR /sbin/ethtool
    instbin $IMGPATH /usr/sbin/route $MBD_DIR /sbin/route
    touch $MBD_DIR/etc/resolv.conf

    # hwdata
    cp -a $IMGPATH/usr/share/hwdata/pci.ids $MBD_DIR/usr/share/hwdata/pci.ids
    cp -a $IMGPATH/usr/share/hwdata/usb.ids $MBD_DIR/usr/share/hwdata/usb.ids

    # PolicyKit
    ( cd $IMGPATH/etc/polkit-1
      cp -a localauthority.conf.d/50-localauthority.conf $MBD_DIR/etc/polkit-1/localauthority.conf.d
      cp -a localauthority.conf.d/60-desktop-policy.conf $MBD_DIR/etc/polkit-1/localauthority.conf.d
      cp -a nullbackend.conf.d/50-nullbackend.conf $MBD_DIR/etc/polkit-1/nullbackend.conf.d
    )
    ( cd $IMGPATH/usr/share/dbus-1/system-services
      cp -a org.freedesktop.PolicyKit1.service $MBD_DIR/usr/share/dbus-1/system-services
    )
    ( cd $IMGPATH/usr/share/polkit/actions
      cp -a org.freedesktop.policykit.policy $MBD_DIR/usr/share/polkit-1/actions
    )

    # dbus
    instbin $IMGPATH /usr/bin/dbus-uuidgen $MBD_DIR /sbin/dbus-uuidgen
    instbin $IMGPATH /usr/bin/dbus-daemon $MBD_DIR /sbin/dbus-daemon
    cp -a $IMGPATH/etc/dbus-1/system.conf $MBD_DIR/etc/dbus-1/system.conf
    cp -a $IMGPATH/$LIBDIR/dbus-1/dbus-daemon-launch-helper $MBD_DIR/$LIBDIR/dbus-1
    chown root:dbus $MBD_DIR/$LIBDIR/dbus-1/dbus-daemon-launch-helper
    chmod 04750 $MBD_DIR/$LIBDIR/dbus-1/dbus-daemon-launch-helper

    # wpa_supplicant
    instbin $IMGPATH /usr/sbin/wpa_passphrase $MBD_DIR /usr/sbin/wpa_passphrase
    instbin $IMGPATH /usr/sbin/wpa_supplicant $MBD_DIR /usr/sbin/wpa_supplicant
    cp -a $IMGPATH/etc/dbus-1/system.d/wpa_supplicant.conf $MBD_DIR/etc/dbus-1/system.d
    cp -a $IMGPATH/etc/wpa_supplicant/wpa_supplicant.conf $MBD_DIR/etc/wpa_supplicant
    ( cd $IMGPATH/usr/share/dbus-1/system-services
      cp -a fi.epitest.hostap.WPASupplicant.service $MBD_DIR/usr/share/dbus-1/system-services
    )

    # NetworkManager
    instbin $IMGPATH /usr/sbin/NetworkManager $MBD_DIR /usr/sbin/NetworkManager
    cp -a $IMGPATH/etc/dbus-1/system.d/nm-*.conf $MBD_DIR/etc/dbus-1/system.d
    cp -a $IMGPATH/etc/dbus-1/system.d/NetworkManager.conf $MBD_DIR/etc/dbus-1/system.d
    cp -a $IMGPATH/etc/NetworkManager/nm-system-settings.conf $MBD_DIR/etc/NetworkManager
    ( cd $IMGPATH/usr/$LIBDIR/NetworkManager
      for f in *.so ; do
          instbin $IMGPATH /usr/$LIBDIR/NetworkManager/$f $MBD_DIR /usr/$LIBDIR/NetworkManager/$f
      done
    )
    ( cd $IMGPATH/usr/libexec
      for f in nm-* ; do
          instbin $IMGPATH /usr/libexec/$f $MBD_DIR /usr/libexec/$f
      done
    )
    ( cd $IMGPATH/usr/share/dbus-1/system-services
      cp -a org.freedesktop.nm_dispatcher.service $MBD_DIR/usr/share/dbus-1/system-services
    )

    # mdadm
    instbin $IMGPATH /usr/sbin/mdadm $MBD_DIR /sbin/mdadm
    instbin $IMGPATH /usr/sbin/mdmon $MBD_DIR /sbin/mdmon

    # rsyslog
    instbin $IMGPATH /usr/sbin/rsyslogd $MBD_DIR /sbin/rsyslogd
    ( cd $IMGPATH/$LIBDIR/rsyslog
      for f in *.so; do
          instbin $IMGPATH /$LIBDIR/rsyslog/$f $MBD_DIR /$LIBDIR/rsyslog/$f
      done
    )
    # \EOF has a quote in the first character on purpose; see man bash on here documents
    cat > $MBD_DIR/etc/rsyslog.conf <<\EOF
#### MODULES ####
$ModLoad imuxsock.so     # provides support for local system logging
$ModLoad imklog.so       # provides kernel logging support

#### GLOBAL DIRECTIVES ####
# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

#### TEMPLATES ####

$template anaconda_tty4, "%syslogseverity-text:::uppercase% %programname%:%msg%\n"
$template anaconda_syslog, "%timestamp:8:$:date-rfc3164%,%timestamp:1:3:date-subseconds% %syslogseverity-text:::uppercase% %programname%:%msg%\n"

#### RULES ####
# log everything except anaconda-specific records from local1 (those are stored
# directly into files via python logging)
*.*;\
authpriv.none;\
local1.none             /tmp/syslog;anaconda_syslog
                        & /dev/tty4;anaconda_tty4

# ### begin forwarding rule ###
# The statement between the begin ... end define a SINGLE forwarding
# rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
#
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
$ActionQueueMaxDiskSpace 1m     # space limit (use as much as possible)
$ActionQueueSaveOnShutdown off  # do not save messages to disk on shutdown
$ActionQueueType LinkedList     # run asynchronously
$ActionResumeRetryCount -1      # infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
# ### end of the forwarding rule ###

EOF

    # Misc
    instbin $IMGPATH /usr/sbin/dmidecode $MBD_DIR /sbin/dmidecode
    instbin $IMGPATH /usr/bin/egrep $MBD_DIR /sbin/egrep
    instbin $IMGPATH /usr/bin/fgrep $MBD_DIR /sbin/fgrep
    instbin $IMGPATH /usr/bin/gawk $MBD_DIR /sbin/gawk
    ( cd $MBD_DIR/sbin ; ln -sf gawk awk )
    instbin $IMGPATH /usr/bin/grep $MBD_DIR /sbin/grep
    instbin $IMGPATH /usr/bin/kill $MBD_DIR /sbin/kill
    instbin $IMGPATH /usr/bin/ln $MBD_DIR /sbin/ln
    instbin $IMGPATH /usr/sbin/load_policy $MBD_DIR /sbin/load_policy
    instbin $IMGPATH /usr/bin/mkdir $MBD_DIR /sbin/mkdir
    instbin $IMGPATH /usr/bin/readlink $MBD_DIR /sbin/readlink
    instbin $IMGPATH /usr/bin/rm $MBD_DIR /sbin/rm
    instbin $IMGPATH /usr/bin/rmdir $MBD_DIR /sbin/rmdir
    instbin $IMGPATH /usr/bin/sed $MBD_DIR /sbin/sed
    instbin $IMGPATH /usr/bin/sleep $MBD_DIR /sbin/sleep
    instbin $IMGPATH /usr/bin/strace $MBD_DIR /sbin/strace
    instbin $IMGPATH /usr/bin/touch $MBD_DIR /sbin/touch
    instbin $IMGPATH /usr/bin/wget $MBD_DIR /sbin/wget

    # Indirect dependencies
    for nsslib in freebl3 softokn3 nssdbm3 ; do
        if [ -f $IMGPATH/$LIBDIR/lib$nsslib.so ]; then
            install -m 755 $IMGPATH/$LIBDIR/lib$nsslib.so $MBD_DIR/$LIBDIR/
        elif [ -f $IMGPATH/usr/$LIBDIR/lib$nsslib.so ]; then
            install -m 755 $IMGPATH/usr/$LIBDIR/lib$nsslib.so $MBD_DIR/$LIBDIR/
        else
            echo "ERROR: *** Missing lib$nsslib.so" >&2
        fi
    done

    install -m 755 $IMGPATH/usr/$LIBDIR/libsqlite3.so.0 $MBD_DIR/usr/$LIBDIR/
    install -m 755 $IMGPATH/$LIBDIR/libnss_dns.so.2 $MBD_DIR/$LIBDIR/
    install -m 755 $IMGPATH/$LIBDIR/libnss_files.so.2 $MBD_DIR/$LIBDIR/
    install -m 755 $IMGPATH/$LIBDIR/libgcc_s.so.1 $MBD_DIR/$LIBDIR/

    install -m 644 $IMGPATH/etc/udev/udev.conf $MBD_DIR/etc/udev/udev.conf
    for i in $IMGPATH/lib/udev/rules.d/*.rules ; do
       install -m 644 $i $MBD_DIR/lib/udev/rules.d/${i##*/}
    done
    for i in $IMGPATH/etc/udev/rules.d/*.rules ; do
       install -m 644 $i $MBD_DIR/etc/udev/rules.d/${i##*/}
    done
    for i in $IMGPATH/lib/udev/*; do
       if [ -f $i ]; then install -m 755 $i $MBD_DIR/lib/udev/${i##*/}; fi
    done
    rm -f $MBD_DIR/lib/udev/rules.d/*generator*

    install -m 644 $LOADERBINDIR/$MYLOADERTR $MBD_DIR/etc/loader.tr
    for i in a/ansi d/dumb l/linux s/screen v/vt100 v/vt100-nav v/vt102 x/xterm x/xterm-color g/gnome ; do
        [ -f $IMGPATH/usr/share/terminfo/$i ] && \
        install -m 644 $IMGPATH/usr/share/terminfo/$i $MBD_DIR/etc/terminfo/$i
    done

    makeproductfile $MBD_DIR

    for n in insmod rmmod modprobe depmod; do
        instbin $IMGPATH /usr/sbin/$n $MBD_DIR /sbin/$n
    done

    ln -s /sbin/init $MBD_DIR/init
    ln -s /proc/mounts $MBD_DIR/etc/mtab
    ln -s sbin $MBD_DIR/bin
    mkdir -p $MBD_DIR/var/lib
    ln -s ../../tmp $MBD_DIR/var/lib/xkb

    setupSshd

    cat > $MBD_DIR/.profile <<EOF
PS1="[anaconda \u@\h \W]\\\\$ "
PATH=/bin:/usr/bin:/usr/sbin:/mnt/sysimage/sbin:/mnt/sysimage/usr/sbin:/mnt/sysimage/bin:/mnt/sysimage/usr/bin
export PATH PS1
EOF

    cat > $MBD_DIR/.bash_history <<EOF
kill -USR2 \`cat /var/run/anaconda.pid\`
kill -HUP \`cat /var/run/anaconda.pid\`
udevadm info --export-db | less
tail -f /tmp/storage.log
EOF

    cp /usr/share/doc/python-devel-*/gdbinit $MBD_DIR/.gdbinit

    rm -f $MBD_FSIMAGE
    (cd $MBD_DIR; find . |cpio --quiet -c -o) |gzip -9 > $MBD_FSIMAGE

    size=$(du $MBD_FSIMAGE | awk '{ print $1 }')

    echo "Wrote $MBD_FSIMAGE (${size}k compressed)"

    if [ -n "$EXTRAINITRDPATH" ]; then
        mkdir -p `dirname $EXTRAINITRDPATH`
        cp -a $MBD_FSIMAGE $EXTRAINITRDPATH
    fi

    if [ -z "$KEEP" ]; then
        rm -rf $MBD_FSIMAGE $MBD_BOOTTREE
    fi
}

makeinstimage () {
    imagename=$1
    type=$2
    tmp=$TMPDIR/instimage.dir.$$

    rm -rf $tmpimage $tmp
    mkdir -p $mntpoint $tmp

    mkdir -p $tmp
    (cd $IMGPATH; find . | cpio --quiet -p $tmp)
    makeproductfile $tmp

    if [ -z "$type" -o "$type" = "cramfs" ]; then
        echo "Running mkcramfs $CRAMBS $tmp $INSTIMGPATH/${imagename}2.img"
        mkfs.cramfs $CRAMBS $tmp $TMPDIR/${imagename}2.img.$$
    elif [ "$type" = "squashfs" ]; then
        echo "Running mksquashfs $tmp $TMPDIR/${imagename}2.img -all-root -no-fragments -no-progress"
        mksquashfs $tmp $TMPDIR/${imagename}2.img.$$ -all-root -no-fragments -no-progress
        chmod 0644 $TMPDIR/${imagename}2.img.$$
    fi
    cp $TMPDIR/${imagename}2.img.$$ $INSTIMGPATH/${imagename}2.img
    size=$(ls -l $INSTIMGPATH/${imagename}2.img | awk '{print $5}')
    size=$(expr $size / 1024)
    echo "Wrote $INSTIMGPATH/${imagename}2.img (${size}k)..."
    relpath=${INSTIMGPATH#$TOPDESTPATH/}
    echo "instimage = ${relpath}/${imagename}2.img" >> $TOPDESTPATH/.treeinfo
    rm -rf $tmp
}

makemainimage () {
    imagename=$1
    type=$2
    mmi_tmpimage=$TMPDIR/instimage.img.$$
    mmi_mntpoint=$TMPDIR/instimage.mnt.$$

    rm -rf $mmi_tmpimage $mmi_mntpoint
    mkdir $mmi_mntpoint

    if [ $type = "ext2" ]; then
        SIZE=$(du -sk $IMGPATH | awk '{ print int($1 * 1.1) }')
        if [ -d $IMGPATH/usr/lib/anaconda-runtime ]; then
            ERROR=$(du -sk $IMGPATH/usr/lib/anaconda-runtime | awk '{ print $1 }')
            SIZE=$(expr $SIZE - $ERROR)
        fi
        if [ -d $IMGPATH/usr/share/syslinux ]; then
            ERROR=$(du -sk $IMGPATH/usr/share/syslinux | awk '{ print $1 }')
            SIZE=$(expr $SIZE - $ERROR)
        fi
        dd if=/dev/zero bs=1k count=${SIZE} of=$mmi_tmpimage 2>/dev/null
        mke2fs -q -F $mmi_tmpimage > /dev/null
        tune2fs -c0 -i0 $mmi_tmpimage >/dev/null
        mount -o loop $mmi_tmpimage $mmi_mntpoint

        (cd $IMGPATH; find . |
            fgrep -v "./usr/lib/anaconda-runtime" |
            fgrep -v "./usr/share/syslinux"
            cpio -H crc -o) | (cd $mmi_mntpoint; cpio -iumd)
        makeproductfile $mmi_mntpoint
        umount $mmi_mntpoint
        rmdir $mmi_mntpoint
    elif [ $type = "squashfs" ]; then
        makeproductfile $IMGPATH
        echo "Running mksquashfs $IMGPATH $mmi_tmpimage -all-root -no-fragments -no-progress"
        mksquashfs $IMGPATH $mmi_tmpimage -all-root -no-fragments -no-progress
        chmod 0644 $mmi_tmpimage
        SIZE=$(expr `cat $mmi_tmpimage | wc -c` / 1024)
    elif [ $type = "cramfs" ]; then
        makeproductfile $IMGPATH
        echo "Running mkcramfs $CRAMBS $IMGPATH $mmi_tmpimage"
        mkfs.cramfs $CRAMBS $IMGPATH $mmi_tmpimage
        SIZE=$(expr `cat $mmi_tmpimage | wc -c` / 1024)
    fi

    cp $mmi_tmpimage $INSTIMGPATH/${imagename}.img
    chmod 644 $INSTIMGPATH/${imagename}.img

    echo "Wrote $INSTIMGPATH/${imagename}.img (${SIZE}k)"
    relpath=${INSTIMGPATH#$TOPDESTPATH/}
    echo "mainimage = ${relpath}/${imagename}.img" >> $TOPDESTPATH/.treeinfo

    rm $mmi_tmpimage
}

makeSecondStage() {
    echo "[stage2]" >> $TOPDESTPATH/.treeinfo
    echo "Building install.img"
    makemainimage "install" "squashfs"
    [ $? = 0 ] || exit 1
}

doPostImages() {
   /bin/true
}

# this gets overloaded if we're on an EFI-capable arch (... with grub)
makeEfiImages()
{
    echo "Not on an EFI capable machine; skipping EFI images."
    /bin/true
}

# source the architecture specific mk-images file so we can call functions
# in it
if [ ${BUILDARCH} = s390x ]; then
    # FIXME: this is a bad hack for s390, but better than copying for now
    source $TOPDIR/mk-images.s390
elif [ ${BUILDARCH} = ppc64 ]; then
    # ... and similar for ppc64
    source $TOPDIR/mk-images.ppc
elif [ ${BUILDARCH} = "x86_64" -o ${BUILDARCH} = "i386" ]; then
    source $TOPDIR/mk-images.x86
    source $TOPDIR/mk-images.efi
elif [ ${BUILDARCH} = "sparc64" -o ${BUILDARCH} = "sparcv9" ]; then
    source $TOPDIR/mk-images.sparc
else
    source $TOPDIR/mk-images.${BUILDARCH}
fi

# Find the kernel, unpack it, and verify it
kerneltags="kernel"
efiarch=""
arches="$BUILDARCH"
if [ "$BUILDARCH" = "ppc" ]; then
    arches="ppc64 ppc"
elif [ "$BUILDARCH" = "i386" ]; then
    arches="i586"
    efiarch="ia32"
    kerneltags="kernel kernel-PAE"
    kernelxen="kernel-PAE"
elif [ "$BUILDARCH" = "x86_64" ]; then
    kerneltags="kernel"
    efiarch="x64"
elif [ "$BUILDARCH" = "ia64" ]; then
    kerneltags="kernel"
    efiarch="ia64"
elif [ "$BUILDARCH" = "sparc" -o "$BUILDARCH" = "sparcv9" -o "$BUILDARCH" = "sparc64" ]; then
    arches="sparc64"
fi

foundakernel=""
for KERNELARCH in $arches; do
    for kernelvers in $kerneltags; do
        kpackage=$(findPackage $kernelvers)
        if [ "$KERNELARCH" = "i586" -a -z "$kpackage" ]; then
            echo "No i586 kernel, trying i686..."
            KERNELARCH="i686"
            kpackage=$(findPackage $kernelvers)
        fi

        if [ -z "$kpackage" ]; then
            echo "Unable to find kernel package $kernelvers"
            continue
        fi

        yumdownloader -c $yumconf --archlist=$KERNELARCH $kpackage
        kpackage="$kpackage.rpm"
        rpm --checksig $kpackage.rpm | grep -v pgp && exit 1
        if [ ! -f "$kpackage" ]; then
            echo "kernel ($kernelvers) doesn't exist for $KERNELARCH.  skipping"
            continue
        fi

        KERNELROOT=$KERNELBASE/$KERNELARCH
        mkdir -p $KERNELROOT

        foundakernel="yes"

        if [ "$BUILDARCH" = "ia64" ]; then
            vmlinuz=$(rpm --nodigest --nosignature -qpl $kpackage |grep ^/boot/efi/EFI/redhat/vmlinuz | head -n 1)
            version=${vmlinuz##/boot/efi/EFI/redhat/vmlinuz-}
        else
            vmlinuz=$(rpm --nodigest --nosignature -qpl $kpackage |grep ^/boot/vmlinuz | head -n 1)
            version=${vmlinuz##/boot/vmlinuz-}
        fi
        arch=$(rpm --nodigest --nosignature --qf '%{ARCH}\n' -qp $kpackage)

        rpm2cpio $kpackage | (cd $KERNELROOT; cpio --quiet -iumd)
        rm -f $kpackage
        # expand out any available firmware too
        for p in $(repoquery -c $yumconf '*firmware*') ; do
            yumdownloader -c $yumconf $p
            rpm --checksig *firmware*.rpm | grep -v pgp && exit 1
            rpm2cpio *firmware*.rpm | (cd $KERNELROOT; cpio --quiet -iumd)
            rm -f *firmware*.rpm
        done
        # and get XEN Hypervisor
        for p in $(repoquery -c $yumconf 'xen-hypervisor') ; do
            yumdownloader -c $yumconf $p
            rpm --checksig xen-hypervisor*.rpm | grep -v pgp && exit 1
            rpm2cpio xen-hypervisor*.rpm | (cd $KERNELROOT; cpio --quiet -iumd)
            rm -f xen-hypervisor*.rpm
        done

        if [ ! -d "$KERNELROOT/lib/modules/$version" ]; then
            echo "$KERNELROOT/lib/modules/$version is not a valid modules directory" 2>&1
            exit 1
        fi

        if [ ! -f "$KERNELROOT/$KERNELDIR/${KERNELNAME}-$version" ]; then
            echo "$KERNELROOT/$KERNELDIR/${KERNELNAME}-$version does not exist"
            exit 1
        fi

        allmods=$(find $KERNELROOT/lib/modules/$version -name *.ko)

        rundepmod $KERNELROOT
        $GENMODINFO $KERNELROOT/lib/modules/$version > $MODINFO

        # make the boot images
        makeBootImages

        makeEfiImages $yumconf
    done
done

if [ -n "$foundakernel" ]; then
    makeSecondStage
    rm -rf $KERNELBASE
fi

doPostImages

cd $TOPDIR
