1{ config, lib, options, pkgs, ... }:
2
3with lib;
4
5let
6 cfg = config.services.languagetool;
7 settingsFormat = pkgs.formats.javaProperties {};
8in {
9 options.services.languagetool = {
10 enable = mkEnableOption (mdDoc "the LanguageTool server");
11
12 port = mkOption {
13 type = types.port;
14 default = 8081;
15 example = 8081;
16 description = mdDoc ''
17 Port on which LanguageTool listens.
18 '';
19 };
20
21 public = mkEnableOption (mdDoc "access from anywhere (rather than just localhost)");
22
23 allowOrigin = mkOption {
24 type = types.nullOr types.str;
25 default = null;
26 example = "https://my-website.org";
27 description = mdDoc ''
28 Set the Access-Control-Allow-Origin header in the HTTP response,
29 used for direct (non-proxy) JavaScript-based access from browsers.
30 `null` to allow access from all sites.
31 '';
32 };
33
34 settings = lib.mkOption {
35 type = types.submodule {
36 freeformType = settingsFormat.type;
37
38 options.cacheSize = mkOption {
39 type = types.ints.unsigned;
40 default = 1000;
41 apply = toString;
42 description = mdDoc "Number of sentences cached.";
43 };
44 };
45 default = {};
46 description = mdDoc ''
47 Configuration file options for LanguageTool, see
48 'languagetool-http-server --help'
49 for supported settings.
50 '';
51 };
52 };
53
54 config = mkIf cfg.enable {
55
56 systemd.services.languagetool = {
57 description = "LanguageTool HTTP server";
58 wantedBy = [ "multi-user.target" ];
59 after = [ "network.target" ];
60 serviceConfig = {
61 DynamicUser = true;
62 User = "languagetool";
63 Group = "languagetool";
64 CapabilityBoundingSet = [ "" ];
65 RestrictNamespaces = [ "" ];
66 SystemCallFilter = [ "@system-service" "~ @privileged" ];
67 ProtectHome = "yes";
68 ExecStart = ''
69 ${pkgs.languagetool}/bin/languagetool-http-server \
70 --port ${toString cfg.port} \
71 ${optionalString cfg.public "--public"} \
72 ${optionalString (cfg.allowOrigin != null) "--allow-origin ${cfg.allowOrigin}"} \
73 "--config" ${settingsFormat.generate "languagetool.conf" cfg.settings}
74 '';
75 };
76 };
77 };
78}