confctl 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +11 -0
  3. data/.gitignore +8 -0
  4. data/.overcommit.yml +6 -0
  5. data/.rubocop.yml +67 -0
  6. data/.rubocop_todo.yml +5 -0
  7. data/.ruby-version +1 -0
  8. data/CHANGELOG.md +2 -0
  9. data/Gemfile +2 -0
  10. data/LICENSE.txt +674 -0
  11. data/README.md +522 -0
  12. data/Rakefile +40 -0
  13. data/bin/confctl +4 -0
  14. data/confctl.gemspec +33 -0
  15. data/example/.gitignore +2 -0
  16. data/example/README.md +38 -0
  17. data/example/cluster/cluster.nix +7 -0
  18. data/example/cluster/module-list.nix +3 -0
  19. data/example/cluster/nixos-machine/config.nix +15 -0
  20. data/example/cluster/nixos-machine/hardware.nix +4 -0
  21. data/example/cluster/nixos-machine/module.nix +8 -0
  22. data/example/cluster/vpsadminos-container/config.nix +22 -0
  23. data/example/cluster/vpsadminos-container/module.nix +8 -0
  24. data/example/cluster/vpsadminos-machine/config.nix +22 -0
  25. data/example/cluster/vpsadminos-machine/hardware.nix +4 -0
  26. data/example/cluster/vpsadminos-machine/module.nix +8 -0
  27. data/example/cluster/vpsfreecz-vps/config.nix +25 -0
  28. data/example/cluster/vpsfreecz-vps/module.nix +8 -0
  29. data/example/configs/confctl.nix +10 -0
  30. data/example/configs/swpins.nix +28 -0
  31. data/example/data/default.nix +5 -0
  32. data/example/data/ssh-keys.nix +7 -0
  33. data/example/environments/base.nix +13 -0
  34. data/example/modules/module-list.nix +13 -0
  35. data/example/shell.nix +11 -0
  36. data/example/swpins/channels/nixos-unstable.json +35 -0
  37. data/example/swpins/channels/vpsadminos-staging.json +35 -0
  38. data/lib/confctl/cli/app.rb +551 -0
  39. data/lib/confctl/cli/attr_filters.rb +51 -0
  40. data/lib/confctl/cli/cluster.rb +1248 -0
  41. data/lib/confctl/cli/command.rb +206 -0
  42. data/lib/confctl/cli/configuration.rb +296 -0
  43. data/lib/confctl/cli/gen_data.rb +97 -0
  44. data/lib/confctl/cli/generation.rb +335 -0
  45. data/lib/confctl/cli/log_view.rb +267 -0
  46. data/lib/confctl/cli/output_formatter.rb +288 -0
  47. data/lib/confctl/cli/swpins/base.rb +40 -0
  48. data/lib/confctl/cli/swpins/channel.rb +73 -0
  49. data/lib/confctl/cli/swpins/cluster.rb +80 -0
  50. data/lib/confctl/cli/swpins/core.rb +86 -0
  51. data/lib/confctl/cli/swpins/utils.rb +55 -0
  52. data/lib/confctl/cli/swpins.rb +5 -0
  53. data/lib/confctl/cli/tag_filters.rb +30 -0
  54. data/lib/confctl/cli.rb +5 -0
  55. data/lib/confctl/conf_cache.rb +105 -0
  56. data/lib/confctl/conf_dir.rb +88 -0
  57. data/lib/confctl/erb_template.rb +37 -0
  58. data/lib/confctl/exceptions.rb +3 -0
  59. data/lib/confctl/gcroot.rb +30 -0
  60. data/lib/confctl/generation/build.rb +145 -0
  61. data/lib/confctl/generation/build_list.rb +106 -0
  62. data/lib/confctl/generation/host.rb +35 -0
  63. data/lib/confctl/generation/host_list.rb +81 -0
  64. data/lib/confctl/generation/unified.rb +117 -0
  65. data/lib/confctl/generation/unified_list.rb +63 -0
  66. data/lib/confctl/git_repo_mirror.rb +79 -0
  67. data/lib/confctl/health_checks/base.rb +66 -0
  68. data/lib/confctl/health_checks/run_command.rb +179 -0
  69. data/lib/confctl/health_checks/systemd/properties.rb +84 -0
  70. data/lib/confctl/health_checks/systemd/property_check.rb +31 -0
  71. data/lib/confctl/health_checks/systemd/property_list.rb +20 -0
  72. data/lib/confctl/health_checks.rb +5 -0
  73. data/lib/confctl/hook.rb +35 -0
  74. data/lib/confctl/line_buffer.rb +53 -0
  75. data/lib/confctl/logger.rb +151 -0
  76. data/lib/confctl/machine.rb +107 -0
  77. data/lib/confctl/machine_control.rb +172 -0
  78. data/lib/confctl/machine_list.rb +108 -0
  79. data/lib/confctl/machine_status.rb +135 -0
  80. data/lib/confctl/module_options.rb +95 -0
  81. data/lib/confctl/nix.rb +382 -0
  82. data/lib/confctl/nix_build.rb +108 -0
  83. data/lib/confctl/nix_collect_garbage.rb +64 -0
  84. data/lib/confctl/nix_copy.rb +49 -0
  85. data/lib/confctl/nix_format.rb +124 -0
  86. data/lib/confctl/nix_literal_expression.rb +15 -0
  87. data/lib/confctl/parallel_executor.rb +43 -0
  88. data/lib/confctl/pattern.rb +9 -0
  89. data/lib/confctl/settings.rb +50 -0
  90. data/lib/confctl/std_line_buffer.rb +40 -0
  91. data/lib/confctl/swpins/change_set.rb +151 -0
  92. data/lib/confctl/swpins/channel.rb +62 -0
  93. data/lib/confctl/swpins/channel_list.rb +47 -0
  94. data/lib/confctl/swpins/cluster_name.rb +94 -0
  95. data/lib/confctl/swpins/cluster_name_list.rb +15 -0
  96. data/lib/confctl/swpins/core.rb +137 -0
  97. data/lib/confctl/swpins/deployed_info.rb +23 -0
  98. data/lib/confctl/swpins/spec.rb +20 -0
  99. data/lib/confctl/swpins/specs/base.rb +184 -0
  100. data/lib/confctl/swpins/specs/directory.rb +51 -0
  101. data/lib/confctl/swpins/specs/git.rb +135 -0
  102. data/lib/confctl/swpins/specs/git_rev.rb +24 -0
  103. data/lib/confctl/swpins.rb +17 -0
  104. data/lib/confctl/system_command.rb +10 -0
  105. data/lib/confctl/user_script.rb +13 -0
  106. data/lib/confctl/user_scripts.rb +41 -0
  107. data/lib/confctl/utils/file.rb +21 -0
  108. data/lib/confctl/version.rb +3 -0
  109. data/lib/confctl.rb +43 -0
  110. data/man/man8/confctl-options.nix.8 +1334 -0
  111. data/man/man8/confctl-options.nix.8.md +1340 -0
  112. data/man/man8/confctl.8 +660 -0
  113. data/man/man8/confctl.8.md +654 -0
  114. data/nix/evaluator.nix +160 -0
  115. data/nix/lib/default.nix +83 -0
  116. data/nix/lib/machine/default.nix +74 -0
  117. data/nix/lib/machine/info.nix +5 -0
  118. data/nix/lib/swpins/eval.nix +71 -0
  119. data/nix/lib/swpins/options.nix +94 -0
  120. data/nix/machines.nix +31 -0
  121. data/nix/modules/cluster/default.nix +459 -0
  122. data/nix/modules/confctl/cli.nix +21 -0
  123. data/nix/modules/confctl/generations.nix +84 -0
  124. data/nix/modules/confctl/nix.nix +28 -0
  125. data/nix/modules/confctl/swpins.nix +55 -0
  126. data/nix/modules/module-list.nix +19 -0
  127. data/shell.nix +42 -0
  128. data/template/confctl-options.nix/main.erb +45 -0
  129. data/template/confctl-options.nix/options.erb +15 -0
  130. metadata +353 -0
data/nix/evaluator.nix ADDED
@@ -0,0 +1,160 @@
1
+ { jsonArg }:
2
+ let
3
+ arg = builtins.fromJSON (builtins.readFile jsonArg);
4
+
5
+ hasCorePkgs = (builtins.hasAttr "coreSwpins" arg) && (builtins.hasAttr "nixpkgs" arg.coreSwpins);
6
+
7
+ nixpkgs =
8
+ if hasCorePkgs then
9
+ import arg.coreSwpins.nixpkgs {}
10
+ else
11
+ import <nixpkgs> {};
12
+
13
+ machines = import ./machines.nix {
14
+ inherit (arg) confDir;
15
+ inherit corePkgs coreLib;
16
+ };
17
+
18
+ nameValuePairs = builtins.map (m: {
19
+ name = m.name;
20
+ value = {
21
+ inherit (m) name;
22
+ } // m.config;
23
+ }) machines;
24
+
25
+ machinesAttrs = builtins.listToAttrs nameValuePairs;
26
+
27
+ fullMachinesAttrs = builtins.listToAttrs (builtins.map (m: {
28
+ name = m.name;
29
+ value = m;
30
+ }) machines);
31
+
32
+ coreSwpins =
33
+ import ./lib/swpins/eval.nix {
34
+ inherit (arg) confDir;
35
+ name = "core";
36
+ dir = "";
37
+ channels = evalConfctl.config.confctl.swpins.core.channels;
38
+ pkgs = nixpkgs.pkgs;
39
+ lib = nixpkgs.lib;
40
+ };
41
+
42
+ corePkgs =
43
+ if hasCorePkgs then
44
+ nixpkgs
45
+ else if builtins.hasAttr "nixpkgs" coreSwpins.evaluated then
46
+ import coreSwpins.evaluated.nixpkgs {}
47
+ else
48
+ abort "Core swpins not set, run `confctl swpins core update`";
49
+
50
+ coreLib = corePkgs.lib;
51
+
52
+ machineSwpins = m:
53
+ import ./lib/swpins/eval.nix {
54
+ inherit (arg) confDir;
55
+ name = m.name;
56
+ channels = m.config.swpins.channels;
57
+ pkgs = corePkgs.pkgs;
58
+ lib = corePkgs.lib;
59
+ };
60
+
61
+ coreSwpinsAttrs = coreSwpins.evaluated;
62
+
63
+ selectedSwpinsAttrs = builtins.listToAttrs (builtins.map (host: {
64
+ name = host;
65
+ value = (machineSwpins fullMachinesAttrs.${host}).evaluated;
66
+ }) arg.machines);
67
+
68
+ selectedToplevels = builtins.listToAttrs (builtins.map (host: {
69
+ name = host;
70
+ value = buildToplevel fullMachinesAttrs.${host};
71
+ }) arg.machines);
72
+
73
+ buildToplevel = m: (evalMachine m).config.system.build.toplevel;
74
+
75
+ evalMachine = m:
76
+ let
77
+ importPath = {
78
+ nixos = <nixpkgs/nixos/lib/eval-config.nix>;
79
+ vpsadminos = <vpsadminos/os/default.nix>;
80
+ };
81
+
82
+ evalConfig = import importPath.${m.config.spin} {
83
+ modules = [ m.build.toplevel ];
84
+ };
85
+ in evalConfig;
86
+
87
+ evalConfctl =
88
+ let
89
+ cfg = "${toString arg.confDir}/configs/confctl.nix";
90
+ in evalNixosModules ([
91
+ ./modules/confctl/generations.nix
92
+ ./modules/confctl/cli.nix
93
+ ./modules/confctl/nix.nix
94
+ ./modules/confctl/swpins.nix
95
+ "${toString arg.confDir}/configs/swpins.nix"
96
+ ] ++ nixpkgs.lib.optional (builtins.pathExists cfg) cfg);
97
+
98
+ docToplevels = [
99
+ "cluster."
100
+ "confctl."
101
+ ];
102
+
103
+ filterOption = o:
104
+ !o.internal && builtins.any (top: nixpkgs.lib.hasPrefix top o.name) docToplevels;
105
+
106
+ docModules =
107
+ let
108
+ userModules = "${toString arg.confDir}/modules/cluster/default.nix";
109
+ in evalNixosModules (
110
+ (import ./modules/module-list.nix).all
111
+ ++
112
+ (nixpkgs.lib.optional (builtins.pathExists userModules) userModules)
113
+ );
114
+
115
+ docOptions =
116
+ builtins.filter filterOption (nixpkgs.lib.optionAttrSetToDocList docModules.options);
117
+
118
+ evalNixosModules = modules:
119
+ import <nixpkgs/nixos/lib/eval-config.nix> {
120
+ modules = modules ++ [
121
+ ({ ... }:
122
+ {
123
+ _module.args = {
124
+ confLib = import ./lib {
125
+ confDir = "${toString arg.confDir}";
126
+ coreLib = nixpkgs.lib;
127
+ corePkgs = nixpkgs.pkgs;
128
+ };
129
+ };
130
+ })
131
+ ];
132
+ };
133
+
134
+ build = {
135
+ # confctl settings
136
+ confctl = nixpkgs.writeText "confctl-settings.json" (builtins.toJSON { confctl = evalConfctl.config.confctl; });
137
+
138
+ # List available nixos module options for documentation purposes
139
+ moduleOptions = docOptions;
140
+
141
+ # List of machines
142
+ list = { machines = builtins.map (m: m.name) machines; };
143
+
144
+ # List of machines in an attrset: host => config
145
+ info = corePkgs.writeText "machine-list.json" (builtins.toJSON machinesAttrs);
146
+
147
+ # Nix configuration of swpins channels
148
+ listSwpinsChannels = evalConfctl.config.confctl.swpins.channels;
149
+
150
+ # JSON file with core swpins
151
+ evalCoreSwpins = corePkgs.writeText "swpins.json" (builtins.toJSON coreSwpinsAttrs);
152
+
153
+ # JSON file with swpins for selected machines
154
+ evalHostSwpins = corePkgs.writeText "swpins.json" (builtins.toJSON selectedSwpinsAttrs);
155
+
156
+ # JSON file with system.build.toplevel for selected machines, this must
157
+ # be run with proper NIX_PATH with swpins
158
+ toplevel = corePkgs.writeText "toplevels.json" (builtins.toJSON selectedToplevels);
159
+ };
160
+ in build.${arg.build}
@@ -0,0 +1,83 @@
1
+ { confDir, coreLib, corePkgs }:
2
+ with coreLib;
3
+ let
4
+ machine = import ./machine { inherit confDir corePkgs coreLib findConfig; };
5
+
6
+ findConfig =
7
+ { cluster, name }:
8
+ cluster.${name};
9
+
10
+ makeMachine =
11
+ { name, config }:
12
+ {
13
+ inherit name config;
14
+ build.toplevel = buildConfig { inherit name config; };
15
+ };
16
+
17
+ buildConfig =
18
+ { name, config }:
19
+ if !config.managed then
20
+ null
21
+ else if config.spin == "nixos" then
22
+ machine.nixos { inherit name config; }
23
+ else if config.spin == "vpsadminos" then
24
+ machine.vpsadminos { inherit name config; }
25
+ else
26
+ null;
27
+ in rec {
28
+ inherit corePkgs coreLib;
29
+
30
+ mkNetUdevRule = name: mac: ''
31
+ ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?*", KERNEL=="eth*", ATTR{address}=="${mac}", NAME="${name}"
32
+ '';
33
+
34
+ mkNetUdevRules = rs: concatStringsSep "\n" (mapAttrsToList (name: mac:
35
+ mkNetUdevRule name mac
36
+ ) rs);
37
+
38
+ inherit findConfig;
39
+
40
+ # Return all configured machines in a list
41
+ getClusterMachines = cluster:
42
+ mapAttrsToList (name: config:
43
+ makeMachine { inherit name config; }
44
+ ) cluster;
45
+
46
+ # Get IP version addresses from all machines in a cluster
47
+ getAllAddressesOf = cluster: v:
48
+ let
49
+ machines = getClusterMachines cluster;
50
+ addresses = flatten (map (machine:
51
+ map (addr: machine // addr) machine.config.addresses.${"v${toString v}"}
52
+ ) machines);
53
+ in addresses;
54
+
55
+ mkOptions = {
56
+ addresses = v:
57
+ { config, ... }:
58
+ {
59
+ options = {
60
+ address = mkOption {
61
+ type = types.str;
62
+ description = "IPv${toString v} address";
63
+ };
64
+
65
+ prefix = mkOption {
66
+ type = types.ints.positive;
67
+ description = "Prefix length";
68
+ };
69
+
70
+ string = mkOption {
71
+ type = types.nullOr types.str;
72
+ default = null;
73
+ apply = v:
74
+ if isNull v then
75
+ "${config.address}/${toString config.prefix}"
76
+ else
77
+ v;
78
+ description = "Address with prefix as string";
79
+ };
80
+ };
81
+ };
82
+ };
83
+ }
@@ -0,0 +1,74 @@
1
+ { confDir, corePkgs, coreLib, findConfig }:
2
+ let
3
+ swpinsFor =
4
+ { name, config }:
5
+ import ../swpins/eval.nix {
6
+ inherit confDir name;
7
+ channels = config.swpins.channels;
8
+ pkgs = corePkgs;
9
+ lib = coreLib;
10
+ };
11
+
12
+ makeModuleArgs =
13
+ { config, swpins, spin, name }@args: {
14
+ swpins = swpins.evaluated;
15
+ swpinsInfo = swpins.infos;
16
+ confMachine = import ./info.nix (args // { inherit findConfig; });
17
+ };
18
+
19
+ makeImports = spin: extraImports: [
20
+ ({ config, pkgs, lib, confMachine, ... }:
21
+ {
22
+ _file = "confctl/nix/lib/machine/default.nix";
23
+
24
+ _module.args = {
25
+ inherit confDir;
26
+ confLib = import ../../lib { inherit confDir coreLib corePkgs; };
27
+ confData = import "${toString confDir}/data/default.nix" { inherit lib; };
28
+ };
29
+
30
+ networking.hostName =
31
+ lib.mkIf (confMachine.host != null && confMachine.host.name != null) (lib.mkDefault confMachine.host.name);
32
+
33
+ networking.domain =
34
+ lib.mkIf (confMachine.host != null) (lib.mkDefault confMachine.host.fullDomain);
35
+ })
36
+ ] ++ (import ../../modules/module-list.nix).${spin}
37
+ ++ (import "${toString confDir}/modules/module-list.nix").${spin}
38
+ ++ (import "${toString confDir}/cluster/module-list.nix")
39
+ ++ extraImports;
40
+ in rec {
41
+ nixos = { name, config }:
42
+ let
43
+ swpins = swpinsFor { inherit name config; };
44
+ in
45
+ { config, pkgs, ... }@args:
46
+ {
47
+ _module.args = makeModuleArgs {
48
+ inherit config swpins;
49
+ spin = "nixos";
50
+ inherit name;
51
+ };
52
+
53
+ imports = makeImports "nixos" [
54
+ "${toString confDir}/cluster/${name}/config.nix"
55
+ ];
56
+ };
57
+
58
+ vpsadminos = { name, config }:
59
+ let
60
+ swpins = swpinsFor { inherit name config; };
61
+ in
62
+ { config, pkgs, ... }@args:
63
+ {
64
+ _module.args = makeModuleArgs {
65
+ inherit config swpins;
66
+ spin = "vpsadminos";
67
+ inherit name;
68
+ };
69
+
70
+ imports = makeImports "vpsadminos" [
71
+ "${toString confDir}/cluster/${name}/config.nix"
72
+ ];
73
+ };
74
+ }
@@ -0,0 +1,5 @@
1
+ { config, spin, name, findConfig, ... }:
2
+ ({ inherit name; } // findConfig {
3
+ inherit (config) cluster;
4
+ inherit name;
5
+ })
@@ -0,0 +1,71 @@
1
+ { confDir, name, dir ? "cluster", channels, pkgs, lib }:
2
+ let
3
+ pinFileName = builtins.replaceStrings [ "/" ] [ ":" ] name;
4
+
5
+ pinFilePath = "${toString confDir}/swpins/${dir}/${pinFileName}.json";
6
+
7
+ pinFileJson = builtins.readFile pinFilePath;
8
+
9
+ pinFileSpecs =
10
+ if builtins.pathExists pinFilePath then
11
+ builtins.fromJSON pinFileJson
12
+ else
13
+ {};
14
+
15
+ pinFileSwpins = lib.mapAttrs (k: v: swpin v) pinFileSpecs;
16
+
17
+ channelPath = chan: "${toString confDir}/swpins/channels/${chan}.json";
18
+
19
+ channelJson = chan: builtins.readFile (channelPath chan);
20
+
21
+ channelSpecs = chan: builtins.fromJSON (channelJson chan);
22
+
23
+ channelSwpins = chan: lib.mapAttrs (k: v: swpin v) (channelSpecs chan);
24
+
25
+ allChannelSwpins = map channelSwpins channels;
26
+
27
+ allSwpins = (lib.foldl (a: b: a // b) {} allChannelSwpins) // pinFileSwpins;
28
+
29
+ swpin = { fetcher, ... }:
30
+ fetchers.${fetcher.type} fetcher.options;
31
+
32
+ fetchers = rec {
33
+ directory = opts:
34
+ opts.path;
35
+
36
+ git = opts:
37
+ let
38
+ filter = lib.filterAttrs (k: v: builtins.elem k [
39
+ "url" "rev" "sha256" "fetchSubmodules"
40
+ ]);
41
+ in pkgs.fetchgit (filter opts);
42
+
43
+ zip = opts:
44
+ pkgs.fetchzip opts;
45
+
46
+ git-rev = opts:
47
+ let
48
+ repo = fetchers.${opts.wrapped_fetcher.type} opts.wrapped_fetcher.options;
49
+ shortRev = lib.substring 0 9 (opts.rev);
50
+ in
51
+ pkgs.runCommand "git-${shortRev}" {} ''
52
+ cp -a ${repo} $out
53
+ chmod 700 $out
54
+ echo "${opts.rev}" > $out/.git-revision
55
+ echo ".git.${shortRev}" > $out/.version-suffix
56
+ '';
57
+ };
58
+
59
+ pinFileInfos = lib.mapAttrs (k: v: v.info or {}) pinFileSpecs;
60
+
61
+ channelInfos = chan: lib.mapAttrs (k: v: v.info or {}) (channelSpecs chan);
62
+
63
+ allChannelInfos = map channelInfos channels;
64
+
65
+ allInfos = (lib.foldl (a: b: a // b) {} allChannelInfos) // pinFileInfos;
66
+
67
+ in {
68
+ evaluated = allSwpins;
69
+
70
+ infos = allInfos;
71
+ }
@@ -0,0 +1,94 @@
1
+ { lib }:
2
+ with lib;
3
+ rec {
4
+ specModule =
5
+ { config, ... }:
6
+ {
7
+ options = {
8
+ type = mkOption {
9
+ type = types.enum [ "directory" "git" "git-rev" ];
10
+ default = "git";
11
+ };
12
+
13
+ directory = mkOption {
14
+ type = types.nullOr (types.submodule directorySpec);
15
+ default = null;
16
+ };
17
+
18
+ git = mkOption {
19
+ type = types.nullOr (types.submodule gitSpec);
20
+ default = null;
21
+ };
22
+
23
+ git-rev = mkOption {
24
+ type = types.nullOr (types.submodule gitSpec);
25
+ default = null;
26
+ };
27
+ };
28
+ };
29
+
30
+ directorySpec =
31
+ { config, ... }:
32
+ {
33
+ options = {
34
+ path = mkOption {
35
+ type = types.str;
36
+ description = ''
37
+ Absolute path to the directory
38
+ '';
39
+ example = "/opt/my-swpin";
40
+ };
41
+ };
42
+ };
43
+
44
+ gitSpec =
45
+ { config, ... }:
46
+ {
47
+ options = {
48
+ url = mkOption {
49
+ type = types.str;
50
+ description = ''
51
+ URL of the git repository
52
+ '';
53
+ example = "https://github.com/vpsfreecz/vpsadminos";
54
+ };
55
+
56
+ fetchSubmodules = mkOption {
57
+ type = types.bool;
58
+ default = false;
59
+ description = ''
60
+ Fetch git submodules
61
+ '';
62
+ };
63
+
64
+ update = {
65
+ ref = mkOption {
66
+ type = types.nullOr types.str;
67
+ default = null;
68
+ description = ''
69
+ Implicit git reference to use for both manual and automatic updates
70
+ '';
71
+ example = "refs/heads/master";
72
+ };
73
+
74
+ auto = mkOption {
75
+ type = types.bool;
76
+ default = false;
77
+ description = ''
78
+ When enabled, the pin is automatically updated to
79
+ <literal>ref</literal> before building machines.
80
+ '';
81
+ };
82
+
83
+ interval = mkOption {
84
+ type = types.int;
85
+ default = 60*60;
86
+ description = ''
87
+ Number of seconds from the last update to trigger the next
88
+ auto-update, if auto-update is enabled.
89
+ '';
90
+ };
91
+ };
92
+ };
93
+ };
94
+ }
data/nix/machines.nix ADDED
@@ -0,0 +1,31 @@
1
+ { confDir, corePkgs, coreLib }:
2
+ let
3
+ confLib = import ./lib { inherit confDir coreLib corePkgs; };
4
+
5
+ userModules = "${toString confDir}/modules/cluster/default.nix";
6
+
7
+ baseModules = [
8
+ ({ ... }:
9
+ {
10
+ _module.args = {
11
+ pkgs = corePkgs;
12
+ inherit confLib;
13
+ swpins = {};
14
+ swpinsInfo = {};
15
+ confMachine = null;
16
+ };
17
+ })
18
+
19
+ ./modules/cluster
20
+ ] ++ (import "${toString confDir}/cluster/module-list.nix")
21
+ ++ (coreLib.optional (builtins.pathExists userModules) userModules);
22
+
23
+ evalConfig = corePkgs.lib.evalModules {
24
+ prefix = [];
25
+ modules = baseModules;
26
+ };
27
+
28
+ cluster = evalConfig.config.cluster;
29
+
30
+ allMachines = confLib.getClusterMachines cluster;
31
+ in allMachines