{ config, lib, pkgs, ... }: let cfg = config.nomarchy.system.snapper; rootIsBtrfs = (config.fileSystems."/".fsType or "") == "btrfs"; active = cfg.enable && rootIsBtrfs; in { config = lib.mkIf active { # `nixos-rebuild-snap`: take a Snapper pre-rebuild snapshot, then run # `nixos-rebuild switch` against the current host. The hostname is read # from the running config so this script works on every machine without # editing. environment.systemPackages = [ (pkgs.writeShellScriptBin "nixos-rebuild-snap" '' if [ "$(id -u)" -ne 0 ]; then echo "This script must be run as root (use sudo)" >&2 exit 1 fi echo "Creating pre-rebuild snapshot..." ${pkgs.snapper}/bin/snapper -c root create \ -d "Pre-rebuild $(date +'%Y-%m-%d %H:%M:%S')" \ --cleanup-algorithm number echo "Rebuilding..." nixos-rebuild switch --flake .#${config.networking.hostName} "$@" '') ]; services.snapper.configs = { root = { SUBVOLUME = "/"; TIMELINE_CREATE = true; TIMELINE_CLEANUP = true; TIMELINE_LIMIT_HOURLY = "5"; TIMELINE_LIMIT_DAILY = "7"; TIMELINE_LIMIT_WEEKLY = "0"; TIMELINE_LIMIT_MONTHLY = "0"; TIMELINE_LIMIT_YEARLY = "0"; }; }; }; }