diff options
Diffstat (limited to 'pkgs/krops/default.nix')
-rw-r--r-- | pkgs/krops/default.nix | 124 |
1 files changed, 81 insertions, 43 deletions
diff --git a/pkgs/krops/default.nix b/pkgs/krops/default.nix index 8336b51..04c38cf 100644 --- a/pkgs/krops/default.nix +++ b/pkgs/krops/default.nix @@ -4,40 +4,77 @@ in { nix, openssh, populate, writers }: rec { - build = target: - runShell target (lib.concatStringsSep " " [ - "nix build" - "-I ${lib.escapeShellArg target.path}" - "--no-link -f '<nixpkgs/nixos>'" - "config.system.build.toplevel" - ]); + rebuild = { + useNixOutputMonitor + }: + args: target: + runShell target {} + (withNixOutputMonitor target useNixOutputMonitor /* sh */ '' + NIX_PATH=${lib.escapeShellArg target.path} \ + nixos-rebuild ${lib.escapeShellArgs args} + ''); - rebuild = args: target: - runShell target "nixos-rebuild -I ${lib.escapeShellArg target.path} ${ - lib.concatMapStringsSep " " lib.escapeShellArg args - }"; - - runShell = target: command: + runShell = target: { + allocateTTY ? false + }: command: let - command' = if target.sudo then "sudo ${command}" else command; + command' = /* sh */ '' + ${lib.optionalString target.sudo "sudo"} \ + /bin/sh -c ${lib.escapeShellArg command} + ''; in if lib.isLocalTarget target then command' else writers.writeDash "krops.${target.host}.${lib.firstWord command}" '' exec ${openssh}/bin/ssh ${lib.escapeShellArgs (lib.flatten [ - (lib.optionals (target.user != "") ["-l" target.user]) - "-p" target.port - "-T" + (lib.mkUserPortSSHOpts target) + (if allocateTTY then "-t" else "-T") target.extraOptions target.host - command'])} + command' + ])} ''; + withNixOutputMonitor = target: mode_: command: let + mode = + lib.getAttr (lib.typeOf mode_) { + bool = lib.toJSON mode_; + string = mode_; + }; + in /* sh */ '' + printf '# use nix-output-monitor: %s\n' ${lib.escapeShellArg mode} >&2 + ${lib.getAttr mode rec { + opportunistic = /* sh */ '' + if command -v nom >/dev/null; then + ${optimistic} + else + ${false} + fi + ''; + optimistic = /* sh */ '' + (${command}) 2>&1 | nom + ''; + pessimistic = /* sh */ '' + NIX_PATH=${lib.escapeShellArg target.path} \ + nix-shell -p nix-output-monitor --run ${lib.escapeShellArg optimistic} + ''; + true = /* sh */ '' + if command -v nom >/dev/null; then + ${optimistic} + else + ${pessimistic} + fi + ''; + false = command; + }} + ''; + writeCommand = name: { command ? (targetPath: "echo ${targetPath}"), backup ? false, force ? false, + allocateTTY ? false, source, target }: let @@ -46,17 +83,19 @@ in writers.writeDash name '' set -efu ${populate { inherit backup force source; target = target'; }} - ${runShell target' (command target'.path)} + ${runShell target' { inherit allocateTTY; } (command target'.path)} ''; writeDeploy = name: { backup ? false, buildTarget ? null, crossDeploy ? false, - fast ? false, + fast ? null, force ? false, + operation ? "switch", source, - target + target, + useNixOutputMonitor ? "opportunistic" }: let buildTarget' = if buildTarget == null @@ -64,32 +103,31 @@ in else lib.mkTarget buildTarget; target' = lib.mkTarget target; in - writers.writeDash name '' - set -efu - ${lib.optionalString (buildTarget' != target') - (populate { inherit backup force source; target = buildTarget'; })} - ${populate { inherit backup force source; target = target'; }} - ${lib.optionalString (! fast) '' - ${rebuild ["dry-build"] buildTarget'} - ${build buildTarget'} - ''} - ${rebuild ([ - "switch" - ] ++ lib.optionals crossDeploy [ - "--no-build-nix" - ] ++ lib.optionals (buildTarget' != target') [ - "--build-host" "${buildTarget'.user}@${buildTarget'.host}" - "--target-host" "${target'.user}@${target'.host}" - ] ++ lib.optionals target'.sudo [ - "--use-remote-sudo" - ]) buildTarget'} - ''; + lib.traceIf (fast != null) "writeDeploy: it's now always fast, setting the `fast` attribute is deprecated and will be removed in future" ( + writers.writeDash name '' + set -efu + ${lib.optionalString (buildTarget' != target') + (populate { inherit backup force source; target = buildTarget'; })} + ${populate { inherit backup force source; target = target'; }} + ${rebuild { inherit useNixOutputMonitor; } ([ + operation + ] ++ lib.optionals crossDeploy [ + "--no-build-nix" + ] ++ lib.optionals (buildTarget' != target') [ + "--build-host" "${buildTarget'.user}@${buildTarget'.host}" + "--target-host" "${target'.user}@${target'.host}" + ] ++ lib.optionals target'.sudo [ + "--use-remote-sudo" + ]) buildTarget'} + '' + ); writeTest = name: { backup ? false, force ? false, source, - target + target, + trace ? false }: let target' = lib.mkTarget target; in @@ -102,7 +140,7 @@ in -A system \ --keep-going \ --no-out-link \ - --show-trace \ + ${lib.optionalString trace "--show-trace"} \ '<nixpkgs/nixos>' ''; } |