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 = lib.mdDoc ''
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 = lib.mdDoc ''
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 = [ "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.serviio =
67 { group = "serviio";
68 home = cfg.dataDir;
69 description = "Serviio Media Server User";
70 createHome = true;
71 isSystemUser = true;
72 };
73
74 users.groups.serviio = { };
75
76 networking.firewall = {
77 allowedTCPPorts = [
78 8895 # serve UPnP responses
79 23423 # console
80 23424 # mediabrowser
81 ];
82 allowedUDPPorts = [
83 1900 # UPnP service discovery
84 ];
85 };
86 };
87}