summaryrefslogtreecommitdiffstats
path: root/krebs/default.nix
diff options
context:
space:
mode:
authorlassulus <lass@aidsballs.de>2015-10-20 23:47:29 +0200
committerlassulus <lass@aidsballs.de>2015-10-20 23:47:29 +0200
commitf6187b3796edcfcce71bd239bbc1e793e6bb806a (patch)
tree5e997809616c2d977c5d34bca8b7d8acbd9b7e1a /krebs/default.nix
parent281ba78969e0c0233fef0746d42f0ec85179b1bd (diff)
parentfc45cc29265e9b3e51033fddd5d8ea1042c1aa41 (diff)
Merge remote-tracking branch 'cd/master'
Diffstat (limited to 'krebs/default.nix')
-rw-r--r--krebs/default.nix346
1 files changed, 167 insertions, 179 deletions
diff --git a/krebs/default.nix b/krebs/default.nix
index b98fad558..de805a89c 100644
--- a/krebs/default.nix
+++ b/krebs/default.nix
@@ -1,21 +1,30 @@
{ current-date
, current-host-name
, current-user-name
-}@current: rec {
+, stockholm
+}:
+
+let out = {
+ inherit deploy;
+ inherit infest;
+ inherit init;
+ inherit lib;
+ inherit nixos-install;
+ };
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 ''
+ ${nix-install args}
${config.krebs.build.profile}/bin/switch-to-configuration switch
''}
echo OK
@@ -31,63 +40,14 @@
# krebs.infest
set -efu
- # XXX type -p is non-standard
- #export RSYNC_RSH; RSYNC_RSH="$(type -p ssh) \
- # -o 'HostName $ {target.host.infest.addr}' \
- # -o 'Port $ {toString target.host.infest.port}' \
- #"
- #ssh() {
- # eval "$RSYNC_RSH \"\$@\""
- #}
-
- ${lib.rootssh target ''
+ ${rootssh target ''
${builtins.readFile ./4lib/infest/prepare.sh}
${builtins.readFile ./4lib/infest/install-nix.sh}
''}
- (${lib.populate args})
-
- ${lib.rootssh target ''
- export PATH; PATH=/root/.nix-profile/bin:$PATH
-
- src=$(type -p nixos-install)
- cat_src() {
- sed < "$src" "$(
- { sed < "$src" -n '
- /^if ! test -e "\$mountPoint\/\$NIXOS_CONFIG/,/^fi$/=
- /^nixpkgs=/=
- /^NIX_PATH=/,/^$/{/./=}
-
- # Disable: Copy the NixOS/Nixpkgs sources to the target as
- # the initial contents of the NixOS channel.
- /^srcs=/,/^ln -sfn /=
- '
- } | sed 's:$:s/^/#krebs#/:'
- )"
- }
-
- # Location to insert lib.install
- i=$(sed -n '/^echo "building the system configuration/=' "$src")
-
- {
- cat_src | sed -n "1,$i{p}"
- cat ${lib.doc (lib.install args)}
- cat_src | sed -n "$i,\''${$i!p}"
- } > nixos-install
- chmod +x nixos-install
-
- ## Wrap inserted lib.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
- #')
- #echo nix-env is $nix_env
- #sed -i '
- # s:^nix-env:chroot $mountPoint '"$nix_env"':
- #' nixos-install
-
- unset SSL_CERT_FILE
- ./nixos-install
+ (${nixos-install args})
+ ${rootssh target ''
${builtins.readFile ./4lib/infest/finalize.sh}
''}
'';
@@ -95,7 +55,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}
@@ -127,138 +87,166 @@
EOF
'';
- lib = import ./4lib { lib = import <nixpkgs/lib>; } // rec {
+ nixos-install =
+ { system ? current-host-name
+ , target ? system
+ }@args: let
+ in ''
+ #! /bin/sh
+ # ${current-date} ${current-user-name}@${current-host-name}
+ # krebs.nixos-install
+ (${populate args})
- stockholm = import ../. current;
+ ${rootssh target ''
+ export PATH; PATH=/root/.nix-profile/bin:$PATH
- get-config = system:
- stockholm.${current-user-name}.${system}.config
- or (abort "unknown system: ${system}");
+ src=$(type -p nixos-install)
+ cat_src() {
+ sed < "$src" "$(
+ { sed < "$src" -n '
+ /^if ! test -e "\$mountPoint\/\$NIXOS_CONFIG/,/^fi$/=
+ /^nixpkgs=/=
+ /^NIX_PATH=/,/^$/{/./=}
- doc = s:
- let b = "EOF${builtins.hashString "sha256" s}"; in
- ''
- <<\${b}
- ${s}
- ${b}
- '';
+ # Disable: Copy the NixOS/Nixpkgs sources to the target as
+ # the initial contents of the NixOS channel.
+ /^srcs=/,/^ln -sfn /=
+ '
+ } | sed 's:$:s/^/#krebs#/:'
+ )"
+ }
- rootssh = target: script:
- "ssh root@${target} -T ${lib.doc ''
- set -efu
- ${script}
- ''}";
+ # Location to insert `nix-install`
+ i=$(sed -n '/^echo "building the system configuration/=' "$src")
- install =
- { system ? current-host-name
- , target ? system
- }:
- let
- stockholm = import ../. {
- inherit current-date;
- inherit current-host-name;
- inherit current-user-name;
- };
+ {
+ cat_src | sed -n "1,$i{p}"
+ cat ${doc (nix-install args)}
+ cat_src | sed -n "$i,\''${$i!p}"
+ } > nixos-install
+ chmod +x nixos-install
- config = stockholm.${current-user-name}.${system}.config
- or (abort "unknown system: ${system}");
+ unset SSL_CERT_FILE
+ ./nixos-install
+ ''}
+ '';
- 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>' \
- -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 "." [
- config.krebs.build.user.name
- config.krebs.build.host.name
- "system"
- ])}
- '';
+ lib = import ./4lib { lib = import <nixpkgs/lib>; } // rec {
+ stockholm-path = ../.;
+ nspath = ns: p: stockholm-path + "/${ns}/${p}";
+ };
- 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"])}
- '';
+ doc = s:
+ let b = "EOF${builtins.hashString "sha256" s}"; in
+ ''
+ <<\${b}
+ ${s}
+ ${b}
+ '';
- stockholm = import ../. {
- inherit current-date;
- inherit current-host-name;
- inherit current-user-name;
- };
+ get-config = system:
+ stockholm.users.${current-user-name}.${system}.config
+ or (abort "unknown system: ${system}, user: ${current-user-name}");
- config = stockholm.${current-user-name}.${system}.config
- or (abort "unknown system: ${system}");
+ nix-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"
+ ])}
+ '';
- current-host = config.krebs.hosts.${current-host-name};
- current-user = config.krebs.users.${current-user-name};
+ 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"])}
+ '';
- target-host = config.krebs.hosts.${system};
+ config = get-config system;
+
+ current-host = config.krebs.hosts.${current-host-name};
+ current-user = config.krebs.users.${current-user-name};
+
+ methods.dir = config:
+ let
+ 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}
+ '';
+ in
+ if can-push then push-method else
+ let dir = "file://${config.host.name}${config.path}"; in
+ # /!\ revise this message when using more than just push-method
+ throw "No way to push ${dir} from ${current-host.name} to ${target}";
+
+ 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;
- 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}";
+ rootssh = target: script:
+ "ssh root@${target} -T ${doc ''
+ set -efu
+ ${script}
+ ''}";
- 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;
- };
-}
+in out