{ config, pkgs, lib, flakeInputs, ... }: with lib; let zfssnap = flakeInputs.mach-nix.lib.${config.nixpkgs.system}.buildPythonPackage rec { pname = "zfssnap"; src = ./zfssnap; version = "0.0.0"; ignoreDataOutdated = true; requirements = '' pyxdg pytimeparse python-dateutil ''; postInstall = '' wrapProgram $out/bin/zfssnap \ --prefix PATH : ${makeBinPath [config.boot.zfs.package]} ''; }; cfg = config.services.zfssnap; in { options = { services.zfssnap = { enable = mkEnableOption "zfssnap service"; config = mkOption { type = types.submodule { options = { keep = mkOption { type = with types; attrsOf str; default = { within = "15m"; "5m" = "48"; "15m" = "32"; hourly = "48"; "4h" = "24"; "12h" = "12"; daily = "62"; halfweekly = "32"; weekly = "24"; monthly = "-1"; }; }; exec = mkOption { type = with types; attrsOf str; default = {}; }; }; }; }; snapInterval = mkOption { type = types.str; default = "*-*-* *:00/5:00"; }; verbosity = mkOption { type = types.int; default = 2; }; extraPruneArgs = mkOption { type = with types; listOf str; default = []; }; extraAutosnapArgs = mkOption { type = with types; listOf str; default = []; }; }; }; config = mkIf cfg.enable { systemd.services."zfssnap" = { description = "Create automatic ZFS snapshots"; after = [ "zfs-import.target" ]; wants = [ "zfssnap-prune.service" ]; before = [ "zfssnap-prune.service" ]; serviceConfig = { Type = "oneshot"; ExecStart = "${zfssnap}/bin/zfssnap --verbosity=${toString cfg.verbosity} autosnap ${escapeShellArgs cfg.extraAutosnapArgs}"; LogRateLimitIntervalSec = 0; }; }; systemd.services."zfssnap-prune" = { description = "Prune automatic ZFS snapshots"; after = [ "zfs-import.target" "zfssnap.service" ]; serviceConfig = { Type = "oneshot"; ExecStart = let mkSectionName = name: strings.escape [ "[" "]" ] (strings.toUpper name); zfssnapConfig = generators.toINI { inherit mkSectionName; } cfg.config; in "${zfssnap}/bin/zfssnap --verbosity=${toString cfg.verbosity} prune --config=${pkgs.writeText "zfssnap.ini" zfssnapConfig} ${escapeShellArgs cfg.extraPruneArgs}"; LogRateLimitIntervalSec = 0; }; }; systemd.timers."zfssnap" = { wantedBy = ["timers.target"]; timerConfig = { OnCalendar = cfg.snapInterval; Persistent = true; }; }; environment.systemPackages = [zfssnap]; }; }