|
6 | 6 | }: let |
7 | 7 | modulesLib = import ../lib.nix lib; |
8 | 8 |
|
9 | | - inherit (lib.lists) findFirst sublist last; |
10 | | - inherit (lib.strings) hasPrefix; |
| 9 | + serviceArgs = |
| 10 | + lib.mapAttrs ( |
| 11 | + beaconName: let |
| 12 | + serviceName = "nimbus-eth2"; |
| 13 | + in |
| 14 | + cfg: ((import ./service-args.nix {inherit lib pkgs;}).argsCreate serviceName cfg) |
| 15 | + ) |
| 16 | + eachBeacon; |
| 17 | + |
11 | 18 | inherit (lib.attrsets) zipAttrsWith; |
12 | | - inherit |
13 | | - (lib) |
14 | | - concatStringsSep |
15 | | - filterAttrs |
16 | | - flatten |
17 | | - mapAttrs' |
18 | | - mapAttrsToList |
19 | | - mkIf |
20 | | - mkMerge |
21 | | - nameValuePair |
22 | | - types |
23 | | - ; |
24 | | - inherit (modulesLib) mkArgs baseServiceConfig defaultArgReducer; |
| 19 | + inherit (lib) filterAttrs flatten mapAttrs' mapAttrsToList mkIf mkMerge nameValuePair; |
| 20 | + inherit (modulesLib) baseServiceConfig; |
25 | 21 |
|
26 | 22 | eachBeacon = config.services.ethereum.nimbus-eth2; |
27 | 23 | in { |
@@ -57,139 +53,29 @@ in { |
57 | 53 | in |
58 | 54 | zipAttrsWith (_name: flatten) perService; |
59 | 55 |
|
| 56 | + environment = lib.mapAttrs' (beaconName: cfg: |
| 57 | + lib.nameValuePair "etc" { |
| 58 | + "ethereum/nimbus-${beaconName}-args" = let |
| 59 | + argsFromFile = cfg.argsFromFile; |
| 60 | + in |
| 61 | + lib.mkIf argsFromFile.enable { |
| 62 | + source = builtins.toFile "nimbus-${beaconName}-args" '' |
| 63 | + ARGS="${serviceArgs.${beaconName}.beaconNodeArgs}" |
| 64 | + ''; |
| 65 | + group = argsFromFile.group; |
| 66 | + mode = argsFromFile.mode; |
| 67 | + }; |
| 68 | + }) |
| 69 | + eachBeacon; |
| 70 | + |
60 | 71 | systemd.services = |
61 | 72 | mapAttrs' |
62 | 73 | ( |
63 | 74 | beaconName: let |
64 | 75 | serviceName = "nimbus-eth2"; |
65 | 76 | in |
66 | 77 | cfg: let |
67 | | - network = |
68 | | - if cfg.args.network != null |
69 | | - then "--network=${cfg.args.network}" |
70 | | - else ""; |
71 | | - |
72 | | - jwtSecret = |
73 | | - if cfg.args.jwt-secret != null |
74 | | - then ''--jwt-secret="%d/jwt-secret"'' |
75 | | - else ""; |
76 | | - |
77 | | - keymanagerTokenFile = |
78 | | - if cfg.args.keymanager.token-file != null |
79 | | - then ''--keymanager-token-file="%d/keymanager-token-file"'' |
80 | | - else ""; |
81 | | - |
82 | | - trustedNodeUrl = |
83 | | - if cfg.args.trusted-node-url != null |
84 | | - then ''--trusted-node-url="${cfg.args.trusted-node-url}"'' |
85 | | - else ""; |
86 | | - |
87 | | - backfilling = |
88 | | - if cfg.args.trusted-node-url != null |
89 | | - then ''--backfill=${lib.boolToString cfg.args.backfill}'' |
90 | | - else ""; |
91 | | - |
92 | | - web3Url = |
93 | | - if cfg.args.web3-urls != null |
94 | | - then ''--web3-url=${concatStringsSep " --web3-url=" cfg.args.web3-urls}'' |
95 | | - else ""; |
96 | | - |
97 | | - web3SignerUrls = lib.pipe cfg.args.web3-signer-url [ |
98 | | - (builtins.map (x: "--web3-signer-url=${x}")) |
99 | | - (builtins.concatStringsSep " ") |
100 | | - ]; |
101 | | - |
102 | | - payloadBuilder = |
103 | | - if cfg.args.payload-builder.enable |
104 | | - then "--payload-builder=true --payload-builder-url=${cfg.args.payload-builder.url}" |
105 | | - else ""; |
106 | | - |
107 | | - dataDirPath = "%S/${serviceName}"; |
108 | | - dataDir = ''--data-dir="${dataDirPath}"''; |
109 | | - |
110 | | - beaconNodeArgs = let |
111 | | - # generate args |
112 | | - args = let |
113 | | - opts = import ./args.nix lib; |
114 | | - |
115 | | - pathReducer = path: let |
116 | | - p = |
117 | | - if (last path == "enable") |
118 | | - then sublist 0 ((builtins.length path) - 1) path |
119 | | - else path; |
120 | | - in "--${concatStringsSep "-" p}"; |
121 | | - |
122 | | - argFormatter = { |
123 | | - opt, |
124 | | - path, |
125 | | - value, |
126 | | - argReducer ? defaultArgReducer, |
127 | | - pathReducer ? defaultArgReducer, |
128 | | - }: let |
129 | | - arg = pathReducer path; |
130 | | - in |
131 | | - if (opt.type == types.bool) |
132 | | - then |
133 | | - ( |
134 | | - if value |
135 | | - then "${arg}" |
136 | | - else "" |
137 | | - ) |
138 | | - else "${arg}=${argReducer value}"; |
139 | | - in |
140 | | - mkArgs { |
141 | | - inherit opts; |
142 | | - inherit (cfg) args; |
143 | | - inherit argFormatter; |
144 | | - inherit pathReducer; |
145 | | - }; |
146 | | - # filter out certain args which need to be treated differently |
147 | | - specialArgs = ["--network" "--jwt-secret" "--web3-urls" "--web3-signer-url" "--trusted-node-url" "--backfill" "--payload-builder" "--keymanager-token-file"]; |
148 | | - isNormalArg = name: (findFirst (arg: hasPrefix arg name) null specialArgs) == null; |
149 | | - filteredArgs = builtins.filter isNormalArg args; |
150 | | - in '' |
151 | | - ${network} ${jwtSecret} \ |
152 | | - ${web3Url} \ |
153 | | - ${web3SignerUrls} \ |
154 | | - ${dataDir} \ |
155 | | - ${keymanagerTokenFile} \ |
156 | | - ${payloadBuilder} \ |
157 | | - ${concatStringsSep " \\\n" filteredArgs} \ |
158 | | - ${lib.escapeShellArgs cfg.extraArgs} |
159 | | - ''; |
160 | | - |
161 | | - nodeSyncArgs = '' |
162 | | - ${network} \ |
163 | | - ${trustedNodeUrl} \ |
164 | | - ${backfilling}''; |
165 | | - |
166 | | - binaryName = |
167 | | - if cfg.args.network == "gnosis" || cfg.args.network == "chiado" |
168 | | - then "${cfg.package}/bin/nimbus_beacon_node_gnosis" |
169 | | - else "${cfg.package}/bin/nimbus_beacon_node"; |
170 | | - |
171 | | - # When running trustedNodeSync after passing once, it gives an error |
172 | | - # and doesn't continue to execute execStart. The problem occurs when |
173 | | - # the service is restarted and execStartPre runs again. So we check |
174 | | - # for the existence of a file in the folder, and that way we know if |
175 | | - # Nimbus is running for the first time or not. |
176 | | - trustedNodeSync = |
177 | | - if cfg.args.trusted-node-url != null |
178 | | - then let |
179 | | - script = pkgs.writeShellScript "trustedNodeSync.sh" '' |
180 | | - datadir="$1" |
181 | | - shift |
182 | | - if [ -f "$datadir/db/nbc.sqlite3" ]; then |
183 | | - echo "skipping trustedNodeSync"; |
184 | | - exit 0 |
185 | | - else |
186 | | - echo "starting trustedNodeSync"; |
187 | | - set -x |
188 | | - ${binaryName} trustedNodeSync "$@" |
189 | | - fi |
190 | | - ''; |
191 | | - in "${script} ${dataDirPath} ${dataDir} ${nodeSyncArgs}" |
192 | | - else null; |
| 78 | + inherit (serviceArgs."${beaconName}") trustedNodeSync execStartCommand; |
193 | 79 | in |
194 | 80 | nameValuePair serviceName (mkIf cfg.enable { |
195 | 81 | after = ["network.target"]; |
|
202 | 88 | { |
203 | 89 | User = serviceName; |
204 | 90 | StateDirectory = serviceName; |
| 91 | + EnvironmentFile = lib.mkIf cfg.argsFromFile.enable "/etc/ethereum/nimbus-${beaconName}-args"; |
205 | 92 | ExecStartPre = trustedNodeSync; |
206 | | - ExecStart = ''${binaryName} ${beaconNodeArgs}''; |
| 93 | + ExecStart = execStartCommand; |
207 | 94 | MemoryDenyWriteExecute = "false"; # causes a library loading error |
208 | 95 | } |
209 | 96 | (mkIf (cfg.args.jwt-secret != null) { |
|
0 commit comments