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}