1# Felix server
2{ config, lib, pkgs, ... }:
3
4with lib;
5
6let
7
8 cfg = config.services.felix;
9
10in
11
12{
13
14 ###### interface
15
16 options = {
17
18 services.felix = {
19
20 enable = mkOption {
21 default = false;
22 description = "Whether to enable the Apache Felix OSGi service";
23 };
24
25 bundles = mkOption {
26 type = types.listOf types.package;
27 default = [ pkgs.felix_remoteshell ];
28 defaultText = "[ pkgs.felix_remoteshell ]";
29 description = "List of bundles that should be activated on startup";
30 };
31
32 user = mkOption {
33 default = "osgi";
34 description = "User account under which Apache Felix runs.";
35 };
36
37 group = mkOption {
38 default = "osgi";
39 description = "Group account under which Apache Felix runs.";
40 };
41
42 };
43
44 };
45
46
47 ###### implementation
48
49 config = mkIf cfg.enable {
50 users.extraGroups = singleton
51 { name = "osgi";
52 gid = config.ids.gids.osgi;
53 };
54
55 users.extraUsers = singleton
56 { name = "osgi";
57 uid = config.ids.uids.osgi;
58 description = "OSGi user";
59 home = "/homeless-shelter";
60 };
61
62 systemd.services.felix = {
63 description = "Felix server";
64 wantedBy = [ "multi-user.target" ];
65
66 preStart = ''
67 # Initialise felix instance on first startup
68 if [ ! -d /var/felix ]
69 then
70 # Symlink system files
71
72 mkdir -p /var/felix
73 chown ${cfg.user}:${cfg.group} /var/felix
74
75 for i in ${pkgs.felix}/*
76 do
77 if [ "$i" != "${pkgs.felix}/bundle" ]
78 then
79 ln -sfn $i /var/felix/$(basename $i)
80 fi
81 done
82
83 # Symlink bundles
84 mkdir -p /var/felix/bundle
85 chown ${cfg.user}:${cfg.group} /var/felix/bundle
86
87 for i in ${pkgs.felix}/bundle/* ${toString cfg.bundles}
88 do
89 if [ -f $i ]
90 then
91 ln -sfn $i /var/felix/bundle/$(basename $i)
92 elif [ -d $i ]
93 then
94 for j in $i/bundle/*
95 do
96 ln -sfn $j /var/felix/bundle/$(basename $j)
97 done
98 fi
99 done
100 fi
101 '';
102
103 script = ''
104 cd /var/felix
105 ${pkgs.su}/bin/su -s ${pkgs.bash}/bin/sh ${cfg.user} -c '${pkgs.jre}/bin/java -jar bin/felix.jar'
106 '';
107 };
108 };
109}