#!/bin/bash

# Copyright: 2023 Virtuozzo International GmbH

# 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.

[ -n "${CARTRIDGECOMMONLIB_VERSION:-}" ] && return 0;
CARTRIDGECOMMONLIB_VERSION="0.1";

 JENVIRONMENT="/etc/jelastic/environment";

 CONTROL_APP="$CARTRIDGE_HOME/bin/control";
 MANIFEST="$CARTRIDGE_HOME/metadata/manifest.yml"
 MANIFEST_EXPORTED="$CARTRIDGE_HOME/metadata/manifest.sh"


$PROGRAM 'git';
$PROGRAM 'curl';
$PROGRAM 'zip';
$PROGRAM 'unzip';
$PROGRAM 'tar';
$PROGRAM 'ifconfig';
$PROGRAM 'uuidgen';
$PROGRAM 'erb';
$PROGRAM 'groupadd';
$PROGRAM 'adduser';
$PROGRAM 'grep';
$PROGRAM 'sed';
$PROGRAM 'awk';
$PROGRAM 'ip'


###### SERVICE STUFF #######

    function parseManifest(){
        $SED -e 's/:[^:\/\/]/="/g;s/$/"/g;s/ *=/=/g' $MANIFEST | $GREP -E "[a-zA-Z0-9]" | $GREP -i "name\|private\|version=" | $SED  's/^-//g' | $SED 's/-/_/g' | $SED 's/ _//g' | $SED  's/ //g'  | $SED "s/\"'/\"/g"  | $SED "s/\"'/\"/g" | $SED "s/'\"/\"/g" | $SED 's/.x_/.x-/g' > $MANIFEST_EXPORTED;
        echo action_reset_password_hook=$($GREP -A 100 "Subscribes" "$MANIFEST" | $GREP -B1 ":reset-password" | head -n1 | $SED 's/://g' | $SED 's/ //g') >> $MANIFEST_EXPORTED;
        [ -f $MANIFEST_EXPORTED ] && source $MANIFEST_EXPORTED;
        [ "xGlassFish" == "x$Name" ] &&  Name=${Name,,};
        [ -f ${CARTRIDGE_HOME}/jelastic/jelastic.conf ] && source ${CARTRIDGE_HOME}/jelastic/jelastic.conf;
    }

   function parseEndPoints(){
        for value in $(cat $MANIFEST_EXPORTED)
        do
	   echo $value | $GREP -q "Private_IP_Name=\|Private_Port_Name=\|Private_Port=" && eval "export $value";
           [ ! -z $Private_IP_Name ] && [ ! -z $Private_Port_Name ] && [ ! -z $Private_Port ] && {
		eval "export J_OPENSHIFT_${Cartridge_Short_Name}_${Private_IP_Name}=\"$($IP a | $GREP -A1 venet0 | $GREP inet | $AWK '{print $2}'| $SED 's/\/[0-9]*//g' | tail -n 1)\"";
                eval "export OPENSHIFT_${Cartridge_Short_Name}_${Private_IP_Name}=0.0.0.0"; 
                eval "export OPENSHIFT_${Cartridge_Short_Name}_${Private_Port_Name}=\"${Private_Port}\"";
                unset Private_IP_Name;
                unset Private_Port_Name;
                unset Private_Port;
           }
        done
}

    function saveEnvironmentVariables(){
        local manualy_exported=$(mktemp);
        proceedStaticENV;
        declare -p | $SED 's/declare //g' | $SED 's/^-x\|^-r\|^--\|^-ir\|^-i\|^-a\|^-ir\|^-ar\|-A\|^r \|\|^"//g' | $SED 's/^ *//' |  $SED '/^BASH\|^SHELLUID=\|^EUID=\|^UID\|^OLDPWD=\|^PPID=\|^SHELLOPTS\|^IFS=\|^LS_COLORS\|^HOME/d' | $SED '/^__/d' | $SED 's/^ *//' |  $GREP  "=" > $JENVIRONMENT;
        $SED -i '/OPENSHIFT\|LOGIN\|PASS\|^PATH\|CARTRIDGE\|RUNAS\|DATA_OWNER\|HOME\|Name\|version\|Version\|Node_Mission\|Engine_Type\|_User\|Smart_Redirect\|Node_Type\|Firewall_Enabled\|Webroot_Path\|Context_Regex/!d' $JENVIRONMENT;
        cat  $JENVIRONMENT | $SED 's/^OPENSHIFT/export OPENSHIFT/g' | $SED 's/^env_/export /g'  > $manualy_exported;
        [ -f "$manualy_exported" ] && cat $manualy_exported > $JENVIRONMENT && rm $manualy_exported;
        [ -f $JENVIRONMENT ] && cat $JENVIRONMENT > ${CARTRIDGE_HOME}/.profile;
    }

    function restoreEnvironmentVariables(){
        [ -f $JENVIRONMENT ] && source $JENVIRONMENT > /dev/null 2>&1;
        return 0;   
    }

    function proceedStaticENV(){
        local envdir=${CARTRIDGE_HOME}/env;
     
        [ -d $envdir ] && {
        for envnode in $(ls -1 ${envdir} 2>/dev/null | $GREP -v "erb$"  )
        do
                export "$(basename $envnode)"="$(cat ${envdir}/${envnode})"; # for current configure session
                export "env_$(basename $envnode)"="$(cat ${envdir}/${envnode})"; # for exports
        done;
        }
    }

    function proceedDynamicENV(){

        [ -f "${J_OPENSHIFT_METADATA_DIR}/managed_files.yml" ] && {

        local erbfilelist=$(mktemp);
        local varlist=$(mktemp);
        cat "${J_OPENSHIFT_METADATA_DIR}/managed_files.yml" | $GREP ".erb" | $SED "s/'//g" | $SED "s@^- @/${CARTRIDGE_HOME}/@g" > $erbfilelist;

        [ ! -s $erbfilelist  ] && return 0;

        for erbfile in $(ls -1 $(cat ${erbfilelist}) 2>/dev/null)
        do
            [ -f "$erbfile" ] && cat "$erbfile" | $SED '/ENV\[/!d;s//&\n/;s/.*\n//;:a;/\]/bb;$!{n;ba};:b;s//\n&/;P;D' | $SED "s/'//g"  > $varlist;
            exportvar=$(basename  $erbfile | $SED 's/.erb//g');
            cp "$erbfile"   "/tmp/${exportvar}";
            for envvar in $(cat ${varlist})
            do
                value=$(eval echo "\$$envvar")
                [ ! -z "$value" ] && $SED -i "s@<%= ENV\['$envvar'\] %>@$value@g"  "/tmp/${exportvar}";
            done

            export "${exportvar}"="$(cat "/tmp/${exportvar}")" > /dev/null 2>&1;
            [ -f "/tmp/${exportvar}"  ] && rm "/tmp/${exportvar}";
            [ -f "$erbfilelist" ] && rm "$erbfilelist";
            [ -f "$varlist" ] && rm $varlist;

        done

        [ -f "$erbfilelist" ] && rm $erbfilelist;

        }
    }

   function proceedMountPoints(){
            local resource_config="${CARTRIDGE_HOME}/jelastic/file_manager.conf";
            [ ! -f $resource_config ] && return 0;
            local sections=$($SED -ne '/\[.*\]/p' $resource_config | $SED 's/\[\|\]//g');
            local fstabfile="/etc/fstab";
            [ ! -d $CARTRIDGE_APP_SHARED ] && mkdir -p $CARTRIDGE_APP_SHARED;

            echo "/var/spool/cron $J_OPENSHIFT_CRON_DIR none  bind 0 0" > $fstabfile;

            for section in $sections
            do
                [ ! -d "${CARTRIDGE_APP_SHARED}/${section}" ] && mkdir -p "${CARTRIDGE_APP_SHARED}/${section}"
                resourcelist=$($SED -n "/$section\]/,/\[/p" $resource_config | $GREP -v "\[\|\]");
                    for resource in ${resourcelist}
                    do
                        srcdir="${CARTRIDGE_HOME}/${resource}";
                        
                        if [ ${#resourcelist[@]} -eq 1 -a "${section}" == "$(basename $resource)"  ]
                        then
                           dstdir="${CARTRIDGE_APP_SHARED}/${section}";
                        else
                           dstdir="${CARTRIDGE_APP_SHARED}/${section}/$(basename $resource)";
                        fi

                        [ ! -d $dstdir ] && mkdir -p $dstdir;
                        if ! $GREP -qP "${srcdir}\s+${dstdir}\s+none\s+bind\s+0\s+0" ${fstabfile}
                        then
                             echo "${srcdir}  ${dstdir} none  bind 0 0" >> $fstabfile ;
                        fi
                    done
            done
	    chkconfig network on;
            mount -a;
    }

    function fixOwnership(){
        chown -Rf  $DATA_OWNER $CARTRIDGE_HOME 2>>"$JEM_CALLS_LOG";
        chown -Rf  $DATA_OWNER $CARTRIDGE_APP_HOME 2>>"$JEM_CALLS_LOG";
        chown -Rf  $DATA_OWNER $CARTRIDGE_APP_SHARED 2>>"$JEM_CALLS_LOG";
        chown -Rf  $DATA_OWNER $J_OPENSHIFT_KEYS_DIR 2>>"$JEM_CALLS_LOG";
        chown -Rf  $DATA_OWNER $J_OPENSHIFT_APPLICATION_PID_DIR 2>>"$JEM_CALLS_LOG";
	chmod -Rf  555 $CARTRIDGE_HOME/env 2>>"$JEM_CALLS_LOG";
        return 0;
    }

    function proceedDynamicDATA(){
        local erbfilelist=$(mktemp)
        local varlist=$(mktemp)

        find "$CARTRIDGE_HOME" -maxdepth 3 -path $CARTRIDGE_HOME/ROOT -prune -type f -name *.erb  > $erbfilelist;

        [ ! -s $erbfilelist  ] && return 0;

        for erbfile in $(ls -1 $(cat ${erbfilelist}) 2>/dev/null)
        do
            [ -f "$erbfile" ] && cat "$erbfile" | $SED '/ENV\[/!d;s//&\n/;s/.*\n//;:a;/\]/bb;$!{n;ba};:b;s//\n&/;P;D' | $SED "s/'//g"  > $varlist;
            staticfile=$(echo $erbfile | $SED 's/.erb//g');
            $ERB $erbfile > $staticfile;
            [ -f "$varlist" ] && rm $varlist;
        done

        [ -f "$erbfilelist" ] && rm $erbfilelist;
    }

    function generateCartDATA(){
        local openshift_vars=$(mktemp);

        typeset | $GREP "^OPENSHIFT\|^CART_PROP_" | $SED 's/CART_PROP_//g' > $openshift_vars;
        local key;
        local value;
        while read envvar 
        do
            key=$($AWK -F "=" '{print $1}' <<< $envvar);
            #value=$($AWK -F "=" '{for(i=1;i<2;i++) $i="";print}' <<< $envvar);
            value=$(eval echo "\$$key");
            result=${result}$(echo {\"Key\":\""$key"\", \"Value\":\""$value"\"});
        done < ${openshift_vars}
        cartdata=$($SED 's/}{/},{/g' <<< "[$result]")
        [ -f "$openshift_vars" ] && rm "$openshift_vars";
    }

    function addNativeOpenshiftUser(){
        [ -z $OPENSHIFT_GEAR_UUID ] && return 0;
        APPSERVER_USER_UID=`$GREP "^jelastic" /etc/passwd | $AWK -F ":" '{print $3}'`
        APPSERVER_GROUP_UID=`$GREP "^jelastic" /etc/group | $AWK -F ":" '{print $3}'`
        [ -n $APPSERVER_USER_ID  ] && APPSERVER_USER_ID="700";
        [ -n $APPSERVER_GROUP_ID  ] && APPSERVER_GROUP_ID="700";

        $GREP -q "$OPENSHIFT_GEAR_UUID"  /etc/passwd || $ADDUSER  -o --uid $APPSERVER_USER_UID --gid $APPSERVER_GROUP_UID --home-dir $CARTRIDGE_HOME --shell /bin/bash $OPENSHIFT_GEAR_UUID > /dev/null 2>&1;
        $GREP -q "$OPENSHIFT_GEAR_UUID" /etc/group || $GROUPADD  -o $OPENSHIFT_GEAR_UUID --gid $APPSERVER_GROUP_UID > /dev/null 2>&1;
        return 0;
    }

    function configureEnvironment(){
        restoreEnvironmentVariables;
        parseManifest;
        getInfraAddresses infraAddr;
        local passwdfile="/etc/passwd";
        [ ! -d "${CARTRIDGE_HOME}/.openshift/action_hooks"  ]  && mkdir -p "${CARTRIDGE_HOME}/.openshift/action_hooks";

    ############  INIT BASIC VARS #############

        #export "OPENSHIFT_${Cartridge_Short_Name}_DIR"=$(eval echo "\$OPENSHIFT_${Cartridge_Short_Name}_DIR")
        #export "OPENSHIFT_${Cartridge_Short_Name}_DIR"="$CARTRIDGE_HOME/versions/${VERSION}/${Name}-${VERSION}";
        export "OPENSHIFT_${Cartridge_Short_Name}_DIR"="$CARTRIDGE_HOME/";
        export "OPENSHIFT_REPO_DIR"="$CARTRIDGE_HOME/";
        export "OPENSHIFT_${Cartridge_Short_Name}_IP"=$($IP a show venet0 | $GREP venet0 | $AWK '{print $2}' | $SED 's/\/[0-9]*//g' | tail -n1);
        export "OPENSHIFT_${Cartridge_Short_Name}_PID_DIR"="/var/run/cartridges";
        export "OPENSHIFT_APP_NAME"="${Name}";   
        export "OPENSHIFT_APP_DNS"="${FQDN}";
        export "OPENSHIFT_GEAR_DNS"="${FQDN}";
        export "OPENSHIFT_CLOUD_DOMAIN"="${FQDN}";
        export "OPENSHIFT_DATA_DIR"="/opt/${Name}/data";
        export "OPENSHIFT_TMP_DIR"="/opt/${Name}/tmp";
        [ -z $OPENSHIFT_APP_UUID ] && export "OPENSHIFT_APP_UUID"=$($UUIDGEN | $SED 's/-//g');
        [ -z $OPENSHIFT_GEAR_UUID ] && export "OPENSHIFT_GEAR_UUID"=$($UUIDGEN | $SED 's/-//g');
        export "OPENSHIFT_GEAR_MEMORY_MB"="$(free -m | $GREP Mem | $AWK '{print $2}')";      

        #Iinitializing endpoints


        export "J_OPENSHIFT_${Cartridge_Short_Name}_IP"=$($IP a show venet0 | $GREP venet0 | $AWK '{print $2}' | $SED 's/\/[0-9]*//g' | tail -n 1);
        export "J_OPENSHIFT_${Cartridge_Short_Name}_${Private_IP_Name}"=$($IP a show venet0 | $GREP venet0 | $AWK '{print $2}' | $SED 's/\/[0-9]*//g' | tail -n 1);
        export "OPENSHIFT_${Cartridge_Short_Name}_IP"="0.0.0.0";
        export "OPENSHIFT_${Cartridge_Short_Name}_${Private_IP_Name}"="0.0.0.0";
        export "OPENSHIFT_${Cartridge_Short_Name}_${Private_Port_Name}"="${Private_Port}";
        export "OPENSHIFT_${Cartridge_Short_Name}_LOG_DIR"="${CARTRIDGE_HOME}/logs";
        export "DEFAULT_JELASTIC_KEY_PATH"="/var/lib/jelastic/keys";
        export "J_OPENSHIFT_KEYS_DIR"="${CARTRIDGE_HOME}/keys";
        export "J_OPENSHIFT_CRON_DIR"="${CARTRIDGE_HOME}/cron";


        # own environment variables

        export OPENSHIFT_CARTRIDGE_SDK_BASH="$cartridge_sdk";
        export "CARTRIDGE_APP_HOME"="/opt/$Name";
        export "CARTRIDGE_APP_SHARED"="/opt/shared";
        export "J_OPENSHIFT_APPHOME_DIR"="$CARTRIDGE_HOME/versions/${Version}";
        export "J_OPENSHIFT_APPHOME_DIR_INTRA"="$CARTRIDGE_HOME/versions/${Version}/$(ls $J_OPENSHIFT_APPHOME_DIR/ 2>/dev/null | tail -n1)";
        export "J_OPENSHIFT_ENVDATA_DIR"="$CARTRIDGE_HOME/env";
        export "J_OPENSHIFT_METADATA_DIR"="$CARTRIDGE_HOME/metadata";
        export "J_OPENSHIFT_APPLICATION_PID_DIR"="/var/run/cartridges";
        export "VERSION"="$Version";

        export PATH=${PATH}:$CARTRIDGE_HOME/versions/${Version}/bin;
        [ -d  "${J_OPENSHIFT_APPHOME_DIR}/bin" ] && export PATH="$PATH:${J_OPENSHIFT_APPHOME_DIR}/bin";

    ############  INI BASIC APP VARS ##############

        ## logs need to be refactored ...
        [[ -L "${CARTRIDGE_HOME}/logs"  ]] && rm "${CARTRIDGE_HOME}/logs";

        ( [ ! -d "${CARTRIDGE_HOME}/log"  ] || [[ ! -L "${CARTRIDGE_HOME}/log"  ]] ) && [ -d "${CARTRIDGE_HOME}/logs"  ] && ln -s  "${CARTRIDGE_HOME}/logs" "${CARTRIDGE_HOME}/log";
        [[ ! -L "${CARTRIDGE_HOME}/logs"  ]] && [ -d "${CARTRIDGE_HOME}/log"  ] &&  [ ! -d "${CARTRIDGE_HOME}/logs" ] && ln -s  "${CARTRIDGE_HOME}/log" "${CARTRIDGE_HOME}/logs";

        ( [ ! -d  "${CARTRIDGE_HOME}/log"  ] || [[ ! -L "${CARTRIDGE_HOME}/log"  ]] ) && [ -d "${J_OPENSHIFT_APPHOME_DIR}/data/log"  ] && ln -s  "${J_OPENSHIFT_APPHOME_DIR}/data/log" "${CARTRIDGE_HOME}/logs";
        ( [ ! -d "${CARTRIDGE_HOME}/logs"  ] || [[ ! -L "${CARTRIDGE_HOME}/logs"  ]] ) && [ -d "${J_OPENSHIFT_APPHOME_DIR}/data/logs"  ] && ln -s  "${J_OPENSHIFT_APPHOME_DIR}/data/logs" "${CARTRIDGE_HOME}/logs";

        ( [ ! -d  "${CARTRIDGE_HOME}/log"  ] || [[ ! -L "${CARTRIDGE_HOME}/log"  ]] ) && [ -d "${J_OPENSHIFT_APPHOME_DIR_INTRA}/data/log"  ] && ln -s  "${J_OPENSHIFT_APPHOME_DIR_INTRA}/data/log" "${CARTRIDGE_HOME}/logs";
        ( [ ! -d "${CARTRIDGE_HOME}/logs"  ] || [[ ! -L "${CARTRIDGE_HOME}/logs"  ]] ) && [ -d "${J_OPENSHIFT_APPHOME_DIR_INTRA}/data/logs"  ] && ln -s  "${J_OPENSHIFT_APPHOME_DIR_INTRA}/data/logs" "${CARTRIDGE_HOME}/logs";

        ( [ ! -d  "${CARTRIDGE_HOME}/log"  ] || [[ ! -L "${CARTRIDGE_HOME}/log"  ]] ) && [ -d "${CARTRIDGE_HOME}/${Name}/log"  ] && ln -s "${CARTRIDGE_HOME}/${Name}/log" "${CARTRIDGE_HOME}/logs";
        ( [ ! -d  "${CARTRIDGE_HOME}/logs"  ] || [[ ! -L "${CARTRIDGE_HOME}/logs"  ]] ) && [ -d "${CARTRIDGE_HOME}/${Name}/log"  ] && ln -s "${CARTRIDGE_HOME}/${Name}/log" "${CARTRIDGE_HOME}/logs";
        ( [ ! -d "${CARTRIDGE_HOME}/logs"  ] || [[ ! -L "${CARTRIDGE_HOME}/logs"  ]] ) && [ -d "${CARTRIDGE_HOME}/${Name}/logs"  ] && ln -s "${CARTRIDGE_HOME}/${Name}/logs" "${CARTRIDGE_HOME}/logs";

        [ -d  "${CARTRIDGE_HOME}/usr/lib64/${Name}" ] && echo "${CARTRIDGE_HOME}/usr/lib64/${Name}" >> /etc/ld.so.conf.d/cart_jeastic.conf && ldconfig  > /dev/null 2>&1;
        [ -d  "${J_OPENSHIFT_APPHOME_DIR}/bin" ] && PATH="$PATH:${J_OPENSHIFT_APPHOME_DIR}/bin"

        parseEndPoints;
        proceedStaticENV;
        proceedDynamicENV;
        proceedDynamicDATA;
        saveEnvironmentVariables;
        [ ! -d "${J_OPENSHIFT_APPHOME_DIR}/data"  ]  && mkdir -p "${J_OPENSHIFT_APPHOME_DIR}/data";
        [ ! -d "${J_OPENSHIFT_APPHOME_DIR}/tmp"  ]  && mkdir -p "${J_OPENSHIFT_APPHOME_DIR}/tmp";
	[ -d "$J_OPENSHIFT_APPHOME_DIR" ] &&  [ ! -e "$CARTRIDGE_APP_HOME"  ] && ln -s "$J_OPENSHIFT_APPHOME_DIR" "$CARTRIDGE_APP_HOME";
        [ ! -d "${DEFAULT_JELASTIC_KEY_PATH}"  ]  && mkdir -p "${DEFAULT_JELASTIC_KEY_PATH}";
        [ ! -d "${J_OPENSHIFT_CRON_DIR}"  ]  && mkdir -p "${J_OPENSHIFT_CRON_DIR}";
        [ ! -d "$J_OPENSHIFT_KEYS_DIR" ] && mkdir -p "$J_OPENSHIFT_KEYS_DIR";       
        #[ ! -L "$J_OPENSHIFT_CRON_DIR/jelastic" ] && ln -f "/var/spool/cron/jelastic" "$J_OPENSHIFT_CRON_DIR/jelastic"    ### this is deprecared because of bug in vixie-cron which restricts hardlinks
        [ -f ${CARTRIDGE_HOME}/jelastic/jelastic.conf ] && source ${CARTRIDGE_HOME}/jelastic/jelastic.conf; ### Required for overrider values already containering env variables
        addNativeOpenshiftUser;
        proceedMountPoints;
        fixOwnership;
    }

    #############################
