eae5eade56
I want to show how composable this project is. For example, you could just use the Authelia module to add SSO to any service, not just those provided here.
109 lines
3.1 KiB
Nix
109 lines
3.1 KiB
Nix
{ config, pkgs, lib, ... }:
|
|
|
|
let
|
|
cfg = config.shb.davfs;
|
|
|
|
template = file: newPath: replacements:
|
|
let
|
|
templatePath = newPath + ".template";
|
|
|
|
sedPatterns = lib.strings.concatStringsSep " " (lib.attrsets.mapAttrsToList (from: to: "\"s|${from}|${to}|\"") replacements);
|
|
in
|
|
''
|
|
ln -fs ${file} ${templatePath}
|
|
rm ${newPath} || :
|
|
sed ${sedPatterns} ${templatePath} > ${newPath}
|
|
'';
|
|
in
|
|
{
|
|
options.shb.davfs = {
|
|
mounts = lib.mkOption {
|
|
default = [];
|
|
type = lib.types.listOf (lib.types.submodule {
|
|
options = {
|
|
remoteUrl = lib.mkOption {
|
|
type = lib.types.str;
|
|
description = "Webdav endpoint to connect to.";
|
|
example = "https://my.domain.com/dav";
|
|
};
|
|
|
|
mountPoint = lib.mkOption {
|
|
type = lib.types.str;
|
|
description = "Mount point to mount the webdav endpoint on.";
|
|
example = "/mnt";
|
|
};
|
|
|
|
username = lib.mkOption {
|
|
type = lib.types.str;
|
|
description = "Username to connect to the webdav endpoint.";
|
|
};
|
|
|
|
passwordFile = lib.mkOption {
|
|
type = lib.types.str;
|
|
description = "Password to connect to the webdav endpoint.";
|
|
};
|
|
|
|
uid = lib.mkOption {
|
|
type = lib.types.nullOr lib.types.int;
|
|
description = "User owner of the mount point.";
|
|
example = 1000;
|
|
default = null;
|
|
};
|
|
|
|
gid = lib.mkOption {
|
|
type = lib.types.nullOr lib.types.int;
|
|
description = "Group owner of the mount point.";
|
|
example = 1000;
|
|
default = null;
|
|
};
|
|
|
|
fileMode = lib.mkOption {
|
|
type = lib.types.nullOr lib.types.str;
|
|
description = "File creation mode";
|
|
example = "0664";
|
|
default = null;
|
|
};
|
|
|
|
directoryMode = lib.mkOption {
|
|
type = lib.types.nullOr lib.types.str;
|
|
description = "Directory creation mode";
|
|
example = "2775";
|
|
default = null;
|
|
};
|
|
|
|
automount = lib.mkOption {
|
|
type = lib.types.bool;
|
|
description = "Create a systemd automount unit";
|
|
default = true;
|
|
};
|
|
};
|
|
});
|
|
};
|
|
};
|
|
|
|
config = {
|
|
services.davfs2.enable = builtins.length cfg.mounts > 0;
|
|
|
|
systemd.mounts =
|
|
let
|
|
mkMountCfg = c: {
|
|
enable = true;
|
|
description = "Webdav mount point";
|
|
after = [ "network-online.target" ];
|
|
wants = [ "network-online.target" ];
|
|
|
|
what = c.remoteUrl;
|
|
where = c.mountPoint;
|
|
options = lib.concatStringsSep "," (
|
|
(lib.optional (!(isNull c.uid)) "uid=${toString c.uid}")
|
|
++ (lib.optional (!(isNull c.gid)) "gid=${toString c.uid}")
|
|
++ (lib.optional (!(isNull c.fileMode)) "file_mode=${toString c.fileMode}")
|
|
++ (lib.optional (!(isNull c.directoryMode)) "dir_mode=${toString c.directoryMode}")
|
|
);
|
|
type = "davfs";
|
|
mountConfig.TimeoutSec = 15;
|
|
};
|
|
in
|
|
map mkMountCfg cfg.mounts;
|
|
};
|
|
}
|