1{
2 config,
3 lib,
4 options,
5 pkgs,
6 ...
7}:
8let
9 cfg = config.services.amule;
10 opt = options.services.amule;
11 user = if cfg.user != null then cfg.user else "amule";
12in
13
14{
15
16 ###### interface
17
18 options = {
19
20 services.amule = {
21
22 enable = lib.mkOption {
23 type = lib.types.bool;
24 default = false;
25 description = ''
26 Whether to run the AMule daemon. You need to manually run "amuled --ec-config" to configure the service for the first time.
27 '';
28 };
29
30 dataDir = lib.mkOption {
31 type = lib.types.str;
32 default = "/home/${user}/";
33 defaultText = lib.literalExpression ''
34 "/home/''${config.${opt.user}}/"
35 '';
36 description = ''
37 The directory holding configuration, incoming and temporary files.
38 '';
39 };
40
41 user = lib.mkOption {
42 type = lib.types.nullOr lib.types.str;
43 default = null;
44 description = ''
45 The user the AMule daemon should run as.
46 '';
47 };
48
49 };
50
51 };
52
53 ###### implementation
54
55 config = lib.mkIf cfg.enable {
56
57 users.users = lib.mkIf (cfg.user == null) [
58 {
59 name = "amule";
60 description = "AMule daemon";
61 group = "amule";
62 uid = config.ids.uids.amule;
63 }
64 ];
65
66 users.groups = lib.mkIf (cfg.user == null) [
67 {
68 name = "amule";
69 gid = config.ids.gids.amule;
70 }
71 ];
72
73 systemd.services.amuled = {
74 description = "AMule daemon";
75 wantedBy = [ "multi-user.target" ];
76 after = [ "network.target" ];
77
78 preStart = ''
79 mkdir -p ${cfg.dataDir}
80 chown ${user} ${cfg.dataDir}
81 '';
82
83 script = ''
84 ${pkgs.su}/bin/su -s ${pkgs.runtimeShell} ${user} \
85 -c 'HOME="${cfg.dataDir}" ${pkgs.amule-daemon}/bin/amuled'
86 '';
87 };
88 };
89}