#!/bin/bash restoreDir="/etc/restore" function is_bin_in_path { builtin type -P "$1" &>/dev/null } hook_check() { if ! is_bin_in_path aptitude; then echo "aptitude needs to be installed for backups to work properly." exit 1 fi if ! is_bin_in_path rsync; then echo "rsync needs to be installed for backups to work properly." exit 1 fi } hook_pre() { mkdir -p "$restoreDir" || exit 1 pushd "$restoreDir" || exit 2 dpkg --get-selections > Package.list aptitude search --disable-columns -F%p '~i!~M!~v' > InstallOnly.list #apt-key exportall > /etc/restore/Repo.keys cp -a /etc/apt/sources.list "$restoreDir/" rsync -avhHi /etc/apt/sources.list.d "$restoreDir/" rsync -avhHi /etc/apt/trusted.gpg.d "$restoreDir/" [[ -d /etc/apt/keyrings ]] && rsync -avhHi /etc/apt/keyrings "$restoreDir/" cat > restore.sh </dev/null || install+=" rsync" dpkg-query -s 'aptitude' &>/dev/null || install+=" aptitude" dpkg-query -s 'borgbackup' &>/dev/null || install+=" borgbackup" dpkg-query -s 'borgmatic' &>/dev/null || install+=" borgmatic" dpkg-query -s 'apt-transport-https' &>/dev/null || install+=" apt-transport-https" if [[ -n "\$install" ]]; then apt -y install \$install fi echo " * Enabling 32-bit packages" grep ':i386' InstallOnly.list &>/dev/null && dpkg --add-architecture i386 echo " * Restoring repositories and keys" cp -a sources.list /etc/apt/sources.list rsync --ignore-existing -raz sources.list.d/ /etc/apt/sources.list.d/ rsync --ignore-existing -raz trusted.gpg.d/ /etc/apt/trusted.gpg.d/ [[ -d keyrings ]] && rsync --ignore-existing -raz keyrings/ /etc/apt/keyrings/ apt update failinstall="" flatpak=0 echo " * Gathering installed packages" #xargs aptitude --schedule-only install < InstallOnly.list while read p; do if [[ "\$p" = "flatpak" ]]; then flatpak=1 fi dpkg-query -s "\$p" &>/dev/null if [[ "\$?" -eq 1 ]]; then aptitude --schedule-only install "\$p" if [[ "\$?" -ne 0 ]]; then if [[ -z "\$failinstall" ]]; then failinstall+="\$p" else failinstall+=", \$p" fi fi fi done < InstallOnly.list echo "Packages that failed to schedule for install:" echo "\$failinstall" echo " * Restoring installed packages (please confirm)" aptitude install if [[ "\$flatpak" -eq 1 ]]; then echo " * Adding flatpak repo: Flathub" flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo fi echo "Packages that failed to schedule for install:" echo "\$failinstall" EOF chmod ug+rx restore.sh popd || exit 2 } hook_post() { : } case "$1" in before_check) hook_check || exit $?;; before_backup) hook_pre || exit $?;; after_backup) hook_post || exit $?;; esac