diff --git a/nixos/modules/services/backup/sanoid.nix b/nixos/modules/services/backup/sanoid.nix
index c7f276e3f04..41d0e2e1df6 100644
--- a/nixos/modules/services/backup/sanoid.nix
+++ b/nixos/modules/services/backup/sanoid.nix
@@ -52,7 +52,7 @@ let
use_template = mkOption {
description = "Names of the templates to use for this dataset.";
type = types.listOf (types.enum (attrNames cfg.templates));
- default = [];
+ default = [ ];
};
useTemplate = use_template;
@@ -84,108 +84,113 @@ let
dataset
];
- configFile = let
- mkValueString = v:
- if builtins.isList v then concatStringsSep "," v
- else generators.mkValueStringDefault {} v;
+ configFile =
+ let
+ mkValueString = v:
+ if builtins.isList v then concatStringsSep "," v
+ else generators.mkValueStringDefault { } v;
- mkKeyValue = k: v: if v == null then ""
- else if k == "processChildrenOnly" then ""
- else if k == "useTemplate" then ""
- else generators.mkKeyValueDefault { inherit mkValueString; } "=" k v;
- in generators.toINI { inherit mkKeyValue; } cfg.settings;
+ mkKeyValue = k: v:
+ if v == null then ""
+ else if k == "processChildrenOnly" then ""
+ else if k == "useTemplate" then ""
+ else generators.mkKeyValueDefault { inherit mkValueString; } "=" k v;
+ in
+ generators.toINI { inherit mkKeyValue; } cfg.settings;
-in {
+in
+{
- # Interface
+ # Interface
- options.services.sanoid = {
- enable = mkEnableOption "Sanoid ZFS snapshotting service";
+ options.services.sanoid = {
+ enable = mkEnableOption "Sanoid ZFS snapshotting service";
- interval = mkOption {
- type = types.str;
- default = "hourly";
- example = "daily";
- description = ''
- Run sanoid at this interval. The default is to run hourly.
+ interval = mkOption {
+ type = types.str;
+ default = "hourly";
+ example = "daily";
+ description = ''
+ Run sanoid at this interval. The default is to run hourly.
- The format is described in
- systemd.time
- 7.
- '';
- };
-
- datasets = mkOption {
- type = types.attrsOf (types.submodule ({config, options, ...}: {
- freeformType = datasetSettingsType;
- options = commonOptions // datasetOptions;
- config.use_template = mkAliasDefinitions (mkDefault options.useTemplate or {});
- config.process_children_only = mkAliasDefinitions (mkDefault options.processChildrenOnly or {});
- }));
- default = {};
- description = "Datasets to snapshot.";
- };
-
- templates = mkOption {
- type = types.attrsOf (types.submodule {
- freeformType = datasetSettingsType;
- options = commonOptions;
- });
- default = {};
- description = "Templates for datasets.";
- };
-
- settings = mkOption {
- type = types.attrsOf datasetSettingsType;
- description = ''
- Free-form settings written directly to the config file. See
-
- for allowed values.
- '';
- };
-
- extraArgs = mkOption {
- type = types.listOf types.str;
- default = [];
- example = [ "--verbose" "--readonly" "--debug" ];
- description = ''
- Extra arguments to pass to sanoid. See
-
- for allowed options.
- '';
- };
+ The format is described in
+ systemd.time
+ 7.
+ '';
};
- # Implementation
-
- config = mkIf cfg.enable {
- services.sanoid.settings = mkMerge [
- (mapAttrs' (d: v: nameValuePair ("template_" + d) v) cfg.templates)
- (mapAttrs (d: v: v) cfg.datasets)
- ];
-
- systemd.services.sanoid = {
- description = "Sanoid snapshot service";
- serviceConfig = {
- ExecStartPre = (map (buildAllowCommand "allow" [ "snapshot" "mount" "destroy" ]) datasets);
- ExecStopPost = (map (buildAllowCommand "unallow" [ "snapshot" "mount" "destroy" ]) datasets);
- ExecStart = lib.escapeShellArgs ([
- "${pkgs.sanoid}/bin/sanoid"
- "--cron"
- "--configdir" (pkgs.writeTextDir "sanoid.conf" configFile)
- ] ++ cfg.extraArgs);
- User = "sanoid";
- Group = "sanoid";
- DynamicUser = true;
- RuntimeDirectory = "sanoid";
- CacheDirectory = "sanoid";
- };
- # Prevents missing snapshots during DST changes
- environment.TZ = "UTC";
- after = [ "zfs.target" ];
- startAt = cfg.interval;
- };
+ datasets = mkOption {
+ type = types.attrsOf (types.submodule ({ config, options, ... }: {
+ freeformType = datasetSettingsType;
+ options = commonOptions // datasetOptions;
+ config.use_template = mkAliasDefinitions (mkDefault options.useTemplate or { });
+ config.process_children_only = mkAliasDefinitions (mkDefault options.processChildrenOnly or { });
+ }));
+ default = { };
+ description = "Datasets to snapshot.";
};
- meta.maintainers = with maintainers; [ lopsided98 ];
- }
+ templates = mkOption {
+ type = types.attrsOf (types.submodule {
+ freeformType = datasetSettingsType;
+ options = commonOptions;
+ });
+ default = { };
+ description = "Templates for datasets.";
+ };
+
+ settings = mkOption {
+ type = types.attrsOf datasetSettingsType;
+ description = ''
+ Free-form settings written directly to the config file. See
+
+ for allowed values.
+ '';
+ };
+
+ extraArgs = mkOption {
+ type = types.listOf types.str;
+ default = [ ];
+ example = [ "--verbose" "--readonly" "--debug" ];
+ description = ''
+ Extra arguments to pass to sanoid. See
+
+ for allowed options.
+ '';
+ };
+ };
+
+ # Implementation
+
+ config = mkIf cfg.enable {
+ services.sanoid.settings = mkMerge [
+ (mapAttrs' (d: v: nameValuePair ("template_" + d) v) cfg.templates)
+ (mapAttrs (d: v: v) cfg.datasets)
+ ];
+
+ systemd.services.sanoid = {
+ description = "Sanoid snapshot service";
+ serviceConfig = {
+ ExecStartPre = (map (buildAllowCommand "allow" [ "snapshot" "mount" "destroy" ]) datasets);
+ ExecStopPost = (map (buildAllowCommand "unallow" [ "snapshot" "mount" "destroy" ]) datasets);
+ ExecStart = lib.escapeShellArgs ([
+ "${pkgs.sanoid}/bin/sanoid"
+ "--cron"
+ "--configdir"
+ (pkgs.writeTextDir "sanoid.conf" configFile)
+ ] ++ cfg.extraArgs);
+ User = "sanoid";
+ Group = "sanoid";
+ DynamicUser = true;
+ RuntimeDirectory = "sanoid";
+ CacheDirectory = "sanoid";
+ };
+ # Prevents missing snapshots during DST changes
+ environment.TZ = "UTC";
+ after = [ "zfs.target" ];
+ startAt = cfg.interval;
+ };
+ };
+
+ meta.maintainers = with maintainers; [ lopsided98 ];
+}