#!/bin/bash

#
# Name:         reset-rsb-apache
# Version:      1.0.2
# Description:  Reset RSB Apache2 configuration to factory default.
#
# (c) 2020-2023, Rapidseedbox, alexey@rapidseedbox.com
#                              boban@rapidseedbox.com
#

set -o pipefail

export LANG="en_US"
export PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"

SC_NAME="$( basename "${0}" )"
SC_VER="$( grep -m 1 -E '^#\s*Version:\s+' "${0}" | awk '{print $NF}' )"
SC_PID="$$"

if ! id "user" > /dev/null 2>&1 ; then
    echo "ERROR: 'user' account not found !!!"
    exit 1
fi

if [ ! -d "/etc/apache2" ] ; then
    echo "ERROR: /etc/apache2: Path not found !!!"
    exit 1
fi

case "${1}" in
  "--force")
      ;;
  *)
      cat <<- EOF
	Usage:
	    ${SC_NAME} --force

	!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	!!!                                                                                      !!!
	!!!  This command will reset your Apache2 Web Server configuration to factory defaults.  !!!
	!!!                                                                                      !!!
	!!!                               You've been warned :)                                  !!!
	!!!                               USE AT YOUR OWN RISK                                   !!!
	!!!                                                                                      !!!
	!!!                                    Good luck!                                        !!!
	!!!                                                                                      !!!
	!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	EOF
      exit 0
      ;;
esac


LSB_RELEASE="$( lsb_release -sc )"

case "${LSB_RELEASE,,}" in
  "xenial")
      archive_suffix="16.04"
      ;;
  "bionic")
      archive_suffix="18.04"
      ;;
  "focal")
      archive_suffix="20.04"
      ;;
  "jammy")
      archive_suffix="22.04"
      ;;
  *)
      echo "Unsupported distribution... Exiting"
      exit 1
      ;;
esac

A2ENCONF="a2enconf"
A2ENMOD="a2enmod"
A2ENSITE="a2ensite"

USERNAME="user"
USERUID="$( getent passwd ${USERNAME} | awk -F: '{print $3}' )"
USERHOME="$( getent passwd ${USERNAME} | awk -F: '{print $6}' )"

echo ">>> Archive suffix: "$archive_suffix
echo ">>> RESET APACHE CONFIG v${SC_VER}"

TMP_DIR="/var/tmp/${SC_NAME}.${SC_PID}"
[ ! -d "${TMP_DIR}" ] && mkdir -p "${TMP_DIR}"


_exit () {
    local _rc="${1}"
    [ -d "${TMP_DIR}" ] && rm -rf "${TMP_DIR}"
    exit ${_rc}
}

echo ">>> Downloading 'apache2' config for '${LSB_RELEASE}' ..."
wget \
     -q \
     --no-check-certificate \
     --timeout=30 \
     --tries=15 \
     -O "${TMP_DIR}/apache2.tar.gz" \
   "https://rsb-supp.rapidseedbox.com/scripts/apache2_${archive_suffix}.tar.gz"
_rc=$?
if [ "${_rc}" != "0" ] ; then 
    echo "Failed to download from monitor.rapidseedbox.com !!! (RC: ${_rc})"
    [ -e "${TMP_DIR}/apache2.tar.gz" ] \
        rm -f "${TMP_DIR}/apache2.tar.gz" > /dev/null 2>&1
    _exit ${_rc}
fi

echo ">>> Downloading 'apache2' userconf-enabled tarball ..."
wget \
      -q \
      --no-check-certificate \
      --timeout=30 \
      --tries=15 \
      -O "${TMP_DIR}/userconf.tar.gz" \
    "https://rsb-supp.rapidseedbox.com/scripts/rsb-apache2-default-userconf-enabled.tar.gz"
_rc=$?
if [ "${_rc}" != "0" ] ; then
    echo "!!! WGET: ERROR (RC: ${_rc}) !!!"
    _exit ${_rc}
fi

_apache2_need_restart="no"
if systemctl is-active "apache2" > /dev/null 2>&1 ; then
    _apache2_need_restart="yes"
    echo ">>> Stopping apache2 service..."
    _svc stop apache2
fi

_tstamp="$( date -u '+%Y%m%d%H%M%S' )"

echo ">>> Creating backup of /etc/apache2 in /var/rsb-backup/etc-apache2.${_tstamp}"
[ -d "/var/rsb-backup" ] || mkdir -vp -d "/var/rsb-backup"
mv -f "/etc/apache2" "/var/rsb-backup/etc-apache2.${_tstamp}"

echo ">>> Extracting apache2 config ..."
tar -zxf "${TMP_DIR}/apache2.tar.gz" -C /
_rc=$?
if [ "${_rc}" != "0" ] ; then 
    echo "!!! Failed to extract archive !!! (RC: ${_rc})"
    _exit ${_rc}
fi

echo ">>> Restoring 'apache2' userconf ..."
echo ">>>>>> Extracting 'userconf' templates tarball ..."
tar -zxf "${TMP_DIR}/userconf.tar.gz" -C "${TMP_DIR}/"
_rc=$?
if [ "${_rc}" != "0" ] ; then
    echo "!!! TAR zxf: ERROR (RC: ${_rc}) !!!"
    _exit ${_rc}
fi
# --
# -- Applications declaration
declare -A APPS
APPS["AriaNG"]="${USERHOME}/ariang,${USERHOME}/.config/ariang,/etc/systemd/system/ariang@.service|ariang-${USERNAME}.conf|"
APPS["Bazarr"]="/opt/bazarr,${USERHOME}/.config/bazarr,/etc/systemd/system/bazarr@.service|bazarr-${USERNAME}.conf|"
APPS["CherryMusic"]="/etc/systemd/system/cherrymusic@.service|cherrymusic-${USERNAME}.conf|"
APPS["CloudCmd"]="/etc/systemd/system/cloudcmd@.service|cloudcmd-${USERNAME}.conf|"
APPS["FileCommander"]="${USERHOME}/.config/filecommander,/usr/local/bin/filecommander,/etc/systemd/system/filecommander@.service|filecommander-${USERNAME}.conf|"
APPS["Flood"]="${USERHOME}/flood,/etc/systemd/system/flood@.service|flood-${USERNAME}.conf|"
APPS["Librespeed"]="/var/www/librespeed|librespeed-${USERNAME}.conf|"
APPS["Lidarr"]="${USERHOME}/.config/lidarr,/opt/Lidarr,/etc/systemd/system/lidarr@.service|lidarr-${USERNAME}.conf|"
APPS["Madsonic"]="/etc/default/madsonic|madsonic.conf|"
APPS["NZBGet"]="${USERHOME}/.config/nzbget,/etc/systemd/system/nzbget@.service|nzbget-${USERNAME}.conf|"
APPS["Ombi"]="/opt/Ombi,/etc/systemd/system/ombi.service|ombi.conf|proxy,proxy_http,proxy_ajp,rewrite,deflate,headers,proxy_balancer,proxy_connect,proxy_html"
APPS["Organizr"]="/var/www/organizr,/var/www/db|organizr.conf|"
APPS["Prowlarr"]="${USERHOME}/.config/prowlarr,/opt/Prowlarr,/etc/systemd/system/prowlarr@.service|prowlarr-${USERNAME}.conf|"
APPS["qBittorrent WebUI"]="${USERHOME}/.config/qBittorrent,/etc/systemd/system/qbittorrent@.service|qbittorrent.conf,qbittorrent-${USERNAME}.conf|"
APPS["Radarr"]="${USERHOME}/.config/radarr,/opt/Radarr,/etc/systemd/system/radarr@.service|radarr-${USERNAME}.conf|"
APPS["Rclone WebUI"]="/etc/systemd/system/rclonewebui@.service|rclonewebui.conf|"
APPS["Readarr"]="${USERHOME}/.config/readarr,/opt/Readarr,/etc/systemd/system/readarr@.service|readarr-${USERNAME}.conf|"
APPS["ruTorrent UI"]="/var/www/rutorrent,/var/www/session|rutorrent-user.conf,rtorrentscgi-${USERNAME}.conf|proxy,proxy_http,proxy_scgi,headers,rewrite"
APPS["Sabnzbd"]="${USERHOME}/.sabnzbd,/etc/systemd/system/sabnzbd@.service|sabnzbd-${USERNAME}.conf|"
APPS["SickChill"]="${USERHOME}/.config/sickchill,/etc/systemd/system/sickchill@.service|sickchill.conf|"
APPS["Sonarr"]="${USERHOME}/.config/sonarr,/etc/systemd/system/sonarr@.service|sonarr-${USERNAME}.conf|"
APPS["Subsonic"]="/etc/default/subsonic|subsonic.conf|"
APPS["SyncThing"]="${USERHOME}/.config/syncthing,/etc/systemd/system/syncthing@.service|syncthing-${USERNAME}.conf|"
APPS["WebSSH"]="/opt/WebSSH2,/etc/systemd/system/webssh.service|webssh.conf|"
APPS["Wireguard"]="/etc/wireguard,/var/www/html/wireguard|wireguard.conf|"
# --
for _app in "${!APPS[@]}" ; do
    _files_list="$( awk -F'|' '{print $1}' <<< "${APPS[${_app}]}" )"
    _confs_list="$( awk -F'|' '{print $2}' <<< "${APPS[${_app}]}" )"
    _mods_list="$( awk -F'|' '{print $3}' <<< "${APPS[${_app}]}" )"
    _err=0
    for _f in $( tr ',' ' ' <<< "${_files_list}" ) ; do
        [ ! -e "${_f}" ] && (( _err ++ ))
    done
    [ "${_err}" != "0" ] && continue
    echo "-- $( printf "%-15s" "${_app}" ): Restoring default Web configuration ..."
    for _c in $( tr ',' ' ' <<< "${_confs_list}" ) ; do
        [ -e "${TMP_DIR}/${_c}" ] \
            && cp -vf "${TMP_DIR}/${_c}" "/etc/apache2/userconf-enabled/"
    done
    if [ -n "${_mods_list}" ] ; then
        echo "-- $( printf "%-15s" "${_app}" ): Restoring Apache2 modules configuration  ..."
        for _m in $( tr ',' ' ' <<< "${_mods_list}" ) ; do
             ${A2ENMOD} "${_m}" 2>&1 | grep -v -E '^Module .* already enabled'
        done
    fi
done

# -- Configure "non-standard" applications
# --
# -- 1. Nextcloud Server
# --
if [ -d "/var/www/nextcloud" ] ; then
    APP_DIRECTORY="/var/www/nextcloud"
    echo "-- $( printf "%-15s" "Nextcloud" ): Restoring default Web configuration ..."
    cat <<-EOF > "/etc/apache2/sites-available/nextcloud.conf"
	Alias /nextcloud "${APP_DIRECTORY}/"

	<Directory ${APP_DIRECTORY}/>
	  Options +FollowSymlinks
	  AllowOverride All
	  Require all granted

	 <IfModule mod_dav.c>
	  Dav off
	 </IfModule>

	 SetEnv HOME ${APP_DIRECTORY}
	 SetEnv HTTP_HOME ${APP_DIRECTORY}

	</Directory>
	EOF
    ${A2ENSITE} "nextcloud.conf"
    echo "-- $( printf "%-15s" "Nextcloud" ): Restoring Apache2 modules configuration  ..."
    for _m in "headers" "rewrite" "env" "dir" "mime" ; do
        ${A2ENMOD} "${_m}" 2>&1 | grep -v -E '^Module .* already enabled'
    done
fi
# --
# -- 2. elFinder
# --
if [ -d "/var/www/html/elfinder" ] ; then
    APP_DIRECTORY="/var/www/html/elfinder"
    echo "-- $( printf "%-15s" "elFinder" ): Restoring default Web configuration ..."
    cat <<-EOF > "/etc/apache2/conf-enabled/elfinder.conf"
	<Directory ${APP_DIRECTORY}/>
	       Options Indexes FollowSymLinks
	       AllowOverride All
	       Require all granted
	</Directory>
	EOF
fi
# --
# -- 3. Pydio
# --
if [ -d "/usr/share/pydio" ] && [ -e "/etc/pydio/apache2.conf" ] ; then
    APP_DIRECTORY="/usr/share/pydio"
    echo "-- $( printf "%-15s" "Pydio" ): Restoring default Web configuration ..."
    ln -svf "/etc/pydio/apache2.conf" \
            "/etc/apache2/conf-available/pydio.conf"
    ln -svf "../conf-available/pydio.conf" \
            "/etc/apache2/conf-enabled/pydio.conf"
fi
# --
# -- 4. Ampache
# --
if [ -d "/usr/share/ampache/www" ] ; then
    APP_DIRECTORY="/usr/share/ampache/www"
    echo "-- $( printf "%-15s" "Ampache" ): Restoring default Web configuration ..."
    ln -svf "../../ampache/ampache.conf" \
            "/etc/apache2/conf-available/ampache.conf"
    ln -svf "../conf-available/ampache.conf" \
            "/etc/apache2/conf-enabled/ampache.conf"
fi


echo ">>> Checking 'apache2' configuration syntax ..."
_msg="$( apachectl -t 2>&1 )"
_rc=$?
if [ "${_rc}" != "0" ] ; then 
    echo "!!! apachectl: SYNTAX CHECK FAILED !!! (RC: ${_rc})"
    [ -n "${_msg}" ] && echo "${_msg}"
    _exit ${_rc}
fi

echo ">>> Regenerating certificates ..."
regen-cert
_rc=$?
if [ "${_rc}" != "0" ] ; then 
    echo "!!! Certificate generation FAILED !!! (RC: ${_rc})"
    _exit ${_rc}
fi

if [ "${_apache2_need_restart}" = "yes" ] ; then
    echo ">>> Restarting apache2 service"
    _svc restart apache2
    _rc=$?
    if [ "${_rc}" != "0" ] ; then 
        echo "!!! Failed to start apache2 service !!! (RC: ${_rc})"
        _exit ${_rc}
    fi
else
    echo "*** Run '_svc restart apache2' if needed"
fi

if which "easy-ssl" > /dev/null 2>&1 ; then
    echo -ne ">>> Regenerating EASY-SSL configuration ...\n"
    easy-ssl -f
    echo -ne "\n\n"
fi

if which "changeseedboxpass" > /dev/null 2>&1 \
   && [ -e "/var/local/passwd/user" ] ; then
    _password="$( awk -F ':' '$1 == "userdir" {print $2}' "/var/local/passwd/user" )"
    if [ -n "${_password}" ] ; then
        echo ">>> Restoring 'user' password for 'UserDir'service ..."
        changeseedboxpass "user" "userdir" "${_password}"
    fi
    _password="$( awk -F ':' '$1 == "transmission" {print $2}' "/var/local/passwd/user" )"
    if [ -n "${_password}" ] ; then
        echo ">>> Restoring 'user' password for 'transmission'service ..."
        changeseedboxpass "user" "transmission" "${_password}"
    fi
fi

echo ""
echo "*** All operations finished successfuly"
echo "*** Please use 'changeseedboxpass' to change all passwords to client's password !!!"
echo "*** Please check accesibility of RSB services (rutorrent, deluge ... etc)"
echo "*** You might need to reinstall some applcations that use Apache2 Web server (install-app / OCI)"

_exit 0
