#!/bin/bash
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.
#
#
# Quick Build/Test for TrafficServer
# Tested on Ubuntu Karmic 9.10, EC2 Friendly with official Canonical AMIs
# Author: Jason Giedymin
# Desc: The intent with this script is to unify a single build script with
#       standard options for testing.
#
# Version Information:
#    v0.1.1a - Added Debug
#    v1.0.0  - Stable Release
#    v1.0.1  - Added sqlite dev lib.
#    v1.0.2  - EC2 Note about ephemeral storage
#            - Create ephemeral storage by mimicking on non EC2 systems.
#    v1.0.3  - Added fedora to list of supported distros
#    v1.0.4  - Added fedora EC2 compatibility
#            - Added EC2 detection, option

# It's safe to use this in a non-ec2 environment. This directory will be
# created if it doesn't exist. If your running this on EC2, it's best not
# to change this location as this is the ephemeral drive setup by Amazon.
# For non-ec2 environments, you may change this to any location you
# desire.
EC2_EPHEMERAL=/mnt
PROJECT=trafficserver

BRANCH=traffic/trunk
SVN_LOC=traffic-trunk.svn
SVN_HOME=http://svn.apache.org/repos/asf/incubator

FALSE=0
TRUE=1
DEBUG=$FALSE
USING_EC2=$FALSE
BUILD_HOME=/usr/local
PREFIX=--prefix=$BUILD_HOME
BUILD_OPTIONS="$PREFIX"
BUILD_OPTIONS_DEBUG="--with-user=root --with-group=root --enable-debug"
BUILD_OPTIONS_FC8_EC2="--disable-eventfd"
CONFIGURE_OPTIONS=""
FULL_BUILD_PATH=$EC2_EPHEMERAL/$PROJECT/$SVN_LOC

SUSE="suse"
FEDORA="fedora"
REDHAT="redhat" # also exists on Fedora
UBUNTU="ubuntu"
DEBIAN="debian" # also exists on Ubuntu
SLACKWARE="slackware"


function killAll() {
    killall traffic_cop
    killall traffic_manager
    killall traffic_server
}

function updateInstall() {
    if [ "$DISTRIB_ID" = "$UBUNTU" ]; then
        apt-get update
        apt-get install -y g++ autoconf \
        make \
        libtool \
        libssl-dev \
        libpcre3-dev \
        curl
        apt-get install -y subversion git git-svn
    elif [ "$DISTRIB_ID" = "$FEDORA" ]; then
        yum update
        yum upgrade

        # Chose not to use kernel version here as FC8 xen needs more than just eventfd work
        if [ $USING_EC2 = $TRUE ]; then
            yum -y install subversion \
                git \
                autoconf \
                automake \
                libtool \
                gcc-c++ \
                glibc-devel \
                openssl-devel \
                db4-devel \
                pcre \
                pcre-devel
        elif [ $USING_EC2 = $FALSE ]; then
            yum -y install subversion \
                git \
                autoconf \
                automake \
                libtool \
                gcc-c++ \
                glibc-devel \
                openssl-devel \
                pcre \
                pcre-devel
        fi
    fi
}

function cleanUp() {
    if [ -e $EC2_EPHEMERAL/$PROJECT ]; then
            rm -R $EC2_EPHEMERAL/$PROJECT
    fi

    if [ ! -d $EC2_EPHEMERAL ]; then
        mkdir -p $EC2_EPHEMERAL
        cd $EC2_EPHEMERAL
    fi
}

function svnCheckout() {
    #----------------SVN Only------------------------------
    svn checkout   $SVN_HOME/$PROJECT/$BRANCH   $FULL_BUILD_PATH
    cd $FULL_BUILD_PATH
    #------------------------------------------------------
}

#This is just for some dev/testing, and still in the 'works'
function dev() {
    #----------------Git Only------------------------------
    git clone git://git.apache.org/trafficserver.git
    cd $EC2_EPHEMERAL/$trafficserver

    #switch to dev build
    git checkout -b remotes/origin/dev
    #------------------------------------------------------
}

function handleGroups() {

    # maybe someday some extra security can be put in around here
    # and yeah, force add the group
    if [ "$DISTRIB_ID" = "$UBUNTU" ]; then
        addgroup nobody
    elif [ "$DISTRIB_ID" = "$FEDORA" ]; then
        groupadd nobody
    fi
}

function getConfigureOptions() {
    configureOptions="$BUILD_OPTIONS"

    if [ $DEBUG = $TRUE ]; then
        configureOptions="$configureOptions $BUILD_OPTIONS_DEBUG"
    fi

    if [ $USING_EC2 = $TRUE ]; then
        if [ "$DISTRIB_ID" = "$FEDORA" ]; then
            configureOptions="$configureOptions $BUILD_OPTIONS_FC8_EC2"
        fi
    fi

    CONFIGURE_OPTIONS=$configureOptions
}

function rebuild() {
    # remake, clean, uninstall first

    if [ ! -d $FULL_BUILD_PATH ]; then
        echo "Can't find $FULL_BUILD_PATH, cannot continue!";
        exit 1;
    fi

    handleGroups

    cd $FULL_BUILD_PATH
    autoreconf -i --force
    ./configure $CONFIGURE_OPTIONS

    make clean

    # Here is where things are dumb.  We don't check for
    # successful builds yet.  Thats in the next release.
    # This is why I call it dumb.
    make
    make uninstall
    make install
}

function postMods() {
    # Flag verbose on, we like verbose
    if [ -e /etc/default/rcS ]; then
        sed -i 's/VERBOSE=no/VERBOSE=yes/g' /etc/default/rcS
    fi

    # Link the script for init purposes, makes things nice
    if [ -e $BUILD_HOME/bin/trafficserver ]; then
        ln -s -f $BUILD_HOME/bin/trafficserver /etc/init.d/trafficserver
    fi
}

function freshBuild() {
    clear
    echo "Starting TrafficServer Install (dumb) process..."

    killAll
    updateInstall
    cleanUp
    svnCheckout
    rebuild
    postMods

    echo;
    echo "TrafficServer Install (dumb) process complete."
}

function forceBuild() {
    clear
    echo "Starting Build Only..."

    killAll
    updateInstall
    rebuild
    postMods

    echo "Build complete."
}

function flipDebug() {
    if [ $DEBUG = $TRUE ]; then
        DEBUG=$FALSE
    elif [ $DEBUG = $FALSE ]; then
        DEBUG=$TRUE
    fi

    getConfigureOptions;
}

function flipEC2() {
    if [ $USING_EC2 = $TRUE ]; then
        USING_EC2=$FALSE
    elif [ $USING_EC2 = $FALSE ]; then
        USING_EC2=$TRUE
    fi

    getConfigureOptions;
}

# Crude but it works without complex regex, and some people remove ec2/ami tools for security...
function detectEC2() {
    if [ -e /etc/ec2_version ]; then #UBUNTU
        USING_EC2=$TRUE
    elif [ -e /etc/ec2/release-notes ]; then #FEDORA
        USING_EC2=$TRUE
    fi
}

function askUser() {
usage;
echo;

usageLine;

read -p "" RESPONSE

if [ "$RESPONSE" = "freshBuild" ]; then
    $RESPONSE;
    exit 0;
elif [ "$RESPONSE" = "forceBuild" ]; then
    $RESPONSE;
    exit 0;
elif [ "$RESPONSE" = "flipDebug" ]; then
    $RESPONSE;
    askUser;
elif [ "$RESPONSE" = "flipEC2" ]; then
    $RESPONSE;
    askUser;
elif [ "$RESPONSE" = "EXIT" ]; then
    echo "Exiting NOW!"
    exit 0;
else
    #usageLine;
    askUser;
    return 1;
fi

}

function usage() {
    clear
    echo;
    echo 'This script is used for doing quick builds & Tests for TrafficServer.';
    echo;
    displayInfo;
    echo;
    echo "Commands:";
    echo 'freshBuild: Checkout from svn, build and install.';
    echo 'forceBuild: Do a build from previous checked out source.';
    echo 'flipDebug: Flip the current debug mode.';
    echo 'flipEC2: Flip the current EC2 mode.';
    echo 'EXIT: Exit now!';
    echo;
}

function displayInfo() {
    #Would like to make these editable in the next release.

    echo "-----------------------------------------------------------------------"
    echo "                         Current Options                               "
    echo "-----------------------------------------------------------------------"
    echo "                 OS: $DISTRIB_ID"

    if [ $DEBUG = $TRUE ]; then
        echo "         Debug Mode: ON"
        else
        echo "         Debug Mode: OFF"
    fi

    if [ $USING_EC2 = $TRUE ]; then
        echo "           EC2 Mode: ON"
        else
        echo "           EC2 Mode: OFF"
    fi

    echo "    Source checkout: $EC2_EPHEMERAL/$PROJECT"
    echo "             Branch: $BRANCH"
    echo "         SVN Server: $SVN_HOME"
    echo "  Configure Options: $CONFIGURE_OPTIONS"
    echo "    Full Build Path: $FULL_BUILD_PATH"
    echo "-----------------------------------------------------------------------"
}

function usageLine() {
    echo;
    echo "You can  access the menu by calling this script or by command line."
    echo "Menu usage and choices are: {freshBuild|forceBuild|flipDebug|flipEC2|EXIT}."
    echo "Command line usage choices are: {freshBuild|forceBuild|freshDebugBuild|EXIT}."
    echo;
    echo "Notes:"
    echo " - the command line has a strict debug build option."
    echo " - when using the command line build, EC2 detection is automatic."
    echo;
}

#------------Main------------

if [ $UID != 0 ] ; then
    echo "Must have root permissions to execute."
    exit 1
fi

if [ -e /etc/SuSE-release ]; then
    DISTRIB_ID=$SUSE
elif [ -e /etc/fedora-release ]; then
    DISTRIB_ID=$FEDORA
elif [ -e /etc/redhat-release ]; then
    DISTRIB_ID=$REDHAT # also exists on Fedora
elif [ -e /etc/lsb-release ]; then
    DISTRIB_ID=$UBUNTU
elif [ -e /etc/debian-version ]; then
    DISTRIB_ID=$DEBIAN # also exists on Ubuntu
elif [ -e /etc/slackware-version ]; then
    DISTRIB_ID=$SLACKWARE
fi

detectEC2;
getConfigureOptions;
displayInfo;

case "$1" in
  freshBuild)
    $1;
    ;;
  forceBuild)
    $1;
    ;;
  freshDebugBuild)
    $DEBUG=$TRUE
    freshBuild;
    ;;
  EXIT)
    echo 'Exiting...';
    exit 0;
    ;;
  *)
    askUser;
    ;;
esac

exit 0;
