summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--lib/default.nix3
-rw-r--r--pkgs/krops/default.nix29
-rw-r--r--pkgs/populate/default.nix23
4 files changed, 31 insertions, 26 deletions
diff --git a/README.md b/README.md
index c4e2b4d..d6f921f 100644
--- a/README.md
+++ b/README.md
@@ -71,7 +71,7 @@ If specified as string, the format could be described as:
[[USER]@]HOST[:PORT][/SOME/PATH]
```
-Portions in square brakets are optional.
+Portions in square brackets are optional.
If the `USER` is the empty string, as in e.g. `@somehost`, then the username
will be obtained by ssh from its configuration files.
diff --git a/lib/default.nix b/lib/default.nix
index 5829250..f1f0007 100644
--- a/lib/default.nix
+++ b/lib/default.nix
@@ -36,6 +36,9 @@ let {
if lib.length y != 1 then throw "malformed /etc/hostname" else
lib.elemAt y 0;
+ firstWord = s:
+ lib.head (lib.match "^([^[:space:]]*).*" s);
+
isLocalTarget = let
origin = lib.mkTarget "";
in target:
diff --git a/pkgs/krops/default.nix b/pkgs/krops/default.nix
index 4760287..ab74bc3 100644
--- a/pkgs/krops/default.nix
+++ b/pkgs/krops/default.nix
@@ -5,7 +5,7 @@ in
{ nix, openssh, populate, writers }: rec {
build = target:
- remoteCommand target (lib.concatStringsSep " " [
+ runShell target (lib.concatStringsSep " " [
"nix build"
"-I ${lib.escapeShellArg target.path}"
"--no-link -f '<nixpkgs/nixos>'"
@@ -13,20 +13,23 @@ in
]);
rebuild = args: target:
- remoteCommand target "nixos-rebuild -I ${lib.escapeShellArg target.path} ${
+ runShell target "nixos-rebuild -I ${lib.escapeShellArg target.path} ${
lib.concatMapStringsSep " " lib.escapeShellArg args
}";
- remoteCommand = target: command:
- writers.writeDash "build.${target.host}" ''
- exec ${openssh}/bin/ssh ${lib.escapeShellArgs (lib.flatten [
- (lib.optionals (target.user != "") ["-l" target.user])
- "-p" target.port
- "-t"
- target.extraOptions
- target.host
- (if target.sudo then "sudo ${command}" else command)])}
- '';
+ runShell = target: command:
+ 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"
+ target.extraOptions
+ target.host
+ (if target.sudo then "sudo ${command}" else command)])}
+ '';
writeCommand = name: {
command ? (targetPath: "echo ${targetPath}"),
@@ -40,7 +43,7 @@ in
writers.writeDash name ''
set -efu
${populate { inherit backup force source; target = target'; }}
- ${remoteCommand target' (command target'.path)}
+ ${runShell target' (command target'.path)}
'';
writeDeploy = name: {
diff --git a/pkgs/populate/default.nix b/pkgs/populate/default.nix
index 36a97b3..40c37e3 100644
--- a/pkgs/populate/default.nix
+++ b/pkgs/populate/default.nix
@@ -6,7 +6,7 @@ with shell;
let
check = { force, target }: let
sentinelFile = "${target.path}/.populate";
- in shell' target /* sh */ ''
+ in runShell target /* sh */ ''
${optionalString force /* sh */ ''
mkdir -vp ${quote (dirOf sentinelFile)} >&2
touch ${quote sentinelFile}
@@ -23,7 +23,7 @@ let
do-backup = { target }: let
sentinelFile = "${target.path}/.populate";
in
- shell' target /* sh */ ''
+ runShell target /* sh */ ''
if ! test -d ${quote sentinelFile}; then
>&2 printf 'error" sentinel file is not a directory: %s\n' ${quote (
optionalString (!isLocalTarget target) "${target.host}:" +
@@ -40,7 +40,7 @@ let
${target.path}/.populate/backup/
'';
- pop.derivation = target: source: shell' target /* sh */ ''
+ pop.derivation = target: source: runShell target /* sh */ ''
nix-build -E ${quote source.text} -o ${quote target.path} >&2
'';
@@ -50,7 +50,7 @@ let
in
rsync' target config (quote source.path);
- pop.git = target: source: shell' target /* sh */ ''
+ pop.git = target: source: runShell target /* sh */ ''
set -efu
if ! test -e ${quote target.path}; then
git clone --recurse-submodules ${quote source.url} ${quote target.path}
@@ -92,7 +92,7 @@ let
if test -e ${quote source.dir}/.git; then
local_pass_info=${quote source.name}\ $(${git}/bin/git -C ${quote source.dir} log -1 --format=%H ${quote source.name})
- remote_pass_info=$(${shell' target /* sh */ ''
+ remote_pass_info=$(${runShell target /* sh */ ''
cat ${quote target.path}/.pass_info || :
''})
@@ -133,12 +133,12 @@ let
pop.pipe = target: source: /* sh */ ''
${quote source.command} | {
- ${shell' target /* sh */ "cat > ${quote target.path}"}
+ ${runShell target /* sh */ "cat > ${quote target.path}"}
}
'';
# TODO rm -fR instead of ln -f?
- pop.symlink = target: source: shell' target /* sh */ ''
+ pop.symlink = target: source: runShell target /* sh */ ''
ln -fnsT ${quote source.target} ${quote target.path}
'';
@@ -178,20 +178,19 @@ let
>&2
'';
- shell' = target: script:
+ runShell = target: command:
if isLocalTarget target
- then script
+ then command
else
if target.sudo then /* sh */ ''
- ${ssh' target} ${quote target.host} ${quote "sudo bash -c ${quote script}"}
+ ${ssh' target} ${quote target.host} ${quote "sudo bash -c ${quote command}"}
'' else ''
- ${ssh' target} ${quote target.host} ${quote script}
+ ${ssh' target} ${quote target.host} ${quote command}
'';
ssh' = target: concatMapStringsSep " " quote (flatten [
"${openssh}/bin/ssh"
(optionals (target.user != "") ["-l" target.user])
- "-o" "ControlPersist=no"
"-p" target.port
"-T"
target.extraOptions