3
0
Fork 0
forked from mirrors/nixpkgs

sanoid: fix sanoid.conf generation

This commit is contained in:
Julien Moutinho 2020-03-31 18:09:59 +02:00
parent c43e0f4873
commit b62a093a58
2 changed files with 31 additions and 59 deletions

View file

@ -10,74 +10,51 @@ let
description = "dataset/template options"; description = "dataset/template options";
}; };
# Default values from https://github.com/jimsalterjrs/sanoid/blob/master/sanoid.defaults.conf
commonOptions = { commonOptions = {
hourly = mkOption { hourly = mkOption {
description = "Number of hourly snapshots."; description = "Number of hourly snapshots.";
type = types.ints.unsigned; type = with types; nullOr ints.unsigned;
default = 48; default = null;
}; };
daily = mkOption { daily = mkOption {
description = "Number of daily snapshots."; description = "Number of daily snapshots.";
type = types.ints.unsigned; type = with types; nullOr ints.unsigned;
default = 90; default = null;
}; };
monthly = mkOption { monthly = mkOption {
description = "Number of monthly snapshots."; description = "Number of monthly snapshots.";
type = types.ints.unsigned; type = with types; nullOr ints.unsigned;
default = 6; default = null;
}; };
yearly = mkOption { yearly = mkOption {
description = "Number of yearly snapshots."; description = "Number of yearly snapshots.";
type = types.ints.unsigned; type = with types; nullOr ints.unsigned;
default = 0; default = null;
}; };
autoprune = mkOption { autoprune = mkOption {
description = "Whether to automatically prune old snapshots."; description = "Whether to automatically prune old snapshots.";
type = types.bool; type = with types; nullOr bool;
default = true; default = null;
}; };
autosnap = mkOption { autosnap = mkOption {
description = "Whether to automatically take snapshots."; description = "Whether to automatically take snapshots.";
type = types.bool; type = with types; nullOr bool;
default = true; default = null;
};
settings = mkOption {
description = ''
Free-form settings for this template/dataset. See
<link xlink:href="https://github.com/jimsalterjrs/sanoid/blob/master/sanoid.defaults.conf"/>
for allowed values.
'';
type = datasetSettingsType;
}; };
}; };
commonConfig = config: { datasetOptions = rec {
settings = { use_template = mkOption {
hourly = mkDefault config.hourly;
daily = mkDefault config.daily;
monthly = mkDefault config.monthly;
yearly = mkDefault config.yearly;
autoprune = mkDefault config.autoprune;
autosnap = mkDefault config.autosnap;
};
};
datasetOptions = {
useTemplate = mkOption {
description = "Names of the templates to use for this dataset."; description = "Names of the templates to use for this dataset.";
type = (types.listOf (types.enum (attrNames cfg.templates))) // { type = types.listOf (types.enum (attrNames cfg.templates));
description = "list of template names";
};
default = []; default = [];
}; };
useTemplate = use_template;
recursive = mkOption { recursive = mkOption {
description = "Whether to recursively snapshot dataset children."; description = "Whether to recursively snapshot dataset children.";
@ -85,19 +62,12 @@ let
default = false; default = false;
}; };
processChildrenOnly = mkOption { process_children_only = mkOption {
description = "Whether to only snapshot child datasets if recursing."; description = "Whether to only snapshot child datasets if recursing.";
type = types.bool; type = types.bool;
default = false; default = false;
}; };
}; processChildrenOnly = process_children_only;
datasetConfig = config: {
settings = {
use_template = mkDefault config.useTemplate;
recursive = mkDefault config.recursive;
process_children_only = mkDefault config.processChildrenOnly;
};
}; };
# Extract pool names from configured datasets # Extract pool names from configured datasets
@ -109,11 +79,11 @@ let
else generators.mkValueStringDefault {} v; else generators.mkValueStringDefault {} v;
mkKeyValue = k: v: if v == null then "" mkKeyValue = k: v: if v == null then ""
else if k == "processChildrenOnly" then ""
else if k == "useTemplate" then ""
else generators.mkKeyValueDefault { inherit mkValueString; } "=" k v; else generators.mkKeyValueDefault { inherit mkValueString; } "=" k v;
in generators.toINI { inherit mkKeyValue; } cfg.settings; in generators.toINI { inherit mkKeyValue; } cfg.settings;
configDir = pkgs.writeTextDir "sanoid.conf" configFile;
in { in {
# Interface # Interface
@ -135,19 +105,21 @@ in {
}; };
datasets = mkOption { datasets = mkOption {
type = types.attrsOf (types.submodule ({ config, ... }: { type = types.attrsOf (types.submodule ({config, options, ...}: {
freeformType = datasetSettingsType;
options = commonOptions // datasetOptions; options = commonOptions // datasetOptions;
config = mkMerge [ (commonConfig config) (datasetConfig config) ]; config.use_template = mkAliasDefinitions (options.useTemplate or {});
config.process_children_only = mkAliasDefinitions (options.processChildrenOnly or {});
})); }));
default = {}; default = {};
description = "Datasets to snapshot."; description = "Datasets to snapshot.";
}; };
templates = mkOption { templates = mkOption {
type = types.attrsOf (types.submodule ({ config, ... }: { type = types.attrsOf (types.submodule {
freeformType = datasetSettingsType;
options = commonOptions; options = commonOptions;
config = commonConfig config; });
}));
default = {}; default = {};
description = "Templates for datasets."; description = "Templates for datasets.";
}; };
@ -177,8 +149,8 @@ in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
services.sanoid.settings = mkMerge [ services.sanoid.settings = mkMerge [
(mapAttrs' (d: v: nameValuePair ("template_" + d) v.settings) cfg.templates) (mapAttrs' (d: v: nameValuePair ("template_" + d) v) cfg.templates)
(mapAttrs (d: v: v.settings) cfg.datasets) (mapAttrs (d: v: v) cfg.datasets)
]; ];
systemd.services.sanoid = { systemd.services.sanoid = {
@ -191,7 +163,7 @@ in {
ExecStart = lib.escapeShellArgs ([ ExecStart = lib.escapeShellArgs ([
"${pkgs.sanoid}/bin/sanoid" "${pkgs.sanoid}/bin/sanoid"
"--cron" "--cron"
"--configdir" configDir "--configdir" (pkgs.writeTextDir "sanoid.conf" configFile)
] ++ cfg.extraArgs); ] ++ cfg.extraArgs);
ExecStopPost = map (pool: lib.escapeShellArgs [ ExecStopPost = map (pool: lib.escapeShellArgs [
"+/run/booted-system/sw/bin/zfs" "unallow" "sanoid" pool "+/run/booted-system/sw/bin/zfs" "unallow" "sanoid" pool

View file

@ -33,7 +33,7 @@ in {
autosnap = true; autosnap = true;
}; };
datasets."pool/sanoid".useTemplate = [ "test" ]; datasets."pool/sanoid".use_template = [ "test" ];
extraArgs = [ "--verbose" ]; extraArgs = [ "--verbose" ];
}; };