1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6
7 cfg = config.services.serviio;
8
9 serviioStart = pkgs.writeScript "serviio.sh" ''
10 #!${pkgs.bash}/bin/sh
11
12 SERVIIO_HOME=${pkgs.serviio}
13
14 # Setup the classpath
15 SERVIIO_CLASS_PATH="$SERVIIO_HOME/lib/*:$SERVIIO_HOME/config"
16
17 # Setup Serviio specific properties
18 JAVA_OPTS="-Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -Dorg.restlet.engine.loggerFacadeClass=org.restlet.ext.slf4j.Slf4jLoggerFacade
19 -Dderby.system.home=${cfg.dataDir}/library -Dserviio.home=${cfg.dataDir} -Dffmpeg.location=${pkgs.ffmpeg}/bin/ffmpeg -Ddcraw.location=${pkgs.dcraw}/bin/dcraw"
20
21 # Execute the JVM in the foreground
22 exec ${pkgs.jre}/bin/java -Xmx512M -Xms20M -XX:+UseG1GC -XX:GCTimeRatio=1 -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 $JAVA_OPTS -classpath "$SERVIIO_CLASS_PATH" org.serviio.MediaServer "$@"
23 '';
24
25in {
26
27 ###### interface
28 options = {
29 services.serviio = {
30
31 enable = mkOption {
32 type = types.bool;
33 default = false;
34 description = ''
35 Whether to enable the Serviio Media Server.
36 '';
37 };
38
39 dataDir = mkOption {
40 type = types.path;
41 default = "/var/lib/serviio";
42 description = ''
43 The directory where serviio stores its state, data, etc.
44 '';
45 };
46
47 };
48 };
49
50 ###### implementation
51
52 config = mkIf cfg.enable {
53 systemd.services.serviio = {
54 description = "Serviio Media Server";
55 after = [ "local-fs.target" "network.target" ];
56 wantedBy = [ "multi-user.target" ];
57 path = [ pkgs.serviio ];
58 serviceConfig = {
59 User = "serviio";
60 Group = "serviio";
61 ExecStart = "${serviioStart}";
62 ExecStop = "${serviioStart} -stop";
63 };
64 };
65
66 users.users = [
67 {
68 name = "serviio";
69 group = "serviio";
70 home = cfg.dataDir;
71 description = "Serviio Media Server User";
72 createHome = true;
73 isSystemUser = true;
74 }
75 ];
76
77 users.groups = [
78 { name = "serviio";}
79 ];
80
81 networking.firewall = {
82 allowedTCPPorts = [
83 8895 # serve UPnP responses
84 23423 # console
85 23424 # mediabrowser
86 ];
87 allowedUDPPorts = [
88 1900 # UPnP service discovey
89 ];
90 };
91 };
92}