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 default = [ pkgs.felix_remoteshell ];
27 description = "List of bundles that should be activated on startup";
28 };
29
30 user = mkOption {
31 default = "osgi";
32 description = "User account under which Apache Felix runs.";
33 };
34
35 group = mkOption {
36 default = "osgi";
37 description = "Group account under which Apache Felix runs.";
38 };
39
40 };
41
42 };
43
44
45 ###### implementation
46
47 config = mkIf cfg.enable {
48 users.extraGroups = singleton
49 { name = "osgi";
50 gid = config.ids.gids.osgi;
51 };
52
53 users.extraUsers = singleton
54 { name = "osgi";
55 uid = config.ids.uids.osgi;
56 description = "OSGi user";
57 home = "/homeless-shelter";
58 };
59
60 jobs.felix =
61 { description = "Felix server";
62
63 preStart =
64 ''
65 # Initialise felix instance on first startup
66 if [ ! -d /var/felix ]
67 then
68 # Symlink system files
69
70 mkdir -p /var/felix
71 chown ${cfg.user}:${cfg.group} /var/felix
72
73 for i in ${pkgs.felix}/*
74 do
75 if [ "$i" != "${pkgs.felix}/bundle" ]
76 then
77 ln -sfn $i /var/felix/$(basename $i)
78 fi
79 done
80
81 # Symlink bundles
82 mkdir -p /var/felix/bundle
83 chown ${cfg.user}:${cfg.group} /var/felix/bundle
84
85 for i in ${pkgs.felix}/bundle/* ${toString cfg.bundles}
86 do
87 if [ -f $i ]
88 then
89 ln -sfn $i /var/felix/bundle/$(basename $i)
90 elif [ -d $i ]
91 then
92 for j in $i/bundle/*
93 do
94 ln -sfn $j /var/felix/bundle/$(basename $j)
95 done
96 fi
97 done
98 fi
99 '';
100
101 script =
102 ''
103 cd /var/felix
104 ${pkgs.su}/bin/su -s ${pkgs.bash}/bin/sh ${cfg.user} -c '${pkgs.jre}/bin/java -jar bin/felix.jar'
105 '';
106 };
107
108 };
109
110}