Add Terraria server service (#16832)

This commit is contained in:
Paul Hendry 2016-08-06 18:58:38 -07:00 committed by Rok Garbas
parent d21981c2a8
commit 486b8e7f5c
4 changed files with 143 additions and 0 deletions

View File

@ -273,6 +273,7 @@
smokeping = 250;
gocd-agent = 251;
gocd-server = 252;
terraria = 253;
# When adding a uid, make sure it doesn't match an existing gid. And don't use uids above 399!
@ -516,6 +517,7 @@
smokeping = 250;
gocd-agent = 251;
gocd-server = 252;
terraria = 253;
# When adding a gid, make sure it doesn't match an existing
# uid. Users and groups with the same name should have equal

View File

@ -174,6 +174,7 @@
./services/games/ghost-one.nix
./services/games/minecraft-server.nix
./services/games/minetest-server.nix
./services/games/terraria.nix
./services/hardware/acpid.nix
./services/hardware/actkbd.nix
./services/hardware/amd-hybrid-graphics.nix

View File

@ -0,0 +1,139 @@
{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.services.terraria;
worldSizeMap = { "small" = 1; "medium" = 2; "large" = 3; };
valFlag = name: val: optionalString (val != null) "-${name} \"${escape ["\\" "\""] (toString val)}\"";
boolFlag = name: val: optionalString val "-${name}";
flags = [
(valFlag "port" cfg.port)
(valFlag "maxPlayers" cfg.maxPlayers)
(valFlag "password" cfg.password)
(valFlag "motd" cfg.messageOfTheDay)
(valFlag "world" cfg.worldPath)
(valFlag "autocreate" (builtins.getAttr cfg.autoCreatedWorldSize worldSizeMap))
(valFlag "banlist" cfg.banListPath)
(boolFlag "secure" cfg.secure)
(boolFlag "noupnp" cfg.noUPnP)
];
in
{
options = {
services.terraria = {
enable = mkOption {
type = types.bool;
default = false;
description = ''
If enabled, starts a Terraria server. The server can be connected to via <literal>tmux -S /var/lib/terraria/terraria.sock attach</literal>
for administration by users who are a part of the <literal>terraria</literal> group (use <literal>C-b d</literal> shortcut to detach again).
'';
};
port = mkOption {
type = types.int;
default = 7777;
description = ''
Specifies the port to listen on.
'';
};
maxPlayers = mkOption {
type = types.int;
default = 255;
description = ''
Sets the max number of players (between 1 and 255).
'';
};
password = mkOption {
type = types.nullOr types.str;
default = null;
description = ''
Sets the server password. Leave <literal>null</literal> for no password.
'';
};
messageOfTheDay = mkOption {
type = types.nullOr types.str;
default = null;
description = ''
Set the server message of the day text.
'';
};
worldPath = mkOption {
type = types.path;
default = null;
description = ''
The path to the world file (<literal>.wld</literal>) which should be loaded.
If no world exists at this path, one will be created with the size
specified by <literal>autoCreatedWorldSize</literal>.
'';
};
autoCreatedWorldSize = mkOption {
type = types.enum [ "small" "medium" "large" ];
default = "medium";
description = ''
Specifies the size of the auto-created world if <literal>worldPath</literal> does not
point to an existing world.
'';
};
banListPath = mkOption {
type = types.nullOr types.path;
default = null;
description = ''
The path to the ban list.
'';
};
secure = mkOption {
type = types.bool;
default = false;
description = "Adds additional cheat protection to the server.";
};
noUPnP = mkOption {
type = types.bool;
default = false;
description = "Disables automatic Universal Plug and Play.";
};
};
};
config = mkIf cfg.enable {
users.extraUsers.terraria = {
description = "Terraria server service user";
home = "/var/lib/terraria";
createHome = true;
uid = config.ids.uids.terraria;
};
users.extraGroups.terraria = {
gid = config.ids.gids.terraria;
members = [ "terraria" ];
};
systemd.services.terraria = {
description = "Terraria Server Service";
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
serviceConfig = {
User = "terraria";
Type = "oneshot";
RemainAfterExit = true;
ExecStart = "${pkgs.tmux.bin}/bin/tmux -S /var/lib/terraria/terraria.sock new -d ${pkgs.terraria-server}/bin/TerrariaServer ${concatStringsSep " " flags}";
ExecStop = "${pkgs.tmux.bin}/bin/tmux -S /var/lib/terraria/terraria.sock send-keys Enter \"exit\" Enter";
};
postStart = ''
${pkgs.coreutils}/bin/chmod 660 /var/lib/terraria/terraria.sock
${pkgs.coreutils}/bin/chgrp terraria /var/lib/terraria/terraria.sock
'';
};
};
}

View File

@ -16,6 +16,7 @@ stdenv.mkDerivation rec {
installPhase = ''
mkdir -p $out/bin
cp -r Linux $out/
chmod +x "$out/Linux/TerrariaServer.bin.x86_64"
ln -s "$out/Linux/TerrariaServer.bin.x86_64" $out/bin/TerrariaServer
# Fix "/lib64/ld-linux-x86-64.so.2" like references in ELF executables.
find "$out" | while read filepath; do