{ config, lib, ... }: { options.mj.base.snapshot = { enable = lib.mkEnableOption "Enable zfs snapshots"; mountpoints = lib.mkOption { default = {}; type = with lib.types; listOf str; }; }; config = lib.mkIf config.mj.base.snapshot.enable { services.sanoid = { enable = true; templates.prod = { hourly = 24; daily = 7; autosnap = true; autoprune = true; }; extraArgs = ["--verbose"]; datasets = let fs_zfs = lib.filterAttrs (_: v: v.fsType == "zfs") config.fileSystems; mountpoint2fs = builtins.listToAttrs (map (mountpoint: { name = mountpoint; value = builtins.getAttr mountpoint fs_zfs; }) config.mj.base.snapshot.mountpoints); s_datasets = lib.mapAttrs' (_mountpoint: fs: { name = fs.device; value = {use_template = ["prod"];}; }) mountpoint2fs; in s_datasets; }; }; }