From 223ae3e11ad73b70e5c70fbce31227f1e3324ddf Mon Sep 17 00:00:00 2001 From: billz Date: Wed, 8 Apr 2020 09:53:41 +0100 Subject: [PATCH] Aligns uninstall w/ #537 --- installers/uninstall.sh | 219 ++++++++++++++++++++++++++-------------- 1 file changed, 143 insertions(+), 76 deletions(-) diff --git a/installers/uninstall.sh b/installers/uninstall.sh index 802d1df7..e89ece5c 100755 --- a/installers/uninstall.sh +++ b/installers/uninstall.sh @@ -1,66 +1,95 @@ #!/bin/bash -raspap_dir="/etc/raspap" -raspap_user="www-data" -version=`sed 's/\..*//' /etc/debian_version` +# +# RaspAP uninstall functions +# Author: @billz +# License: GNU General Public License v3.0 +# +# You are not obligated to bundle the LICENSE file with your RaspAP projects as long +# as you leave these references intact in the header comments of your source files. -# Determine Raspbian version and set default home location for lighttpd -webroot_dir="/var/www/html" -if [ $version -eq 10 ]; then - version_msg="Raspbian 10.0 (Buster)" - php_package="php7.1-cgi" -elif [ $version -eq 9 ]; then - version_msg="Raspbian 9.0 (Stretch)" - php_package="php7.0-cgi" -else - version_msg="Raspbian 8.0 (Jessie) or earlier" - webroot_dir="/var/www" - php_package="php5-cgi" -fi +# Exit on error +set -o errexit +# Exit on error inside functions +set -o errtrace +# Turn on traces, disabled by default +# set -o xtrace -phpcgiconf="" -if [ "$php_package" = "php7.1-cgi" ]; then - phpcgiconf="/etc/php/7.1/cgi/php.ini" -elif [ "$php_package" = "php7.0-cgi" ]; then - phpcgiconf="/etc/php/7.0/cgi/php.ini" -elif [ "$php_package" = "php5-cgi" ]; then - phpcgiconf="/etc/php5/cgi/php.ini" -fi +# Set defaults +readonly raspap_dir="/etc/raspap" +readonly raspap_user="www-data" +readonly raspap_sudoers="/etc/sudoers.d/090_raspap" +readonly raspap_dnsmasq="/etc/dnsmasq.d/090_raspap.conf" +readonly raspap_sysctl="/etc/sysctl.d/90_raspap.conf" +readonly rulesv4="/etc/iptables/rules.v4" +webroot_dir="/var/www/html" + +# Determines host Linux distrubtion details +function _get_linux_distro() { + if type lsb_release >/dev/null 2>&1; then # linuxbase.org + OS=$(lsb_release -si) + RELEASE=$(lsb_release -sr) + CODENAME=$(lsb_release -sc) + DESC=$(lsb_release -sd) + elif [ -f /etc/os-release ]; then # freedesktop.org + . /etc/os-release + OS=$ID + RELEASE=$VERSION_ID + CODENAME=$VERSION_CODENAME + DESC=$PRETTY_NAME + else + _install_error "Unsupported Linux distribution" + fi +} + +# Sets php package option based on Linux version, abort if unsupported distro +function _set_php_package() { + case $RELEASE in + "18.04"|"19.10") # Ubuntu Server + php_package="php7.4-cgi" + phpcgiconf="/etc/php/7.4/cgi/php.ini" ;; + "10") + php_package="php7.3-cgi" + phpcgiconf="/etc/php/7.3/cgi/php.ini" ;; + "9") + php_package="php7.0-cgi" + phpcgiconf="/etc/php/7.0/cgi/php.ini" ;; + esac +} # Outputs a RaspAP Install log line -function install_log() { - echo -e "\033[1;32mRaspAP Install: $*\033[m" +function _install_log() { + echo -e "\033[1;32mRaspAP Uninstall: $*\033[m" } # Outputs a RaspAP Install Error log line and exits with status code 1 -function install_error() { - echo -e "\033[1;37;41mRaspAP Install Error: $*\033[m" +function _install_error() { + echo -e "\033[1;37;41mRaspAP Uninstall Error: $*\033[m" exit 1 } # Checks to make sure uninstallation info is correct -function config_uninstallation() { - install_log "Configure installation" - echo "Detected ${version_msg}" - echo "Install directory: ${raspap_dir}" - echo "Lighttpd directory: ${webroot_dir}" - echo -n "Uninstall RaspAP with these values? [y/N]: " +function _config_uninstallation() { + _install_log "Configure uninstall of RaspAP" + _get_linux_distro + echo "Detected ${DESC}" + echo "RaspAP install directory: ${raspap_dir}" + echo -n "Lighttpd install directory: ${webroot_dir}? [Y/n]: " read answer - if [[ $answer != "y" ]]; then + if [ "$answer" != "${answer#[Nn]}" ]; then + read -e -p "Enter alternate lighttpd directory: " -i "/var/www/html" webroot_dir + fi + echo "Uninstall from lighttpd directory: ${webroot_dir}" + echo -n "Uninstall RaspAP with these values? [Y/n]: " + read answer + if [[ "$answer" != "${answer#[Nn]}" ]]; then echo "Installation aborted." exit 0 fi } # Checks for/restore backup files -function check_for_backups() { +function _check_for_backups() { if [ -d "$raspap_dir/backups" ]; then - if [ -f "$raspap_dir/backups/interfaces" ]; then - echo -n "Restore the last interfaces file? [y/N]: " - read answer - if [[ $answer -eq 'y' ]]; then - sudo cp "$raspap_dir/backups/interfaces" /etc/network/interfaces - fi - fi if [ -f "$raspap_dir/backups/hostapd.conf" ]; then echo -n "Restore the last hostapd configuration file? [y/N]: " read answer @@ -89,63 +118,101 @@ function check_for_backups() { sudo cp "$raspap_dir/backups/php.ini" "$phpcgiconf" fi fi - if [ -f "$raspap_dir/backups/rc.local" ]; then - echo -n "Restore the last rc.local file? [y/N]: " - read answer - if [[ $answer -eq 'y' ]]; then - sudo cp "$raspap_dir/backups/rc.local" /etc/rc.local - else - echo -n "Remove RaspAP Lines from /etc/rc.local? [Y/n]: " - if [[ $answer -ne 'n' ]]; then - sed -i '/#RASPAP/d' /etc/rc.local - fi - fi - fi fi } # Removes RaspAP directories -function remove_raspap_directories() { - install_log "Removing RaspAP Directories" +function _remove_raspap_directories() { + _install_log "Removing RaspAP Directories" if [ ! -d "$raspap_dir" ]; then - install_error "RaspAP Configuration directory not found. Exiting!" + _install_error "RaspAP Configuration directory not found. Exiting." fi if [ ! -d "$webroot_dir" ]; then - install_error "RaspAP Installation directory not found. Exiting!" + _install_error "RaspAP Installation directory not found. Exiting." fi + sudo rm -rf "$webroot_dir"/* || _install_error "Unable to remove $webroot_dir" + sudo rm -rf "$raspap_dir" || _install_error "Unable to remove $raspap_dir" +} - sudo rm -rf "$webroot_dir"/* - sudo rm -rf "$raspap_dir" +# Removes raspapd.service +function _remove_raspap_service() { + _install_log "Removing raspapd.service" + sudo rm /lib/systemd/system/raspapd.service || _install_error "Unable to remove raspap.service file" + sudo systemctl daemon-reload + sudo systemctl disable raspapd.service || _install_error "Failed to disable raspap.service" + echo "Done." +} +# Restores networking config to pre-install defaults +function _restore_networking() { + _install_log "Restoring networking config to pre-install defaults" + echo "Disabling IP forwarding in $raspap_sysctl" + sudo rm $raspap_sysctl || _install_error "Unable to remove $raspap_sysctl" + sudo /etc/init.d/procps restart || _install_error "Unable to execute procps" + echo "Checking iptables rules" + rules=( + "-A POSTROUTING -j MASQUERADE" + "-A POSTROUTING -s 192.168.50.0/24 ! -d 192.168.50.0/24 -j MASQUERADE" + ) + for rule in "${rules[@]}"; do + if grep -- "$rule" $rulesv4 > /dev/null; then + rule=$(sed -e 's/^\(-A POSTROUTING\)/-t nat -D POSTROUTING/' <<< $rule) + echo "Removing rule: ${rule}" + sudo iptables $rule || _install_error "Unable to execute iptables" + removed=true + fi + done + # Persist rules if removed + if [ "$removed" = true ]; then + echo "Removing persistent iptables rules" + sudo iptables-save | sudo tee $rulesv4 > /dev/null || _install_error "Unable to execute iptables-save" + fi + echo "Done." } # Removes installed packages -function remove_installed_packages() { - install_log "Removing installed packages" - echo -n "Remove the following installed packages? lighttpd $php_package git hostapd dnsmasq vnstat [y/N]: " +function _remove_installed_packages() { + _install_log "Removing installed packages" + _set_php_package + if [ ${OS,,} = "debian" ] || [ ${OS,,} = "ubuntu" ]; then + dhcpcd_package="dhcpcd5" + else + dhcpcd_package="dnsmasq" + fi + echo -n "Remove the following installed packages? lighttpd hostapd iptables-persistent $php_package $dhcpcd_package vnstat qrencode [y/N]: " read answer if [ "$answer" != 'n' ] && [ "$answer" != 'N' ]; then echo "Removing packages." - sudo apt-get remove lighttpd $php_package git hostapd dnsmasq vnstat - sudo apt-get autoremove + sudo apt-get remove lighttpd hostapd iptables-persistent $php_package $dhcpcd_package vnstat qrencode || _install_error "Unable to remove installed packages" + sudo apt-get autoremove || _install_error "Unable to run apt autoremove" else echo "Leaving packages installed." fi } # Removes www-data from sudoers -function clean_sudoers() { - # should this check for only our commands? - sudo sed -i '/www-data/d' /etc/sudoers +function _remove_sudoers() { + _install_log "Removing sudoers permissions" + echo "Removing ${raspap_sudoers}" + sudo rm "$raspap_sudoers" || _install_error "Unable to remove $raspap_sudoers" + echo "Done." } -function remove_raspap() { - config_uninstallation - check_for_backups - remove_raspap_directories - remove_installed_packages - clean_sudoers +function _uninstall_complete() { + _install_log "Uninstall completed" + echo "It is recommended that you reboot your system as a final step." } -remove_raspap +function _remove_raspap() { + _config_uninstallation + _check_for_backups + _remove_raspap_service + _restore_networking + _remove_raspap_directories + _remove_installed_packages + _remove_sudoers + _uninstall_complete +} + +_remove_raspap