#!/usr/bin/bash VERSION="3.2" IGREEN="\033[0;92m" # Intense Green IYELLOW="\033[0;93m" # Intense Yellow IRED='\033[0;91m' # Red NO_COLOR="\033[0m" # Text Reset TMP="/tmp/update" DATE="$(date +"%Y-%m-%dT%H:%M:%S%:z")" # RFC 3339 date-time https://datatracker.ietf.org/doc/html/rfc3339#section-5.6 trap interrupt_function INT interrupt_function() { echo -e "${IRED}\nInterrupt has been detected${NO_COLOR}" if [ -f /var/lib/pacman/db.lck ]; then echo -e "${IRED}Trying to unlock the pacman db. Please enter your password.${NO_COLOR}" su --command="rm --force /var/lib/pacman/db.lck" fi [[ -d $TMP ]] && rm --recursive --force "$TMP" [[ -f "$BACKUP_LOCATION"/before-backup_"$DATE".tar.zst.new ]] && rm --force "$BACKUP_LOCATION"/before-backup_"$DATE".tar.zst.new [[ -f "$BACKUP_LOCATION"/after-backup_"$DATE".tar.zst.new ]] && rm --force "$BACKUP_LOCATION"/after-backup_"$DATE".tar.zst.new exit 1 } help() { echo "Usage: update [OPTION]" echo "options:" echo "--help displays this message" echo "--preview shows a preview of pkg's and flatpaks which can be updated" echo "--version prints out the version number" } source "$HOME"/.config/update.conf || echo -e "${IRED}No config found${NO_COLOR}" || exit 1 if [[ ${1:0:2} == \-\- ]]; then case "${1:2}" in help) help ;; preview) "$PACMAN_WRAPPER" -Syy "$PACMAN_WRAPPER" --query --upgrades [[ -x /usr/bin/flatpak ]] && flatpak remote-ls --updates ;; version) echo "$VERSION" ;; ?) help; exit 1;; esac exit 0 fi check_for_valid_backup_location() { if [ ! -d $1 ]; then echo -e "${IYELLOW}$1 doesn't exist${NO_COLOR}" read -p "Do you want to create the path and continue? [y/N]" input case $input in [Yy]) mkdir --parents "$1" ;; [Nn]) exit 0;; * ) exit 0 ;; esac fi } if [ $BACKUP_LOCATION ]; then check_for_valid_backup_location "$BACKUP_LOCATION" else echo -e "${IRED}No BACKUP_LOCATION in $HOME/.config/update.conf specified${NO_COLOR}" exit 1 fi [[ $SECONDARY_BACKUP_LOCATION ]] && check_for_valid_backup_location "$SECONDARY_BACKUP_LOCATION" lock_pacman_db() { if [ -f /var/lib/pacman/db.lck ]; then echo -e "${IYELLOW}->${NO_COLOR} /var/lib/pacman/db.lck exists" echo -e "${IYELLOW}->${NO_COLOR} there might be another instance of pacman running. exiting..." exit 1 fi echo -e "${IYELLOW}Trying to lock the pacman db. Please enter your password.${NO_COLOR}" su --command="touch /var/lib/pacman/db.lck" } unlock_pacman_db() { echo -e "${IYELLOW}Trying to unlock the pacman db. Please enter your password.${NO_COLOR}" su --command="rm --force /var/lib/pacman/db.lck" } delete_oldest_backup() { if [[ $(find $BACKUP_LOCATION -name '*$1*' -exec printf %c {} + | wc -c) -ge $BACKUP_AMOUNT ]]; then rm --force $(find "$BACKUP_LOCATION" -name '*$1*' | sort -rn | head -1) fi } before_backup() { lock_pacman_db [[ -d $TMP ]] && rm --recursive --force "$TMP" mkdir --parents "$TMP"/before-backup_"$DATE" "$TMP"/after-backup_"$DATE" pacman --verbose --query > "$TMP"/before-backup_"$DATE"/pacman-before.txt [[ -x /usr/bin/flatpak ]] && flatpak list --all --show-details > "$TMP"/before-backup_"$DATE"/flatpak-before.txt tar --create --zstd --file "$TMP"/before-backup_"$DATE".tar.zst.new "$TMP"/before-backup_"$DATE" /var/lib/pacman/local cp "$TMP"/before-backup_"$DATE".tar.zst.new "$BACKUP_LOCATION" [[ $SECONDARY_BACKUP_LOCATION ]] && cp "$TMP"/before-backup_"$DATE".tar.zst.new "$SECONDARY_BACKUP_LOCATION" unlock_pacman_db } after_backup() { lock_pacman_db pacman --verbose --query > "$TMP"/after-backup_"$DATE"/pacman-after.txt [[ -x /usr/bin/flatpak ]] && flatpak list --all --show-details > "$TMP"/after-backup_"$DATE"/flatpak-after.txt tar --create --zstd --file "$TMP"/after-backup_"$DATE".tar.zst.new "$TMP"/after-backup_"$DATE" cp "$TMP"/after-backup_"$DATE".tar.zst.new "$BACKUP_LOCATION" [[ $SECONDARY_BACKUP_LOCATION ]] && cp "$TMP"/after-backup_"$DATE".tar.zst.new "$SECONDARY_BACKUP_LOCATION" delete_oldest_backup after-backup mv "$BACKUP_LOCATION"/after-backup_"$DATE".tar.zst.new "$BACKUP_LOCATION"/after-backup_"$DATE".tar.zst [[ $SECONDARY_BACKUP_LOCATION ]] && mv "$SECONDARY_BACKUP_LOCATION"/after-backup_"$DATE".tar.zst.new "$SECONDARY_BACKUP_LOCATION"/after-backup_"$DATE".tar.zst delete_oldest_backup before-backup mv "$BACKUP_LOCATION"/before-backup_"$DATE".tar.zst.new "$BACKUP_LOCATION"/before-backup_"$DATE".tar.zst [[ $SECONDARY_BACKUP_LOCATION ]] && mv "$SECONDARY_BACKUP_LOCATION"/before-backup_"$DATE".tar.zst.new "$SECONDARY_BACKUP_LOCATION"/before-backup_"$DATE".tar.zst unlock_pacman_db rm --recursive --force "$TMP" } update() { "$PACMAN_WRAPPER" if [[ -x /usr/bin/flatpak ]]; then flatpak update --assumeyes flatpak list --all --show-details > "$TMP"/after-backup_"$DATE"/flatpak-after.txt fi } before_backup && echo -e "${IGREEN}before-backup complete${NO_COLOR}" update after_backup && echo -e "${IGREEN}after-backup complete${NO_COLOR}"