vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / misc / blenderfarm.nix
blob0d8ecf7af8e20cfa2cc4d122e02b3c542288ce36
1 { config
2 , lib
3 , pkgs
4 , ...
5 }:
6 let
7   cfg = config.services.blendfarm;
8   json = pkgs.formats.json { };
9   configFile = json.generate "ServerSettings" (defaultConfig // cfg.serverConfig);
10   defaultConfig = {
11     Port = 15000;
12     BroadcastPort = 16342;
13     BypassScriptUpdate = false;
14     BasicSecurityPassword = null;
15   };
18   meta.maintainers = with lib.maintainers; [ gador ];
20   options.services.blendfarm = with lib.types; {
21     enable = lib.mkEnableOption "Blendfarm, a render farm management software for Blender";
22     package = lib.mkPackageOption pkgs "blendfarm" { };
23     openFirewall = lib.mkEnableOption "allowing blendfarm network access through the firewall";
25     user = lib.mkOption {
26       description = "User under which blendfarm runs.";
27       default = "blendfarm";
28       type = str;
29     };
31     group = lib.mkOption {
32       description = "Group under which blendfarm runs.";
33       default = "blendfarm";
34       type = str;
35     };
37     basicSecurityPasswordFile = lib.mkOption {
38       description = ''Path to the password file the client needs to connect to the server.
39       The password must not contain a forward slash.'';
40       default = null;
41       type = nullOr str;
42     };
44     blenderPackage = lib.mkPackageOption pkgs "blender" { };
46     serverConfig = lib.mkOption {
47       description = "Server configuration";
48       default = defaultConfig;
49       type = submodule {
50         freeformType = attrsOf anything;
51         options = {
52           Port = lib.mkOption {
53             description = "Default port blendfarm server listens on.";
54             default = 15000;
55             type = types.port;
56           };
57           BroadcastPort = lib.mkOption {
58             description = "Default port blendfarm server advertises itself on.";
59             default = 16342;
60             type = types.port;
61           };
63           BypassScriptUpdate = lib.mkOption {
64             description = "Prevents blendfarm from replacing the .py self-generated scripts.";
65             default = false;
66             type = bool;
67           };
68         };
69       };
70     };
71   };
73   config = lib.mkIf cfg.enable {
74     environment.systemPackages = [ cfg.package ];
75     networking.firewall = lib.optionalAttrs (cfg.openFirewall) {
76       allowedTCPPorts = [ cfg.serverConfig.Port ];
77       allowedUDPPorts = [ cfg.serverConfig.BroadcastPort ];
78     };
80     systemd.services.blendfarm-server = {
81       wantedBy = [ "multi-user.target" ];
82       after = [ "network-online.target" ];
83       wants = [ "network-online.target" ];
84       description = "blendfarm server";
85       path = [ cfg.blenderPackage ];
86       preStart = ''
87         rm -f ServerSettings
88         install -m640 ${configFile} ServerSettings
89         if [ ! -d "BlenderData/nix-blender-linux64" ]; then
90           mkdir -p BlenderData/nix-blender-linux64
91           echo "nix-blender" > VersionCustom
92         fi
93         rm -f BlenderData/nix-blender-linux64/blender
94         ln -s ${lib.getExe cfg.blenderPackage} BlenderData/nix-blender-linux64/blender
95       '' +
96       lib.optionalString (cfg.basicSecurityPasswordFile != null) ''
97         BLENDFARM_PASSWORD=$(${pkgs.systemd}/bin/systemd-creds cat BLENDFARM_PASS_FILE)
98         sed -i "s/null/\"$BLENDFARM_PASSWORD\"/g" ServerSettings
99       '';
100       serviceConfig = {
101         ExecStart = "${cfg.package}/bin/LogicReinc.BlendFarm.Server";
102         DynamicUser = true;
103         LogsDirectory = "blendfarm";
104         StateDirectory = "blendfarm";
105         WorkingDirectory = "/var/lib/blendfarm";
106         User = cfg.user;
107         Group = cfg.group;
108         StateDirectoryMode = "0755";
109         LoadCredential = lib.optional (cfg.basicSecurityPasswordFile != null) "BLENDFARM_PASS_FILE:${cfg.basicSecurityPasswordFile}";
110         ReadWritePaths = "";
111         CapabilityBoundingSet = "";
112         RestrictAddressFamilies = [ "AF_UNIX" "AF_INET" "AF_INET6" ];
113         RestrictNamespaces = true;
114         PrivateDevices = true;
115         PrivateUsers = true;
116         ProtectClock = true;
117         ProtectControlGroups = true;
118         ProtectHome = true;
119         ProtectKernelLogs = true;
120         ProtectKernelModules = true;
121         ProtectKernelTunables = true;
122         SystemCallArchitectures = "native";
123         SystemCallFilter = [
124           "@system-service"
125           "~@privileged"
126           "@chown"
127         ];
128         RestrictRealtime = true;
129         LockPersonality = true;
130         UMask = "0066";
131         ProtectHostname = true;
132       };
133     };
135     users.users.blendfarm = {
136       isSystemUser = true;
137       group = "blendfarm";
138     };
139     users.groups.blendfarm = { };
140   };