#!/bin/bash

# XXX: This is in post-install.d, instead of install.d, because the
# hadoop RPM claims ownership of files owned by the filesystem RPM,
# such as /usr and /bin, and installing hadoop then updating
# filesystem results in a failure. This can be moved to install.d when
# HADOOP-9777 is resolved.
#   https://issues.apache.org/jira/browse/HADOOP-9777

if [ "${DIB_DEBUG_TRACE:-0}" -gt 0 ]; then
    set -x
fi
set -eu
set -o pipefail

install-packages wget tar

function install_hadoop_v1 {
    case "$DISTRO_NAME" in
        ubuntu )
            package="hadoop_$DIB_HADOOP_VERSION-1_x86_64.deb"
        ;;
        fedora | rhel | centos )
            package="hadoop-$DIB_HADOOP_VERSION-1.x86_64.rpm"
        ;;
    esac

    case "$DISTRO_NAME" in
        ubuntu )
            dpkg -i $tmp_dir/$package
        ;;
        fedora | rhel | centos )
            if [ "$DISTRO_NAME" = "fedora" ] && [ $(lsb_release -rs) -ge '19' ]; then
                rpm -i $tmp_dir/$package --relocate /usr=/usr --replacefiles
            else
                rpm -ivh --replacefiles $tmp_dir/$package
            fi
            chmod 755 /usr/sbin/start-*
            chmod 755 /usr/sbin/stop-*
            chmod 755 /usr/sbin/slaves.sh
            chmod 755 /usr/sbin/update-hadoop-env.sh
        ;;
    esac
    rm -r $tmp_dir

    echo "Pre-configuring Hadoop"

    cat >> /home/hadoop/.bashrc <<EOF
PATH=\$PATH:/usr/sbin
HADOOP_HOME=/usr/share/hadoop/
EOF

    sed -i -e "s,export HADOOP_LOG_DIR=.*,export HADOOP_LOG_DIR=/mnt/log/hadoop/\$USER," \
        -e "s,export HADOOP_SECURE_DN_LOG_DIR=.*,export HADOOP_SECURE_DN_LOG_DIR=/mnt/log/hadoop/hdfs," \
        -e "s,HADOOP_DATANODE_OPTS=\"-Dhadoop.security.logger=ERROR\,DRFAS \$HADOOP_DATANODE_OPTS\",HADOOP_DATANODE_OPTS=\"-Djava.security.egd=file:/dev/./urandom -Dhadoop.security.logger=ERROR\,DRFAS \$HADOOP_DATANODE_OPTS\"," \
        /etc/hadoop/hadoop-env.sh

    echo "source $JAVA_RC" >> /etc/hadoop/hadoop-env.sh
}


function install_hadoop_v2 {
    case "$DIB_HADOOP_VERSION" in
        "2.6.0")
            hadoop_native_libs_url="${HADOOP_V2_6_NATIVE_LIBS_DOWNLOAD_URL}"
        ;;
        *)
            echo "Invalid DIB_HADOOP_VERSION: $DIB_HADOOP_VERSION"
            exit 1
        ;;
    esac

    package="hadoop-$DIB_HADOOP_VERSION.tar.gz"

    echo "Installing hadoop"

    INSTALL_DIR="/opt"
    HADOOP_HOME="/opt/hadoop"
    mkdir -p "$INSTALL_DIR"
    tar xvf "$tmp_dir/$package" -C "$INSTALL_DIR"
    ln -s "$INSTALL_DIR/hadoop-$DIB_HADOOP_VERSION" "$HADOOP_HOME"
    chown -R hadoop:hadoop "$INSTALL_DIR/hadoop-$DIB_HADOOP_VERSION"
    chown -R hadoop:hadoop "$HADOOP_HOME"
    rm -r $tmp_dir

    echo "Inject Hadoop native libs"
    rm -r "$HADOOP_HOME/lib/native"
    wget "$hadoop_native_libs_url"
    native_libs_filename=$(basename "$hadoop_native_libs_url")
    tar xvf "$native_libs_filename" -C "$HADOOP_HOME/lib"
    rm "$native_libs_filename"

    echo "Pre-configuring Hadoop"

    HADOOP_PID_DIR="/var/run/hadoop"
    mkdir $HADOOP_PID_DIR
    chown hadoop:hadoop $HADOOP_PID_DIR

    cat >> /etc/profile.d/hadoop.sh <<EOF
export HADOOP_COMMON_HOME=$HADOOP_HOME
export PATH=\$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_HDFS_HOME=\$HADOOP_COMMON_HOME
export HADOOP_YARN_HOME=\$HADOOP_COMMON_HOME
export HADOOP_MAPRED_HOME=\$HADOOP_COMMON_HOME
export HADOOP_PID_DIR=$HADOOP_PID_DIR
export YARN_PID_DIR=$HADOOP_PID_DIR
export HADOOP_MAPRED_PID_DIR=$HADOOP_PID_DIR
EOF

    sed -i -e "s,\#export HADOOP_LOG_DIR=.*,export HADOOP_LOG_DIR=/mnt/log/hadoop/\$USER," \
        -e "s,export HADOOP_SECURE_DN_LOG_DIR=.*,export HADOOP_SECURE_DN_LOG_DIR=/mnt/log/hadoop/hdfs," \
        $HADOOP_HOME/etc/hadoop/hadoop-env.sh
    echo "source $JAVA_RC" >> $HADOOP_HOME/etc/hadoop/hadoop-env.sh

    sed -i -e "s,YARN_LOG_DIR=.*,YARN_LOG_DIR=/mnt/log/hadoop/yarn," \
        $HADOOP_HOME/etc/hadoop/yarn-env.sh
    echo "source $JAVA_RC" >> $HADOOP_HOME/etc/hadoop/yarn-env.sh

    # enable swiftfs
    ln -s ${HADOOP_HOME}/share/hadoop/tools/lib/hadoop-openstack-${DIB_HADOOP_VERSION}.jar ${HADOOP_HOME}/share/hadoop/common/lib/
}

if [ ! "$DISTRO_NAME" == "fedora" -a ! "$DISTRO_NAME" == "ubuntu" -a ! "$DISTRO_NAME" == "rhel" -a ! "$DISTRO_NAME" == "centos" ]; then
    echo "Unknown distro: $DISTRO_NAME. Exiting."
    exit 1
fi

echo "Hadoop setup begins for $DISTRO_NAME"
tmp_dir=/tmp/hadoop

echo "Creating hadoop user & group"
case "$DISTRO_NAME" in
    ubuntu )
        addgroup hadoop
        adduser --ingroup hadoop --disabled-password --gecos GECOS hadoop
        adduser hadoop sudo
    ;;
    fedora | rhel | centos )
        adduser -G adm,wheel hadoop
    ;;
esac

if [[ "$DIB_HADOOP_VERSION" < "2.0.0" ]]; then
    install_hadoop_v1
else
    install_hadoop_v2
fi

echo "Applying firstboot script"

RC_SCRIPT_DIR=""
if [ "$DISTRO_NAME" == "ubuntu" ]; then
    # File '/etc/rc.local' may not exist
    if [ -f "/etc/rc.local" ]; then
        mv /etc/rc.local /etc/rc.local.old
    fi
    RC_SCRIPT_DIR="/etc"
else
    # File '/etc/rc.d/rc.local' may not exist
    if [ -f "/etc/rc.d/rc.local" ]; then
        mv /etc/rc.d/rc.local /etc/rc.d/rc.local.old
    fi
    RC_SCRIPT_DIR="/etc/rc.d"
fi

install -D -g root -o root -m 0755 $(dirname $0)/firstboot $RC_SCRIPT_DIR/rc.local
