1{ config, lib, pkgs, ... }:
2
3let
4 inherit (lib) escapeShellArgs mkEnableOption mkIf mkOption types;
5
6 cfg = config.services.mimir;
7
8 settingsFormat = pkgs.formats.yaml {};
9in {
10 options.services.mimir = {
11 enable = mkEnableOption (lib.mdDoc "mimir");
12
13 configuration = mkOption {
14 type = (pkgs.formats.json {}).type;
15 default = {};
16 description = lib.mdDoc ''
17 Specify the configuration for Mimir in Nix.
18 '';
19 };
20
21 configFile = mkOption {
22 type = types.nullOr types.path;
23 default = null;
24 description = lib.mdDoc ''
25 Specify a configuration file that Mimir should use.
26 '';
27 };
28
29 package = mkOption {
30 default = pkgs.mimir;
31 defaultText = lib.literalExpression "pkgs.mimir";
32 type = types.package;
33 description = lib.mdDoc ''Mimir package to use.'';
34 };
35
36 extraFlags = mkOption {
37 type = types.listOf types.str;
38 default = [];
39 example = [ "--config.expand-env=true" ];
40 description = lib.mdDoc ''
41 Specify a list of additional command line flags,
42 which get escaped and are then passed to Mimir.
43 '';
44 };
45 };
46
47 config = mkIf cfg.enable {
48 # for mimirtool
49 environment.systemPackages = [ cfg.package ];
50
51 assertions = [{
52 assertion = (
53 (cfg.configuration == {} -> cfg.configFile != null) &&
54 (cfg.configFile != null -> cfg.configuration == {})
55 );
56 message = ''
57 Please specify either
58 'services.mimir.configuration' or
59 'services.mimir.configFile'.
60 '';
61 }];
62
63 systemd.services.mimir = {
64 description = "mimir Service Daemon";
65 wantedBy = [ "multi-user.target" ];
66
67 serviceConfig = let
68 conf = if cfg.configFile == null
69 then settingsFormat.generate "config.yaml" cfg.configuration
70 else cfg.configFile;
71 in
72 {
73 ExecStart = "${cfg.package}/bin/mimir --config.file=${conf} ${escapeShellArgs cfg.extraFlags}";
74 DynamicUser = true;
75 Restart = "always";
76 ProtectSystem = "full";
77 DevicePolicy = "closed";
78 NoNewPrivileges = true;
79 WorkingDirectory = "/var/lib/mimir";
80 StateDirectory = "mimir";
81 };
82 };
83 };
84}