Compare commits
4 Commits
06ca3a547c
...
11ae1097de
Author | SHA1 | Date |
---|---|---|
Peder Bergebakken Sundt | 11ae1097de | |
Peder Bergebakken Sundt | 7d8165c1bb | |
Peder Bergebakken Sundt | 9206f9da29 | |
Peder Bergebakken Sundt | af3bb1cbf9 |
|
@ -169,7 +169,7 @@
|
||||||
# file = ./secrets/${hostname}.yaml;
|
# file = ./secrets/${hostname}.yaml;
|
||||||
# exists = builtins.pathExists file;
|
# exists = builtins.pathExists file;
|
||||||
# yaml = lib.removeAttrs (lib.importYAML file) ["sops"];
|
# yaml = lib.removeAttrs (lib.importYAML file) ["sops"];
|
||||||
# secrets = lib.attrNames yaml;
|
# secrets = lib.attrNames yaml; # TODO: recurse
|
||||||
#in
|
#in
|
||||||
# if !exists then {} else lib.mkMerge (lib.forEach secrets (secret:
|
# if !exists then {} else lib.mkMerge (lib.forEach secrets (secret:
|
||||||
# lib.mkIf (config.sops.secrets ? secret) {
|
# lib.mkIf (config.sops.secrets ? secret) {
|
||||||
|
|
|
@ -5,6 +5,10 @@
|
||||||
boot.loader.efi.canTouchEfiVariables = true;
|
boot.loader.efi.canTouchEfiVariables = true;
|
||||||
boot.loader.efi.efiSysMountPoint = "/boot/efi";
|
boot.loader.efi.efiSysMountPoint = "/boot/efi";
|
||||||
|
|
||||||
|
boot.binfmt.emulatedSystems = [
|
||||||
|
"aarch64-linux"
|
||||||
|
];
|
||||||
|
|
||||||
services.nfs.server.enable = false; # TODO: remove?
|
services.nfs.server.enable = false; # TODO: remove?
|
||||||
|
|
||||||
imports = [
|
imports = [
|
||||||
|
|
|
@ -11,11 +11,11 @@
|
||||||
# buildMachine.protocol
|
# buildMachine.protocol
|
||||||
# ssh.listenUser
|
# ssh.listenUser
|
||||||
# ssh.listenPort
|
# ssh.listenPort
|
||||||
# ssh.listenPublicKey # cat /etc/ssh/ssh_host_ed25519_key.pub || ssh-keyscan {{fqdn}}
|
# ssh.listenPublicKey # cat /etc/ssh/ssh_host_ed25519_key.pub || ssh-keyscan {{fqdn}}
|
||||||
# ssh.userPublicKey # sudo ssh-keygen -t ed25519 && sudo cat /root/.ssh/id_ed25519.pub
|
# ssh.proxyJump # optional hostname
|
||||||
# ssh.proxyJump # optional hostname
|
|
||||||
# ssh.userPrivateKey # optional IdentityFile to use
|
|
||||||
# ssh.connectTimeout
|
# ssh.connectTimeout
|
||||||
|
# ssh.userPrivateKey # optional IdentityFile to use
|
||||||
|
# ssh.userPublicKey # sudo ssh-keygen -t ed25519 && sudo cat /root/.ssh/id_ed25519.pub
|
||||||
|
|
||||||
|
|
||||||
# buildMachine.supportedFeatures:
|
# buildMachine.supportedFeatures:
|
||||||
|
@ -32,8 +32,8 @@ buildMachine.speedFactor = 1
|
||||||
buildMachine.supportedFeatures = []
|
buildMachine.supportedFeatures = []
|
||||||
buildMachine.mandatoryFeatures = []
|
buildMachine.mandatoryFeatures = []
|
||||||
buildMachine.protocol = "ssh" # "ssh-ng"
|
buildMachine.protocol = "ssh" # "ssh-ng"
|
||||||
ssh.listenUser = "pbsds" # TODO: change
|
# ssh.listenUser = "pbsds" # TODO: change
|
||||||
# ssh.listenUser = "nixbld-remote"
|
ssh.listenUser = "nixbld-remote"
|
||||||
ssh.listenPort = 22
|
ssh.listenPort = 22
|
||||||
ssh.connectTimeout = 3
|
ssh.connectTimeout = 3
|
||||||
|
|
||||||
|
@ -41,6 +41,7 @@ ssh.connectTimeout = 3
|
||||||
# headless: one job per 4 threads and 8GB RAM
|
# headless: one job per 4 threads and 8GB RAM
|
||||||
# graphical: one job
|
# graphical: one job
|
||||||
|
|
||||||
|
|
||||||
["bolle.pbsds.net"]
|
["bolle.pbsds.net"]
|
||||||
buildMachine.systems = ["x86_64-linux", "i686-linux", "riscv64-linux"]
|
buildMachine.systems = ["x86_64-linux", "i686-linux", "riscv64-linux"]
|
||||||
buildMachine.maxJobs = 3 # 12 threads 32GB
|
buildMachine.maxJobs = 3 # 12 threads 32GB
|
||||||
|
@ -51,6 +52,7 @@ ssh.proxyJump = "isvegg.pvv.ntnu.no"
|
||||||
|
|
||||||
["eple.pbsds.net"] # r9 290x
|
["eple.pbsds.net"] # r9 290x
|
||||||
aliases = [ "eple.tail9aac63.ts.net" ]
|
aliases = [ "eple.tail9aac63.ts.net" ]
|
||||||
|
buildMachine.systems = ["x86_64-linux", "i686-linux", "aarch64-linux"]
|
||||||
buildMachine.maxJobs = 3 # 12 threads 32GB
|
buildMachine.maxJobs = 3 # 12 threads 32GB
|
||||||
buildMachine.speedFactor = 3 # i7-5820K
|
buildMachine.speedFactor = 3 # i7-5820K
|
||||||
buildMachine.supportedFeatures = ["kvm", "big-parallel", "nixos-test"]
|
buildMachine.supportedFeatures = ["kvm", "big-parallel", "nixos-test"]
|
||||||
|
@ -108,6 +110,7 @@ ssh.listenPort = 2222
|
||||||
ssh.listenPublicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILD7+tE6rm742fz+nqa3+zlglMuzCzOQlc0OSJssvgVL"
|
ssh.listenPublicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILD7+tE6rm742fz+nqa3+zlglMuzCzOQlc0OSJssvgVL"
|
||||||
ssh.userPublicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVohqGMKp/UEZtb71RSBBXOEGX4o3lN5GYBlP7HEKbs root@brumlebasse"
|
ssh.userPublicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVohqGMKp/UEZtb71RSBBXOEGX4o3lN5GYBlP7HEKbs root@brumlebasse"
|
||||||
|
|
||||||
|
|
||||||
["isvegg.pvv.ntnu.no"]
|
["isvegg.pvv.ntnu.no"]
|
||||||
# buildMachine.maxJobs = 1 # 4 threads 16GB
|
# buildMachine.maxJobs = 1 # 4 threads 16GB
|
||||||
buildMachine.speedFactor = 1 # i5-3570
|
buildMachine.speedFactor = 1 # i5-3570
|
||||||
|
|
|
@ -4,8 +4,15 @@
|
||||||
# TODO: https://exozy.me/about
|
# TODO: https://exozy.me/about
|
||||||
|
|
||||||
let
|
let
|
||||||
inherit (builtins) map fromTOML readFile elem attrNames attrValues;
|
inherit (builtins)
|
||||||
inherit (lib) mkIf;
|
map
|
||||||
|
fromTOML
|
||||||
|
toString
|
||||||
|
readFile
|
||||||
|
elem
|
||||||
|
attrNames
|
||||||
|
attrValues
|
||||||
|
;
|
||||||
|
|
||||||
known-hosts = let
|
known-hosts = let
|
||||||
known-hosts' = lib.importTOML ../hosts/known-hosts.toml; # TODO: eww
|
known-hosts' = lib.importTOML ../hosts/known-hosts.toml; # TODO: eww
|
||||||
|
@ -13,14 +20,13 @@ let
|
||||||
lib.pipe known-hosts' [
|
lib.pipe known-hosts' [
|
||||||
(lib.flip lib.removeAttrs ["__default__"])
|
(lib.flip lib.removeAttrs ["__default__"])
|
||||||
(lib.mapAttrs (fqdn: host:
|
(lib.mapAttrs (fqdn: host:
|
||||||
lib.recursiveUpdate (
|
lib.recursiveUpdate (known-hosts'."__default__" or {}) host
|
||||||
(known-hosts'."__default__" or {})
|
|
||||||
// { isAlias = false; }
|
|
||||||
) host
|
|
||||||
))
|
))
|
||||||
(lib.mapAttrsToList (fqdn: host: let
|
(lib.mapAttrsToList (fqdn: host:
|
||||||
|
let
|
||||||
allHostnames = [ fqdn ] ++ host.aliases;
|
allHostnames = [ fqdn ] ++ host.aliases;
|
||||||
in lib.forEach allHostnames (alias:
|
in
|
||||||
|
lib.forEach allHostnames (alias:
|
||||||
lib.nameValuePair
|
lib.nameValuePair
|
||||||
alias
|
alias
|
||||||
(host // {
|
(host // {
|
||||||
|
@ -35,8 +41,8 @@ let
|
||||||
hostNames = attrNames known-hosts;
|
hostNames = attrNames known-hosts;
|
||||||
thisHost = known-hosts.${config.networking.fqdn};
|
thisHost = known-hosts.${config.networking.fqdn};
|
||||||
thisHostIsBuilder = thisHost.buildMachine.maxJobs > 0;
|
thisHostIsBuilder = thisHost.buildMachine.maxJobs > 0;
|
||||||
thisHostIsHopHost = builtins.elem config.networking.fqdn (lib.forEach (attrValues known-hosts) (host: host.ssh.proxyJump or null));
|
thisHostIsBuildee = thisHost.ssh ? userPublicKey;
|
||||||
thisHostIsConsumer = thisHost.ssh ? userPublicKey;
|
thisHostIsHopHost = elem config.networking.fqdn (lib.forEach (attrValues known-hosts) (host: host.ssh.proxyJump or null));
|
||||||
|
|
||||||
mkRemoteConfig = fqdn: let
|
mkRemoteConfig = fqdn: let
|
||||||
thatHost = known-hosts.${fqdn};
|
thatHost = known-hosts.${fqdn};
|
||||||
|
@ -46,11 +52,11 @@ let
|
||||||
sshUser = thatHost.ssh.listenUser;
|
sshUser = thatHost.ssh.listenUser;
|
||||||
};
|
};
|
||||||
thatHostIsBuilder = thatHost.buildMachine.maxJobs > 0;
|
thatHostIsBuilder = thatHost.buildMachine.maxJobs > 0;
|
||||||
thatHostIsConsumer = thatHost.ssh ? userPublicKey && thisHostIsBuilder;
|
thatHostIsBuildee = thatHost.ssh ? userPublicKey && thisHostIsBuilder;
|
||||||
thatHostIsThis = builtins.elem config.networking.fqdn ([ fqdn ] ++ thatHost.aliases);
|
thatHostIsThis = elem config.networking.fqdn ([ fqdn ] ++ thatHost.aliases);
|
||||||
in mkIf (!thatHostIsThis) ( lib.mkMerge [
|
in lib.mkIf (!thatHostIsThis) ( lib.mkMerge [
|
||||||
# out
|
# out
|
||||||
(lib.mkIf (thisHostIsConsumer && thatHostIsBuilder) {
|
(lib.mkIf (thisHostIsBuildee && thatHostIsBuilder) {
|
||||||
|
|
||||||
# TODO: Allow setting speedFactor for local builds, as local is currently fixed to 0
|
# TODO: Allow setting speedFactor for local builds, as local is currently fixed to 0
|
||||||
# https://github.com/NixOS/nix/issues/2457
|
# https://github.com/NixOS/nix/issues/2457
|
||||||
|
@ -62,17 +68,17 @@ let
|
||||||
|
|
||||||
})
|
})
|
||||||
# out or jump
|
# out or jump
|
||||||
(lib.mkIf (thisHostIsConsumer && thatHost.ssh ? listenPublicKey) {
|
(lib.mkIf (thisHostIsBuildee && thatHost.ssh ? listenPublicKey) {
|
||||||
programs.ssh.knownHosts.${fqdn}.publicKey = thatHost.ssh.listenPublicKey;
|
programs.ssh.knownHosts.${fqdn}.publicKey = thatHost.ssh.listenPublicKey;
|
||||||
# TODO: use nix.buildMachines.*.publicHostKey ?
|
# TODO: use nix.buildMachines.*.publicHostKey ?
|
||||||
|
|
||||||
# timeouts are great when remote is unresponsive. nix doesn't care, lix is way and tests each remote only once
|
# timeouts are great when remote is unresponsive. nix doesn't care, lix is way and tests each remote only once
|
||||||
programs.ssh.extraConfig = ''
|
programs.ssh.extraConfig = ''
|
||||||
Host ${fqdn}
|
Host ${fqdn}
|
||||||
ConnectTimeout ${builtins.toString thatHost.ssh.connectTimeout}
|
ConnectTimeout ${toString thatHost.ssh.connectTimeout}
|
||||||
Port ${builtins.toString thatHost.ssh.listenPort}
|
Port ${toString thatHost.ssh.listenPort}
|
||||||
${lib.optionalString (thatHost.ssh ? proxyJump) ''
|
${lib.optionalString (thatHost.ssh ? proxyJump) ''
|
||||||
ProxyJump ${thatJump.ssh.listenUser}@${thatHost.ssh.proxyJump}:${builtins.toString thatJump.ssh.listenPort}
|
ProxyJump ${thatJump.ssh.listenUser}@${thatHost.ssh.proxyJump}:${toString thatJump.ssh.listenPort}
|
||||||
''}
|
''}
|
||||||
${lib.optionalString (thatHost.ssh ? userPrivateKey) ''
|
${lib.optionalString (thatHost.ssh ? userPrivateKey) ''
|
||||||
IdentityFile ${thatHost.ssh.userPrivateKey}
|
IdentityFile ${thatHost.ssh.userPrivateKey}
|
||||||
|
@ -85,14 +91,14 @@ let
|
||||||
|
|
||||||
})
|
})
|
||||||
# in
|
# in
|
||||||
(mkIf ((thisHostIsBuilder || thisHostIsHopHost) && thatHostIsConsumer) {
|
(lib.mkIf ((thisHostIsBuilder || thisHostIsHopHost) && thatHostIsBuildee) {
|
||||||
users.users.${thisHost.ssh.listenUser} = {
|
users.users.${thisHost.ssh.listenUser} = {
|
||||||
isSystemUser = lib.mkDefault (!config.users.users.${thisHost.ssh.listenUser}.isNormalUser);
|
isSystemUser = lib.mkDefault (!config.users.users.${thisHost.ssh.listenUser}.isNormalUser);
|
||||||
openssh.authorizedKeys.keys = [ thatHost.ssh.userPublicKey ];
|
openssh.authorizedKeys.keys = [ thatHost.ssh.userPublicKey ];
|
||||||
group = lib.mkOptionDefault "nogroup";
|
group = lib.mkOptionDefault "nogroup";
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
(mkIf (thisHostIsBuilder && thatHostIsConsumer) {
|
(lib.mkIf (thisHostIsBuilder && thatHostIsBuildee) {
|
||||||
nix.settings.allowed-users = [ thisHost.ssh.listenUser ];
|
nix.settings.allowed-users = [ thisHost.ssh.listenUser ];
|
||||||
nix.settings.trusted-users = [ thisHost.ssh.listenUser ];
|
nix.settings.trusted-users = [ thisHost.ssh.listenUser ];
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue