|
4 | 4 | pkgs, |
5 | 5 | ... |
6 | 6 | }: let |
7 | | - inherit |
8 | | - (builtins) |
9 | | - isBool |
10 | | - isList |
11 | | - toString |
12 | | - ; |
13 | | - inherit |
14 | | - (lib) |
15 | | - boolToString |
16 | | - concatStringsSep |
17 | | - filterAttrs |
18 | | - findFirst |
19 | | - flatten |
20 | | - hasPrefix |
21 | | - mapAttrs' |
22 | | - mapAttrsToList |
23 | | - mkIf |
24 | | - mkMerge |
25 | | - nameValuePair |
26 | | - optionals |
27 | | - zipAttrsWith |
28 | | - ; |
| 7 | + serviceArgs = |
| 8 | + lib.mapAttrs ( |
| 9 | + nethermindName: let |
| 10 | + serviceName = "nethermind-${nethermindName}"; |
| 11 | + in |
| 12 | + cfg: ((import ./service-args.nix {inherit lib pkgs;}).argsCreate serviceName cfg) |
| 13 | + ) |
| 14 | + eachNethermind; |
| 15 | + |
| 16 | + inherit (builtins) toString; |
| 17 | + inherit (lib) filterAttrs flatten mapAttrs' mapAttrsToList mkIf mkMerge nameValuePair optionals zipAttrsWith; |
29 | 18 |
|
30 | 19 | modulesLib = import ../lib.nix lib; |
31 | | - inherit (modulesLib) mkArgs baseServiceConfig; |
| 20 | + inherit (modulesLib) baseServiceConfig; |
32 | 21 |
|
33 | 22 | # capture config for all configured netherminds |
34 | 23 | eachNethermind = config.services.ethereum.nethermind; |
|
58 | 47 | in |
59 | 48 | zipAttrsWith (_name: flatten) perService; |
60 | 49 |
|
| 50 | + environment = lib.mapAttrs' (nethermindName: cfg: |
| 51 | + lib.nameValuePair "etc" { |
| 52 | + "ethereum/nethermind-${nethermindName}-args" = let |
| 53 | + argsFromFile = cfg.argsFromFile; |
| 54 | + in |
| 55 | + lib.mkIf argsFromFile.enable { |
| 56 | + source = builtins.toFile "nethermind-${nethermindName}-args" '' |
| 57 | + ARGS="${serviceArgs.${nethermindName}.scriptArgs}" |
| 58 | + ''; |
| 59 | + group = argsFromFile.group; |
| 60 | + mode = argsFromFile.mode; |
| 61 | + }; |
| 62 | + }) |
| 63 | + eachNethermind; |
| 64 | + |
61 | 65 | # create a service for each instance |
62 | 66 | systemd.services = |
63 | 67 | mapAttrs' ( |
64 | 68 | nethermindName: let |
65 | 69 | serviceName = "nethermind-${nethermindName}"; |
66 | 70 | in |
67 | 71 | cfg: let |
68 | | - scriptArgs = let |
69 | | - # custom arg reducer for nethermind |
70 | | - argReducer = value: |
71 | | - if (isList value) |
72 | | - then concatStringsSep "," value |
73 | | - else if (isBool value) |
74 | | - then boolToString value |
75 | | - else toString value; |
76 | | - |
77 | | - # remove modules from arguments |
78 | | - pathReducer = path: let |
79 | | - arg = concatStringsSep "." (lib.lists.remove "modules" path); |
80 | | - in "--${arg}"; |
81 | | - |
82 | | - # custom arg formatter for nethermind |
83 | | - argFormatter = { |
84 | | - path, |
85 | | - value, |
86 | | - argReducer, |
87 | | - pathReducer, |
88 | | - ... |
89 | | - }: let |
90 | | - arg = pathReducer path; |
91 | | - in "${arg} ${argReducer value}"; |
92 | | - |
93 | | - jwtSecret = |
94 | | - if cfg.args.modules.JsonRpc.JwtSecretFile != null |
95 | | - then "--JsonRpc.JwtSecretFile %d/jwtsecret" |
96 | | - else ""; |
97 | | - datadir = |
98 | | - if cfg.args.datadir != null |
99 | | - then "--datadir ${cfg.args.datadir}" |
100 | | - else "--datadir %S/${serviceName}"; |
101 | | - |
102 | | - # generate flags |
103 | | - args = let |
104 | | - opts = import ./args.nix lib; |
105 | | - in |
106 | | - mkArgs { |
107 | | - inherit pathReducer argReducer argFormatter opts; |
108 | | - inherit (cfg) args; |
109 | | - }; |
110 | | - |
111 | | - # filter out certain args which need to be treated differently |
112 | | - specialArgs = ["--JsonRpc.JwtSecretFile"]; |
113 | | - isNormalArg = name: (findFirst (arg: hasPrefix arg name) null specialArgs) == null; |
114 | | - |
115 | | - filteredArgs = builtins.filter isNormalArg args; |
116 | | - in '' |
117 | | - ${datadir} \ |
118 | | - ${jwtSecret} \ |
119 | | - ${concatStringsSep " \\\n" filteredArgs} \ |
120 | | - ${lib.escapeShellArgs cfg.extraArgs} |
121 | | - ''; |
| 72 | + inherit (serviceArgs."${nethermindName}") execStartCommand; |
122 | 73 | in |
123 | 74 | nameValuePair serviceName (mkIf cfg.enable { |
124 | 75 | after = ["network.target"]; |
|
134 | 85 | serviceConfig = mkMerge [ |
135 | 86 | { |
136 | 87 | User = serviceName; |
| 88 | + EnvironmentFile = lib.mkIf cfg.argsFromFile.enable "/etc/ethereum/nethermind-${nethermindName}-args"; |
137 | 89 | StateDirectory = serviceName; |
138 | 90 | MemoryDenyWriteExecute = false; # setting this option is incompatible with JIT |
139 | | - ExecStart = "${cfg.package}/bin/nethermind ${scriptArgs}"; |
| 91 | + ExecStart = execStartCommand; |
140 | 92 | } |
141 | 93 | baseServiceConfig |
142 | 94 | (mkIf (cfg.args.modules.JsonRpc.JwtSecretFile != null) { |
|
0 commit comments