#!/bin/bash

SCRIPT_VER="1.8"

APP="NZBGet"
APP_CATEGORY="Torrent Clients and Utilities"
APP_SCOPE="user"
APP_ENABLED="no"
#><#APP_CHECK_VER_CMD="if which nzbget > /dev/null 2>&1 ; then nzbget --version | awk "{print \$NF}" ; else if [ -x /opt/nzbget/nzbget ] ; then /opt/nzbget/nzbget --version | awk "{print \$NF}" ; else echo "" ; fi ; fi"
STORED_PASSWORD_SERVICE="nzbget"
SUPPORTED_ON="Debian9,Ubuntu16.04,Ubuntu18.04,Ubuntu20.04,Ubuntu22.04"
DAEMON_PORT=6789
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/nzbget"

while : ; do

    main_rc=1

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

    if ! DPKG_CHECK "nzbget" ; then
        APT_INSTALL "nzbget" || break
    fi

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

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

    MKDIR "${APP_DIRECTORY}" || break
    WGET "${SUPPORT}/nzbget.conf" || break
    MV "${TMP_DIR}/nzbget.conf" "${APP_DIRECTORY}/" || greak
    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/nzbget.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'"

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

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

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

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

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

	[Install]
	WantedBy=multi-user.target
	EOF

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

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

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

		<Location /nzbget-${USERNAME}/>
		  AuthType Digest
		  AuthName "NZBGet"
		  AuthDigestDomain "/nzbget-${USERNAME}/"
		  AuthDigestProvider file
		  AuthUserFile "/etc/apache2/nzbget.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/nzbget@${USERNAME}" 2>> "${LOGFILE}"
		check process nzbget-${USERNAME} with pidfile ${APP_DIRECTORY}/nzbget.pid
		  start program = "/usr/sbin/service nzbget@${USERNAME} restart"
		  stop program = "/usr/sbin/service nzbget@${USERNAME} stop"
		EOF
         MONIT_RELOAD
    fi


    main_rc=0
    break

done


SCRIPTEXIT
