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