#!/bin/bash
#
# Copyright 2015 Hewlett-Packard Development Company, L.P.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
if [ "${DIB_DEBUG_TRACE:-0}" -gt 0 ]; then
    set -x
fi
set -eu
set -o pipefail

if [ -f ${TARGET_ROOT}/.extra_settings ] ; then
    . ${TARGET_ROOT}/.extra_settings
fi
ARCH=${ARCH:-x86_64}
if [ $ARCH = amd64 ]; then
    ARCH=x86_64
fi
# Calling elements will need to set DISTRO_NAME and DIB_RELEASE
DIB_YUMCHROOT_EXTRA_ARGS=${DIB_YUMCHROOT_EXTRA_ARGS:-}
YUMCHROOT_TARBALL=$DIB_IMAGE_CACHE/yumchroot-${DISTRO_NAME}-${DIB_RELEASE}-${ARCH}.tar.gz
# TODO Maybe deal with DIB_DISTRIBUTION_MIRROR
http_proxy=${http_proxy:-}

WORKING=$(mktemp --tmpdir=${TMP_DIR:-/tmp} -d)
EACTION="rm -r $WORKING"
trap "$EACTION" EXIT

YUM_CACHE=$DIB_IMAGE_CACHE/yum

# install the [fedora|centos]-[release|repo] packages inside the
# chroot, which are needed to bootstrap yum/dnf
#
# note this runs outside the chroot, where we're assuming the platform
# has yum/yumdownloader
function _install_repos {
    yumdownloader \
        --releasever=$DIB_RELEASE \
        --setopt=reposdir=$TMP_HOOKS_PATH/yum.repos.d \
        --destdir=$WORKING \
        ${DISTRO_NAME}-release
    RELEASE_RPMS="${DISTRO_NAME}-release"

    # after fedora21, this is split into into a separate -repos
    # package
    if [ $DISTRO_NAME = fedora ] ; then
        yumdownloader \
            --releasever=$DIB_RELEASE \
            --setopt=reposdir=$TMP_HOOKS_PATH/yum.repos.d \
            --destdir=$WORKING \
            ${DISTRO_NAME}-repos
        RELEASE_RPMS="${RELEASE_RPMS} ${DISTRO_NAME}-repos"
    fi

    # --nodeps works around these wanting /bin/sh in some fedora
    # releases, see rhbz#1265873
    sudo rpm --root $TARGET_ROOT --nodeps -ivh $WORKING/*rpm
}

# _install_pkg_manager packages...
#
# install the package manager packages.  This is done outside the chroot
# and with yum from the build system.
# TODO: one day build systems will be dnf only, but we don't handle
# that right now
function _install_pkg_manager {
    # Install into the chroot, using the gpg keys from the release
    # rpm's installed in the chroot
    sudo sed -i "s,/etc/pki/rpm-gpg,$TARGET_ROOT/etc/pki/rpm-gpg,g" \
        $TARGET_ROOT/etc/yum.repos.d/*repo

    sudo yum -y \
            --setopt=cachedir=$YUM_CACHE/$ARCH/$DIB_RELEASE \
            --setopt=reposdir=$TARGET_ROOT/etc/yum.repos.d \
            --installroot $TARGET_ROOT \
        install $@

    # Set gpg path back because subsequent actions will take place in
    # the chroot
    sudo sed -i "s,$TARGET_ROOT/etc/pki/rpm-gpg,/etc/pki/rpm-gpg,g" \
        $TARGET_ROOT/etc/yum.repos.d/*repo
}

if [ -n "$DIB_OFFLINE" -o -n "${DIB_YUMCHROOT_USE_CACHE:-}" ] && [ -f $YUMCHROOT_TARBALL ] ; then
    echo $YUMCHROOT_TARBALL found in cache. Using.
    sudo tar -C $TARGET_ROOT --numeric-owner -xzf $YUMCHROOT_TARBALL
else
    # initalize rpmdb
    sudo mkdir -p $TARGET_ROOT/var/lib/rpm
    sudo rpm --root $TARGET_ROOT --initdb

    # this makes sure that running yum/dnf in the chroot it can get
    # out to download stuff
    sudo mkdir $TARGET_ROOT/etc
    sudo cp /etc/resolv.conf $TARGET_ROOT/etc/resolv.conf

    # Bind mount the external yum cache inside the chroot.  Same logic
    # as in the yum element to provide for yum caching copied here
    # because the sequencing is wrong otherwise
    sudo mkdir -p $TMP_MOUNT_PATH/tmp/yum
    sudo mount --bind $YUM_CACHE $TMP_MOUNT_PATH/tmp/yum

    _install_repos

    if [ $DIB_RELEASE -ge 22 ]; then
        # install dnf for >= f22
        _install_pkg_manager dnf dnf-plugins-core yum
    else
        _install_pkg_manager yum
    fi

    # bootstrap the environment within the chroot
    sudo chroot $TARGET_ROOT ${YUM} makecache
    sudo chroot $TARGET_ROOT ${YUM} -y \
        --setopt=cachedir=/tmp/yum/$ARCH/$DIB_RELEASE \
        install passwd findutils sudo util-linux-ng

    # cleanup
    sudo rm $TARGET_ROOT/etc/resolv.conf
    sudo umount $TMP_MOUNT_PATH/tmp/yum

    # RPM doesn't know whether files have been changed since install
    # At this point though, we know for certain that we have changed no
    # config files, so anything marked .rpmnew is just a bug.
    for newfile in $(sudo find $TARGET_ROOT -type f -name '*rpmnew') ; do
        sudo mv $newfile $(echo $newfile | sed 's/.rpmnew$//')
    done

    echo Caching result in $YUMCHROOT_TARBALL
    sudo tar --numeric-owner \
        -C $TARGET_ROOT \
        -zcf $YUMCHROOT_TARBALL --exclude='./tmp/*' .
fi

sudo rm -f ${TARGET_ROOT}/.extra_settings
