#!/bin/bash

# vim: ts=4 sw=4 sts=4 et tw=72 :

# force any errors to cause the script and job to end in failure
set -xeu -o pipefail

ensure_kernel_install() {
    # Workaround for mkinitrd failing on occassion.
    # On CentOS 7 it seems like the kernel install can fail it's mkinitrd
    # run quietly, so we may not notice the failure. This script retries for a
    # few times before giving up.
    initramfs_ver=$(rpm -q kernel | tail -1 | sed "s/kernel-/initramfs-/")
    grub_conf="/boot/grub/grub.conf"
    # Public cloud does not use /boot/grub/grub.conf and uses grub2 instead.
    if [ ! -e "$grub_conf" ]; then
        echo "$grub_conf not found. Using Grub 2 conf instead."
        grub_conf="/boot/grub2/grub.cfg"
    fi

    for i in $(seq 3); do
        if grep "$initramfs_ver" "$grub_conf"; then
            break
        fi
        echo "Kernel initrd missing. Retrying to install kernel..."
        yum reinstall -y kernel
    done
    if ! grep "$initramfs_ver" "$grub_conf"; then
        cat /boot/grub/grub.conf
        echo "ERROR: Failed to install kernel."
        exit 1
    fi
}

ensure_ubuntu_install() {
    # Workaround for mirrors occassionally failing to install a package.
    # On Ubuntu sometimes the mirrors fail to install a package. This wrapper
    # checks that a package is successfully installed before moving on.

    packages=($@)

    for pkg in "${packages[@]}"
    do
        # Retry installing package 5 times if necessary
        for i in {0..5}
        do
            if [ "$(dpkg-query -W -f='${Status}' "$pkg" 2>/dev/null | grep -c "ok installed")" -eq 0 ]; then
                apt-cache policy "$pkg"
                apt-get install "$pkg"
                continue
            else
                echo "$pkg already installed."
                break
            fi
        done
    done
}

rh_systems() {
    # Handle the occurance where SELINUX is actually disabled
    SELINUX=$(grep -E '^SELINUX=(disabled|permissive|enforcing)$' /etc/selinux/config)
    MODE=$(echo "$SELINUX" | cut -f 2 -d '=')
    case "$MODE" in
        permissive)
            echo "************************************"
            echo "** SYSTEM ENTERING ENFORCING MODE **"
            echo "************************************"
            # make sure that the filesystem is properly labelled.
            # it could be not fully labeled correctly if it was just switched
            # from disabled, the autorelabel misses some things
            # skip relabelling on /dev as it will generally throw errors
            restorecon -R -e /dev /

            # enable enforcing mode from the very start
            setenforce enforcing

            # configure system for enforcing mode on next boot
            sed -i 's/SELINUX=permissive/SELINUX=enforcing/' /etc/selinux/config
        ;;
        disabled)
            sed -i 's/SELINUX=disabled/SELINUX=permissive/' /etc/selinux/config
            touch /.autorelabel

            echo "*******************************************"
            echo "** SYSTEM REQUIRES A RESTART FOR SELINUX **"
            echo "*******************************************"
        ;;
        enforcing)
            echo "*********************************"
            echo "** SYSTEM IS IN ENFORCING MODE **"
            echo "*********************************"
        ;;
    esac

    # Allow jenkins access to alternatives command to switch java version
    cat <<EOF >/etc/sudoers.d/89-jenkins-user-defaults
Defaults:jenkins !requiretty
jenkins ALL = NOPASSWD: /usr/sbin/alternatives
EOF

    echo "---> Updating operating system"
    yum clean all
    yum install -y deltarpm
    yum update -y

    ensure_kernel_install

    # add in components we need or want on systems
    echo "---> Installing base packages"
    yum install -y @base https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    # separate group installs from package installs since a non-existing
    # group with dnf based systems (F21+) will fail the install if such
    # a group does not exist
    yum install -y unzip xz puppet git git-review perl-XML-XPath
    yum install -y python-{devel,virtualenv}
    yum install -y python3-{devel,setuptools,pip}

    # All of our systems require Java (because of Jenkins)
    # Install all versions of the OpenJDK devel but force 1.7.0 to be the
    # default

    echo "---> Configuring OpenJDK"
    yum install -y 'java-*-openjdk-devel'

    FACTER_OS=$(/usr/bin/facter operatingsystem)
    FACTER_OSVER=$(/usr/bin/facter operatingsystemrelease)
    case "$FACTER_OS" in
        Fedora)
            if [ "$FACTER_OSVER" -ge "21" ]
            then
                echo "---> not modifying java alternatives as OpenJDK 1.7.0 does not exist"
            else
                alternatives --set java /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
                alternatives --set java_sdk_openjdk /usr/lib/jvm/java-1.7.0-openjdk.x86_64
            fi
        ;;
        RedHat|CentOS)
            if [ "$(echo "$FACTER_OSVER" | cut -d'.' -f1)" -ge "7" ]
            then
                echo "---> not modifying java alternatives as OpenJDK 1.7.0 does not exist"
            else
                alternatives --set java /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
                alternatives --set java_sdk_openjdk /usr/lib/jvm/java-1.7.0-openjdk.x86_64
            fi
        ;;
        *)
            alternatives --set java /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
            alternatives --set java_sdk_openjdk /usr/lib/jvm/java-1.7.0-openjdk.x86_64
        ;;
    esac

    ########################
    # --- START LFTOOLS DEPS

    # Used by various scripts to push patches to Gerrit
    yum install -y git-review

    # Needed to parse OpenStack commands used by opendaylight-infra stack commands
    # to initialize Heat template based systems.
    yum install -y jq

    # Used by lftools scripts to parse XML
    yum install -y xmlstarlet

     # Install Shellcheck from archive
     SHELLCHECK_VERSION="v0.6.0"
     SHELLCHECK_SHA256SUM="95c7d6e8320d285a9f026b5241f48f1c02d225a1b08908660e8b84e58e9c7dce"
     curl -L -o /tmp/shellcheck.tar.xz https://storage.googleapis.com/shellcheck/shellcheck-${SHELLCHECK_VERSION}.linux.x86_64.tar.xz
     echo "$SHELLCHECK_SHA256SUM  /tmp/shellcheck.tar.xz" | sha256sum -c -
     pushd /tmp
     tar -xJvf shellcheck.tar.xz
     cp shellcheck-${SHELLCHECK_VERSION}/shellcheck /usr/local/bin/shellcheck
     chmod a+x /usr/local/bin/shellcheck
     popd

    # --- END LFTOOLS DEPS
    ######################

    # install haveged to avoid low entropy rejecting ssh connections
    yum install -y haveged
    systemctl enable haveged.service
}

ubuntu_systems() {
    # Ignore SELinux since slamming that onto Ubuntu leads to
    # frustration

    # Allow jenkins access to update-alternatives command to switch java version
    cat <<EOF >/etc/sudoers.d/89-jenkins-user-defaults
Defaults:jenkins !requiretty
jenkins  ALL = NOPASSWD: /usr/sbin/update-alternatives, /usr/sbin/update-java-alternatives

EOF

    export DEBIAN_FRONTEND=noninteractive
    cat <<EOF >> /etc/apt/apt.conf
APT {
  Get {
    Assume-Yes "true";
    allow-change-held-packages "true";
    allow-downgrades "true";
    allow-remove-essential "true";
  };
};

Dpkg::Options {
  "--force-confdef";
  "--force-confold";
};

EOF

    # Add hostname to /etc/hosts to fix 'unable to resolve host' issue with sudo
    sed -i "/127.0.0.1/s/$/ $(hostname)/" /etc/hosts

    echo "---> Updating operating system"

    # added 2019-09-20 as apt-add-repository and software-properties-common weren't working
    cat <<EOF >/etc/apt/sources.list.d/packer.list
# created by packer
deb http://us.archive.ubuntu.com/ubuntu $(lsb_release -sc) main universe restricted multiverse

EOF

    # remove these as the fix seems to be broken now? zdw, 2019-09-20
    # # Change made 2018-07-09 by zdw
    # # per discussion on #lf-releng, the upstream Ubuntu image changed to be
    # # missing add-apt-repository, so the next command failed.
    # apt-get update -m
    # # added 2019-09-20, sometimes upstream repos are broken w/this package, try to determine why
    # apt-cache madison software-properties-common
    # apt-get install -y software-properties-common

    # add additional repositories
    # add-apt-repository "deb http://us.archive.ubuntu.com/ubuntu $(lsb_release -sc) main universe restricted multiverse"

    echo "---> Installing base packages"
    apt-get clean
    apt-get update -m
    apt-get upgrade -m
    apt-get dist-upgrade -m

    apt-get update -m
    ensure_ubuntu_install unzip xz-utils puppet git libxml-xpath-perl

    # Deprecated - updating to corretto Java distro, 2019-07-22, zdw
    # install Java 7
    # echo "---> Configuring OpenJDK"
    # FACTER_OSVER=$(/usr/bin/facter operatingsystemrelease)
    # case "$FACTER_OSVER" in
    #     14.04)
    #         apt-get install openjdk-7-jdk
    #         # make jdk8 available
    #         add-apt-repository -y ppa:openjdk-r/ppa
    #         apt-get update
    #         # We need to force openjdk-8-jdk to install
    #         apt-get install openjdk-8-jdk
    #         # make sure that we still default to openjdk 7
    #         update-alternatives --set java /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
    #         update-alternatives --set javac /usr/lib/jvm/java-7-openjdk-amd64/bin/javac
    #     ;;
    #     16.04)
    #         apt-get install openjdk-8-jdk
    #     ;;
    #     *)
    #         echo "---> Unknown Ubuntu version $FACTER_OSVER"
    #         exit 1
    #     ;;
    # esac
    ########################

    echo "---> Configuring Corretto JDK Distribution"
    # instructions: https://docs.aws.amazon.com/corretto/latest/corretto-8-ug/generic-linux-install.html
    # install prereqs
    apt-get install java-common

    # install Java8
    CORRETTO_JAVA8_VERSION="8.222.10-1"
    CORRETTO_JAVA8_SHA256SUM="e5fd6c6f2d1a1fc5e6926f7a543e67ad0f0e0389ddc5d2deb5890bdeb21ea445"
    curl -L -o /tmp/corretto_java8.deb "https://d3pxv6yz143wms.cloudfront.net/$(echo $CORRETTO_JAVA8_VERSION | tr - .)/java-1.8.0-amazon-corretto-jdk_${CORRETTO_JAVA8_VERSION}_amd64.deb"
    echo "$CORRETTO_JAVA8_SHA256SUM  /tmp/corretto_java8.deb" | sha256sum -c -
    dpkg -i /tmp/corretto_java8.deb

    # install Java11
    CORRETTO_JAVA11_VERSION="11.0.4.11-1"
    CORRETTO_JAVA11_SHA256SUM="f47c77f8f9ee5a80804765236c11dc749d351d3b8f57186c6e6b58a6c4019d3e"
    curl -L -o /tmp/corretto_java11.deb "https://d3pxv6yz143wms.cloudfront.net/$(echo $CORRETTO_JAVA11_VERSION | tr - .)/java-11-amazon-corretto-jdk_${CORRETTO_JAVA11_VERSION}_amd64.deb"
    echo "$CORRETTO_JAVA11_SHA256SUM  /tmp/corretto_java11.deb" | sha256sum -c -
    dpkg -i /tmp/corretto_java11.deb

    # Fix corretto 11 lack of jinfo that prevents update-java-alternatives from working
    # Upstream fix not integrated yet: https://github.com/corretto/corretto-11/pull/27
    cat <<EOF >/usr/lib/jvm/.java-11-amazon-corretto.jinfo
name=java-11-amazon-corretto
alias=java-11-amazon-corretto
priority=11100002
section=main

jdk java /usr/lib/jvm/java-11-amazon-corretto/bin/java
jdk keytool /usr/lib/jvm/java-11-amazon-corretto/bin/keytool
jdk rmid /usr/lib/jvm/java-11-amazon-corretto/bin/rmid
jdk rmiregistry /usr/lib/jvm/java-11-amazon-corretto/bin/rmiregistry
jdk jjs /usr/lib/jvm/java-11-amazon-corretto/bin/jjs
jdk pack200 /usr/lib/jvm/java-11-amazon-corretto/bin/pack200
jdk unpack200 /usr/lib/jvm/java-11-amazon-corretto/bin/unpack200
jdk javac /usr/lib/jvm/java-11-amazon-corretto/bin/javac
jdk jaotc /usr/lib/jvm/java-11-amazon-corretto/bin/jaotc
jdk jlink /usr/lib/jvm/java-11-amazon-corretto/bin/jlink
jdk jmod /usr/lib/jvm/java-11-amazon-corretto/bin/jmod
jdk jhsdb /usr/lib/jvm/java-11-amazon-corretto/bin/jhsdb
jdk jar /usr/lib/jvm/java-11-amazon-corretto/bin/jar
jdk jarsigner /usr/lib/jvm/java-11-amazon-corretto/bin/jarsigner
jdk javadoc /usr/lib/jvm/java-11-amazon-corretto/bin/javadoc
jdk javap /usr/lib/jvm/java-11-amazon-corretto/bin/javap
jdk jcmd /usr/lib/jvm/java-11-amazon-corretto/bin/jcmd
jdk jconsole /usr/lib/jvm/java-11-amazon-corretto/bin/jconsole
jdk jdb /usr/lib/jvm/java-11-amazon-corretto/bin/jdb
jdk jdeps /usr/lib/jvm/java-11-amazon-corretto/bin/jdeps
jdk jdeprscan /usr/lib/jvm/java-11-amazon-corretto/bin/jdeprscan
jdk jimage /usr/lib/jvm/java-11-amazon-corretto/bin/jimage
jdk jinfo /usr/lib/jvm/java-11-amazon-corretto/bin/jinfo
jdk jmap /usr/lib/jvm/java-11-amazon-corretto/bin/jmap
jdk jps /usr/lib/jvm/java-11-amazon-corretto/bin/jps
jdk jrunscript /usr/lib/jvm/java-11-amazon-corretto/bin/jrunscript
jdk jshell /usr/lib/jvm/java-11-amazon-corretto/bin/jshell
jdk jstack /usr/lib/jvm/java-11-amazon-corretto/bin/jstack
jdk jstat /usr/lib/jvm/java-11-amazon-corretto/bin/jstat
jdk jstatd /usr/lib/jvm/java-11-amazon-corretto/bin/jstatd
jdk rmic /usr/lib/jvm/java-11-amazon-corretto/bin/rmic
jdk serialver /usr/lib/jvm/java-11-amazon-corretto/bin/serialver

EOF

    # Set default version to be Java8
    update-java-alternatives --set java-1.8.0-amazon-corretto

    # Set default version to be Java11
    # update-java-alternatives --set java-11-amazon-corretto

    ########################
    # --- START LFTOOLS DEPS

    # Used by various scripts to push patches to Gerrit
    # ensure_ubuntu_install git-review

    # Needed to parse OpenStack commands used by opendaylight-infra stack commands
    # to initialize Heat template based systems.
    ensure_ubuntu_install jq

    # Used by lftools scripts to parse XML
    ensure_ubuntu_install xmlstarlet

    # Change made by zdw on 2018-04-12
    # hackage.haskell.org was down, talked to zxiiro on #lf-releng and he recommended
    # pulling down the packages in a way similar to this ansible role, rather than using cabal:
    # https://github.com/lfit/ansible-roles-shellcheck-install/blob/master/tasks/main.yml

    SHELLCHECK_VERSION="v0.6.0"
    SHELLCHECK_SHA256SUM="95c7d6e8320d285a9f026b5241f48f1c02d225a1b08908660e8b84e58e9c7dce"
    curl -L -o /tmp/shellcheck.tar.xz https://storage.googleapis.com/shellcheck/shellcheck-${SHELLCHECK_VERSION}.linux.x86_64.tar.xz
    echo "$SHELLCHECK_SHA256SUM  /tmp/shellcheck.tar.xz" | sha256sum -c -
    pushd /tmp
    tar -xJvf shellcheck.tar.xz
    cp shellcheck-${SHELLCHECK_VERSION}/shellcheck /usr/local/bin/shellcheck
    chmod a+x /usr/local/bin/shellcheck
    popd

    # --- END LFTOOLS DEPS
    ######################

    # install haveged to avoid low entropy rejecting ssh connections
    apt-get install haveged
    update-rc.d haveged defaults

    # disable unattended upgrades & daily updates
    echo '---> Disabling automatic daily upgrades'
    sed -ine 's/"1"/"0"/g' /etc/apt/apt.conf.d/10periodic
    echo 'APT::Periodic::Unattended-Upgrade "0";' >> /etc/apt/apt.conf.d/10periodic
}

all_systems() {
    # Do any Distro specific installations here
    echo "Checking distribution"
    FACTER_OS=$(/usr/bin/facter operatingsystem)
    case "$FACTER_OS" in
        *)
            echo "---> $FACTER_OS found"
            echo "No extra steps for $FACTER_OS"
        ;;
    esac
}

echo "---> Attempting to detect OS"
# upstream cloud images use the distro name as the initial user
ORIGIN=$(if [ -e /etc/redhat-release ]
    then
        echo redhat
    else
        echo ubuntu
    fi)
#ORIGIN=$(logname)

case "${ORIGIN}" in
    fedora|centos|redhat)
        echo "---> RH type system detected"
        rh_systems
    ;;
    ubuntu)
        echo "---> Ubuntu system detected"
        ubuntu_systems
    ;;
    *)
        # Kill the build for unhandled distributions
        echo "---> Unknown operating system" 1>&2
        exit 1
    ;;
esac

# execute steps for all systems
all_systems
