|
9 | 9 | }: let |
10 | 10 | modulesLib = import ../lib.nix lib; |
11 | 11 |
|
12 | | - inherit (lib.lists) optionals findFirst; |
13 | | - inherit (lib.strings) hasPrefix; |
| 12 | + serviceArgs = |
| 13 | + lib.mapAttrs ( |
| 14 | + gethName: let |
| 15 | + serviceName = "geth-${gethName}"; |
| 16 | + in |
| 17 | + cfg: ((import ./service-args.nix {inherit lib pkgs;}).argsCreate serviceName cfg) |
| 18 | + ) |
| 19 | + eachGeth; |
| 20 | + |
| 21 | + inherit (lib.lists) optionals; |
14 | 22 | inherit (lib.attrsets) zipAttrsWith; |
15 | | - inherit |
16 | | - (lib) |
17 | | - concatStringsSep |
18 | | - filterAttrs |
19 | | - flatten |
20 | | - mapAttrs' |
21 | | - mapAttrsToList |
22 | | - mkIf |
23 | | - mkMerge |
24 | | - nameValuePair |
25 | | - ; |
26 | | - inherit (modulesLib) mkArgs baseServiceConfig; |
| 23 | + inherit (lib) filterAttrs flatten mapAttrs' mapAttrsToList mkIf mkMerge nameValuePair; |
| 24 | + inherit (modulesLib) baseServiceConfig; |
27 | 25 |
|
28 | 26 | # capture config for all configured geths |
29 | 27 | eachGeth = config.services.ethereum.geth; |
|
57 | 55 | in |
58 | 56 | zipAttrsWith (_name: flatten) perService; |
59 | 57 |
|
| 58 | + environment = lib.mapAttrs' (gethName: cfg: |
| 59 | + lib.nameValuePair "etc" { |
| 60 | + "ethereum/geth-${gethName}-args" = let |
| 61 | + argsFromFile = cfg.argsFromFile; |
| 62 | + in |
| 63 | + lib.mkIf argsFromFile.enable { |
| 64 | + source = builtins.toFile "geth-${gethName}-args" '' |
| 65 | + ARGS="${serviceArgs.${gethName}.scriptArgs}" |
| 66 | + ''; |
| 67 | + group = argsFromFile.group; |
| 68 | + mode = argsFromFile.mode; |
| 69 | + }; |
| 70 | + }) |
| 71 | + eachGeth; |
| 72 | + |
60 | 73 | # create a service for each instance |
61 | 74 | systemd.services = |
62 | 75 | mapAttrs' |
|
65 | 78 | serviceName = "geth-${gethName}"; |
66 | 79 | in |
67 | 80 | cfg: let |
68 | | - scriptArgs = let |
69 | | - # replace enable flags like --http.enable with just --http |
70 | | - pathReducer = path: let |
71 | | - arg = concatStringsSep "." (lib.lists.remove "enable" path); |
72 | | - in "--${arg}"; |
73 | | - |
74 | | - # generate flags |
75 | | - args = let |
76 | | - opts = import ./args.nix lib; |
77 | | - in |
78 | | - mkArgs { |
79 | | - inherit pathReducer opts; |
80 | | - inherit (cfg) args; |
81 | | - }; |
82 | | - |
83 | | - # filter out certain args which need to be treated differently |
84 | | - specialArgs = ["--network" "--authrpc.jwtsecret" "--ipcEnable"]; |
85 | | - isNormalArg = name: (findFirst (arg: hasPrefix arg name) null specialArgs) == null; |
86 | | - |
87 | | - filteredArgs = builtins.filter isNormalArg args; |
88 | | - |
89 | | - network = |
90 | | - if cfg.args.network != null |
91 | | - then "--${cfg.args.network}" |
92 | | - else ""; |
93 | | - |
94 | | - jwtSecret = |
95 | | - if cfg.args.authrpc.jwtsecret != null |
96 | | - then "--authrpc.jwtsecret %d/jwtsecret" |
97 | | - else ""; |
98 | | - |
99 | | - ipc = |
100 | | - if cfg.args.ipcEnable |
101 | | - then "" |
102 | | - else "--ipcdisable"; |
103 | | - |
104 | | - datadir = |
105 | | - if cfg.args.datadir != null |
106 | | - then "--datadir ${cfg.args.datadir}" |
107 | | - else "--datadir %S/${serviceName}"; |
108 | | - in '' |
109 | | - ${ipc} ${network} ${jwtSecret} \ |
110 | | - ${datadir} \ |
111 | | - ${concatStringsSep " \\\n" filteredArgs} \ |
112 | | - ${lib.escapeShellArgs cfg.extraArgs} |
113 | | - ''; |
| 81 | + inherit (serviceArgs."${gethName}") execStartCommand; |
114 | 82 | in |
115 | 83 | nameValuePair serviceName (mkIf cfg.enable { |
116 | 84 | after = ["network.target"]; |
|
127 | 95 | baseServiceConfig |
128 | 96 | { |
129 | 97 | User = serviceName; |
| 98 | + EnvironmentFile = lib.mkIf cfg.argsFromFile.enable "/etc/ethereum/geth-${gethName}-args"; |
130 | 99 | StateDirectory = serviceName; |
131 | | - ExecStart = "${cfg.package}/bin/geth ${scriptArgs}"; |
| 100 | + ExecStart = execStartCommand; |
132 | 101 | } |
133 | 102 | (mkIf (cfg.args.authrpc.jwtsecret != null) { |
134 | 103 | LoadCredential = ["jwtsecret:${cfg.args.authrpc.jwtsecret}"]; |
|
0 commit comments