about summary refs log tree commit diff
path: root/nixos
diff options
context:
space:
mode:
authorEric Litak <elitak@gmail.com>2016-04-11 21:17:05 -0700
committerEric Litak <elitak@gmail.com>2016-04-14 23:03:36 -0700
commit13577e8785140521106f0060a6af8a1129a9f6de (patch)
treedf5a31ed0de68ebaa168213063a7e1b46b1d70f1 /nixos
parent7ce216139cd6fa777d3e8fc137ee3b2f9e561e21 (diff)
downloadnixlib-13577e8785140521106f0060a6af8a1129a9f6de.tar
nixlib-13577e8785140521106f0060a6af8a1129a9f6de.tar.gz
nixlib-13577e8785140521106f0060a6af8a1129a9f6de.tar.bz2
nixlib-13577e8785140521106f0060a6af8a1129a9f6de.tar.lz
nixlib-13577e8785140521106f0060a6af8a1129a9f6de.tar.xz
nixlib-13577e8785140521106f0060a6af8a1129a9f6de.tar.zst
nixlib-13577e8785140521106f0060a6af8a1129a9f6de.zip
factorio: headless server module
Diffstat (limited to 'nixos')
-rw-r--r--nixos/modules/misc/ids.nix2
-rw-r--r--nixos/modules/module-list.nix1
-rw-r--r--nixos/modules/services/games/factorio.nix102
3 files changed, 105 insertions, 0 deletions
diff --git a/nixos/modules/misc/ids.nix b/nixos/modules/misc/ids.nix
index 86332d719495..9e6bbc744381 100644
--- a/nixos/modules/misc/ids.nix
+++ b/nixos/modules/misc/ids.nix
@@ -262,6 +262,7 @@
       mfi = 238;
       caddy = 239;
       taskd = 240;
+      factorio = 241;
 
       # When adding a uid, make sure it doesn't match an existing gid. And don't use uids above 399!
 
@@ -495,6 +496,7 @@
       #mfi = 238; # unused
       caddy = 239;
       taskd = 240;
+      factorio = 241;
 
       # When adding a gid, make sure it doesn't match an existing
       # uid. Users and groups with the same name should have equal
diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index 6384f8a3d9aa..41b60773a70b 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -158,6 +158,7 @@
   ./services/desktops/gnome3/tracker.nix
   ./services/desktops/profile-sync-daemon.nix
   ./services/desktops/telepathy.nix
+  ./services/games/factorio.nix
   ./services/games/ghost-one.nix
   ./services/games/minecraft-server.nix
   ./services/games/minetest-server.nix
diff --git a/nixos/modules/services/games/factorio.nix b/nixos/modules/services/games/factorio.nix
new file mode 100644
index 000000000000..fff0d091c7a8
--- /dev/null
+++ b/nixos/modules/services/games/factorio.nix
@@ -0,0 +1,102 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+  cfg = config.services.factorio;
+  name = "Factorio";
+  stateDir = "/var/lib/factorio";
+  configFile = pkgs.writeText "factorio.conf" ''
+    use-system-read-write-data-directories=true
+    [path]
+    read-data=${pkgs.factorio-headless}/share/factorio/data
+    write-data=${stateDir}
+  '';
+in
+{
+  options = {
+    services.factorio = {
+      enable = mkEnableOption name;
+      port = mkOption {
+        type = types.int;
+        default = 34197;
+        description = ''
+          The port to which the service should bind.
+
+          This option will also open up the UDP port in the firewall configuration.
+        '';
+      };
+      saveName = mkOption {
+        type = types.string;
+        default = "default";
+        description = ''
+          The name of the savegame that will be used by the server.
+
+          When not present in ${stateDir}/saves, it will be generated before starting the service.
+        '';
+      };
+      # TODO Add more individual settings as nixos-options?
+      # TODO XXX The server tries to copy a newly created config file over the old one
+      #   on shutdown, but fails, because it's in the nix store. When is this needed?
+      #   Can an admin set options in-game and expect to have them persisted?
+      configFile = mkOption {
+        type = types.path;
+        default = configFile;
+        defaultText = "configFile";
+        description = ''
+          The server's configuration file.
+
+          The default file generated by this module contains lines essential to
+          the server's operation. Use its contents as a basis for any
+          customizations.
+        '';
+      };
+    };
+  };
+
+  config = mkIf cfg.enable {
+    users = {
+      users.factorio = {
+        uid             = config.ids.uids.factorio;
+        description     = "Factorio server user";
+        group           = "factorio";
+        home            = stateDir;
+        createHome      = true;
+      };
+
+      groups.factorio = {
+        gid = config.ids.gids.factorio;
+      };
+    };
+
+    systemd.services.factorio = {
+      description   = "Factorio headless server";
+      wantedBy      = [ "multi-user.target" ];
+      after         = [ "network.target" ];
+
+      preStart = ''
+          test -e ${stateDir}/saves/${cfg.saveName}.zip || ${pkgs.factorio-headless}/bin/factorio \
+            --config=${cfg.configFile} \
+            --create=${cfg.saveName}
+      '';
+
+      serviceConfig = {
+        User = "factorio";
+        Group = "factorio";
+        Restart = "always";
+        KillSignal = "SIGINT";
+        WorkingDirectory = stateDir;
+        PrivateTmp = true;
+        UMask = "0007";
+        ExecStart = toString [
+          "${pkgs.factorio-headless}/bin/factorio"
+          "--config=${cfg.configFile}"
+          "--port=${toString cfg.port}"
+          "--start-server=${cfg.saveName}"
+        ];
+      };
+    };
+
+    networking.firewall.allowedUDPPorts = [ cfg.port ];
+  };
+}