update/update
2024-07-23 19:57:36 +02:00

142 lines
5.2 KiB
Bash
Executable File

#!/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}"