feat(steam): mkbeatsaber

This commit is contained in:
arcnmx 2024-02-13 17:02:53 -08:00
parent 46c6fbc8c1
commit fc11fb8152
18 changed files with 891 additions and 44 deletions

View file

@ -4,9 +4,10 @@
...
}: let
inherit (lib.options) mkOption mkEnableOption;
inherit (lib.modules) mkIf mkMerge;
inherit (lib.strings) match concatStringsSep;
inherit (lib.lists) optional;
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; {
@ -15,49 +16,96 @@ in {
type = path;
default = "/mnt/kyuuto-media";
};
libraryDir = mkOption {
shareDir = mkOption {
type = path;
default = cfg.mountDir + "/library";
default = cfg.mountDir + "/shared";
};
transferDir = mkOption {
type = path;
default = cfg.mountDir + "/transfer";
};
shareDir = mkOption {
libraryDir = mkOption {
type = path;
default = cfg.mountDir + "/shared";
default = cfg.mountDir + "/library";
};
gameLibraryDir = mkOption {
type = path;
default = cfg.libraryDir + "/games";
};
gameLibraries = mkOption {
type = listOf str;
default = [ "PC" ];
};
};
config = {
systemd.tmpfiles.rules = let
isGroupWritable = mode: match "[375][0-7][76][0-7]" mode != null;
isOtherWritable = mode: match "[375][0-7][0-7][76]" mode != null;
mkKyuutoDir = {
path,
mode ? "3775",
owner ? "guest",
group ? "kyuuto",
acls ? optional (isGroupWritable mode) "default:group::rwx"
++ optional (isOtherWritable mode) "default:other::rwx",
}: [
"d ${path} ${mode} ${owner} ${group}"
] ++ optional (acls != [ ]) "a+ ${path} - - - - ${concatStringsSep "," acls}";
in mkIf cfg.setup (
mkKyuutoDir { path = cfg.transferDir; }
++ mkKyuutoDir { path = cfg.shareDir; owner = "root"; }
++ mkKyuutoDir { path = cfg.libraryDir; owner = "root"; }
++ mkKyuutoDir { path = cfg.libraryDir + "/unsorted"; }
++ mkKyuutoDir { path = cfg.libraryDir + "/music"; owner = "root"; }
++ mkKyuutoDir { path = cfg.libraryDir + "/music/assorted"; owner = "sonarr"; mode = "7775"; }
++ mkKyuutoDir { path = cfg.libraryDir + "/music/collections"; }
++ mkKyuutoDir { path = cfg.libraryDir + "/anime"; owner = "sonarr"; mode = "7775"; }
++ mkKyuutoDir { path = cfg.libraryDir + "/tv"; owner = "sonarr"; mode = "7775"; }
++ mkKyuutoDir { path = cfg.libraryDir + "/movies"; owner = "radarr"; mode = "7775"; }
++ mkKyuutoDir { path = cfg.libraryDir + "/software"; }
++ mkKyuutoDir { path = cfg.libraryDir + "/books"; }
++ mkKyuutoDir { path = cfg.libraryDir + "/games"; }
);
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;

View file

@ -78,8 +78,8 @@ in {
public = false;
browseable = false;
"valid users" = [ "@peeps" ];
"acl group control" = true;
"create mask" = "0664";
"create mask" = "0775";
"force file mode" = "3010";
"force directory mode" = "3000";
"directory mask" = "7775";
};

View file

@ -0,0 +1,10 @@
{
lib,
...
}: let
inherit (lib.modules) mkDefault;
in {
services.steam.accountSwitch = {
enable = mkDefault true;
};
}

15
nixos/steam/beatsaber.nix Normal file
View file

@ -0,0 +1,15 @@
{
lib,
...
}: let
inherit (lib.modules) mkDefault;
in {
services.steam.beatsaber = {
enable = mkDefault true;
defaultVersion = mkDefault "1.29.0";
versions = {
"1.29.0" = { };
"1.34.2" = { };
};
};
}

View file

@ -6,7 +6,12 @@
isNormalUser = true;
autoSubUidGidRange = false;
group = name;
extraGroups = [ "users" "peeps" "kyuuto" "wheel" ];
extraGroups = [
"users" "peeps"
"kyuuto"
"steamaccount" "beatsaber"
"wheel"
];
openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ8Z6briIboxIdedPGObEWB6QEQkvxKvnMW/UVU9t/ac mew-pgp"
];

View file

@ -6,7 +6,10 @@
isNormalUser = true;
autoSubUidGidRange = false;
group = name;
extraGroups = [ "users" "peeps" "kyuuto" ];
extraGroups = [
"users" "peeps"
"kyuuto"
];
};
users.groups.connieallure = { name, ... }: {
gid = config.users.users.${name}.uid;

View file

@ -20,6 +20,19 @@ in {
filterAttrs (_: user: userIs "peeps" user && userIs "kyuuto" user) config.users.users
);
};
steamaccount = {
gid = 8131;
};
beatsaber = {
gid = 8132;
};
admin = {
gid = 8126;
members = mapAttrsToList (_: user: user.name) (
filterAttrs (_: user: userIs "peeps" user && userIs "wheel" user) config.users.users
);
};
};
users.users = {
guest = {
@ -27,5 +40,10 @@ in {
group = "nogroup";
isSystemUser = true;
};
admin = {
uid = 8126;
group = "admin";
isSystemUser = true;
};
};
}

View file

@ -6,7 +6,11 @@
isNormalUser = true;
autoSubUidGidRange = false;
group = name;
extraGroups = [ "users" "peeps" "kyuuto" ];
extraGroups = [
"users" "peeps"
"kyuuto"
"steamaccount" "beatsaber"
];
};
users.groups.kaosubaloo = { name, ... }: {
gid = config.users.users.${name}.uid;

View file

@ -6,7 +6,12 @@
isNormalUser = true;
autoSubUidGidRange = false;
group = name;
extraGroups = [ "users" "peeps" "kyuuto" "wheel" ];
extraGroups = [
"users" "peeps"
"kyuuto"
"steamaccount" "beatsaber"
"wheel"
];
openssh.authorizedKeys.keys = [
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCocjQqiDIvzq+Qu3jkf7FXw5piwtvZ1Mihw9cVjdVcsra3U2c9WYtYrA3rS50N3p00oUqQm9z1KUrvHzdE+03ZCrvaGdrtYVsaeoCuuvw7qxTQRbItTAEsfRcZLQ5c1v/57HNYNEsjVrt8VukMPRXWgl+lmzh37dd9w45cCY1QPi+JXQQ/4i9Vc3aWSe4X6PHOEMSBHxepnxm5VNHm4PObGcVbjBf0OkunMeztd1YYA9sEPyEK3b8IHxDl34e5t6NDLCIDz0N/UgzCxSxoz+YJ0feQuZtud/YLkuQcMxW2dSGvnJ0nYy7SA5DkW1oqcy6CGDndHl5StOlJ1IF9aGh0gGkx5SRrV7HOGvapR60RphKrR5zQbFFka99kvSQgOZqSB3CGDEQGHv8dXKXIFlzX78jjWDOBT67vA/M9BK9FS2iNnBF5x6shJ9SU5IK4ySxq8qvN7Us8emkN3pyO8yqgsSOzzJT1JmWUAx0tZWG/BwKcFBHfceAPQl6pwxx28TM3BTBRYdzPJLTkAy48y6iXW6UYdfAPlShy79IYjQtEThTuIiEzdzgYdros0x3PDniuAP0KOKMgbikr0gRa6zahPjf0qqBnHeLB6nHAfaVzI0aNbhOg2bdOueE1FX0x48sjKqjOpjlIfq4WeZp9REr2YHEsoLFOBfgId5P3BPtpBQ== yubikey5"
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPsu3vNsvBb/G+wALpstD/DnoRZ3fipAs00jtl8rzDuv96RlS7AJr4aNvG6Pt2D9SYn2wVLaiw+76mz2gOycH9/N+VCvL4/0MN9uqj+7XIcxNRo0gHVOblmi2bOXcmGKh3eRwHj1xyDwRxo9WIuBEP2bPpDPz75OXRtEdlTgvky7siSguQxJu03cb0p9hNAYhUoohNXyWW2CjDCLUQVE1+QRVUzsKq3KkPy0cHYgmZC1gRSMQyKpMt72L5tayLz3Tp/zrshucc+QO5IJeZdqMxsNAcvALsysT1J5EqxZoYH9VpWLRhSgVD6Nvn853pycJAlXQxgOCpSD3/v/JbgUe5NE+ci0o7NMy5IiHUv2gQMRIEhwBHlRGwokUPL9upx0lsjaEiPya5xQqqDKRom87xytM778ANS5CuMdQMWg9qVbpHZUHMjA0QmNkjPgq71pUDXHk5L4mZuS8wVjyjnvlw68yIJuHEc8P7QiLcjvRHFS2L9Ck8NRmPDTQXlQi9kk6LmMyu6fdevR/kZL21b+xO1e2DMyxBbNDTot8luppiiL8adgUDMwptpIne7JCWB1o9NFCbXUVgwuCCYBif6pOGSc6bGo1JTAKMflRlcy6Mi3t5H0mR2lj/sCSTWwTlP5FM4aPIq08NvW6PeuK1bFJY9fIgTwVsUnbAKOhmsMt62w== cardno:12 078 454"