From 11cd5a98d51e9f29d62cd0d3f63b0e44dd9bedf1 Mon Sep 17 00:00:00 2001
From: Jean-Paul Calderone <exarkun@twistedmatrix.com>
Date: Wed, 7 Jul 2021 09:04:29 -0400
Subject: [PATCH] Get NIX_PATH set right for the morph command

---
 nixos/modules/deployment.nix    | 12 +++++++++++-
 nixos/modules/update-deployment | 11 +++++++----
 2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/nixos/modules/deployment.nix b/nixos/modules/deployment.nix
index db61ba8b..26156595 100755
--- a/nixos/modules/deployment.nix
+++ b/nixos/modules/deployment.nix
@@ -11,7 +11,13 @@ let
     # `restrict` means "disable all the things" then `command` means "but
     # enable running this one command" (the client does not have to supply the
     # command; if they authenticate, this is the command that will run).
-    "restrict,command=\"${command} ${gridName}\" ${authorizedKey}";
+    # environment lets us pass an environment variable into the process
+    # started by the given command.  It only works because we configured our
+    # sshd to allow this particular variable through.  By passing this value,
+    # we can pin nixpkgs in the executed command to the same version
+    # configured for use here.  It might be better if we just had a channel
+    # the system could be configured with ... but we don't at the moment.
+    "restrict,environment=\"NIXPKGS_FOR_MORPH=${pkgs.path}\",command=\"${command} ${gridName}\" ${authorizedKey}";
 in {
   options = {
     services.private-storage.deployment.authorizedKey = lib.mkOption {
@@ -44,6 +50,10 @@ in {
       ];
     };
 
+    services.openssh.extraConfig = ''
+      PermitUserEnvironment=NIXPKGS_FOR_MORPH
+    '';
+
     # Create a one-time service that will set up an ssh key that allows the
     # deployment user to authorize as root to perform the system update with
     # `morph deploy`.
diff --git a/nixos/modules/update-deployment b/nixos/modules/update-deployment
index 57af331d..306bb882 100755
--- a/nixos/modules/update-deployment
+++ b/nixos/modules/update-deployment
@@ -2,10 +2,6 @@
 
 set -euxo pipefail
 
-# XXX I just want to inherit this.  Why can't I get it through the environment
-# to here?
-export NIX_PATH=nixpkgs=https://github.com/PrivateStorageio/nixpkgs/archive/7e71ee63a67bd3e2c190abd982b541603f4f86b0.tar.gz
-
 # Accept the name of the grid this system is part of as a parameter.  This
 # lets us pick the correct morph grid source file later on.
 GRIDNAME=$1
@@ -77,6 +73,13 @@ EOF
 # Make sure known_hosts has the host key in it.
 ssh -o StrictHostKeyChecking=no "$(hostname).$(domainname)" ":"
 
+# Set nixpkgs to our preferred version for the morph build.  The NIX_PATH
+# environment variable itself receives special treatment by some parts of the
+# system (especially those parts leading up to the execution of this script)
+# so we pass the desired information through a different variable and then
+# shuffle it into the right place here, just before it is needed.
+export NIX_PATH="nixpkgs=$NIXPKGS_FOR_MORPH"
+
 # Attempt to update just this host.  Choose the morph grid definition matching
 # the grid we belong to and limit the morph deployment update to the host
 # matching our name.  morph uses just the bare hostname without the domain
-- 
GitLab