108 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{ config, lib, pkgs, ... }:
 | 
						|
 | 
						|
with lib;
 | 
						|
 | 
						|
let
 | 
						|
  cfg   = config.services.minetest-server;
 | 
						|
  flag  = val: name: if val != null then "--${name} ${val} " else "";
 | 
						|
  flags = [ 
 | 
						|
    (flag cfg.gameId "gameid") 
 | 
						|
    (flag cfg.world "world") 
 | 
						|
    (flag cfg.configPath "config") 
 | 
						|
    (flag cfg.logPath "logfile") 
 | 
						|
    (flag cfg.port "port") 
 | 
						|
  ];
 | 
						|
in
 | 
						|
{
 | 
						|
  options = {
 | 
						|
    services.minetest-server = {
 | 
						|
      enable = mkOption {
 | 
						|
        type        = types.bool;
 | 
						|
        default     = false;
 | 
						|
        description = "If enabled, starts a Minetest Server.";
 | 
						|
      };
 | 
						|
 | 
						|
      gameId = mkOption {
 | 
						|
        type        = types.nullOr types.str;
 | 
						|
        default     = null;
 | 
						|
        description = ''
 | 
						|
          Id of the game to use. To list available games run 
 | 
						|
          `minetestserver --gameid list`.
 | 
						|
 | 
						|
          If only one game exists, this option can be null.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      world = mkOption {
 | 
						|
        type        = types.nullOr types.path;
 | 
						|
        default     = null;
 | 
						|
        description = ''
 | 
						|
          Name of the world to use. To list available worlds run
 | 
						|
          `minetestserver --world list`.
 | 
						|
 | 
						|
          If only one world exists, this option can be null.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      configPath = mkOption {
 | 
						|
        type        = types.nullOr types.path;
 | 
						|
        default     = null;
 | 
						|
        description = ''
 | 
						|
          Path to the config to use.
 | 
						|
 | 
						|
          If set to null, the config of the running user will be used:
 | 
						|
          `~/.minetest/minetest.conf`.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      logPath = mkOption {
 | 
						|
        type        = types.nullOr types.path;
 | 
						|
        default     = null;
 | 
						|
        description = ''
 | 
						|
          Path to logfile for logging. 
 | 
						|
 | 
						|
          If set to null, logging will be output to stdout which means
 | 
						|
          all output will be catched by systemd.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      port = mkOption {
 | 
						|
        type        = types.nullOr types.int;
 | 
						|
        default     = null;
 | 
						|
        description = ''
 | 
						|
          Port number to bind to.
 | 
						|
 | 
						|
          If set to null, the default 30000 will be used.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
    };
 | 
						|
  };
 | 
						|
 | 
						|
  config = mkIf cfg.enable {
 | 
						|
    users.users.minetest = {
 | 
						|
      description     = "Minetest Server Service user";
 | 
						|
      home            = "/var/lib/minetest";
 | 
						|
      createHome      = true;
 | 
						|
      uid             = config.ids.uids.minetest;
 | 
						|
      group           = "minetest";
 | 
						|
    };
 | 
						|
    users.groups.minetest.gid = config.ids.gids.minetest;
 | 
						|
 | 
						|
    systemd.services.minetest-server = {
 | 
						|
      description   = "Minetest Server Service";
 | 
						|
      wantedBy      = [ "multi-user.target" ];
 | 
						|
      after         = [ "network.target" ];
 | 
						|
 | 
						|
      serviceConfig.Restart = "always";
 | 
						|
      serviceConfig.User    = "minetest";
 | 
						|
      serviceConfig.Group   = "minetest";
 | 
						|
 | 
						|
      script = ''
 | 
						|
        cd /var/lib/minetest
 | 
						|
 | 
						|
        exec ${pkgs.minetest}/bin/minetest --server ${concatStrings flags}
 | 
						|
      '';
 | 
						|
    };
 | 
						|
  };
 | 
						|
}
 |