130 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{ config, lib, pkgs, ... }:
 | 
						|
 | 
						|
with lib;
 | 
						|
 | 
						|
let
 | 
						|
 | 
						|
  cfg = config.services.winstone;
 | 
						|
 | 
						|
  winstoneOpts = { name, ... }: {
 | 
						|
    options = {
 | 
						|
      name = mkOption {
 | 
						|
        default = name;
 | 
						|
        internal = true;
 | 
						|
      };
 | 
						|
 | 
						|
      serviceName = mkOption {
 | 
						|
        type = types.str;
 | 
						|
        description = ''
 | 
						|
          The name of the systemd service. By default, it is
 | 
						|
          derived from the winstone instance name.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      warFile = mkOption {
 | 
						|
        type = types.str;
 | 
						|
        description = ''
 | 
						|
          The WAR file that Winstone should serve.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      javaPackage = mkOption {
 | 
						|
        type = types.package;
 | 
						|
        default = pkgs.jre;
 | 
						|
        defaultText = "pkgs.jre";
 | 
						|
        description = ''
 | 
						|
          Which Java derivation to use for running Winstone.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      user = mkOption {
 | 
						|
        type = types.str;
 | 
						|
        description = ''
 | 
						|
          The user that should run this Winstone process and
 | 
						|
          own the working directory.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      group = mkOption {
 | 
						|
        type = types.str;
 | 
						|
        description = ''
 | 
						|
          The group that will own the working directory.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      workDir = mkOption {
 | 
						|
        type = types.str;
 | 
						|
        description = ''
 | 
						|
          The working directory for this Winstone instance. Will
 | 
						|
          contain extracted webapps etc. The directory will be
 | 
						|
          created if it doesn't exist.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      extraJavaOptions = mkOption {
 | 
						|
        type = types.listOf types.str;
 | 
						|
        default = [];
 | 
						|
        description = ''
 | 
						|
          Extra command line options given to the java process running
 | 
						|
          Winstone.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      extraOptions = mkOption {
 | 
						|
        type = types.listOf types.str;
 | 
						|
        default = [];
 | 
						|
        description = ''
 | 
						|
          Extra command line options given to the Winstone process.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
    };
 | 
						|
 | 
						|
    config = {
 | 
						|
      workDir = mkDefault "/run/winstone/${name}";
 | 
						|
      serviceName = mkDefault "winstone-${name}";
 | 
						|
    };
 | 
						|
  };
 | 
						|
 | 
						|
  mkService = cfg: let
 | 
						|
    opts = concatStringsSep " " (cfg.extraOptions ++ [
 | 
						|
      "--warfile ${cfg.warFile}"
 | 
						|
    ]);
 | 
						|
 | 
						|
    javaOpts = concatStringsSep " " (cfg.extraJavaOptions ++ [
 | 
						|
      "-Djava.io.tmpdir=${cfg.workDir}"
 | 
						|
      "-jar ${pkgs.winstone}/lib/winstone.jar"
 | 
						|
    ]);
 | 
						|
  in {
 | 
						|
    wantedBy = [ "multi-user.target" ];
 | 
						|
    description = "winstone service for ${cfg.name}";
 | 
						|
    preStart = ''
 | 
						|
      mkdir -p "${cfg.workDir}"
 | 
						|
      chown ${cfg.user}:${cfg.group} "${cfg.workDir}"
 | 
						|
    '';
 | 
						|
    serviceConfig = {
 | 
						|
      ExecStart = "${cfg.javaPackage}/bin/java ${javaOpts} ${opts}";
 | 
						|
      User = cfg.user;
 | 
						|
      PermissionsStartOnly = true;
 | 
						|
    };
 | 
						|
  };
 | 
						|
 | 
						|
in {
 | 
						|
 | 
						|
  options = {
 | 
						|
    services.winstone = mkOption {
 | 
						|
      default = {};
 | 
						|
      type = with types; attrsOf (submodule winstoneOpts);
 | 
						|
      description = ''
 | 
						|
        Defines independent Winstone services, each serving one WAR-file.
 | 
						|
      '';
 | 
						|
    };
 | 
						|
  };
 | 
						|
 | 
						|
  config = mkIf (cfg != {}) {
 | 
						|
 | 
						|
    systemd.services = mapAttrs' (n: c: nameValuePair c.serviceName (mkService c)) cfg;
 | 
						|
 | 
						|
  };
 | 
						|
 | 
						|
}
 |