#!/bin/bash

SCRIPT_VER="1.10"

APP="RSB Dashboard"
APP_CATEGORY="Utilities"
APP_SCOPE="system"
APP_ENABLED="yes"
STORED_PASSWORD_SERVICE="userdir"
#><#APP_CHECK_VER_CMD="if [ -d "${APP_DIRECTORY}" ] ; then grep -E "\\\$version\s+=\s+" "${APP_DIRECTORY}/dashboard/inc/config.php" | awk "{print \$NF}" | tr -d "\";v" ; else echo "" ; fi"
#><#APP_UPGRADE_VER_CMD="wget -q --timeout=10 --tries=3 -O - ${SUPPORT}/rsb-dashboard/version.id"
SUPPORTED_ON="Ubuntu16.04,Ubuntu18.04,Ubuntu20.04,Ubuntu22.04"
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="/etc/QuickBox"
APP_BIN_DIRECTORY="/usr/local/bin/quickbox"
WEB_DIRECTORY="/var/www/dashboard"

while : ; do

    main_rc=1

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

    # -- Save current settings
    if [ -e "${WEB_DIRECTORY}/db/.smoked.lock" ] ; then
        _theme="smoked"
    elif [ -e "${WEB_DIRECTORY}/db/.defaulted.lock" ] ; then
        _theme="defaulted"
    fi

    _lang="$( grep -E '\$language\s+=' "${WEB_DIRECTORY}/inc/localize.php" 2> /dev/null \
                  | awk '{print $NF}' \
                  | tr -d "';" )"
    cat <<-EOF > "/var/tmp/rsb-dashboard.settings"
	_THEME='${_theme}'
	_LANG='${_lang}'
	EOF

    # -- Uninstall Dashboard
    for _d in "${APP_DIRECTORY}" \
              "${APP_BIN_DIRECTORY}" \
    ; do
        if [ -d "${_d}" ] ; then
            RM_DIRS "${_d}"
        fi
    done
    [ -e "/etc/sudoers.d/dashboard" ] \
        && RM_FILES "/etc/sudoers.d/dashboard"

    ${PKG_INSTALL} \
         "php" "libapache2-mod-php" \
         "php-memcached" "php-net-socket" \
         "vnstat" "vnstati" "iotop" "sysstat" "iperf3" "mtr-tiny" || break

    # -- Install new Dashboard version
    for _d in "${APP_DIRECTORY}" \
              "${APP_BIN_DIRECTORY}" \
              "${WEB_DIRECTORY}" \
              "/etc/sudoers.d" \
    ; do
        if [ ! -d "${_d}" ] ; then
            MKDIR "${_d}" || break
        fi
    done

    WGET "${SUPPORT}/rsb-dashboard.tar.gz" || break
    TAR_ZXF "${TMP_DIR}/rsb-dashboard.tar.gz" "${APP_DIRECTORY}/" || break

    RUN_LOG "echo '${DEV}' > '${APP_DIRECTORY}/dashboard/db/interface.txt' 2>&1"
    RUN_LOG "echo '${USERNAME}' > '${APP_DIRECTORY}/dashboard/db/master.txt' 2>&1"
    _vnstat_ver="$( vnstat --version \
                        | awk '{print $2}' \
                        | awk -F. '{print $1}' )"
    echo -n "${_vnstat_ver}" > "${WEB_DIRECTORY}/vnstat_version.id"

    CP_FILE "${APP_DIRECTORY}/packages/system/rsb/vnstat-12-months.sh" \
            "/usr/local/sbin/vnstat-12-months.sh" 

    for _f in "${APP_DIRECTORY}/dashboard/inc/config.php" \
              "${APP_DIRECTORY}/dashboard/widgets/bw_tables.php" \
              "${APP_DIRECTORY}/dashboard/widgets/data.php" \
              "${APP_DIRECTORY}/dashboard/widgets/stat.php" \
              "/usr/local/sbin/vnstat-12-months.sh" \
    ; do
        RUN_LOG "sed -i 's|###DEV###|${DEV}|g' '${_f}' 2>&1"
        RUN_LOG "sed -i 's|###VNSTAT_VER###|${_vnstat_ver}|g' '${_f}' 2>&1"
    done

    cat <<-EOF > "/etc/cron.d/vnstat-12-months"
	MAILTO=""
	PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

	0 * * * * root /bin/bash /usr/local/sbin/vnstat-12-months.sh
	EOF

    [ -d "/var/local/stats" ] \
        || MKDIR "/var/local/stats"

    RUN_LOG "bash /usr/local/sbin/vnstat-12-months.sh 2>&1"

    case "${LSB_VER}" in
      "Ubuntu16.04"|"Ubuntu18.04")
          _sudo_no_log="syslog"
          ;;
      *)
          _sudo_no_log="log_allowed"
          ;;
    esac
    RUN_LOG "sed -i -e 's|###APP_BIN_DIRECTORY###|${APP_BIN_DIRECTORY}|g' \
                 '${APP_DIRECTORY}/packages/system/rsb/sudoers' 2>&1"
    RUN_LOG "sed -i -e 's|###APACHE_USER###|${APACHE_USER}|g' \
                 '${APP_DIRECTORY}/packages/system/rsb/sudoers' 2>&1"
    RUN_LOG "sed -i -e 's|###USERNAME###|${USERNAME}|g' \
                 '${APP_DIRECTORY}/packages/system/rsb/sudoers' 2>&1"
    RUN_LOG "sed -i -e 's|###SUDO_NO_LOG###|${_sudo_no_log}|g' \
                 '${APP_DIRECTORY}/packages/system/rsb/sudoers' 2>&1"
    CP_FILE "${APP_DIRECTORY}/packages/system/rsb/sudoers" \
            "/etc/sudoers.d/dashboard" 
    CHOWN_FILE root:root "/etc/sudoers.d/dashboard" 
    CHMOD_FILE "0440" "/etc/sudoers.d/dashboard" 

    RUN_LOG "rsync -av --stats \
                   ${APP_DIRECTORY}/dashboard/ ${WEB_DIRECTORY}/ 2>&1" || break

    RUN_LOG "rsync -av --stats \
                   ${APP_DIRECTORY}/packages/ ${APP_BIN_DIRECTORY}/ 2>&1" || break

    find ${APP_BIN_DIRECTORY} -type f -exec chmod +x {} \; > /dev/null 2>&1

    RUN_LOG "cp -pf ${APP_BIN_DIRECTORY}/system/reload /usr/bin/reload 2>&1" || break

    RUN_LOG "cp -pf ${APP_BIN_DIRECTORY}/system/_ttyd_cmd /usr/local/bin/CLI 2>&1" || break

    # -- Restore Dashboard settings (upgrade scenario)
    if [ -e "/var/tmp/rsb-dashboard.settings" ] ; then
        . "/var/tmp/rsb-dashboard.settings"
#        if [ -n "${_THEME}" ] ; then
#            RUN_LOG "${APP_BIN_DIRECTORY}/system/theme/themeSelect-${_THEME}"
#        fi
        if [ -n "${_LANG}" ] ; then
            RUN_LOG "${APP_BIN_DIRECTORY}/system/lang/langSelect-${_LANG}"
        fi
        RM_FILES "/var/tmp/rsb-dashboard.settings"
    fi

    CHOWN_DIR "${APACHE_USER}":"${APACHE_GROUP}" "${WEB_DIRECTORY}" || break


    # -- Configure Web Console (`ttyd`)
    _install_ttyd="no"
    _restart_ttyd="no"
    _ttyd_url="$( curl -s https://api.github.com/repos/tsl0922/ttyd/releases/latest \
                      | jq -r ".assets[] | select(.name | contains(\"$(arch)\")) | .browser_download_url" )"
    if [ ! -x "/usr/local/bin/ttyd" ] ; then
        _restart_ttyd="yes"
        _install_ttyd="yes"
    else
        _ttyd_latest_version="$( awk -F/ '{print $(NF-1)}' <<< "${_ttyd_url}" )"
        _ttyd_version="$( /usr/local/bin/ttyd -v 2> /dev/null \
                              | awk '{print $NF}' \
                              | awk -F'-' '{print $1}' )"
        if [ "${_ttyd_latest_version}" != "${_ttyd_version}" ] ; then
            _restart_ttyd="yes"
            _install_ttyd="yes"
        fi
    fi
    if [ "${_install_ttyd}" = "yes" ] ; then
        _ttyd_url="$( curl -s https://api.github.com/repos/tsl0922/ttyd/releases/latest \
                          | jq -r ".assets[] | select(.name | contains(\"$(arch)\")) | .browser_download_url" )"
        if systemctl is-active "ttyd" > /dev/null 2>&1 ; then
            SVC_STOP "ttyd"
            _restart_ttyd="yes"
        fi
        WGET "${_ttyd_url}" "/usr/local/bin/ttyd" || break
        CHMOD_FILE 0755 "/usr/local/bin/ttyd" || break
    fi

    cat <<-EOF > "${TMP_DIR}/ttyd.service"
	[Unit]
	Description=Terminal over HTTP
	#Required=sshd.service
	After=sshd.service

	[Service]
	User=user
	Group=user
	Type=simple
	WorkingDirectory=/home/user
	#ExecStart=/usr/local/bin/ttyd -W -i 127.0.0.1 -p 4200 bash
	#ExecStart=/usr/local/bin/ttyd -W -a -i 127.0.0.1 -p 4200 /usr/local/bin/quickbox/system/_ttyd_cmd
	ExecStart=/usr/local/bin/ttyd -W -a -i 127.0.0.1 -p 4200 CLI
	ExecReload=/bin/kill -HUP \$MAINPID
	KillMode=process
	Restart=on-abort

	[Install]
	WantedBy=multi-user.target
	EOF

    if [ ! -e "/etc/systemd/system/ttyd.service" ] ; then
        _restart_ttyd="yes"
        CP_FILE "${TMP_DIR}/ttyd.service" \
                "/etc/systemd/system/ttyd.service" \
            || break
    else
        if ! diff "${TMP_DIR}/ttyd.service" \
                  "/etc/systemd/system/ttyd.service" \
                 > /dev/null 2>&1
        then
            _restart_ttyd="yes"
            CP_FILE "${TMP_DIR}/ttyd.service" \
                    "/etc/systemd/system/ttyd.service" \
                || break
        fi
    fi

    # -- Clear terminal when ttyd `screen` session detached
    echo "termcapinfo xterm*|rxvt*  te=\E[?1049l:ti=\E[?1049h:" \
        > "${WEB_DIRECTORY}/.screenrc-rsb-dashboard"

    if [ "${_restart_ttyd}" = "yes" ] ; then
        SYSTEMD_RELOAD
        SVC_ENABLE  "ttyd"
        SVC_RESTART "ttyd"
    fi

    # -- Disable built-in authentication in ruTorrent
    # -- We'll use `dashboard` or /rutorrent URL rules to login
    if [ -e "/var/www/rutorrent/.htaccess" ] ; then
        MV "/var/www/rutorrent/.htaccess" \
           "/var/www/rutorrent/.htaccess.dashboard.BAK"
    fi

    # -- Configure Downloads directory URL
    [ -L "${USERHOME}/Downloads/Downloads" ] && RM_FILES "${USERHOME}/Downloads/Downloads"
    [ -L "${WEB_DIRECTORY}/Downloads" ] && RM_FILES "${WEB_DIRECTORY}/Downloads"
    RUN_LOG "ln -svf '${USERHOME}/Downloads' '${WEB_DIRECTORY}/Downloads' 2>&1"

    # -- Configure NextCloud URL
    [ -L "/var/www/nextcloud/nextcloud" ] && RM_FILES "/var/www/nextcloud/nextcloud"
    [ -L "${WEB_DIRECTORY}/nextcloud" ] && RM_FILES "${WEB_DIRECTORY}/nextcloud"
    RUN_LOG "ln -svf '/var/www/nextcloud' '${WEB_DIRECTORY}/nextcloud' 2>&1"

    # -- Configure WireGuard directory URL
    [ -L "/var/www/html/wireguard/wireguard" ] && RM_FILES "/var/www/html/wireguard/wireguard"
    [ -L "${WEB_DIRECTORY}/wireguard" ] && RM_FILES "${WEB_DIRECTORY}/wireguard"
    RUN_LOG "ln -svf '/var/www/html/wireguard' '${WEB_DIRECTORY}/wireguard' 2>&1"

    # -- Configure Syncthing service
    if [ -e "${USERHOME}/.config/syncthing/config.xml" ] ; then
        RUN_LOG "sed -i -re '/\s*<(password|user)>/d' '${USERHOME}/.config/syncthing/config.xml'"
        systemctl is-active "syncthing@${USERNAME}" > /dev/null 2>&1 \
            && SVC_RESTART "syncthing@${USERNAME}"
    fi



    main_rc=0
    break

done


#APP_DB_UPDATE="no"
SCRIPTEXIT
