Merge remote-tracking branch 'ni/master' into HEAD

This commit is contained in:
lassulus 2017-07-25 23:16:06 +02:00
commit 826da6c222
4 changed files with 80 additions and 60 deletions

View File

@ -84,8 +84,9 @@ $(error No goals specified)
endif endif
# usage: make deploy system=foo [target=bar] # usage: make deploy system=foo [target=bar]
# usage: make install system=foo target=bar
# usage: make test system=foo target=bar # usage: make test system=foo target=bar
deploy test: deploy install test:
ifdef target ifdef target
nix-shell --run '$@ --system=$(system) --target=$(target)' nix-shell --run '$@ --system=$(system) --target=$(target)'
else else
@ -112,15 +113,3 @@ pkgs.%:;@$(call build,$@)
# usage: make LOGNAME=krebs system=wolf eval.config.krebs.build.host.name # usage: make LOGNAME=krebs system=wolf eval.config.krebs.build.host.name
eval eval.:;@$(call evaluate,$${expr-eval}) eval eval.:;@$(call evaluate,$${expr-eval})
eval.%:;@$(call evaluate,$@) eval.%:;@$(call evaluate,$@)
# usage: make install system=foo [target_host=bar]
install: ssh ?= ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
install:
$(ssh) $(target_user)@$(target_host) -p $(target_port) \
env target_path=$(target_path) \
sh -s prepare < krebs/4lib/infest/prepare.sh
$(MAKE) populate target_path=/mnt$(target_path)
$(ssh) $(target_user)@$(target_host) -p $(target_port) \
env NIXOS_CONFIG=$(target_path)/nixos-config \
STOCKHOLM_VERSION="$$STOCKHOLM_VERSION" \
nixos-install

View File

@ -1,8 +1,8 @@
#! /bin/sh #! /bin/sh
set -efu set -efu
nix_url=https://nixos.org/releases/nix/nix-1.10/nix-1.10-x86_64-linux.tar.bz2 nix_url=https://nixos.org/releases/nix/nix-1.11.13/nix-1.11.13-x86_64-linux.tar.bz2
nix_sha256=504f7a3a85fceffb8766ae5e1005de9e02e489742f5a63cc3e7552120b138bf4 nix_sha256=c11411d52d8ad1ce3a68410015487282fd4651d3abefbbb13fa1f7803a2f60de
prepare() {( prepare() {(
if test -e /etc/os-release; then if test -e /etc/os-release; then
@ -14,10 +14,6 @@ prepare() {(
;; ;;
centos) centos)
case $VERSION_ID in case $VERSION_ID in
6)
prepare_centos "$@"
exit
;;
7) 7)
prepare_centos "$@" prepare_centos "$@"
exit exit
@ -51,13 +47,6 @@ prepare() {(
esac esac
;; ;;
esac esac
elif test -e /etc/centos-release; then
case $(cat /etc/centos-release) in
'CentOS release 6.5 (Final)')
prepare_centos "$@"
exit
;;
esac
fi fi
echo "$0 prepare: unknown OS" >&2 echo "$0 prepare: unknown OS" >&2
exit -1 exit -1
@ -217,7 +206,7 @@ prepare_common() {(
mkdir -p bin mkdir -p bin
rm -f bin/nixos-install rm -f bin/nixos-install
cp "$(type -p nixos-install)" bin/nixos-install cp "$(type -p nixos-install)" bin/nixos-install
sed -i "s@^NIX_PATH=\"[^\"]*\"@NIX_PATH=$target_path@" bin/nixos-install sed -i "s@NIX_PATH=\"[^\"]*\"@NIX_PATH=$target_path@" bin/nixos-install
if ! grep -q '^PATH.*#krebs' .bashrc; then if ! grep -q '^PATH.*#krebs' .bashrc; then
echo '. /root/.nix-profile/etc/profile.d/nix.sh' >> .bashrc echo '. /root/.nix-profile/etc/profile.d/nix.sh' >> .bashrc

View File

@ -144,9 +144,14 @@ with import <stockholm/lib>;
env = filevars // { passAsFile = attrNames filevars; }; env = filevars // { passAsFile = attrNames filevars; };
in in
# Use a subshell because <nixpkgs/stdenv/generic/setup.sh>'s genericBuild
# sources (or evaluates) the buildCommand and we don't want to modify its
# shell. In particular, exitHandler breaks in multiple ways with set -u.
pkgs.runCommand name env /* sh */ '' pkgs.runCommand name env /* sh */ ''
(
set -efu set -efu
${concatMapStringsSep "\n" (getAttr "install") files} ${concatMapStringsSep "\n" (getAttr "install") files}
)
''; '';
writeHaskell = writeHaskell =

View File

@ -15,10 +15,52 @@ let
\test -n "''${target-}" || target=$system \test -n "''${target-}" || target=$system
\test -n "''${user-}" || user=$LOGNAME \test -n "''${user-}" || user=$LOGNAME
. ${init.env} . ${init.env}
. ${init.proxy}
exec ${utils.deploy} exec ${utils.deploy}
''; '';
# usage: install [--user=USER] --system=SYSTEM --target=TARGET
cmds.install = pkgs.writeBash "cmds.install" ''
set -efu
command=install
. ${init.args}
\test -n "''${user-}" || user=$LOGNAME
. ${init.env}
if \test "''${using_proxy-}" != true; then
${pkgs.openssh}/bin/ssh \
-o StrictHostKeyChecking=no \
-o UserKnownHostsFile=/dev/null \
"$target_user@$target_host" -p "$target_port" \
env target_path=$(quote "$target_path") \
sh -s prepare < ${./krebs/4lib/infest/prepare.sh}
# TODO inline prepare.sh?
fi
. ${init.proxy}
# Reset PATH because we need access to nixos-install.
# TODO provide nixos-install instead of relying on prepare.sh
export PATH="$OLD_PATH"
# these variables get defined by nix-shell (i.e. nix-build) from
# XDG_RUNTIME_DIR and reference the wrong directory (/run/user/0),
# which only exists on / and not at /mnt.
export NIX_BUILD_TOP=/tmp
export TEMPDIR=/tmp
export TEMP=/tmp
export TMPDIR=/tmp
export TMP=/tmp
export XDG_RUNTIME_DIR=/tmp
export NIXOS_CONFIG="$target_path/nixos-config"
cd
exec nixos-install
'';
# usage: test [--user=USER] --system=SYSTEM --target=TARGET # usage: test [--user=USER] --system=SYSTEM --target=TARGET
cmds.test = pkgs.writeDash "cmds.test" /* sh */ '' cmds.test = pkgs.writeDash "cmds.test" /* sh */ ''
set -efu set -efu
@ -29,6 +71,7 @@ let
. ${init.args} . ${init.args}
\test -n "''${user-}" || user=$LOGNAME \test -n "''${user-}" || user=$LOGNAME
. ${init.env} . ${init.env}
. ${init.proxy}
exec ${utils.build} config.system.build.toplevel exec ${utils.build} config.system.build.toplevel
''; '';
@ -114,9 +157,6 @@ let
''; '';
init.env = pkgs.writeText "init.env" /* sh */ '' init.env = pkgs.writeText "init.env" /* sh */ ''
source=''${source-$user/1systems/$system/source.nix}
export source
export system export system
export target export target
export user export user
@ -129,25 +169,17 @@ let
export target_port="$(echo $target_object | ${pkgs.jq}/bin/jq -r .port)" export target_port="$(echo $target_object | ${pkgs.jq}/bin/jq -r .port)"
export target_path="$(echo $target_object | ${pkgs.jq}/bin/jq -r .path)" export target_path="$(echo $target_object | ${pkgs.jq}/bin/jq -r .path)"
export target_local="$(echo $target_object | ${pkgs.jq}/bin/jq -r .local)" export target_local="$(echo $target_object | ${pkgs.jq}/bin/jq -r .local)"
if \test "''${using_proxy-}" != true; then
${init.env.populate}
if \test "$target_local" != true; then
exec ${init.env.proxy} "$command" "$@"
fi
fi
'' // {
populate = pkgs.writeDash "init.env.populate" ''
set -efu
_source=$(get-source "$source")
echo $_source |
${pkgs.populate}/bin/populate \
"$target_user@$target_host:$target_port$target_path" \
>&2
unset _source
''; '';
proxy = pkgs.writeDash "init.env.proxy" ''
set -efu init.proxy = pkgs.writeText "init.proxy" /* sh */ ''
if \test "''${using_proxy-}" != true; then
source_file=$user/1systems/$system/source.nix
source=$(get-source "$source_file")
qualified_target=$target_user@$target_host:$target_port$target_path
echo "$source" | populate "$qualified_target"
if \test "$target_local" != true; then
exec ${pkgs.openssh}/bin/ssh \ exec ${pkgs.openssh}/bin/ssh \
"$target_user@$target_host" -p "$target_port" \ "$target_user@$target_host" -p "$target_port" \
cd "$target_path/stockholm" \; \ cd "$target_path/stockholm" \; \
@ -157,10 +189,11 @@ let
system=$(quote "$system") \ system=$(quote "$system") \
target=$(quote "$target") \ target=$(quote "$target") \
using_proxy=true \ using_proxy=true \
$(quote "$@") $(quote "$command" "$@")
")" ")"
fi
fi
''; '';
};
utils.build = pkgs.writeDash "utils.build" '' utils.build = pkgs.writeDash "utils.build" ''
set -efu set -efu
@ -201,9 +234,13 @@ let
in pkgs.stdenv.mkDerivation { in pkgs.stdenv.mkDerivation {
name = "stockholm"; name = "stockholm";
shellHook = /* sh */ '' shellHook = /* sh */ ''
export OLD_PATH="$PATH"
export NIX_PATH=stockholm=$PWD:nixpkgs=${toString <nixpkgs>} export NIX_PATH=stockholm=$PWD:nixpkgs=${toString <nixpkgs>}
if test -e /nix/var/nix/daemon-socket/socket; then
export NIX_REMOTE=daemon export NIX_REMOTE=daemon
fi
export PATH=${lib.makeBinPath [ export PATH=${lib.makeBinPath [
pkgs.populate
shell.cmdspkg shell.cmdspkg
]} ]}