2023-12-03 02:09:46 -05:00
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
restoreDir="/etc/restore"
|
|
|
|
|
|
|
|
function is_bin_in_path {
|
|
|
|
builtin type -P "$1" &>/dev/null
|
|
|
|
}
|
|
|
|
|
2023-12-03 06:02:44 -05:00
|
|
|
hook_before() {
|
2023-12-03 02:09:46 -05:00
|
|
|
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
|
|
|
|
|
|
|
|
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 <<EOF
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
if [[ ! -f "InstallOnly.list" ]]; then
|
|
|
|
echo "This needs to be run inside the restore directory."
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
if [[ ! -d "trusted.gpg.d" ]]; then
|
|
|
|
echo "This needs to be run inside the restore directory."
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
#apt-key add /etc/restore/Repo.keys
|
|
|
|
#dpkg --set-selections < /etc/restore/Package.list
|
|
|
|
#apt-get dselect-upgrade
|
|
|
|
|
|
|
|
install=""
|
|
|
|
|
|
|
|
echo " * Installing required packages"
|
|
|
|
dpkg-query -s 'rsync' &>/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
|
|
|
|
}
|
|
|
|
|
2023-12-03 06:02:44 -05:00
|
|
|
hook_after() {
|
2023-12-03 02:09:46 -05:00
|
|
|
:
|
|
|
|
}
|
|
|
|
|
2023-12-03 06:02:44 -05:00
|
|
|
hook_fail() {
|
|
|
|
:
|
|
|
|
}
|
|
|
|
|
|
|
|
hook_final() {
|
|
|
|
:
|
|
|
|
}
|
2023-12-03 02:09:46 -05:00
|
|
|
|
|
|
|
case "$1" in
|
2023-12-03 06:02:44 -05:00
|
|
|
before) hook_before || exit $?;;
|
|
|
|
after) hook_after || exit $?;;
|
|
|
|
fail) hook_final || exit $?;;
|
|
|
|
finally) hook_final || exit $?;;
|
2023-12-03 02:09:46 -05:00
|
|
|
esac
|