{ config, lib, pkgs, ... }: let cfg = config.mj.base.btrfssnapshot; in { options.mj.base.btrfssnapshot = { enable = lib.mkEnableOption "Enable btrfs snapshots"; subvolumes = lib.mkOption { default = { }; type = with lib.types; attrsOf (submodule { options = { label = lib.mkOption { type = str; }; keep = lib.mkOption { type = int; }; refreshInterval = lib.mkOption { type = str; }; }; }); }; }; config = lib.mkIf cfg.enable { systemd = { services = lib.mapAttrs' ( subvolume: params: lib.nameValuePair "btrfs-snapshot-${lib.strings.sanitizeDerivationName subvolume}" { description = "${params.label} btrfs snapshot for ${subvolume} (keep ${params.keep}"; serviceConfig.ExecStart = "${pkgs.btrfs-auto-snapshot} --verbose --label=${params.label} --keep=${params.keep} ${subvolume}"; } ); timers = lib.mapAttrs' ( subvolume: params: lib.nameValuePair "btrfs-snapshot-${lib.strings.sanitizeDerivationName subvolume}" { description = "${params.label} btrfs snapshot for ${subvolume}"; wantedBy = [ "timers.target" ]; timerConfig.OnCalendar = params.refreshInterval; } ); }; }; }