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.users = singleton
58 { name = virtuosoUser;
59 uid = config.ids.uids.virtuoso;
60 description = "virtuoso user";
61 home = stateDir;
62 };
63
64 systemd.services.virtuoso = {
65 after = [ "network.target" ];
66 wantedBy = [ "multi-user.target" ];
67
68 preStart = ''
69 mkdir -p ${stateDir}
70 chown ${virtuosoUser} ${stateDir}
71 '';
72
73 script = ''
74 cd ${stateDir}
75 ${pkgs.virtuoso}/bin/virtuoso-t +foreground +configfile ${pkgs.writeText "virtuoso.ini" cfg.config}
76 '';
77 };
78
79 services.virtuoso.config = ''
80 [Database]
81 DatabaseFile=${stateDir}/x-virtuoso.db
82 TransactionFile=${stateDir}/x-virtuoso.trx
83 ErrorLogFile=${stateDir}/x-virtuoso.log
84 xa_persistent_file=${stateDir}/x-virtuoso.pxa
85
86 [Parameters]
87 ServerPort=${cfg.listenAddress}
88 RunAs=${virtuosoUser}
89 ${optionalString (cfg.dirsAllowed != null) "DirsAllowed=${cfg.dirsAllowed}"}
90 ${cfg.parameters}
91
92 [HTTPServer]
93 ${optionalString (cfg.httpListenAddress != null) "ServerPort=${cfg.httpListenAddress}"}
94 '';
95
96 };
97
98}