#!/bin/bash

SCRIPT_VER="1.0"

APP="NZBGetCom"
APP_CATEGORY="Torrent Clients and Utilities"
APP_SCOPE="user"
APP_ENABLED="yes"
STORED_PASSWORD_SERVICE="userdir"
#><#APP_CHECK_VER_CMD="if [ -x /opt/nzbgetcom/nzbget ] ; then /opt/nzbgetcom/nzbget --version | awk "{print \$NF}" ; else echo "" ; fi"
#><#APP_UPGRADE_VER_CMD="curl -Ls -m 30 -o /dev/null -w "%{url_effective}" https://github.com/nzbgetcom/nzbget/releases/latest | awk -F/ "{print \$NF}" | tr -d "v""
SUPPORTED_ON="Ubuntu20.04,Ubuntu22.04"
DAEMON_PORT=7789
USE_APACHE2="yes"
LIBRARY="functions4.sh"

if [ "${SUPPORT-}" = '' ]; then
    SUPPORT="https://installers.rapidseedbox.com/scripts/whmcs_client_installers/support"
fi

LOGFILE="/var/log/whmcs_client_installers/${0}.log"
[ ! -d "/var/log/whmcs_client_installers" ] && mkdir -p "/var/log/whmcs_client_installers"

wget -4 -nc -q --no-check-certificate --timeout=20 --tries=5 ${SUPPORT}/${LIBRARY} >> "${LOGFILE}" 2>&1
if [ ! -f "./${LIBRARY}" ] ; then
    echo "55"
    echo "Error downloading \"${SUPPORT}/${LIBRARY}\"" >> "${LOGFILE}"
    exit 55
fi

# shellcheck source=support/functions4.sh
. "./${LIBRARY}"
SCRIPTENTRY

VALIDATE_USER

APP_DIRECTORY="${USERHOME}/.config/nzbgetcom"

while : ; do

    main_rc=1

    CHECK_APP ; _rc=$?
    if [ ${_rc} -ne 0 ] ; then
        main_rc=${_rc}
        break
    fi

    RM_FILES "${TMP_DIR}/nzbget-latest-bin-linux.run"
    WGET "https://nzbget.com/download/nzbget-latest-bin-linux.run" || break
    INFO "Executing nzbgetcom Installer"
    sh $TMP_DIR/nzbget-latest-bin-linux.run --destdir /opt/nzbgetcom || break
    INFO "Execution Finished"


    if [ ! -d "${USERHOME}/.config" ] ; then
        MKDIR "${USERHOME}/.config" || break
        CHOWN_DIR "${USERNAME}":"${USERNAME}" "${USERHOME}/.config" || break
    fi
    MKDIR "${USERHOME}/NZBGetCom" || break
    for __dir in \
        "Movies" \
        "Series" \
        "Music" \
        "Software" \
        "completed" \
        "intermediate" \
        "nzb" \
        "queue" \
        "tmp" \
    ; do
        MKDIR "${USERHOME}/NZBGetCom/${__dir}" || break
    done
    CHOWN_DIR "${USERNAME}":"${USERNAME}" "${USERHOME}/NZBGetCom"

    NZBGET_CONTROL_PORT="$(( USERUID + 7789 - FIRST_UID ))"

    MKDIR "${APP_DIRECTORY}" || break

    MV "/opt/nzbgetcom/nzbget.conf" "${APP_DIRECTORY}/" || break
    RUN_LOG "echo 's|^ControlIP=.*$|ControlIP=127.0.0.1|' | \
                 sed -f - -i '${APP_DIRECTORY}/nzbget.conf'"
    RUN_LOG "echo 's|^ControlPort=.*$|ControlPort=${NZBGET_CONTROL_PORT}|' | \
                 sed -f - -i '${APP_DIRECTORY}/nzbget.conf'"
    RUN_LOG "echo 's|^AuthorizedIP=.*$|AuthorizedIP=127.0.0.1|' | \
                 sed -f - -i '${APP_DIRECTORY}/nzbget.conf'"
    RUN_LOG "echo 's|^LogFile=.*$|LogFile=${USERHOME}/log/nzbgetcom.log|' | \
                 sed -f - -i '${APP_DIRECTORY}/nzbget.conf'"
    RUN_LOG "echo 's|^\(ParCleanupQueue=.*\)$|#\1|' | \
                 sed -f - -i '${APP_DIRECTORY}/nzbget.conf'"
    RUN_LOG "echo 's|^\(DeleteCleanupDisk=.*\)$|#\1|' | \
                 sed -f - -i '${APP_DIRECTORY}/nzbget.conf'"
    # -- Set 30 MB/s downloads within the app
    RUN_LOG "echo 's|DownloadRate=.*|DownloadRate=30000|' | \
                 sed -f - -i '${APP_DIRECTORY}/nzbget.conf'"
    # -- Disable Direct Unpack
    RUN_LOG "echo 's|DirectUnpack=.*|DirectUnpack=no|' | \
                 sed -f - -i '${APP_DIRECTORY}/nzbget.conf'"
    RUN_LOG "echo 's|MainDir=.*|MainDir=~/NZBGetCom|' | \
                 sed -f - -i '${APP_DIRECTORY}/nzbget.conf'"


    CHOWN_DIR "${USERNAME}":"${USERNAME}" "${APP_DIRECTORY}"

    # -- Resource limiting to 20MB/s by default
    cat <<-EOF > "/etc/systemd/system/nzbgetcom.slice" 2>> "${LOGFILE}"
	[Unit]
	Description=NZBGetCom resource limiting
	Before=slices.target

	[Slice]
	CPUAccounting=yes
	CPUQuota=45%
	IOAccounting=yes
	IOReadBandwidthMax=/ 20M
	IOWriteBandwidthMax=/ 20M
	EOF

    cat <<-EOF > "/etc/systemd/system/nzbgetcom@.service" 2>> "${LOGFILE}"
	[Unit]
	Description=NZBGetCom Daemon
	Documentation=http://nzbget.com/documentation
	After=network.target

	[Service]
	User=%i
	Group=%i
	Type=forking
	ExecStart=/opt/nzbgetcom/nzbget -c /home/%i/.config/nzbgetcom/nzbget.conf -D
	ExecStartPost=/bin/sh -c "echo \$MAINPID > /home/%i/.config/nzbgetcom/nzbget.pid"
	ExecStop=/opt/nzbgetcom/nzbget -Q
	ExecReload=/opt/nzbgetcom/nzbget -O
	KillMode=process
	Restart=on-failure
	Slice=nzbgetcom.slice

	[Install]
	WantedBy=multi-user.target
	EOF

    SYSTEMD_RELOAD
    SVC_ENABLE "nzbgetcom@${USERNAME}"
    SVC_START  "nzbgetcom@${USERNAME}"

    # Configure Apache
    if [ -d "/etc/apache2/userconf-enabled" ] ; then
        if [ "${USERUID}" = "${FIRST_UID}" ] ; then
            cat <<-EOF > "/etc/apache2/userconf-enabled/nzbgetcom-${USERNAME}.conf" 2>> "${LOGFILE}"
		RewriteEngine on
		RewriteRule ^/nzbgetcom\$ /nzbgetcom/ [R=permanent]
		ProxyPass /nzbgetcom http://localhost:${NZBGET_CONTROL_PORT}
		ProxyPassReverse /nzbgetcom http://localhost:${NZBGET_CONTROL_PORT}

		<Location /nzbgetcom/>
		  Order Allow,Deny
		  Allow from All
		  AuthType Digest
		  AuthName "apache2"
		  AuthDigestProvider file
		  AuthUserFile "/etc/apache2/users.password"
		  Require user ${USERNAME}
		</Location>
		EOF
        else
            cat <<-EOF > "/etc/apache2/userconf-enabled/nzbgetcom-${USERNAME}.conf" 2>> "${LOGFILE}"
		RewriteEngine on
		RewriteRule ^/nzbgetcom-${USERNAME}\$ /nzbgetcom-${USERNAME}/ [R=permanent]
		ProxyPass /nzbgetcom-${USERNAME} http://localhost:${NZBGET_CONTROL_PORT}
		ProxyPassReverse /nzbgetcom-${USERNAME} http://localhost:${NZBGET_CONTROL_PORT}

		<Location /nzbgetcom-${USERNAME}/>
		  Order Allow,Deny
		  Allow from All
		  AuthType Digest
		  AuthName "apache2"
		  AuthDigestProvider file
		  AuthUserFile "/etc/apache2/users.password"
		  Require user ${USERNAME}
		</Location>
		EOF
        fi
        SVC_RESTART "apache2"
    fi

    passwd_file="/etc/apache2/nzbget.users.password"
    pline="$( \
        ( echo -n "${USERNAME}:NZBGet:" && echo -n "${USERNAME}:NZBGet:${USERPASSWORD}" \
           | md5sum | awk '{print $1}' \
        ) \
      )"
    if [ -e "${passwd_file}" ] && grep -q -e "^${USERNAME}:NZBGet:" "${passwd_file}"
    then
        RUN_LOG "echo 's#^${USERNAME}:NZBGet:.*#${pline}#' \
                     | sed -f - -i '${passwd_file}'"
    else
        echo "${pline}" >> "${passwd_file}"
    fi

    #
    # -- monit configs
    if [ -d "/etc/monit/conf.d" ] ; then
         cat <<-EOF > "/etc/monit/conf.d/nzbgetcom@${USERNAME}" 2>> "${LOGFILE}"
		check process nzbgetcom-${USERNAME} with pidfile ${APP_DIRECTORY}/nzbget.pid
		  start program = "/usr/sbin/service nzbgetcom@${USERNAME} restart"
		  stop program = "/usr/sbin/service nzbgetcom@${USERNAME} stop"
		EOF
         MONIT_RELOAD
    fi


    main_rc=0
    break

done


SCRIPTEXIT
