Skip to content

Commit de4b210

Browse files
MartinNikovPetarKirov
authored andcommitted
config(modules/geth): Add argsFromFile option
1 parent 18c5cff commit de4b210

File tree

3 files changed

+116
-61
lines changed

3 files changed

+116
-61
lines changed

modules/geth/default.nix

Lines changed: 30 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,19 @@
99
}: let
1010
modulesLib = import ../lib.nix lib;
1111

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;
1422
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;
2725

2826
# capture config for all configured geths
2927
eachGeth = config.services.ethereum.geth;
@@ -57,6 +55,21 @@ in {
5755
in
5856
zipAttrsWith (_name: flatten) perService;
5957

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+
6073
# create a service for each instance
6174
systemd.services =
6275
mapAttrs'
@@ -65,52 +78,7 @@ in {
6578
serviceName = "geth-${gethName}";
6679
in
6780
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;
11482
in
11583
nameValuePair serviceName (mkIf cfg.enable {
11684
after = ["network.target"];
@@ -127,8 +95,9 @@ in {
12795
baseServiceConfig
12896
{
12997
User = serviceName;
98+
EnvironmentFile = lib.mkIf cfg.argsFromFile.enable "/etc/ethereum/geth-${gethName}-args";
13099
StateDirectory = serviceName;
131-
ExecStart = "${cfg.package}/bin/geth ${scriptArgs}";
100+
ExecStart = execStartCommand;
132101
}
133102
(mkIf (cfg.args.authrpc.jwtsecret != null) {
134103
LoadCredential = ["jwtsecret:${cfg.args.authrpc.jwtsecret}"];

modules/geth/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;

modules/geth/service-args.nix

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
{
2+
lib,
3+
pkgs,
4+
...
5+
}: let
6+
modulesLib = import ../lib.nix lib;
7+
8+
inherit (lib.lists) findFirst;
9+
inherit (lib.strings) hasPrefix;
10+
inherit (lib) concatStringsSep;
11+
inherit (modulesLib) mkArgs;
12+
in {
13+
argsCreate = serviceName: cfg: let
14+
network =
15+
if cfg.args.network != null
16+
then "--${cfg.args.network}"
17+
else "";
18+
19+
jwtSecret =
20+
if cfg.args.authrpc.jwtsecret != null
21+
then "--authrpc.jwtsecret %d/jwtsecret"
22+
else "";
23+
24+
ipc =
25+
if cfg.args.ipcEnable
26+
then ""
27+
else "--ipcdisable";
28+
29+
datadir =
30+
if cfg.args.datadir != null
31+
then "--datadir ${cfg.args.datadir}"
32+
else "--datadir %S/${serviceName}";
33+
in rec {
34+
scriptArgs = let
35+
# replace enable flags like --http.enable with just --http
36+
pathReducer = path: let
37+
arg = concatStringsSep "." (lib.lists.remove "enable" path);
38+
in "--${arg}";
39+
40+
# generate flags
41+
args = let
42+
opts = import ./args.nix lib;
43+
in
44+
mkArgs {
45+
inherit pathReducer opts;
46+
inherit (cfg) args;
47+
};
48+
49+
# filter out certain args which need to be treated differently
50+
specialArgs = ["--network" "--authrpc.jwtsecret" "--ipcEnable"];
51+
isNormalArg = name: (findFirst (arg: hasPrefix arg name) null specialArgs) == null;
52+
53+
filteredArgs = builtins.filter isNormalArg args;
54+
in ''
55+
${ipc} ${network} \
56+
${concatStringsSep " \\\n" filteredArgs} \
57+
${lib.escapeShellArgs cfg.extraArgs}
58+
'';
59+
60+
systemdPathsArgs = ''
61+
${datadir} \
62+
${jwtSecret} \
63+
'';
64+
65+
execStartCommand =
66+
if cfg.argsFromFile.enable
67+
then ''${cfg.package}/bin/geth ${systemdPathsArgs} $ARGS''
68+
else ''${cfg.package}/bin/geth ${systemdPathsArgs} ${scriptArgs}'';
69+
};
70+
}

0 commit comments

Comments
 (0)