1{ config, lib, pkgs, ... }:
2let
3 cfg = config.services.virtuoso;
4 virtuosoUser = "virtuoso";
5 stateDir = "/var/lib/virtuoso";
6in
7with lib;
8{
9
10 ###### interface
11
12 options = {
13
14 services.virtuoso = {
15
16 enable = mkOption {
17 default = false;
18 description = "Whether to enable Virtuoso Opensource database server.";
19 };
20
21 config = mkOption {
22 default = "";
23 description = "Extra options to put into Virtuoso configuration file.";
24 };
25
26 parameters = mkOption {
27 default = "";
28 description = "Extra options to put into [Parameters] section of Virtuoso configuration file.";
29 };
30
31 listenAddress = mkOption {
32 default = "1111";
33 example = "myserver:1323";
34 description = "ip:port or port to listen on.";
35 };
36
37 httpListenAddress = mkOption {
38 default = null;
39 example = "myserver:8080";
40 description = "ip:port or port for Virtuoso HTTP server to listen on.";
41 };
42
43 dirsAllowed = mkOption {
44 default = null;
45 example = "/www, /home/";
46 description = "A list of directories Virtuoso is allowed to access";
47 };
48 };
49
50 };
51
52
53 ###### implementation
54
55 config = mkIf cfg.enable {
56
57 users.extraUsers = singleton
58 { name = virtuosoUser;
59 uid = config.ids.uids.virtuoso;
60 description = "virtuoso user";
61 home = stateDir;
62 };
63
64 systemd.services.virtuoso = {
65 wantedBy = [ "ip-up.target" ];
66
67 preStart = ''
68 mkdir -p ${stateDir}
69 chown ${virtuosoUser} ${stateDir}
70 '';
71
72 script = ''
73 cd ${stateDir}
74 ${pkgs.virtuoso}/bin/virtuoso-t +foreground +configfile ${pkgs.writeText "virtuoso.ini" cfg.config}
75 '';
76 };
77
78 services.virtuoso.config = ''
79 [Database]
80 DatabaseFile=${stateDir}/x-virtuoso.db
81 TransactionFile=${stateDir}/x-virtuoso.trx
82 ErrorLogFile=${stateDir}/x-virtuoso.log
83 xa_persistent_file=${stateDir}/x-virtuoso.pxa
84
85 [Parameters]
86 ServerPort=${cfg.listenAddress}
87 RunAs=${virtuosoUser}
88 ${optionalString (cfg.dirsAllowed != null) "DirsAllowed=${cfg.dirsAllowed}"}
89 ${cfg.parameters}
90
91 [HTTPServer]
92 ${optionalString (cfg.httpListenAddress != null) "ServerPort=${cfg.httpListenAddress}"}
93 '';
94
95 };
96
97}