confctl 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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