Skip to content

Commit 2e72ea8

Browse files
MartinNikovPetarKirov
authored andcommitted
config(modules/nethermind): Add argsFromFile option
1 parent de4b210 commit 2e72ea8

File tree

3 files changed

+121
-78
lines changed

3 files changed

+121
-78
lines changed

modules/nethermind/default.nix

Lines changed: 30 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,20 @@
44
pkgs,
55
...
66
}: 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;
2918

3019
modulesLib = import ../lib.nix lib;
31-
inherit (modulesLib) mkArgs baseServiceConfig;
20+
inherit (modulesLib) baseServiceConfig;
3221

3322
# capture config for all configured netherminds
3423
eachNethermind = config.services.ethereum.nethermind;
@@ -58,67 +47,29 @@ in {
5847
in
5948
zipAttrsWith (_name: flatten) perService;
6049

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+
6165
# create a service for each instance
6266
systemd.services =
6367
mapAttrs' (
6468
nethermindName: let
6569
serviceName = "nethermind-${nethermindName}";
6670
in
6771
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;
12273
in
12374
nameValuePair serviceName (mkIf cfg.enable {
12475
after = ["network.target"];
@@ -134,9 +85,10 @@ in {
13485
serviceConfig = mkMerge [
13586
{
13687
User = serviceName;
88+
EnvironmentFile = lib.mkIf cfg.argsFromFile.enable "/etc/ethereum/nethermind-${nethermindName}-args";
13789
StateDirectory = serviceName;
13890
MemoryDenyWriteExecute = false; # setting this option is incompatible with JIT
139-
ExecStart = "${cfg.package}/bin/nethermind ${scriptArgs}";
91+
ExecStart = execStartCommand;
14092
}
14193
baseServiceConfig
14294
(mkIf (cfg.args.modules.JsonRpc.JwtSecretFile != null) {

modules/nethermind/options.nix

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,22 @@
3030
description = "Open ports in the firewall for any enabled networking services";
3131
};
3232

33+
argsFromFile = {
34+
enable = mkEnableOption (mdDoc "Create a file in the etc directory from which arguments can be modified");
35+
group = mkOption {
36+
type = types.str;
37+
default = "";
38+
example = "devops";
39+
description = lib.mdDoc "Group which can modify the arguments file";
40+
};
41+
mode = mkOption {
42+
type = types.str;
43+
default = "0664";
44+
example = "0060";
45+
description = lib.mdDoc "Arguments file mode";
46+
};
47+
};
48+
3349
# mixin backup options
3450
backup = let
3551
inherit (import ../backup/lib.nix lib) options;
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
{
2+
lib,
3+
pkgs,
4+
...
5+
}: let
6+
modulesLib = import ../lib.nix lib;
7+
inherit (builtins) isBool isList toString;
8+
inherit (lib) boolToString concatStringsSep findFirst hasPrefix;
9+
inherit (modulesLib) mkArgs;
10+
in {
11+
argsCreate = serviceName: cfg: let
12+
jwtSecret =
13+
if cfg.args.modules.JsonRpc.JwtSecretFile != null
14+
then "--JsonRpc.JwtSecretFile %d/jwtsecret"
15+
else "";
16+
datadir =
17+
if cfg.args.datadir != null
18+
then "--datadir ${cfg.args.datadir}"
19+
else "--datadir %S/${serviceName}";
20+
in rec {
21+
scriptArgs = let
22+
# custom arg reducer for nethermind
23+
argReducer = value:
24+
if (isList value)
25+
then concatStringsSep "," value
26+
else if (isBool value)
27+
then boolToString value
28+
else toString value;
29+
30+
# remove modules from arguments
31+
pathReducer = path: let
32+
arg = concatStringsSep "." (lib.lists.remove "modules" path);
33+
in "--${arg}";
34+
35+
# custom arg formatter for nethermind
36+
argFormatter = {
37+
path,
38+
value,
39+
argReducer,
40+
pathReducer,
41+
...
42+
}: let
43+
arg = pathReducer path;
44+
in "${arg} ${argReducer value}";
45+
46+
# generate flags
47+
args = let
48+
opts = import ./args.nix lib;
49+
in
50+
mkArgs {
51+
inherit pathReducer argReducer argFormatter opts;
52+
inherit (cfg) args;
53+
};
54+
55+
# filter out certain args which need to be treated differently
56+
specialArgs = ["--JsonRpc.JwtSecretFile"];
57+
isNormalArg = name: (findFirst (arg: hasPrefix arg name) null specialArgs) == null;
58+
59+
filteredArgs = builtins.filter isNormalArg args;
60+
in ''
61+
${concatStringsSep " \\\n" filteredArgs} \
62+
${lib.escapeShellArgs cfg.extraArgs}
63+
'';
64+
65+
systemdPathsArgs = ''
66+
${datadir} \
67+
${jwtSecret} \
68+
'';
69+
70+
execStartCommand =
71+
if cfg.argsFromFile.enable
72+
then ''${cfg.package}/bin/nethermind ${systemdPathsArgs} $ARGS''
73+
else ''${cfg.package}/bin/nethermind ${systemdPathsArgs} ${scriptArgs}'';
74+
};
75+
}

0 commit comments

Comments
 (0)