#!/usr/bin/env bash
# ======================================================================
#
# DEPLOYMENT POC CLIENT
#
# ----------------------------------------------------------------------
# 2021-04-19  v0.1  <axel.hahn@iml.unibe.ch>  initial version
# ======================================================================


# ----------------------------------------------------------------------
# CONFIG
# ----------------------------------------------------------------------
cd $( dirname $0 )
selfdir=$( /bin/pwd )

tmpdir=/var/tmp/imldeployment_packages

wait=0
# wait=1


# ----------------------------------------------------------------------
# FUNCTIONS
# ----------------------------------------------------------------------


# get a list profiles by searching a config.sh
# no param
function getprofiles(){
    find ${selfdir}/profiles/ -name "config.sh" | rev | cut -f 2 -d "/" | rev
}

# set a profile, load it, verify required parameters
# param  string  name of a subdir in ./profiles/
function setprofile(){
    profile=$1

    # source config for software download - as default.
    . ${selfdir}/bin/getfile.sh.cfg 

    # my install dir
    installdir=

    # fileowner
    appowner=

    profiledir=${selfdir}/profiles/${profile}
    . ${profiledir}/config.sh || exit 11

    echo "[${profiledir}/config.sh] was loaded."
    if [ -z "$installdir" -o -z "${IMLCI_PHASE}" -o -z "${IMLCI_PROJECT}" ]; then
        echo "to be defined in ${profiledir}/config.sh:"
        echo "installdir    = $installdir"
        echo "These variables must be set in bin/getfile.sh.cfg or in [profile]/config.sh:"
        echo "IMLCI_PHASE   = $IMLCI_PHASE"
        echo "IMLCI_PROJECT = $IMLCI_PROJECT"
        exit 12
    fi 
    echo "OK, profile [${profile}] was set."

    downloadfile="${tmpdir}/${IMLCI_PROJECT}.tgz"
    downloadtmp="${tmpdir}/${IMLCI_PROJECT}.tgz.tmp"
}

# output a colored infoline with date and given message
# param  string  message text
function header(){
    local COLOR="\033[34m"
    local NO_COLOR="\033[0m"
    echo
    echo -en "${COLOR}"
    echo ______________________________________________________________________
    echo -n ">>>>>>>>>> $(date) "
    test ! -z "$profile" && echo -n "${profile} :: " 
    echo -n "$*"
    echo -en "${NO_COLOR}"
    if [ "$wait" = "1" ]; then
        echo -n " RETURN"; read dummy;
    fi 
    echo
}

# execute a task/ hook - if the given task script exists and has executable
# persmissions; if not it is not an error
# param  string  filename
function run_task(){
    local taskscript=$1
    if [ -x "${taskscript}" ]; then
        echo "INFO: starting script ${taskscript}..."
        . "${taskscript}" || exit 10
    else
        test -f "${taskscript}" && ( echo "SKIP: task script ${taskscript} is not executable." ; ls -l "${taskscript}")
        test -f "${taskscript}" || echo "SKIP: task script ${taskscript} does not exist."
    fi
}

# ----------------------------------------------------------------------
# MAIN
# ----------------------------------------------------------------------

cd $( dirname $0 )

if [ $# -eq 0 ]; then
    header "looping over all profiles"
    getprofiles
    echo
    for myprofile in $( getprofiles )
    do
        $0 $myprofile    
    done
    rc=$?
    profile=
    header "loop over projects is finished"
    echo exiting with statuscode $rc
    exit $rc
fi

echo
echo
echo "<<<<<<<<<<##########|  POC :: DEPLOYMENT SCRIPT  |##########>>>>>>>>>>"
echo


# ----------------------------------------------------------------------
header "Set profile [$1]"
setprofile $1


# ----------------------------------------------------------------------
header "Download ${IMLCI_PROJECT}.tgz"
isupdate=0
${selfdir}/bin/getfile.sh -f ${IMLCI_PROJECT}.tgz -o ${downloadtmp} || exit 1


# ----------------------------------------------------------------------
header "Detect if download is newer than last download."
if [ -f ${downloadfile} ]; then
    # ls -l "${downloadfile}" "${downloadtmp}" 
    diff "${downloadfile}" "${downloadtmp}"
    if [ $? -eq 0 ]; then
        echo "INFO: the downloaded file is the same like last download."
        rm -f "${downloadtmp}"
    else
        echo "OK: donwload contains an update."
        isupdate=1
        mv "${downloadtmp}" "${downloadfile}"
    fi
else
    echo "INFO: last download not available - first install or a forced update."
    isupdate=1
    mv "${downloadtmp}" "${downloadfile}"
fi
ls -l "${downloadfile}"


# ----------------------------------------------------------------------
header "Switch into install dir ${installdir} ..."
test -d "${installdir}" || mkdir -p "${installdir}"
cd ${installdir} || exit 2


# ----------------------------------------------------------------------
header "PRE tasks"
# what you could do here:
# - enable maintenance flag
# - stop service
# - clenaup directory ... up to remove all current files
run_task "${profiledir}/tasks_preinstall.sh"


# ----------------------------------------------------------------------
header "PRE tasks II - cleanup"
test "$cleanup_preview" -eq "1" || echo "SKIP: preview of cleanup is disabled."
test "$cleanup_preview" -eq "1" && "${selfdir}/bin/preinstall_cleanup.sh" "${installdir}" "${downloadfile}"

test "$cleanup_force" -eq "1"   || echo "SKIP: cleanup files is disabled."
test "$cleanup_force" -eq "1"   && "${selfdir}/bin/preinstall_cleanup.sh" "${installdir}" "${downloadfile}" "force"


# ----------------------------------------------------------------------
header "Extract ${downloadfile} $( pwd )"
tar -xzf "${downloadfile}" . || exit 3
ls -l


# ----------------------------------------------------------------------
# header "Remove download archive ${IMLCI_PROJECT}.tgz"
# echo rm -f  ${IMLCI_PROJECT}.tgz


# ----------------------------------------------------------------------
header "Update config files"
echo "Showing replacements:" ; grep '@replace\[' hooks/templates/*
run_task "${profiledir}/tasks_config.sh"


# ----------------------------------------------------------------------
header "Set file owner [${appowner}]"
if [ ! -z "${appowner}" ]; then
    sudo chown -R $appowner * || exit 5
    ls -l
else
    echo "SKIP: variable appowner was not set"
fi


# ----------------------------------------------------------------------
header "POST tasks"
# what you could do here:
# - start current deploy scripts
# - apply database updates
# - set permissions
# - start service
# - remove maintenance flag
# - send success message as email/ slack/ [another fancy tool]
run_task "${profiledir}/tasks_postinstall.sh"


# ----------------------------------------------------------------------
header "DONE :-)"


# ----------------------------------------------------------------------