1{ config, lib, pkgs, ... }:
2let
3 cfg = config.services.monetdb;
4 monetdbUser = "monetdb";
5in
6with lib;
7{
8
9 ###### interface
10
11 options = {
12
13 services.monetdb = {
14
15 enable = mkOption {
16 type = types.bool;
17 default = false;
18 description = "Whether to enable MonetDB database server.";
19 };
20
21 package = mkOption {
22 type = types.path;
23 description = "MonetDB package to use.";
24 };
25
26 dbfarmDir = mkOption {
27 type = types.path;
28 default = "/var/lib/monetdb";
29 description = ''
30 Specifies location of Monetdb dbfarm (keeps database and auxiliary files).
31 '';
32 };
33
34 port = mkOption {
35 default = "50000";
36 example = "50000";
37 description = "Port to listen on.";
38 };
39 };
40
41 };
42
43
44 ###### implementation
45
46 config = mkIf cfg.enable {
47
48 users.extraUsers.monetdb =
49 { name = monetdbUser;
50 uid = config.ids.uids.monetdb;
51 description = "monetdb user";
52 home = cfg.dbfarmDir;
53 };
54
55 users.extraGroups.monetdb.gid = config.ids.gids.monetdb;
56
57 environment.systemPackages = [ cfg.package ];
58
59 systemd.services.monetdb =
60 { description = "MonetDB Server";
61
62 wantedBy = [ "multi-user.target" ];
63
64 after = [ "network.target" ];
65
66 path = [ cfg.package ];
67
68 preStart =
69 ''
70 # Initialise the database.
71 if ! test -e ${cfg.dbfarmDir}/.merovingian_properties; then
72 mkdir -m 0700 -p ${cfg.dbfarmDir}
73 chown -R ${monetdbUser} ${cfg.dbfarmDir}
74 ${cfg.package}/bin/monetdbd create ${cfg.dbfarmDir}
75 ${cfg.package}/bin/monetdbd set port=${cfg.port} ${cfg.dbfarmDir}
76 fi
77 '';
78
79 serviceConfig.ExecStart = "${cfg.package}/bin/monetdbd start -n ${cfg.dbfarmDir}";
80
81 serviceConfig.ExecStop = "${cfg.package}/bin/monetdbd stop ${cfg.dbfarmDir}";
82
83 unitConfig.RequiresMountsFor = "${cfg.dbfarmDir}";
84 };
85
86 };
87
88}