nixos/davfs2: fix settings option

Changed files
+39 -20
nixos
modules
services
network-filesystems
+39 -20
nixos/modules/services/network-filesystems/davfs2.nix
···
{ config, lib, pkgs, ... }:
let
-
toStr = value:
-
if true == value then "yes"
-
else if false == value then "no"
-
else toString value;
-
-
inherit (lib.attrsets) mapAttrsToList optionalAttrs;
+
inherit (lib.attrsets) optionalAttrs;
+
inherit (lib.generators) toINIWithGlobalSection;
inherit (lib.lists) optional;
inherit (lib.modules) mkIf;
inherit (lib.options) literalExpression mkEnableOption mkOption;
-
inherit (lib.strings) concatLines;
-
inherit (lib.types) lines str submodule;
+
inherit (lib.strings) escape;
+
inherit (lib.types) attrsOf bool int lines oneOf str submodule;
cfg = config.services.davfs2;
-
format = pkgs.formats.toml { };
-
configFile = let
-
settings = mapAttrsToList (n: v: "${n} = ${toStr v}") cfg.settings;
-
in pkgs.writeText "davfs2.conf" ''
-
${concatLines settings}
+
+
escapeString = escape ["\"" "\\"];
+
+
formatValue = value:
+
if true == value then "1"
+
else if false == value then "0"
+
else if builtins.isString value then "\"${escapeString value}\""
+
else toString value;
+
+
configFile = pkgs.writeText "davfs2.conf" ''
+
${toINIWithGlobalSection {
+
mkSectionName = escapeString;
+
mkKeyValue = k: v: "${k} ${formatValue v}";
+
} cfg.settings}
${cfg.extraConfig}
'';
in
···
settings = mkOption {
type = submodule {
-
freeformType = format.type;
+
freeformType = let
+
valueTypes = [ bool int str ];
+
in
+
attrsOf (attrsOf (oneOf (valueTypes ++ [ (attrsOf (oneOf valueTypes)) ] )));
};
-
default = {};
+
default = { };
example = literalExpression ''
{
-
kernel_fs = "coda";
-
proxy = "foo.bar:8080";
-
use_locks = 0;
+
globalSection = {
+
proxy = "foo.bar:8080";
+
use_locks = false;
+
};
+
sections = {
+
"/media/dav" = {
+
use_locks = true;
+
};
+
"/home/otto/mywebspace" = {
+
gui_optimize = true;
+
};
+
};
}
'';
description = ''
···
environment.etc."davfs2/davfs2.conf".source = configFile;
services.davfs2.settings = {
-
dav_user = cfg.davUser;
-
dav_group = cfg.davGroup;
+
globalSection = {
+
dav_user = cfg.davUser;
+
dav_group = cfg.davGroup;
+
};
};
users.groups = optionalAttrs (cfg.davGroup == "davfs2") {