From 6f82f965a742d2013d9bab578a4d83fa37526902 Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Sat, 19 Feb 2022 15:05:25 +0100 Subject: vidhar: zfssnap... --- modules/zfssnap/default.nix | 95 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 modules/zfssnap/default.nix (limited to 'modules/zfssnap/default.nix') diff --git a/modules/zfssnap/default.nix b/modules/zfssnap/default.nix new file mode 100644 index 00000000..a0590c9f --- /dev/null +++ b/modules/zfssnap/default.nix @@ -0,0 +1,95 @@ +{ config, pkgs, lib, ... }: + +with lib; + +let + zfssnap = pkgs.stdenv.mkDerivation rec { + name = "zfssnap"; + src = ./zfssnap.py; + + phases = [ "buildPhase" "checkPhase" "installPhase" ]; + + buildInputs = with pkgs; [makeWrapper]; + + python = pkgs.python39.withPackages (ps: with ps; [pyxdg pytimeparse dateutil systemd]); + + buildPhase = '' + substitute $src zfssnap \ + --subst-var-by python ${escapeShellArg python} + ''; + + doCheck = true; + checkPhase = '' + ${python}/bin/python -m py_compile zfssnap + ''; + + installPhase = '' + install -m 0755 -D -t $out/bin \ + zfssnap + + 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 = with types; attrsOf (attrsOf str); + default = { + keep = { + within = "5m"; + "5m" = "24"; + hourly = "24"; + daily = "31"; + monthly = "24"; + yearly = "-1"; + }; + }; + }; + + snapInterval = mkOption { + type = types.str; + default = "*-*-* *:00/5:00 Europe/Berlin"; + }; + }; + }; + + 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 --no-stderr -vv"; + }; + }; + 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 --no-stderr -vv prune --config=${zfssnapConfig}"; + }; + }; + + systemd.timers."zfssnap" = { + wantedBy = ["timers.target"]; + timerConfig = { + OnCalendar = cfg.snapInterval; + Persistent = true; + }; + }; + + environment.systemPackages = [zfssnap]; + }; +} -- cgit v1.2.3