summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--default.nix2
-rw-r--r--krebs/default.nix264
2 files changed, 129 insertions, 137 deletions
diff --git a/default.nix b/default.nix
index 831a71f0b..dbf7fdde7 100644
--- a/default.nix
+++ b/default.nix
@@ -47,7 +47,7 @@ let out = {
inherit (eval {}) pkgs;
};
- krebs = import ./krebs current;
+ krebs = import ./krebs (current // { stockholm = out; });
inherit (krebs) lib;
# Path resolvers for common and individual files.
diff --git a/krebs/default.nix b/krebs/default.nix
index daa23cba8..c23cf152a 100644
--- a/krebs/default.nix
+++ b/krebs/default.nix
@@ -1,21 +1,29 @@
{ current-date
, current-host-name
, current-user-name
-}@current: rec {
+, stockholm
+}:
+
+let out = {
+ inherit deploy;
+ inherit infest;
+ inherit init;
+ inherit lib;
+ };
deploy =
{ system ? current-host-name
, target ? system
}@args: let
- config = lib.get-config system;
+ config = get-config system;
in ''
#! /bin/sh
# ${current-date} ${current-user-name}@${current-host-name}
# krebs.deploy
set -efu
- (${lib.populate args})
- ${lib.rootssh target ''
- ${lib.install args}
+ (${populate args})
+ ${rootssh target ''
+ ${install args}
${config.krebs.build.profile}/bin/switch-to-configuration switch
''}
echo OK
@@ -66,17 +74,17 @@
)"
}
- # Location to insert lib.install
+ # Location to insert install
i=$(sed -n '/^echo "building the system configuration/=' "$src")
{
cat_src | sed -n "1,$i{p}"
- cat ${lib.doc (lib.install args)}
+ cat ${lib.doc (install args)}
cat_src | sed -n "$i,\''${$i!p}"
} > nixos-install
chmod +x nixos-install
- ## Wrap inserted lib.install into chroot.
+ ## Wrap inserted install into chroot.
#nix_env=$(cat_src | sed -n '
# s:.*\(/nix/store/[a-z0-9]*-nix-[0-9.]\+/bin/nix-env\).*:\1:p;T;q
#')
@@ -95,7 +103,7 @@
init =
{ system ? current-host-name
}@args: let
- config = lib.get-config system;
+ config = get-config system;
in ''
#! /bin/sh
# ${current-date} ${current-user-name}@${current-host-name}
@@ -128,140 +136,124 @@
'';
lib = import ./4lib { lib = import <nixpkgs/lib>; } // rec {
-
stockholm-path = ../.;
-
- stockholm = import stockholm-path current;
-
nspath = ns: p: stockholm-path + "/${ns}/${p}";
+ };
- get-config = system:
- stockholm.users.${current-user-name}.${system}.config
- or (abort "unknown system: ${system}, user: ${current-user-name}");
+ doc = s:
+ let b = "EOF${builtins.hashString "sha256" s}"; in
+ ''
+ <<\${b}
+ ${s}
+ ${b}
+ '';
- doc = s:
- let b = "EOF${builtins.hashString "sha256" s}"; in
- ''
- <<\${b}
- ${s}
- ${b}
- '';
+ get-config = system:
+ stockholm.users.${current-user-name}.${system}.config
+ or (abort "unknown system: ${system}, user: ${current-user-name}");
- rootssh = target: script:
- "ssh root@${target} -T ${lib.doc ''
- set -efu
- ${script}
- ''}";
-
- install =
- { system ? current-host-name
- , target ? system
- }:
- let
- stockholm = import ../. {
- inherit current-date;
- inherit current-host-name;
- inherit current-user-name;
- };
-
- config = get-config system;
-
- nix-path =
- lib.concatStringsSep ":"
- (lib.mapAttrsToList (name: _: "${name}=/root/${name}")
- (config.krebs.build.source.dir //
- config.krebs.build.source.git));
- in ''
+ install =
+ { system ? current-host-name
+ , target ? system
+ }:
+ let
+ config = get-config system;
+
+ nix-path =
+ lib.concatStringsSep ":"
+ (lib.mapAttrsToList (name: _: "${name}=/root/${name}")
+ (config.krebs.build.source.dir //
+ config.krebs.build.source.git));
+ in ''
+ set -efu
+ NIX_PATH=${lib.shell.escape nix-path} \
+ nix-env \
+ --show-trace \
+ -f '<stockholm>' \
+ --argstr current-date ${lib.shell.escape current-date} \
+ --argstr current-host-name ${lib.shell.escape current-host-name} \
+ --argstr current-user-name ${lib.shell.escape current-user-name} \
+ --profile ${lib.shell.escape config.krebs.build.profile} \
+ --set \
+ -A ${lib.escapeShellArg (lib.concatStringsSep "." [
+ "users"
+ config.krebs.build.user.name
+ config.krebs.build.host.name
+ "system"
+ ])}
+ '';
+
+ populate =
+ { system ? current-host-name
+ , target ? system
+ }@args:
+ let out = ''
+ #! /bin/sh
+ # ${current-date} ${current-user-name}@${current-host-name}
set -efu
- NIX_PATH=${lib.shell.escape nix-path} \
- nix-env \
- --show-trace \
- -f '<stockholm>' \
- -Q \
- --argstr current-date ${lib.shell.escape current-date} \
- --argstr current-host-name ${lib.shell.escape current-host-name} \
- --argstr current-user-name ${lib.shell.escape current-user-name} \
- --profile ${lib.shell.escape config.krebs.build.profile} \
- --set \
- -A ${lib.escapeShellArg (lib.concatStringsSep "." [
- "users"
- config.krebs.build.user.name
- config.krebs.build.host.name
- "system"
- ])}
+ ${lib.concatStringsSep "\n"
+ (lib.concatMap
+ (type: lib.mapAttrsToList (_: methods.${type})
+ config.krebs.build.source.${type})
+ ["dir" "git"])}
'';
- populate =
- { system ? current-host-name
- , target ? system
- }@args:
- let out = ''
- #! /bin/sh
- # ${current-date} ${current-user-name}@${current-host-name}
- set -efu
- ${lib.concatStringsSep "\n"
- (lib.concatMap
- (type: lib.mapAttrsToList (_: methods.${type})
- config.krebs.build.source.${type})
- ["dir" "git"])}
+ config = get-config system;
+
+ current-host = config.krebs.hosts.${current-host-name};
+ current-user = config.krebs.users.${current-user-name};
+
+ target-host = config.krebs.hosts.${system};
+
+ methods.dir = config:
+ let
+ can-link = config.host.name == target-host.name;
+ can-push = config.host.name == current-host.name;
+ push-method = ''
+ rsync \
+ --exclude .git \
+ --exclude .graveyard \
+ --exclude old \
+ --exclude tmp \
+ --rsync-path='mkdir -p ${config.target-path} && rsync' \
+ --delete-excluded \
+ -vrLptgoD \
+ ${config.path}/ \
+ root@${target}:${config.target-path}
+ '';
+ url = "file://${config.host.name}${config.path}";
+ in
+ #if can-link then link-method else
+ if can-push then push-method else
+ throw "cannot source ${url}";
+
+ methods.git = config:
+ rootssh target ''
+ mkdir -p ${config.target-path}
+ cd ${config.target-path}
+ if ! test -e .git; then
+ git init
+ fi
+ if ! cur_url=$(git config remote.origin.url 2>/dev/null); then
+ git remote add origin ${config.url}
+ elif test "$cur_url" != ${config.url}; then
+ git remote set-url origin ${config.url}
+ fi
+ if test "$(git rev-parse --verify HEAD 2>/dev/null)" != ${config.rev}; then
+ git fetch origin
+ git checkout ${config.rev} -- .
+ git checkout -q ${config.rev}
+ git submodule init
+ git submodule update
+ fi
+ git clean -dxf
'';
+ in out;
- stockholm = import ../. {
- inherit current-date;
- inherit current-host-name;
- inherit current-user-name;
- };
-
- config = get-config system;
-
- current-host = config.krebs.hosts.${current-host-name};
- current-user = config.krebs.users.${current-user-name};
-
- target-host = config.krebs.hosts.${system};
-
- methods.dir = config:
- let
- can-link = config.host.name == target-host.name;
- can-push = config.host.name == current-host.name;
- push-method = ''
- rsync \
- --exclude .git \
- --exclude .graveyard \
- --exclude old \
- --exclude tmp \
- --rsync-path='mkdir -p ${config.target-path} && rsync' \
- --delete-excluded \
- -vrLptgoD \
- ${config.path}/ \
- root@${target}:${config.target-path}
- '';
- url = "file://${config.host.name}${config.path}";
- in
- #if can-link then link-method else
- if can-push then push-method else
- throw "cannot source ${url}";
-
- methods.git = config:
- lib.rootssh target ''
- mkdir -p ${config.target-path}
- cd ${config.target-path}
- if ! test -e .git; then
- git init
- fi
- if ! cur_url=$(git config remote.origin.url 2>/dev/null); then
- git remote add origin ${config.url}
- elif test "$cur_url" != ${config.url}; then
- git remote set-url origin ${config.url}
- fi
- if test "$(git rev-parse --verify HEAD 2>/dev/null)" != ${config.rev}; then
- git fetch origin
- git checkout ${config.rev} -- .
- git checkout -q ${config.rev}
- git submodule init
- git submodule update
- fi
- git clean -dxf
- '';
- in out;
- };
-}
+ rootssh = target: script:
+ "ssh root@${target} -T ${doc ''
+ set -efu
+ ${script}
+ ''}";
+
+in out