infrastructure/nixos/kyuuto/mount.nix
2024-02-18 11:09:14 -08:00

135 lines
3.6 KiB
Nix

{
config,
lib,
...
}: let
inherit (lib.options) mkOption mkEnableOption;
inherit (lib.modules) mkIf mkMerge mkDefault;
inherit (lib.strings) removePrefix;
inherit (lib.attrsets) listToAttrs nameValuePair;
inherit (config.services.steam) accountSwitch;
cfg = config.kyuuto;
in {
options.kyuuto = with lib.types; {
setup = mkEnableOption "directory and permission setup";
mountDir = mkOption {
type = path;
default = "/mnt/kyuuto-media";
};
shareDir = mkOption {
type = path;
default = cfg.mountDir + "/shared";
};
transferDir = mkOption {
type = path;
default = cfg.mountDir + "/transfer";
};
libraryDir = mkOption {
type = path;
default = cfg.mountDir + "/library";
};
gameLibraryDir = mkOption {
type = path;
default = cfg.libraryDir + "/games";
};
gameLibraries = mkOption {
type = listOf str;
default = [ "PC" ];
};
};
config = {
kyuuto = {
gameLibraries = [
"PC"
"Wii" "Gamecube" "N64" "SNES" "NES"
"NDS" "GBA" "GBC"
"PS3" "PS2" "PS1"
"PSVita" "PSP"
"Genesis"
];
};
services.steam = {
library = {
setup = mkDefault cfg.setup;
rootDir = cfg.shareDir + "/steam/library";
};
accountSwitch = {
setup = mkDefault cfg.setup;
sharePath = removePrefix "${cfg.shareDir}/" accountSwitch.rootDir;
rootDir = cfg.shareDir + "/steam";
};
};
services.tmpfiles = let
shared = {
owner = mkDefault "admin";
group = mkDefault "kyuuto";
mode = mkDefault "3775";
};
leaf = {
inherit (shared) owner group;
mode = mkDefault "2775";
};
setupFiles = [
{
${cfg.shareDir} = mkMerge [
shared
{ group = "peeps"; }
];
${cfg.transferDir} = shared;
${cfg.libraryDir} = shared;
${cfg.libraryDir + "/unsorted"} = shared;
${cfg.libraryDir + "/music"} = shared;
${cfg.libraryDir + "/music/assorted"} = leaf;
${cfg.libraryDir + "/music/collections"} = shared;
${cfg.libraryDir + "/anime"} = leaf;
${cfg.libraryDir + "/tv"} = leaf;
${cfg.libraryDir + "/movies"} = leaf;
${cfg.libraryDir + "/software"} = leaf;
${cfg.libraryDir + "/books"} = leaf;
${cfg.gameLibraryDir} = shared;
}
(listToAttrs (
map (gameLibrary: nameValuePair (cfg.gameLibraryDir + "/${gameLibrary}") leaf) cfg.gameLibraries
))
];
in {
enable = mkIf cfg.setup true;
files = mkMerge [
(mkIf cfg.setup (mkMerge setupFiles))
(mkIf accountSwitch.enable {
${accountSwitch.gamesDir} = {
type = "bind";
bindReadOnly = true;
src = cfg.gameLibraryDir + "/PC";
};
})
];
};
users = let
mapId = id: if config.proxmoxLXC.privileged or true then 100000 + id else id;
mkDummyUsers = {
name,
group ? name,
enable ? !config.services.${serviceName}.enable, serviceName ? name,
uid ? config.ids.uids.${name},
gid ? config.ids.gids.${group},
}: mkIf enable {
users.${name} = {
group = mkIf (group != null) group;
uid = mapId uid;
isSystemUser = true;
};
groups.${group} = {
gid = mapId gid;
};
};
in mkMerge [
(mkDummyUsers { name = "deluge"; })
(mkDummyUsers { name = "radarr"; })
(mkDummyUsers { name = "sonarr"; })
(mkDummyUsers { name = "lidarr"; })
];
};
}