From 625bd446dd7238c5226dc90c89bdfa4ee5c13688 Mon Sep 17 00:00:00 2001 From: tv Date: Tue, 23 Aug 2022 14:16:39 +0200 Subject: krops writeDeploy: add useNixOutputMonitor parameter --- README.md | 23 +++++++++++++++++++++ pkgs/krops/default.nix | 55 +++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 71 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 6e50633..6d574fe 100644 --- a/README.md +++ b/README.md @@ -136,6 +136,29 @@ Create the sentinel file (`/var/src/.populate`) before syncing the new source. Specifies which `nixos-rebuild` operation to perform. +### `useNixOutputMonitor` (optional, defaults to `"opportunistic"`) + +Specifies when to pipe `nixos-rebuild`'s output to +[nom](https://github.com/maralorn/nix-output-monitor). + +Supported values: + +* `"opportunistic"` (default) - + Use `nom` only if it is present on the target machine. + +* `"optimistic"` - + Use `nom`, assuming it is present on the target machine. + +* `"pessimistic"` - + Use `nom` via `nix-shell` on the target machine. + +* `true` - + Use `nom`. + If it is not present on the target machine, then use it via `nix-shell`. + +* `false` - + Don't use `nom` + ## writeTest Very similiar to writeDeploy, but just builds the system on the target without diff --git a/pkgs/krops/default.nix b/pkgs/krops/default.nix index b4f89b6..429e648 100644 --- a/pkgs/krops/default.nix +++ b/pkgs/krops/default.nix @@ -4,10 +4,16 @@ in { nix, openssh, populate, writers }: rec { - rebuild = args: target: - runShell target {} "nixos-rebuild -I ${lib.escapeShellArg target.path} ${ - lib.concatMapStringsSep " " lib.escapeShellArg args - }"; + rebuild = { + useNixOutputMonitor + }: + args: target: + runShell target {} + (withNixOutputMonitor useNixOutputMonitor /* sh */ '' + nixos-rebuild -I ${ + lib.concatMapStringsSep " " lib.escapeShellArg ([target.path] ++ args) + } + ''); runShell = target: { allocateTTY ? false @@ -24,9 +30,43 @@ in (if allocateTTY then "-t" else "-T") target.extraOptions target.host - command'])} + command' + ])} ''; + withNixOutputMonitor = 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-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, @@ -51,7 +91,8 @@ in force ? false, operation ? "switch", source, - target + target, + useNixOutputMonitor ? "opportunistic" }: let buildTarget' = if buildTarget == null @@ -65,7 +106,7 @@ in ${lib.optionalString (buildTarget' != target') (populate { inherit backup force source; target = buildTarget'; })} ${populate { inherit backup force source; target = target'; }} - ${rebuild ([ + ${rebuild { inherit useNixOutputMonitor; } ([ operation ] ++ lib.optionals crossDeploy [ "--no-build-nix" -- cgit v1.2.3