#!/bin/sh

# Add bhsvc user that is using for java trans purpose
create_user(){
    # Create u_bhsvc user
    if [ $(grep -c '^u_bhsvc:' /etc/passwd) -eq 0 ]; then
        PASSWD=`openssl rand -base64 16`
        sudo synouser --add u_bhsvc "$PASSWD" "Nakivo Inc" 0 "" "" >/dev/null 2>&1
    fi

    # Create g_bhsvc group
    if [ $(grep -c '^g_bhsvc:' /etc/group) -eq 0 ]; then
        sudo synogroup --add g_bhsvc u_bhsvc >/dev/null 2>&1
    fi
}

if [ ${SYNOPKG_DSM_VERSION_MAJOR:-5} -ge 6 ]; then
    PS_FLAGS_TRANSPORTER_PREFIX="-Ao pid,comm"
    PS_FLAGS_PREFIX="ax"
fi

#Migrate
if [ -e /etc/init/nkv-dirsvc.conf ]; then
    DIRECTOR_FOLDER=`sed -n '/^\(env \)\{0,1\}SVC_PATH="\(.*\)"$/s//\2/p' /etc/init/nkv-dirsvc.conf 2>/dev/null`
    LEGACY_PRODUCT_ROOT=`dirname "$DIRECTOR_FOLDER"`
elif [ -e /etc/init/nkv-bhsvc.conf ]; then
    TRANSPORTER_FOLDER=`sed -n '/^\(env \)\{0,1\}SVC_PATH="\(.*\)"$/s//\2/p' /etc/init/nkv-bhsvc.conf 2>/dev/null`
    LEGACY_PRODUCT_ROOT=`dirname "$TRANSPORTER_FOLDER"`
fi
if [ "x${LEGACY_PRODUCT_ROOT}" = "x" ]; then
    LEGACY_PRODUCT_ROOT='/usr/local/nakivo'
fi

if [ -d "$LEGACY_PRODUCT_ROOT" ]; then
    #Transporter
    PID=`ps ${PS_FLAGS_PREFIX} | grep -v grep | grep "bhsvc" | sed -n '/^[[:space:]]*\([[:digit:]]\+\).*/s//\1/p'`
    if [ "x$PID" != "x" ]; then
        stop nkv-bhsvc
        while ps ${PS_FLAGS_PREFIX} | grep -qE "^ *$PID "; do
           sleep 1
        done
    fi

    if [ -d "$LEGACY_PRODUCT_ROOT/transporter" ]; then
        KEEP_LIST="bh-logs bh-base bh-vddk bhsvc.id certificate.pem"
        for KEEP in $KEEP_LIST; do
            [ -e "$LEGACY_PRODUCT_ROOT/transporter/$KEEP" ] && cp -r "$LEGACY_PRODUCT_ROOT/transporter/$KEEP" "$SYNOPKG_PKGDEST/transporter/"
        done

        if [ -x /usr/bin/diff ]; then
            SCRIPTS_LIST=`ls -1 "$LEGACY_PRODUCT_ROOT/transporter/scripts"`
            for script in $SCRIPTS_LIST; do
                /usr/bin/diff -q "$LEGACY_PRODUCT_ROOT/transporter/scripts/$script" "$SYNOPKG_PKGDEST/transporter/scripts/$script"
                [ $? -ne 0 ] && cp "$LEGACY_PRODUCT_ROOT/transporter/scripts/$script" "$SYNOPKG_PKGDEST/transporter/scripts/${script}.old"
            done
        fi

        #cleanup
        /usr/syno/bin/servicetool --remove-configure-file --package nkv-bhsvc.sc
        rm -rf "$LEGACY_PRODUCT_ROOT/transporter"
    fi
    [ -e /etc/init/nkv-bhsvc.conf ] && rm -f /etc/init/nkv-bhsvc.conf

    #Director
    PID=`ps ${PS_FLAGS_PREFIX}ww | grep -v grep | grep "nkv-dirsvc.jar" | sed -n '/^[[:space:]]*\([[:digit:]]\+\).*/s//\1/p'`
    if [ "x$PID" != "x" ]; then
        stop nkv-dirsvc
        while ps ${PS_FLAGS_PREFIX}ww | grep -qE "^ *$PID "; do
           sleep 1
        done
    fi

    if [ -d "$LEGACY_PRODUCT_ROOT/director" ]; then
        KEEP_LIST="userdata logs tomcat/cert"
        for KEEP in $KEEP_LIST; do
            if [ -e "$LEGACY_PRODUCT_ROOT/director/$KEEP" ]; then
                rm -rf "$SYNOPKG_PKGDEST/$KEEP" 2>/dev/null
                cp -r "$LEGACY_PRODUCT_ROOT/director/$KEEP" "$SYNOPKG_PKGDEST/$KEEP"
            fi
        done

        #clenaup
        /usr/syno/bin/servicetool --remove-configure-file --package nkv-dirsvc.sc
        rm -rf "$LEGACY_PRODUCT_ROOT/director"
    fi
    [ -e /etc/init/nkv-dirsvc.conf ] && rm -f /etc/init/nkv-dirsvc.conf
fi

#Director
if [ -e "$SYNOPKG_PKGDEST/nkv-dirsvc" ]; then
    SVC_PROFILE=`ls -1 "$SYNOPKG_PKGDEST/userdata" | grep -E '.profile$' | tail -n 1`
    if [ "x$SVC_PROFILE" != "x" ]; then
        SVC_PROFILE="$SYNOPKG_PKGDEST/userdata/$SVC_PROFILE"
    fi

    if [ "x$SYNOPKG_PKG_STATUS" != "xINSTALL" ]; then
        CONFIG="$SYNOPKG_PKGDEST/nkv-dirsvc.old"
        if [ -e "$CONFIG" ]; then
            DIRECTOR_OPTIONS=`sed -n '/^\(env \)\{0,1\}SVC_OPTIONS="\(.*\)"$/s//\2/p' "$CONFIG" 2>/dev/null`
            DIRECTOR_OPTIONS=`echo $DIRECTOR_OPTIONS | sed -e 's/ -Xnoagent//g' -e 's/ -XX:+AggressiveOpts//g'`
        fi

        CONFIG="$SYNOPKG_PKGDEST/userdata/config.properties"
        if [ -e "$CONFIG" ]; then
            DIRECTOR_PORT=`sed -n '\!^webui\.port=\(.*\)$!s!!\1!p' "$CONFIG" 2>/dev/null`
            TRANSPORTER_PORT=`sed -n '\!^transporter\.port1=\(.*\)$!s!!\1!p' "$CONFIG" 2>/dev/null`
            TRANSPORTER_RANGE_START=`sed -n '\!^transporter\.range1Start=\(.*\)$!s!!\1!p' "$CONFIG" 2>/dev/null`
            TRANSPORTER_RANGE_END=`sed -n '\!^transporter\.range1End=\(.*\)$!s!!\1!p' "$CONFIG" 2>/dev/null`
            REPOSITORY=`sed -n '\!^repo\.autocreate\.path=\(.*\)$!s!!\1!p' "$CONFIG" 2>/dev/null`
        fi
    else #INSTALL
        if [ "x$REPOSITORY" = "x" ]; then
            if [ ${SYNOPKG_DSM_VERSION_MAJOR:-5} -ge 6 ]; then
                synoshare -enum LOCAL | tail -n+3 | grep -qE "^NAKIVO_Repository$" >/dev/null 2>&1
                if [ $? -ne 0 ]; then
                    REPOSITORY="$SYNOPKG_PKGDEST_VOL/NAKIVO_Repository"
                    synoshare --add NAKIVO_Repository "NAKIVO Repository" "$REPOSITORY" "" "admin" "" 1 0
                else
                    REPOSITORY=`synoshare -get NAKIVO_Repository | sed -n '\![[:space:]]*Path[^[]*\[\([^]]*\)\].*!s!!\1!p'`
                fi
            else
                REPOSITORY=`synoshare -enum LOCAL | tail -n+3 | xargs -n 1 synoshare -get | sed -n '\![[:space:]]*Path[^[]*\[\([^]]*\)\].*!s!!\1!p' | head -n 1`
            fi
        fi
        if [ "x$REPOSITORY" = "x" ]; then
            REPOSITORY=`echo $SYNOPKG_PKGDEST | sed -n '\!\(/[^/]*\)/.*!s!!\1/repository!p'`
        fi
        if [ ${SYNOPKG_DSM_VERSION_MAJOR:-5} -lt 6 ]; then
            [ ! -e "$REPOSITORY" ] && mkdir -p "$REPOSITORY"
        fi

        sed -e '\!^\(webui\.port\)=.*$!s!!\1='${DIRECTOR_PORT:=4443}'!' \
            -e '\!^\(transporter\.port1\)=.*$!s!!\1='${TRANSPORTER_PORT:=9446}'!' \
            -e '\!^\(transporter\.range1Start\)=.*$!s!!\1='${TRANSPORTER_RANGE_START:=9448}'!' \
            -e '\!^\(transporter\.range1End\)=.*$!s!!\1='${TRANSPORTER_RANGE_END:=10000}'!' \
            -e '\!^\(repo\.autocreate\.path\)=.*$!s!!\1='${REPOSITORY}'!' \
            -e '\!^\(repo\.autocreate\)=.*$!s!!\1=true!' \
            -e '\!^\(system.lang\)=.*$!s!!\1=en_US!' \
            -e '\!^\(system.mt\)=.*$!s!!\1=false!' \
            -e '\!^\(callhome.autosendBundles\)=.*$!s!!\1=true!' \
            -i "$SYNOPKG_PKGDEST/userdata/config.properties"

        if [ "x$SVC_PROFILE" != "x" ]; then
            sed -e '\!^\([[:space:]]*"system.repository.default.path"[[:space:]]*:[[:space:]]*\)[^,]*\(,\?\).*!s!!\1"'"${REPOSITORY}"'"\2!' \
                -i "$SVC_PROFILE"
        fi
    fi

    if [ "x${DIRECTOR_OPTIONS}" = "x" ]; then
        if [ "x$SVC_PROFILE" != "x" ]; then
            DIRECTOR_OPTIONS=`awk 'BEGIN{A=0} /}/{A=0} /jvm/{A=1; next;} {if (A==1) print $0}' "$SVC_PROFILE" | sed -n '/[[:space:]]*"args": "\([^"]*\).*/s//\1/p'`

            if [ -e /proc/meminfo ]; then
                RAM=`cat /proc/meminfo | sed -n '/MemTotal:[[:space:]]*\([[:digit:]]\+\).*/s//\1/p'`
            fi

            if [ "x$RAM" != "x" ]; then
                if [ $RAM -le 1048576 ]; then
                    RAM_TAG='MIN'
                elif [ $RAM -le 2097152 ]; then
                    RAM_TAG='MB512'
                elif [ $RAM -le 3145728 ]; then
                    RAM_TAG='MB768'
                elif [ $RAM -le 4194304 ]; then
                    RAM_TAG='GB2'
                elif [ $RAM -le 8388608 ]; then
                    RAM_TAG='GB2'
                elif [ $RAM -le 12582912 ]; then
                    RAM_TAG='GB4'
                elif [ $RAM -le 16777216 ]; then
                    RAM_TAG='GB6'
                else
                    RAM_TAG='GB8'
                fi
            fi

            MEMORY_ARGS=`awk 'BEGIN{A=0} /}/{A=0} /memoryArgs/{A=1; next;} {if (A==1) print $0}' "$SVC_PROFILE" | sed -n '/[[:space:]]*"'${RAM_TAG:-MIN}'": "\([^"]*\).*/s//\1/p'`
            if [ "x$MEMORY_ARGS" != "x" ]; then
                DIRECTOR_OPTIONS="$DIRECTOR_OPTIONS $MEMORY_ARGS"
            fi
        else
            DIRECTOR_OPTIONS='-Dfile.encoding=UTF-8 -server -Xss320k -Xms64m -Xmx128m'
        fi
    fi
    sed -e "s!%SVC_OPTIONS%!$DIRECTOR_OPTIONS!" \
        -e 's!%SVC_PATH%!${SYNOPKG_PKGDEST:-'$SYNOPKG_PKGDEST'}!' \
        -e 's!%PS_FLAGS%!${PS_FLAGS_PREFIX}ww!' \
        -e 's!%PS_TARGET%!$SVC_BIN!' \
        "$SYNOPKG_PKGDEST/nkv-dirsvc" >"$SYNOPKG_PKGDEST/nkv-dirsvc_"
    mv "$SYNOPKG_PKGDEST/nkv-dirsvc_" "$SYNOPKG_PKGDEST/nkv-dirsvc"
    chown 0:0 "$SYNOPKG_PKGDEST/nkv-dirsvc"
    chmod 755 "$SYNOPKG_PKGDEST/nkv-dirsvc"

    [ ! -e "$SYNOPKG_PKGDEST/nkv-dirsvc.jar" ] && ln -s "$SYNOPKG_PKGDEST/backup_replication.jar" "$SYNOPKG_PKGDEST/nkv-dirsvc.jar"
    [ -e "$SYNOPKG_PKGDEST/start" ] && chmod 750 "$SYNOPKG_PKGDEST/start"
    chmod -R 755 "$SYNOPKG_PKGDEST/jre/bin/"*
    chmod 755 "$SYNOPKG_PKGDEST/jre/lib/jspawnhelper"

    #Prepare WEB UI redirect
    sed -e 's!%SVC_PORT%!'${DIRECTOR_PORT:=4443}'!' \
        "$SYNOPKG_PKGDEST/redirect/config" >"$SYNOPKG_PKGDEST/redirect/config_"
    mv "$SYNOPKG_PKGDEST/redirect/config_" "$SYNOPKG_PKGDEST/redirect/config"

    # Update director folder permission
    chown root:administrators "$SYNOPKG_PKGDEST"
    chmod 751 "$SYNOPKG_PKGDEST"

    # Replace %JAVA% in the cli.sh file
    chmod 750 $SYNOPKG_PKGDEST/bin/cli.sh
    JAVA_PATH='../jre/bin/java'
    sed -ie "s@%JAVA%@$JAVA_PATH@" "$SYNOPKG_PKGDEST/bin/cli.sh"
fi

#Transporter
if [ -e "$SYNOPKG_PKGDEST/transporter" ]; then
    TRANSPORTER_ROOT="$SYNOPKG_PKGDEST/transporter"
else
    TRANSPORTER_ROOT="$SYNOPKG_PKGDEST"
fi

sed -e 's!%SVC_PATH%!'$TRANSPORTER_ROOT'!' \
    -e 's!%SVC_PORT%!'${TRANSPORTER_PORT:=9446}'!' \
    -e 's!%SVC_OPTIONS%!-r!' \
    -e "s!%PS_FLAGS%!$PS_FLAGS_TRANSPORTER_PREFIX!" \
    "$TRANSPORTER_ROOT/nkv-bhsvc" >"$TRANSPORTER_ROOT/nkv-bhsvc_"
mv "$TRANSPORTER_ROOT/nkv-bhsvc_" "$TRANSPORTER_ROOT/nkv-bhsvc"
chown 0:0 "$TRANSPORTER_ROOT/nkv-bhsvc"
chmod 755 "$TRANSPORTER_ROOT/nkv-bhsvc"

chmod 750 "$TRANSPORTER_ROOT/bhsvc" \
          "$TRANSPORTER_ROOT/bh" \
          "$TRANSPORTER_ROOT/scripts/"*.sh

# don't support Saas for armv7, armv8
uname -m | grep -qE '^armv7|armv8' 2>/dev/null
if [ $? -ne 0 ]; then
    # copy jre from director
    if [ -e "$SYNOPKG_PKGDEST/nkv-dirsvc" ]; then
        cp -R "$SYNOPKG_PKGDEST/jre" "$TRANSPORTER_ROOT/java"
    fi
    # Add chmod 755 and add bhsvc user for using java transporter
    chmod 755 -R "$TRANSPORTER_ROOT/java/"
    create_user
fi

# Fix permission
if [ -e /var/run/postgresql ]; then
  chmod o+w /var/run/postgresql
fi

#VDDK Fix
if [ -d "$TRANSPORTER_ROOT/vddk" ]; then
    VDDK_ROOT="$TRANSPORTER_ROOT/vddk"
    #re-link to vddk subfolder
    ls -l "/usr/lib/vmware" 2>/dev/null | grep -qE 'vddk$' >/dev/null 2>&1
    [ $? -ne 0 -a -h "/usr/lib/vmware" ] && rm "/usr/lib/vmware" >/dev/null 2>&1
else
    VDDK_ROOT="$TRANSPORTER_ROOT"
fi
[ ! -h "/usr/lib/vmware" ] && ln -s "$VDDK_ROOT" "/usr/lib/vmware" >/dev/null 2>&1
if [ -d "$TRANSPORTER_ROOT/vddk67" ]; then
    [ ! -e "$VDDK_ROOT/libcrypto.so.1.0.2" ] && ln -s "$TRANSPORTER_ROOT/vddk67/libcrypto.so.1.0.2" "$VDDK_ROOT/libcrypto.so.1.0.2" >/dev/null 2>&1
    [ ! -e "$VDDK_ROOT/libssl.so.1.0.2" ] && ln -s "$TRANSPORTER_ROOT/vddk67/libssl.so.1.0.2" "$VDDK_ROOT/libssl.so.1.0.2" >/dev/null 2>&1
fi
if [ -d "$TRANSPORTER_ROOT/vddk60" ]; then
    [ ! -e "$VDDK_ROOT/libcrypto.so.1.0.1" ] && ln -s "$TRANSPORTER_ROOT/vddk60/libcrypto.so.1.0.1" "$VDDK_ROOT/libcrypto.so.1.0.1" >/dev/null 2>&1
    [ ! -e "$VDDK_ROOT/libssl.so.1.0.1" ] && ln -s "$TRANSPORTER_ROOT/vddk60/libssl.so.1.0.1" "$VDDK_ROOT/libssl.so.1.0.1" >/dev/null 2>&1
fi

#Addon
ADDON_PACKAGE='https://nbr-addons.s3-us-west-2.amazonaws.com/synology_addon_tools-1.1-armv8.sh'
if [ "x${ADDON_PACKAGE}" != "x" ]; then
    PASSED=1
    wget --tries=2 --connect-timeout=60 --no-check-certificate -O - "${ADDON_PACKAGE}" >"$SYNOPKG_PKGDEST/addon.sh"
    if [ $? -eq 0 ]; then
        sh "$SYNOPKG_PKGDEST/addon.sh"
        PASSED=$?
    fi
    rm -f "$SYNOPKG_PKGDEST/addon.sh"

    if [ "x$SYNOPKG_PKG_STATUS" = "xINSTALL" ]; then
        if [ $PASSED -ne 0 ]; then
            echo "Add-on tools could not be installed. \
This add-on package is necessary for NAKIVO Backup & Replication to work properly. Please, follow the instructions to install the package manually: \
https://www.nakivo.com/helpcenter/display/KB/Add-on+Package+Cannot+Be+Installed+on+Synology+NAS" >>$SYNOPKG_TEMP_LOGFILE
        fi
    fi
fi

#fix libdevmapper.so.1.02.1
if [ ! -e "/usr/lib/libdevmapper.so.1.02.1" ]; then
    if [ -e "/usr/lib/libdevmapper.so.1.02" ]; then
        ln -s "/usr/lib/libdevmapper.so.1.02" "/usr/lib/libdevmapper.so.1.02.1" >/dev/null 2>&1
    elif [ -e "/lib64/libdevmapper.so.1.02" ]; then
        ln -s "/lib64/libdevmapper.so.1.02" "/usr/lib/libdevmapper.so.1.02.1" >/dev/null 2>&1
    fi
fi

exit 0
