diff --git a/changes/pr-560.md b/changes/pr-560.md new file mode 100644 index 000000000..f8675e5cd --- /dev/null +++ b/changes/pr-560.md @@ -0,0 +1 @@ +Add externalDrives module to auto-mount known external drives diff --git a/pkgs/nixos/modules/externalDrives/module.nix b/pkgs/nixos/modules/externalDrives/module.nix new file mode 100644 index 000000000..8de188c80 --- /dev/null +++ b/pkgs/nixos/modules/externalDrives/module.nix @@ -0,0 +1,92 @@ +{ + config, + lib, + ... +}: +let + cfg = config.machines.externalDrives; + + foreignFsTypes = [ + "ntfs" + "ntfs-3g" + "vfat" + "exfat" + ]; + + uid = toString config.users.users.${cfg.user}.uid; + gid = toString config.users.groups.${cfg.group}.gid; + + baseOpts = [ + "nofail" + "x-systemd.automount" + "x-systemd.idle-timeout=60" + "x-systemd.device-timeout=10s" + ]; + + ownershipOpts = [ + "uid=${uid}" + "gid=${gid}" + "dmask=007" + "fmask=117" + "windows_names" + ]; + + driveModule = lib.types.submodule { + options = { + uuid = lib.mkOption { + type = lib.types.str; + description = "Filesystem UUID; the device is resolved via /dev/disk/by-uuid."; + }; + fsType = lib.mkOption { + type = lib.types.str; + default = "ntfs-3g"; + description = "Mount filesystem type."; + }; + extraOptions = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = [ ]; + description = "Extra mount options appended for this drive."; + }; + }; + }; + + mkMount = name: drive: { + name = "/mnt/${name}"; + value = { + device = "/dev/disk/by-uuid/${drive.uuid}"; + fsType = drive.fsType; + options = + baseOpts + ++ lib.optionals (lib.elem drive.fsType foreignFsTypes) ownershipOpts + ++ drive.extraOptions; + }; + }; +in +{ + options.machines.externalDrives = { + enable = lib.mkEnableOption "auto-mount known external drives at /mnt/ when connected"; + user = lib.mkOption { + type = lib.types.str; + default = "andrew"; + description = "Owner of foreign-filesystem mounts."; + }; + group = lib.mkOption { + type = lib.types.str; + default = "dev"; + description = "Group owner of foreign-filesystem mounts."; + }; + drives = lib.mkOption { + type = lib.types.attrsOf driveModule; + default = { + seagate.uuid = "A4E83FF7E83FC5F8"; + aegis.uuid = "0259FC5C6268D54B"; + }; + description = "Known external drives keyed by mount-point name under /mnt."; + }; + }; + + config = lib.mkIf cfg.enable { + boot.supportedFilesystems = [ "ntfs" ]; + fileSystems = lib.mapAttrs' mkMount cfg.drives; + }; +} diff --git a/pkgs/nixos/pc-base.nix b/pkgs/nixos/pc-base.nix index 3ae58daaa..c6c20b1f9 100644 --- a/pkgs/nixos/pc-base.nix +++ b/pkgs/nixos/pc-base.nix @@ -239,6 +239,7 @@ in ./modules/webserverNode/module.nix ./modules/cudaNode/module.nix ./modules/comfyui/module.nix + ./modules/externalDrives/module.nix ../modules/notes-wiki/module.nix ../modules/metricsNode/module.nix ../modules/plexNode/module.nix @@ -466,7 +467,7 @@ in }; services.stampserver = { - enable = cfg.isATS || cfg.enableFileServers; + enable = true; package = anixpkgs.stampserver; rootDir = "${cfg.homeDir}/fileservers"; }; @@ -664,6 +665,9 @@ in services.metricsNode.enable = cfg.enableMetrics; services.metricsNode.openFirewall = cfg.enableMetrics; + # External drives + machines.externalDrives.enable = true; + # Notes Wiki services.notes-wiki.enable = cfg.serveNotesWiki;