From 1b450f434f078753776237c7da076fa7cf441936 Mon Sep 17 00:00:00 2001 From: alexion Date: Wed, 9 Sep 2026 22:09:04 -0400 Subject: [PATCH] refactor(nixos): localize SteamCMD script helpers --- configs/nixos/modules/services/steamcmd.nix | 228 ++++++++++---------- 1 file changed, 115 insertions(+), 113 deletions(-) diff --git a/configs/nixos/modules/services/steamcmd.nix b/configs/nixos/modules/services/steamcmd.nix index a40af94..e292d66 100644 --- a/configs/nixos/modules/services/steamcmd.nix +++ b/configs/nixos/modules/services/steamcmd.nix @@ -6,45 +6,6 @@ }: let cfg = config.modules.services.steamcmd; - - libraryPath = lib.concatStringsSep ":" cfg.libraryDirs; - - prepareScript = pkgs.writeShellScript "steamcmd-${cfg.serviceName}-prepare" '' - set -eu - - ${pkgs.coreutils}/bin/install -d \ - -o ${lib.escapeShellArg cfg.user} \ - -g ${lib.escapeShellArg cfg.group} \ - -m 0770 \ - ${lib.escapeShellArg cfg.steamDir} \ - ${lib.escapeShellArg cfg.installDir} \ - ${lib.escapeShellArg cfg.stateDir} - ''; - - updateScript = pkgs.writeShellScript "steamcmd-${cfg.serviceName}-update" '' - set -eu - - export HOME=${lib.escapeShellArg cfg.steamDir} - exec ${lib.getExe cfg.package} \ - +force_install_dir ${lib.escapeShellArg cfg.installDir} \ - +login anonymous \ - +app_update ${toString cfg.appId} ${lib.optionalString cfg.validateUpdate "validate"} \ - +quit - ''; - - startScript = pkgs.writeShellScript "steamcmd-${cfg.serviceName}-start" '' - set -eu - - cd ${lib.escapeShellArg cfg.installDir} - ${lib.optionalString (cfg.libraryDirs != [ ]) ''export LD_LIBRARY_PATH=${lib.escapeShellArg libraryPath}:''${LD_LIBRARY_PATH-}''} - exec ${lib.getExe pkgs.steam-run} ${lib.escapeShellArg cfg.executable} ${lib.escapeShellArgs cfg.arguments} - ''; - - restartCommand = - if cfg.restart.command != null then - cfg.restart.command - else - "systemctl restart ${lib.escapeShellArg cfg.serviceName}.service"; in { options.modules.services.steamcmd = { @@ -181,87 +142,128 @@ in registry."stable-uid".${config.networking.hostName}.steamcmd = 20003; } - (lib.mkIf cfg.enable { - users.groups.${cfg.group} = { }; - users.users.${cfg.user} = { - isSystemUser = true; - uid = config.registry."stable-uid".${config.networking.hostName}.steamcmd; - group = cfg.group; - home = cfg.steamDir; - }; + (lib.mkIf cfg.enable ( + let + prepareScript = pkgs.writeShellScript "steamcmd-${cfg.serviceName}-prepare" '' + set -eu - systemd.tmpfiles.rules = [ - "d ${cfg.steamDir} 0770 ${cfg.user} ${cfg.group} - -" - "z ${cfg.steamDir} 0770 ${cfg.user} ${cfg.group} - -" - "d ${cfg.installDir} 0770 ${cfg.user} ${cfg.group} - -" - "z ${cfg.installDir} 0770 ${cfg.user} ${cfg.group} - -" - "d ${cfg.stateDir} 0770 ${cfg.user} ${cfg.group} - -" - "z ${cfg.stateDir} 0770 ${cfg.user} ${cfg.group} - -" - ]; + ${pkgs.coreutils}/bin/install -d \ + -o ${lib.escapeShellArg cfg.user} \ + -g ${lib.escapeShellArg cfg.group} \ + -m 0770 \ + ${lib.escapeShellArg cfg.steamDir} \ + ${lib.escapeShellArg cfg.installDir} \ + ${lib.escapeShellArg cfg.stateDir} + ''; - systemd.services = { - "steamcmd-${cfg.serviceName}-update" = { - description = "Update ${cfg.serviceName} with SteamCMD"; - after = [ "network-online.target" ]; - wants = [ "network-online.target" ]; - serviceConfig = { - Type = "oneshot"; - User = cfg.user; - Group = cfg.group; - WorkingDirectory = "-${cfg.steamDir}"; - ExecStartPre = "+${prepareScript}"; - ExecStart = updateScript; + updateScript = pkgs.writeShellScript "steamcmd-${cfg.serviceName}-update" '' + set -eu + + export HOME=${lib.escapeShellArg cfg.steamDir} + exec ${lib.getExe cfg.package} \ + +force_install_dir ${lib.escapeShellArg cfg.installDir} \ + +login anonymous \ + +app_update ${toString cfg.appId} ${lib.optionalString cfg.validateUpdate "validate"} \ + +quit + ''; + + libraryPath = lib.concatStringsSep ":" cfg.libraryDirs; + startScript = pkgs.writeShellScript "steamcmd-${cfg.serviceName}-start" '' + set -eu + + cd ${lib.escapeShellArg cfg.installDir} + ${lib.optionalString (cfg.libraryDirs != [ ]) ''export LD_LIBRARY_PATH=${lib.escapeShellArg libraryPath}:''${LD_LIBRARY_PATH-}''} + exec ${lib.getExe pkgs.steam-run} ${lib.escapeShellArg cfg.executable} ${lib.escapeShellArgs cfg.arguments} + ''; + + restartCommand = + if cfg.restart.command != null then + cfg.restart.command + else + "systemctl restart ${lib.escapeShellArg cfg.serviceName}.service"; + in + { + users.groups.${cfg.group} = { }; + users.users.${cfg.user} = { + isSystemUser = true; + uid = config.registry."stable-uid".${config.networking.hostName}.steamcmd; + group = cfg.group; + home = cfg.steamDir; + }; + + systemd.tmpfiles.rules = [ + "d ${cfg.steamDir} 0770 ${cfg.user} ${cfg.group} - -" + "z ${cfg.steamDir} 0770 ${cfg.user} ${cfg.group} - -" + "d ${cfg.installDir} 0770 ${cfg.user} ${cfg.group} - -" + "z ${cfg.installDir} 0770 ${cfg.user} ${cfg.group} - -" + "d ${cfg.stateDir} 0770 ${cfg.user} ${cfg.group} - -" + "z ${cfg.stateDir} 0770 ${cfg.user} ${cfg.group} - -" + ]; + + systemd.services = { + "steamcmd-${cfg.serviceName}-update" = { + description = "Update ${cfg.serviceName} with SteamCMD"; + after = [ "network-online.target" ]; + wants = [ "network-online.target" ]; + serviceConfig = { + Type = "oneshot"; + User = cfg.user; + Group = cfg.group; + WorkingDirectory = "-${cfg.steamDir}"; + ExecStartPre = "+${prepareScript}"; + ExecStart = updateScript; + }; + }; + + ${cfg.serviceName} = { + description = "${cfg.serviceName} game server"; + after = [ + "network-online.target" + "steamcmd-${cfg.serviceName}-update.service" + ]; + wants = [ "network-online.target" ]; + wantedBy = [ "multi-user.target" ]; + path = [ pkgs.steam-run ]; + serviceConfig = { + Type = "simple"; + User = cfg.user; + Group = cfg.group; + WorkingDirectory = "-${cfg.installDir}"; + EnvironmentFile = cfg.environmentFiles; + ExecStartPre = [ + "+${prepareScript}" + ] ++ lib.optional cfg.updateOnStart updateScript; + ExecStart = startScript; + Restart = "on-failure"; + }; + }; + + "steamcmd-${cfg.serviceName}-restart" = lib.mkIf cfg.restart.enable { + description = "Restart ${cfg.serviceName}"; + serviceConfig = { + Type = "oneshot"; + ExecStart = pkgs.writeShellScript "steamcmd-${cfg.serviceName}-restart" '' + set -eu + + exec ${restartCommand} + ''; + }; }; }; - ${cfg.serviceName} = { - description = "${cfg.serviceName} game server"; - after = [ - "network-online.target" - "steamcmd-${cfg.serviceName}-update.service" - ]; - wants = [ "network-online.target" ]; - wantedBy = [ "multi-user.target" ]; - path = [ pkgs.steam-run ]; - serviceConfig = { - Type = "simple"; - User = cfg.user; - Group = cfg.group; - WorkingDirectory = "-${cfg.installDir}"; - EnvironmentFile = cfg.environmentFiles; - ExecStartPre = [ - "+${prepareScript}" - ] ++ lib.optional cfg.updateOnStart updateScript; - ExecStart = startScript; - Restart = "on-failure"; + systemd.timers."steamcmd-${cfg.serviceName}-restart" = lib.mkIf cfg.restart.enable { + description = "Restart ${cfg.serviceName} on a schedule"; + wantedBy = [ "timers.target" ]; + timerConfig = { + OnCalendar = cfg.restart.onCalendar; + RandomizedDelaySec = cfg.restart.randomizedDelaySec; + Persistent = true; }; }; - "steamcmd-${cfg.serviceName}-restart" = lib.mkIf cfg.restart.enable { - description = "Restart ${cfg.serviceName}"; - serviceConfig = { - Type = "oneshot"; - ExecStart = pkgs.writeShellScript "steamcmd-${cfg.serviceName}-restart" '' - set -eu - - exec ${restartCommand} - ''; - }; - }; - }; - - systemd.timers."steamcmd-${cfg.serviceName}-restart" = lib.mkIf cfg.restart.enable { - description = "Restart ${cfg.serviceName} on a schedule"; - wantedBy = [ "timers.target" ]; - timerConfig = { - OnCalendar = cfg.restart.onCalendar; - RandomizedDelaySec = cfg.restart.randomizedDelaySec; - Persistent = true; - }; - }; - - networking.firewall.allowedTCPPorts = cfg.tcpPorts; - networking.firewall.allowedUDPPorts = cfg.udpPorts; - }) + networking.firewall.allowedTCPPorts = cfg.tcpPorts; + networking.firewall.allowedUDPPorts = cfg.udpPorts; + } + )) ]; }