From 270cb8d3dd67d4d3cf895a52dc1714df8f8074c0 Mon Sep 17 00:00:00 2001 From: zapp-brannigan <42693598+zapp-brannigan@users.noreply.github.com> Date: Mon, 26 Dec 2022 15:25:49 +0100 Subject: [PATCH 1/3] Add support for systems with /boot outside the @-subvolume --- snapper-rollback.conf | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/snapper-rollback.conf b/snapper-rollback.conf index 9f8c57f..6ac9de8 100644 --- a/snapper-rollback.conf +++ b/snapper-rollback.conf @@ -28,3 +28,10 @@ mountpoint = /btrfsroot # mount this device there before rolling back. This parameter is optional, but # if unset, you'll have to mount your btrfs root manually. #dev = /dev/sda42 + +# If your /boot is located outside the `subvol_main` you have to back it up manually. +# Please use the pacman-hook suggested in +# https://wiki.archlinux.org/title/System_backup#Snapshots_and_/boot_partition +# In such a case set `external_boot` to True +external_boot = False +boot_backup_dir = /.bootbackup From 1ef412d8780e85674275a7bebc93e75ff7bde1ec Mon Sep 17 00:00:00 2001 From: zapp-brannigan <42693598+zapp-brannigan@users.noreply.github.com> Date: Mon, 26 Dec 2022 15:27:23 +0100 Subject: [PATCH 2/3] Add support for systems with /boot outside the @-subvolume --- snapper-rollback.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/snapper-rollback.py b/snapper-rollback.py index 859a27b..8a3cfb8 100755 --- a/snapper-rollback.py +++ b/snapper-rollback.py @@ -125,10 +125,23 @@ def rollback(subvol_main, subvol_main_newname, subvol_rollback_src, dev, dry_run os.rename(subvol_main_newname, subvol_main) +def rollback_boot_partiton(boot_backup_dir,dry_run): + full_path = boot_backup_dir+"/boot" + if dry_run: + LOG.info("rm -rf /boot/*") + LOG.info("cp -a {}/* /boot/".format(full_path)) + else: + os.system("rm -rf /boot/*") + os.system("cp -a {}/* /boot/".format(full_path)) + + def main(): args = parse_args() config = read_config(args.config) - + + if os.path.ismount("/boot") and config.get("root", "external_boot") == "False": + LOG.warning("/boot is outside the `subvol_main`, your system may not boot after rollback!") + mountpoint = pathlib.Path(config.get("root", "mountpoint")) subvol_main = mountpoint / config.get("root", "subvol_main") subvol_rollback_src = ( @@ -164,6 +177,12 @@ def main(): except PermissionError as e: LOG.fatal("Permission denied: {}".format(e)) exit(1) + try: + if config.get("root", "external_boot") == "True" and os.path.ismount("/boot"): + boot_backup_dir = str(subvol_rollback_src) + config.get("root", "boot_backup_dir") + rollback_boot_partiton(boot_backup_dir,dry_run=args.dry_run) + except Exception as e: + LOG.fatal("Error: {}".format(e)) if __name__ == "__main__": From fd6b05acd93dc68a61a4328e0ddf86d6d7f7738b Mon Sep 17 00:00:00 2001 From: zapp-brannigan <42693598+zapp-brannigan@users.noreply.github.com> Date: Mon, 26 Dec 2022 15:48:44 +0100 Subject: [PATCH 3/3] Set default value for "external_boot" --- snapper-rollback.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snapper-rollback.py b/snapper-rollback.py index 8a3cfb8..bbee228 100755 --- a/snapper-rollback.py +++ b/snapper-rollback.py @@ -50,7 +50,7 @@ def parse_args(): def read_config(configfile): - config = configparser.ConfigParser() + config = configparser.ConfigParser({"external_boot":"False"}) config.read(configfile) return config