diff --git a/x-ui.sh b/x-ui.sh index 386e24cbe..7e7998fae 100644 --- a/x-ui.sh +++ b/x-ui.sh @@ -253,9 +253,20 @@ uninstall() { systemctl reset-failed fi + local panel_used_postgres="false" + local db_env_file + db_env_file="$(xui_env_file_path)" + if [[ -r "$db_env_file" ]] && grep -q '^XUI_DB_TYPE=postgres' "$db_env_file"; then + panel_used_postgres="true" + fi + rm /etc/x-ui/ -rf rm ${xui_folder}/ -rf - rm -f "$(xui_env_file_path)" + rm -f "$db_env_file" + + if [[ "$panel_used_postgres" == "true" ]] && postgresql_installed; then + purge_postgresql + fi echo "" echo -e "Uninstalled Successfully.\n" @@ -2727,6 +2738,63 @@ pg_require_installed() { fi } +# Completely removes the PostgreSQL server and ALL of its databases from the system. +# Gated behind an explicit confirmation because this is system-wide and irreversible: +# any other application sharing this PostgreSQL instance loses its data too. Mirrors the +# package names used by pg_install_local() so the right packages are removed per distro. +purge_postgresql() { + echo "" + echo -e "${yellow}This panel was using PostgreSQL.${plain}" + echo -e "${red}WARNING:${plain} purging removes the PostgreSQL server and ${red}ALL${plain} of its databases on" + echo -e "this machine, including any used by other applications. This cannot be undone." + confirm "Also purge PostgreSQL and delete all of its data?" "n" + if [[ $? != 0 ]]; then + LOGI "Left PostgreSQL installed; its data was not removed." + return 0 + fi + + if [[ $release == "alpine" ]]; then + rc-service postgresql stop 2> /dev/null + rc-update del postgresql 2> /dev/null + else + systemctl stop "$(pg_systemd_unit)" 2> /dev/null + systemctl disable "$(pg_systemd_unit)" 2> /dev/null + fi + + case "${release}" in + ubuntu | debian | armbian) + apt-get -y --purge remove 'postgresql*' + apt-get -y autoremove --purge + ;; + fedora | amzn | virtuozzo | rhel | almalinux | rocky | ol) + dnf remove -y postgresql postgresql-server postgresql-contrib + ;; + centos) + if [[ "${VERSION_ID}" =~ ^7 ]]; then + yum remove -y postgresql postgresql-server postgresql-contrib + else + dnf remove -y postgresql postgresql-server postgresql-contrib + fi + ;; + arch | manjaro | parch) + pacman -Rns --noconfirm postgresql + ;; + opensuse-tumbleweed | opensuse-leap) + zypper -q remove -y postgresql postgresql-server postgresql-contrib + ;; + alpine) + apk del postgresql postgresql-contrib postgresql-client + ;; + *) + LOGE "Unsupported distro for automatic PostgreSQL purge: ${release}. Remove it manually." + return 1 + ;; + esac + + rm -rf /var/lib/postgresql /var/lib/pgsql /var/lib/postgres /etc/postgresql + LOGI "PostgreSQL has been purged." +} + # Installs a local PostgreSQL server and creates a dedicated xui user/database. # Progress goes to stderr; on success the connection DSN is printed to stdout so # callers can capture it. Mirrors install_postgres_local() from install.sh, so the