about summary refs log tree commit diff
path: root/modules/user/aszlig/programs/taalo-build/default.nix
blob: 5fb0943882fb8c0067762372c49fa12c89d3ceb0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
{ config, pkgs, lib, ... }:

let
  # Make sure we use a Nix version prior to 1.12, because taalo currently uses
  # the legacy SSH protocol, so we can't use the ssh-ng store backend here.
  #
  # Apart from that, even if we would use the new store backend we would break
  # the taalo-build backend for Nix 1.11.
  inherit (import (import (../../../../../nixpkgs-path.nix)) {
    config = {};
  }) nix;

  backend = pkgs.writeScript "taalo-realize-backend" ''
    #!${pkgs.perl}/bin/perl -I${nix}/lib/perl5/site_perl
    use strict;
    use Nix::CopyClosure;
    use Nix::SSH;
    use IPC::Open2;

    binmode STDERR, ":encoding(utf8)";

    my ($from, $to);
    my $dest = 'nix-remote-build@taalo.headcounter.org';
    my $cmd = "exec ssh $dest -C -- nix-store --serve --write";
    my $pid = open2($from, $to, $cmd);

    # Do the handshake.
    my $magic;
    eval {
        my $SERVE_MAGIC_1 = 0x390c9deb; # FIXME
        my $clientVersion = 0x200;
        syswrite($to, pack("L<x4L<x4", $SERVE_MAGIC_1, $clientVersion))
          or die;
        $magic = readInt($from);
    };

    die "unable to connect to taalo\n" if $@;
    die "did not get valid handshake from taalo\n" if $magic != 0x5452eecb;

    my $serverVersion = readInt($from);
    die "unsupported server version\n"
      if $serverVersion < 0x200 || $serverVersion >= 0x300;

    Nix::CopyClosure::copyToOpen(
      $from, $to, "taalo", \@ARGV, 0, 0, 0, 1
    );

    writeInt(6, $to) or die;
    writeStrings(\@ARGV, $to);
    writeInt(0, $to);
    writeInt(0, $to);

    my $res = readInt($from);

    close $to;

    waitpid($pid, 0);
    exit $res;
  '';

  taalo-realize = pkgs.writeScriptBin "taalo-realize" ''
    #!${pkgs.stdenv.shell}
    if [ $# -le 0 -o "$1" = "--help" -o "$1" = "-h" ]; then
      echo "Usage: $0 DERIVATION..." >&2
      exit 1
    fi

    exec ${backend} "$@"
  '';

  taalo-build = pkgs.writeScriptBin "taalo-build" ''
    #!${pkgs.stdenv.shell}
    if tmpdir="$("${pkgs.coreutils}/bin/mktemp" -d -t taalo-build.XXXXXX)"; then
      trap "rm -rf '$tmpdir'" EXIT
      set -o pipefail
      drvs="$(nix-instantiate --add-root "$tmpdir/derivation" --indirect "$@" \
        | cut -d'!' -f1)" || exit 1
      ${backend} $("${pkgs.coreutils}/bin/readlink" $drvs)
      exit $?
    else
      echo "Unable to create temporary directory for build link!" >&2
      exit 1
    fi
  '';

in {
  options.vuizvui.user.aszlig.programs.taalo-build = {
    enable = lib.mkEnableOption "aszlig's build helpers for remote builds";
  };
  config = lib.mkIf config.vuizvui.user.aszlig.programs.taalo-build.enable {
    environment.systemPackages = [ taalo-realize taalo-build ];
  };
}