grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / network-filesystems / davfs2.nix
blob49a363476c975673637d7c965b819b30b96a896a
1 { config, lib, pkgs, ... }:
3 let
4   inherit (lib.attrsets) optionalAttrs;
5   inherit (lib.generators) toINIWithGlobalSection;
6   inherit (lib.lists) optional;
7   inherit (lib.modules) mkIf mkRemovedOptionModule;
8   inherit (lib.options) literalExpression mkEnableOption mkOption;
9   inherit (lib.strings) escape;
10   inherit (lib.types) attrsOf bool int lines oneOf str submodule;
12   cfg = config.services.davfs2;
14   escapeString = escape ["\"" "\\"];
16   formatValue = value:
17     if true == value then "1"
18     else if false == value then "0"
19     else if builtins.isString value then "\"${escapeString value}\""
20     else toString value;
22   configFile = pkgs.writeText "davfs2.conf" (
23     toINIWithGlobalSection {
24       mkSectionName = escapeString;
25       mkKeyValue = k: v: "${k} ${formatValue v}";
26     } cfg.settings);
30   imports = [
31     (mkRemovedOptionModule [ "services" "davfs2" "extraConfig" ] ''
32       The option extraConfig got removed, please migrate to
33       services.davfs2.settings instead.
34     '')
35   ];
37   options.services.davfs2 = {
38     enable = mkEnableOption "davfs2";
40     davUser = mkOption {
41       type = str;
42       default = "davfs2";
43       description = ''
44         When invoked by root the mount.davfs daemon will run as this user.
45         Value must be given as name, not as numerical id.
46       '';
47     };
49     davGroup = mkOption {
50       type = str;
51       default = "davfs2";
52       description = ''
53         The group of the running mount.davfs daemon. Ordinary users must be
54         member of this group in order to mount a davfs2 file system. Value must
55         be given as name, not as numerical id.
56       '';
57     };
59     settings = mkOption {
60       type = submodule {
61         freeformType = let
62           valueTypes = [ bool int str ];
63         in
64         attrsOf (attrsOf (oneOf (valueTypes ++ [ (attrsOf (oneOf valueTypes)) ] )));
65       };
66       default = { };
67       example = literalExpression ''
68         {
69           globalSection = {
70             proxy = "foo.bar:8080";
71             use_locks = false;
72           };
73           sections = {
74             "/media/dav" = {
75               use_locks = true;
76             };
77             "/home/otto/mywebspace" = {
78               gui_optimize = true;
79             };
80           };
81         }
82       '';
83       description = ''
84         Extra settings appended to the configuration of davfs2.
85         See {manpage}`davfs2.conf(5)` for available settings.
86       ''  ;
87     };
88   };
90   config = mkIf cfg.enable {
92     environment.systemPackages = [ pkgs.davfs2 ];
93     environment.etc."davfs2/davfs2.conf".source = configFile;
95     services.davfs2.settings = {
96       globalSection = {
97         dav_user = cfg.davUser;
98         dav_group = cfg.davGroup;
99       };
100     };
102     users.groups = optionalAttrs (cfg.davGroup == "davfs2") {
103       davfs2.gid = config.ids.gids.davfs2;
104     };
106     users.users = optionalAttrs (cfg.davUser == "davfs2") {
107       davfs2 = {
108         createHome = false;
109         group = cfg.davGroup;
110         uid = config.ids.uids.davfs2;
111         description = "davfs2 user";
112       };
113     };
115     security.wrappers."mount.davfs" = {
116       program = "mount.davfs";
117       source = "${pkgs.davfs2}/bin/mount.davfs";
118       owner = "root";
119       group = cfg.davGroup;
120       setuid = true;
121       permissions = "u+rx,g+x";
122     };
124     security.wrappers."umount.davfs" = {
125       program = "umount.davfs";
126       source = "${pkgs.davfs2}/bin/umount.davfs";
127       owner = "root";
128       group = cfg.davGroup;
129       setuid = true;
130       permissions = "u+rx,g+x";
131     };
133   };