From 1ebbb7937ddd8b5e5d8d04189dc2283a16c12f9e Mon Sep 17 00:00:00 2001 From: William Date: Sun, 13 Jul 2025 18:46:39 -0300 Subject: [PATCH] fix character escaping in nixos-deploy --- packages/nixos-deploy.nix | 205 +++++++++++++++++++------------------- 1 file changed, 101 insertions(+), 104 deletions(-) diff --git a/packages/nixos-deploy.nix b/packages/nixos-deploy.nix index 227ea4e..e9c90f2 100644 --- a/packages/nixos-deploy.nix +++ b/packages/nixos-deploy.nix @@ -1,134 +1,131 @@ -{ lib -, stdenv -, nixos-rebuild -, openssh -, coreutils -, gnugrep -, gawk +{ + lib, + stdenv, + nixos-rebuild, + openssh, + coreutils, + gnugrep, + gawk, }: stdenv.mkDerivation rec { pname = "nixos-deploy"; version = "1.0"; - src = lib.fakeSha256; # will be ignored since we're using `installPhase` - + src = null; dontUnpack = true; - buildInputs = [ ]; - installPhase = '' - mkdir -p $out/bin - cat > $out/bin/nixos-deploy << 'EOF' -#!/usr/bin/env bash -set -euo pipefail + mkdir -p $out/bin + cat > $out/bin/nixos-deploy << 'EOF' + #!/usr/bin/env bash + set -euo pipefail -LOCAL_BUILD=false -ACTION="switch" -FLAKE_URI="" -TARGET_HOST="" -SSH_USER="" -SSH_HOST="" + LOCAL_BUILD=false + ACTION="switch" + FLAKE_URI="" + TARGET_HOST="" + SSH_USER="" + SSH_HOST="" -show_usage() { - echo -e "Usage: nixos-deploy [--local-build] [--boot] [user@]host" - echo "" - echo -e "Arguments:" - echo " flake-uri Flake URI (e.g., .#hostname)" - echo " [user@]host Target host, optionally with user" - echo "" - echo -e "Options:" - echo " --local-build Build locally instead of on remote" - echo " --boot Use 'boot' instead of 'switch' action" - echo "" - echo -e "Examples:" - echo " nixos-deploy .#hostname user@192.168.1.10" - echo " nixos-deploy --local-build .#hostname 192.168.1.10" - echo " nixos-deploy --boot .#hostname 192.168.1.10" - echo " nixos-deploy .#hostname 192.168.1.10 # uses current user" - exit 1 -} + show_usage() { + echo -e "Usage: nixos-deploy [--local-build] [--boot] [user@]host" + echo "" + echo -e "Arguments:" + echo " flake-uri Flake URI (e.g., .#hostname)" + echo " [user@]host Target host, optionally with user" + echo "" + echo -e "Options:" + echo " --local-build Build locally instead of on remote" + echo " --boot Use 'boot' instead of 'switch' action" + echo "" + echo -e "Examples:" + echo " nixos-deploy .#hostname user@192.168.1.10" + echo " nixos-deploy --local-build .#hostname 192.168.1.10" + echo " nixos-deploy --boot .#hostname 192.168.1.10" + echo " nixos-deploy .#hostname 192.168.1.10 # uses current user" + exit 1 + } -while [[ $# -gt 0 ]]; do - case $1 in - --local-build) - LOCAL_BUILD=true - shift - ;; - --boot) - ACTION="boot" - shift - ;; - --help|-h) - show_usage - ;; - -*) - echo -e "Unknown option: $1" - show_usage - ;; - *) - if [[ -z "$FLAKE_URI" ]]; then - FLAKE_URI="$1" - elif [[ -z "$TARGET_HOST" ]]; then - TARGET_HOST="$1" - else - echo -e "Too many arguments" + while [[ $# -gt 0 ]]; do + case $1 in + --local-build) + LOCAL_BUILD=true + shift + ;; + --boot) + ACTION="boot" + shift + ;; + --help|-h) show_usage - fi - shift - ;; - esac -done + ;; + -*) + echo -e "Unknown option: $1" + show_usage + ;; + *) + if [[ -z "$FLAKE_URI" ]]; then + FLAKE_URI="$1" + elif [[ -z "$TARGET_HOST" ]]; then + TARGET_HOST="$1" + else + echo -e "Too many arguments" + show_usage + fi + shift + ;; + esac + done -if [[ -z "$FLAKE_URI" ]]; then - echo -e "flake-uri is required" - show_usage -fi + if [[ -z "$FLAKE_URI" ]]; then + echo -e "flake-uri is required" + show_usage + fi -if [[ -z "$TARGET_HOST" ]]; then - echo -e "target host is required" - show_usage -fi + if [[ -z "$TARGET_HOST" ]]; then + echo -e "target host is required" + show_usage + fi -if [[ "$TARGET_HOST" == *"@"* ]]; then - SSH_USER="${TARGET_HOST%@*}" - SSH_HOST="${TARGET_HOST#*@}" -else - SSH_USER="$("${coreutils}/bin/whoami")" - SSH_HOST="$TARGET_HOST" -fi + if [[ "$TARGET_HOST" == *"@"* ]]; then + SSH_USER="''${TARGET_HOST%@*}" + SSH_HOST="''${TARGET_HOST#*@}" + else + SSH_USER="$("''${coreutils}/bin/whoami")" + SSH_HOST="$TARGET_HOST" + fi -echo "Deploying $FLAKE_URI to $SSH_HOST as user $SSH_USER (action: $ACTION)" + echo "Deploying $FLAKE_URI to $SSH_HOST as user $SSH_USER (action: $ACTION)" -if [[ "$LOCAL_BUILD" != "true" ]]; then - GC_ROOT_PATH="/tmp/nixos-deploy-$SSH_HOST-$$" -fi + if [[ "$LOCAL_BUILD" != "true" ]]; then + GC_ROOT_PATH="/tmp/nixos-deploy-$SSH_HOST-$$" + fi -REBUILD_CMD="${nixos-rebuild}/bin/nixos-rebuild $ACTION --flake $FLAKE_URI --target-host $TARGET_HOST" + REBUILD_CMD="''${nixos-rebuild}/bin/nixos-rebuild $ACTION --flake $FLAKE_URI --target-host $TARGET_HOST" -if [[ "$LOCAL_BUILD" == "true" ]]; then - echo -e "Building locally and deploying to remote host" -else - REBUILD_CMD="$REBUILD_CMD --build-host $SSH_HOST" - echo -e "Building on remote host" -fi + if [[ "$LOCAL_BUILD" == "true" ]]; then + echo -e "Building locally and deploying to remote host" + else + REBUILD_CMD="$REBUILD_CMD --build-host $SSH_HOST" + echo -e "Building on remote host" + fi -if [[ "$SSH_USER" != "root" ]]; then - REBUILD_CMD="$REBUILD_CMD --use-remote-sudo" - echo -e "Using remote sudo for non-root user" -fi + if [[ "$SSH_USER" != "root" ]]; then + REBUILD_CMD="$REBUILD_CMD --use-remote-sudo" + echo -e "Using remote sudo for non-root user" + fi -echo -e "Running: $REBUILD_CMD" -exec $REBUILD_CMD -EOF - chmod +x $out/bin/nixos-deploy + echo -e "Running: $REBUILD_CMD" + exec $REBUILD_CMD + EOF + + chmod +x $out/bin/nixos-deploy ''; meta = with lib; { description = "Tool to deploy a NixOS flake to a remote host using nixos-rebuild"; license = licenses.mit; - maintainers = with maintainers; [ ]; platforms = platforms.unix; }; } -