29027fd1e1
Using pkgs.lib on the spine of module evaluation is problematic because the pkgs argument depends on the result of module evaluation. To prevent an infinite recursion, pkgs and some of the modules are evaluated twice, which is inefficient. Using ‘with lib’ prevents this problem.
130 lines
3 KiB
Nix
130 lines
3 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.openjre;
|
|
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 = types.attrsOf types.optionSet;
|
|
options = [ 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;
|
|
|
|
};
|
|
|
|
}
|