diff options
author | Griffin Smith <grfn@gws.fyi> | 2020-07-03T04·26-0400 |
---|---|---|
committer | glittershark <grfn@gws.fyi> | 2020-07-06T15·16+0000 |
commit | a73714a93c2d5e1ce2f9e52f23eaf3019a5d46ed (patch) | |
tree | 9162ebd1a732ddcd743794eba602f88cd6ba4e27 /ops/nixos/default.nix | |
parent | 8bcdff263c31892161c5c40eb848f02b88c18624 (diff) |
feat(ops/nixos): Add generic rebuild-system script r/1221
This adds a first crack at one idea for a generic, non-user-specific rebuild-system script to ops.nixos.rebuild-system. The idea here is that we enumerate all the nixos systems stored in the monorepo (similarly to what we do for ci-builds right now) then search through them by hostname to find the one matching the hostname of the current system, which is an attempt at a more generic version of tazjin's rebuilder script which does the same thing but with an explicit case block. As a caveat, it feels like there's a slight possibility that this way of finding systems is going to get slow to evaluate - on my system it feels fine but if it grows out of hand it's probably feasible to just bake this into the built script as a dynamically generated case statement. Change-Id: I2e4c5401913b6f4d936ab48ba2f95f96e0e78eb4 Reviewed-on: https://cl.tvl.fyi/c/depot/+/894 Tested-by: BuildkiteCI Reviewed-by: lukegb <lukegb@tvl.fyi>
Diffstat (limited to 'ops/nixos/default.nix')
-rw-r--r-- | ops/nixos/default.nix | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/ops/nixos/default.nix b/ops/nixos/default.nix index a0d7630d00e0..40431a79afaf 100644 --- a/ops/nixos/default.nix +++ b/ops/nixos/default.nix @@ -6,8 +6,40 @@ # # TODO(tazjin): Find a more elegant solution for the whole module # situation. -{ ... }@args: +{ lib, pkgs, depot, ... }@args: -{ +let + inherit (lib) findFirst isAttrs; +in + +rec { whitby = import ./whitby/default.nix args; + + # System installation + + allSystems = import ./all-systems.nix args; + + nixosFor = configuration: depot.third_party.nixos { + inherit configuration; + }; + + findSystem = hostname: + (findFirst + (system: system.config.networking.hostName == hostname) + (throw "${hostname} is not a known NixOS host") + (map nixosFor allSystems)); + + rebuild-system = pkgs.writeShellScriptBin "rebuild-system" '' + set -ue + if [[ $EUID -ne 0 ]]; then + echo "Oh no! Only root is allowed to rebuild the system!" >&2 + exit 1 + fi + + echo "Rebuilding NixOS for $HOSTNAME" + system=$(nix-build -E "((import ${toString depot.depotPath} {}).ops.nixos.findSystem \"$HOSTNAME\").system" --no-out-link --show-trace) + + nix-env -p /nix/var/nix/profiles/system --set $system + $system/bin/switch-to-configuration switch + ''; } |