#!/bin/bash

# 4RCH maintenance
# Revision: 2022.04.22 -- by eznix (https://sourceforge.net/projects/ezarch/)
# (GNU/General Public License version 3.0)

# ---------------------------------------
# Define Functions:
# ---------------------------------------

handlerror () {
  clear
  set -uo pipefail
  trap 's=$?; echo "$0: Error on line "$LINENO": $BASH_COMMAND"; exit $s' ERR
}

welcomer () {
  clear
  echo "==================================================="
  echo "=                                                 ="
  echo "=     4RCH Maintenance Script                     ="
  echo "=                                                 ="
  echo "=                                                 ="
  echo "=     Version 2.3  (Release)                      ="
  echo "=                                                 ="
  echo "=     Brought to you by M3DEV                     ="
  echo "=     https://github.com/M4RT1NDEV/4rch-linux     ="
  echo "=                                                 ="
  echo -e "=================================================== \n"
  sleep 4
}

failedsrvs () {
  clear
  systemctl --failed > /tmp/failedsrvs
  nano /tmp/failedsrvs
  clear
  echo -e "\n"
  rm /tmp/failedsrvs
  clear
}

journalchk () {
  clear
  journalctl -p 3 -xb > /tmp/journalchk
  nano /tmp/journalchk
  clear
  echo -e "\n"
  rm /tmp/journalchk
  clear
}

journalcln () {
  clear
  journalctl --vacuum-time=2weeks
  clear
  echo -e "\n"
  echo "Journal directory cleaned"
  sleep 2
  clear
}

sysupdate () {
  clear
  pacman -Syu
  clear
  echo -e "\n"
  echo "Full system upgrade finished"
  sleep 2
  clear
}

pkgsccache () {
  clear
  pacman -Scc
  clear
  echo -e "\n"
  echo "Package cache cleaned"
  sleep 2
  clear
}

keysreset () {
  clear
  rm /var/lib/pacman/sync/*
  rm -rf /etc/pacman.d/gnupg/*
  pacman-key --init
  pacman-key --populate
  pacman -S --noconfirm archlinux-keyring
  clear
  echo -e "\n"
  echo "All pacman keys are reset"
  sleep 2
  clear
}

usercachecln () {
  clear
  echo "[Unit]
Description=Clean primary user cache on boot.

[Service]
Type=simple
ExecStart=/bin/bash /usr/local/bin/clnusercache.sh

[Install]
WantedBy=multi-user.target" > /usr/lib/systemd/system/clnusercache.service
  echo "#!/bin/bash 
rm -r /home/*/.cache/*
rm /etc/systemd/system/multi-user.target.wants/clnusercache.service" > /usr/local/bin/clnusercache.sh
  chmod +x /usr/local/bin/clnusercache.sh
  ln -sf /usr/lib/systemd/system/clnusercache.service /etc/systemd/system/multi-user.target.wants/clnusercache.service
  clear
  echo -e "\n"
  echo "User's cache directory cleaned on next boot"
  sleep 3
  clear
}

runreflector () {
  clear
  reflector --latest 10 --sort rate --protocol https --save /etc/pacman.d/mirrorlist
  clear
  echo -e "\n"
  echo "Mirrorlist regenerated"
  sleep 2
  clear
}

enfirewall () {
  clear
  systemctl enable firewalld.service
  systemctl start firewalld.service
  clear
  echo "Firewalld Service is enabled"
  sleep 2
  clear
}

mainmenu () { while true
do
  clear
  echo "-------------------------------------"
  echo " 4RCH Maintenance Script"
  echo "-------------------------------------"
  echo ""
  echo "  1) Failed systemd services"
  echo "  2) Check journal logs"
  echo "  3) Cleanup journal space"
  echo "  4) Run system update"
  echo "  5) Clean package cache"
  echo "  6) Reset all pacman keys"
  echo "  7) Clean user cache on next boot"
  echo "  8) Regenerate mirrorlist"
  echo "  9) Enable Firewalld Service"

  echo ""
  echo "  X) Exit"
  echo -e "\n"
  read -p "Enter your choice: " optionA
  case $optionA in
    1 ) failedsrvs ;;
    2 ) journalchk ;;
    3 ) journalcln ;;
    4 ) sysupdate ;;
    5 ) pkgsccache ;;
    6 ) keysreset ;;
    7 ) usercachecln ;;
    8 ) runreflector ;;
    9 ) enfirewall ;;
    x|X ) exit;;
    * ) invalid ;;
  esac
done
}

ROOTUSER () {
  if [[ "$EUID" = 0 ]]; then
    continue
  else
    echo "Please Run As Root"
    sleep 2
    exit
  fi
}

ROOTUSER
handlerror
welcomer
mainmenu

done

# Disclaimer:
# THIS SOFTWARE IS PROVIDED BY EZNIX “AS IS” AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL EZNIX BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

# END
