@@ -726,53 +726,45 @@ runKexec() {
726
726
abort " Could not create a temporary log file for $sshUser "
727
727
fi
728
728
729
- # Unified kexec error handling function
730
- handleKexecResult () {
731
- local exitCode=$1
732
- local operation=$2
729
+ # Handle kexec operation failures
730
+ handleKexecFailure () {
731
+ local operation=$1
733
732
734
- if [[ $exitCode -eq 0 ]]; then
735
- echo " $operation completed successfully" >&2
736
- else
737
- # If operation failed, try to fetch the log file
738
- local logContent=" "
739
- if logContent=$(
740
- set +x
741
- runSsh " cat \" $remoteLogFile \" 2>/dev/null" 2> /dev/null
742
- ) ; then
743
- echo " Remote output log:" >&2
744
- echo " $logContent " >&2
745
- fi
746
- echo " $operation failed" >&2
747
- exit 1
733
+ # Try to fetch the log file
734
+ local logContent=" "
735
+ if logContent=$(
736
+ set +x
737
+ runSsh " cat \" $remoteLogFile \" 2>/dev/null" 2> /dev/null
738
+ ) ; then
739
+ echo " Remote output log:" >&2
740
+ echo " $logContent " >&2
748
741
fi
742
+ echo " $operation failed" >&2
743
+ exit 1
749
744
}
750
745
746
+ # Extract directly to the user's home directory
747
+ if [[ -z $remoteHomeDir ]]; then
748
+ abort " Could not determine home directory for user $sshUser "
749
+ fi
750
+
751
751
# Define common remote commands template
752
752
local remoteCommandTemplate
753
753
remoteCommandTemplate="
754
- ${enableDebug: +set -x}
755
- # Create a script that we can run with sudo
756
- kexec_script_tmp=\$ (mktemp /tmp/kexec-script.XXXXXX.sh)
757
- trap 'rm -f \"\$ kexec_script_tmp\" ' EXIT
758
- cat > \"\$ kexec_script_tmp\" << 'KEXEC_SCRIPT'
759
- #!/usr/bin/env bash
760
- set -eu ${enableDebug}
761
- rm -rf /root/kexec
762
- mkdir -p /root/kexec
763
- cd /root/kexec
764
- echo 'Downloading kexec tarball (this may take a moment)...'
765
- # Execute tar command
766
- %TAR_COMMAND% && TMPDIR=/root/kexec setsid --wait /root/kexec/kexec/run --kexec-extra-flags $( printf ' %q ' " $kexecExtraFlags " )
767
- KEXEC_SCRIPT
768
-
769
- # Run the script and let output flow naturally
770
- ${maybeSudo} bash \"\$ kexec_script_tmp\" 2>&1 | tee \" $remoteLogFile \" || true
754
+ # Run kexec commands with sudo if needed
755
+ {
756
+ set -eu ${enableDebug}
757
+ ${maybeSudo} rm -rf \" $remoteHomeDir /kexec\"
758
+ mkdir -p \" $remoteHomeDir /kexec\"
759
+ cd \" $remoteHomeDir /kexec\"
760
+ echo Downloading kexec tarball, this may take a moment...
761
+ # Execute tar command
762
+ %TAR_COMMAND%
763
+ TMPDIR=\" $remoteHomeDir /kexec\" ${maybeSudo} setsid --wait \" $remoteHomeDir /kexec/kexec/run\" --kexec-extra-flags $( printf ' %q' " $kexecExtraFlags " )
764
+ } 2>&1 | tee \" $remoteLogFile \" || true
765
+
771
766
# The script will likely disconnect us, so we consider it successful if we see the kexec message
772
- if grep -q 'machine will boot into nixos' \" $remoteLogFile \" ; then
773
- echo 'Kexec initiated successfully'
774
- exit 0
775
- else
767
+ if ! grep -q 'machine will boot into nixos' \" $remoteLogFile \" ; then
776
768
echo 'Kexec may have failed - check output above'
777
769
exit 1
778
770
fi
805
797
localUploadCommand=(curl --fail -Ss -L " ${kexecUrl} " )
806
798
fi
807
799
808
- # If no local upload command is defined, we use the remote command to download and execute
800
+ # Determine the tar command based on upload method
801
+ local tarCommand
809
802
if [[ ${# localUploadCommand[@]} -eq 0 ]]; then
810
- # Use remote command for download and execution
811
- local tarCommand
803
+ # Use remote command for download
812
804
tarCommand=" $( printf ' %q ' " ${remoteUploadCommand[@]} " ) | tar -xv ${tarDecomp} "
813
- local remoteCommands
814
- remoteCommands=${remoteCommandTemplate// ' %TAR_COMMAND%' / $tarCommand }
815
-
816
- # Run the SSH command - for kexec with sudo, we expect it might disconnect
817
- local sshExitCode
818
- (
819
- set +x
820
- runSsh sh -c " $( printf ' %q' " $remoteCommands " ) "
821
- )
822
- sshExitCode=$?
823
-
824
- handleKexecResult $sshExitCode " Kexec"
825
805
else
826
- # Why do we need $remoteHomeDir?
827
- # In the case where the ssh user is not root, we need to upload the kexec tarball
828
- # to a location where the user has write permissions. We then use sudo to run
829
- # kexec from that location.
830
- if [[ -z $remoteHomeDir ]]; then
831
- abort " Could not determine home directory for user $sshUser "
832
- fi
833
-
834
- (
835
- set +x
836
- " ${localUploadCommand[@]} " | runSsh " cat > \" $remoteHomeDir \" /kexec-tarball.tar.gz"
837
- )
806
+ # Upload the kexec tarball first
807
+ " ${localUploadCommand[@]} " | runSsh " cat > \" $remoteHomeDir \" /kexec-tarball.tar.gz"
808
+ # Use local file for extraction
809
+ tarCommand=" cat \" $remoteHomeDir \" /kexec-tarball.tar.gz | tar -xv ${tarDecomp} "
810
+ fi
838
811
839
- # Use local command with pipe to remote
840
- local tarCommand=" cat \" $remoteHomeDir \" /kexec-tarball.tar.gz | tar -xv ${tarDecomp} "
841
- local remoteCommands=${remoteCommandTemplate// ' %TAR_COMMAND%' / $tarCommand }
812
+ local remoteCommands
813
+ remoteCommands=${remoteCommandTemplate// ' %TAR_COMMAND%' / $tarCommand }
842
814
843
- # Execute the local upload command and check for success
844
- local uploadExitCode
845
- (
846
- set +x
847
- runSsh sh -c " $( printf ' %q' " $remoteCommands " ) "
848
- )
849
- uploadExitCode=$?
850
-
851
- handleKexecResult $uploadExitCode " Upload"
852
- fi
815
+ # Create and execute the script on the remote system
816
+ runSsh " mkdir -p \" $remoteHomeDir /kexec\" && cat > \" $remoteHomeDir /kexec/unpack.sh\" " << EOF
817
+ $remoteCommands
818
+ EOF
819
+ runSsh " bash $remoteHomeDir /kexec/unpack.sh" || handleKexecFailure " Kexec"
853
820
854
821
# use the default SSH port to connect at this point
855
822
local i
0 commit comments