mirror of
https://github.com/gensokyo-zone/infrastructure.git
synced 2026-02-09 04:19:19 -08:00
150 lines
3.8 KiB
Nix
150 lines
3.8 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";})
|
|
];
|
|
};
|
|
}
|