1{ config, lib, pkgs, ... }:
2
3# NOTE for now nothing is installed into /etc/bee-clef/. the config files are used as read-only from the nix store.
4
5with lib;
6let
7 cfg = config.services.bee-clef;
8in {
9 meta = {
10 maintainers = with maintainers; [ attila-lendvai ];
11 };
12
13 ### interface
14
15 options = {
16 services.bee-clef = {
17 enable = mkEnableOption (lib.mdDoc "clef external signer instance for Ethereum Swarm Bee");
18
19 dataDir = mkOption {
20 type = types.nullOr types.str;
21 default = "/var/lib/bee-clef";
22 description = lib.mdDoc ''
23 Data dir for bee-clef. Beware that some helper scripts may not work when changed!
24 The service itself should work fine, though.
25 '';
26 };
27
28 passwordFile = mkOption {
29 type = types.nullOr types.str;
30 default = "/var/lib/bee-clef/password";
31 description = lib.mdDoc "Password file for bee-clef.";
32 };
33
34 user = mkOption {
35 type = types.str;
36 default = "bee-clef";
37 description = lib.mdDoc ''
38 User the bee-clef daemon should execute under.
39 '';
40 };
41
42 group = mkOption {
43 type = types.str;
44 default = "bee-clef";
45 description = lib.mdDoc ''
46 Group the bee-clef daemon should execute under.
47 '';
48 };
49 };
50 };
51
52 ### implementation
53
54 config = mkIf cfg.enable {
55 # if we ever want to have rules.js under /etc/bee-clef/
56 # environment.etc."bee-clef/rules.js".source = ${pkgs.bee-clef}/rules.js
57
58 systemd.packages = [ pkgs.bee-clef ]; # include the upstream bee-clef.service file
59
60 systemd.tmpfiles.rules = [
61 "d '${cfg.dataDir}/' 0750 ${cfg.user} ${cfg.group}"
62 "d '${cfg.dataDir}/keystore' 0700 ${cfg.user} ${cfg.group}"
63 ];
64
65 systemd.services.bee-clef = {
66 path = [
67 # these are needed for the ensure-clef-account script
68 pkgs.coreutils
69 pkgs.gnused
70 pkgs.gawk
71 ];
72
73 wantedBy = [ "bee.service" "multi-user.target" ];
74
75 serviceConfig = {
76 User = cfg.user;
77 Group = cfg.group;
78 ExecStartPre = ''${pkgs.bee-clef}/share/bee-clef/ensure-clef-account "${cfg.dataDir}" "${pkgs.bee-clef}/share/bee-clef/"'';
79 ExecStart = [
80 "" # this hides/overrides what's in the original entry
81 "${pkgs.bee-clef}/share/bee-clef/bee-clef-service start"
82 ];
83 ExecStop = [
84 "" # this hides/overrides what's in the original entry
85 "${pkgs.bee-clef}/share/bee-clef/bee-clef-service stop"
86 ];
87 Environment = [
88 "CONFIGDIR=${cfg.dataDir}"
89 "PASSWORD_FILE=${cfg.passwordFile}"
90 ];
91 };
92 };
93
94 users.users = optionalAttrs (cfg.user == "bee-clef") {
95 bee-clef = {
96 group = cfg.group;
97 home = cfg.dataDir;
98 isSystemUser = true;
99 description = "Daemon user for the bee-clef service";
100 };
101 };
102
103 users.groups = optionalAttrs (cfg.group == "bee-clef") {
104 bee-clef = {};
105 };
106 };
107}