#!/bin/bash set -e msg() { >&2 echo "garlicd: $@" } if [ ! -z "$1" ]; then >&2 echo "usage: garlicd" exit 1 fi export PATH="@extraPath@:$PATH" garlic_sandbox=$(nix show-config |\ grep extra-sandbox-paths |\ grep -o '/garlic=[^ ]*' || true) if [ -z "$garlic_sandbox" ]; then msg "Missing extra-sandbox-paths /garlic mountpoint" msg "Check the ~/.config/nix/nix.conf file" exit 1 fi mountdir_rel=$(echo "$garlic_sandbox" | sed 's@^/garlic=@@g') mountdir=$(readlink -f "$mountdir_rel") run="$mountdir/run" completed="$mountdir/completed" wipe="$mountdir/wipe" handle_bad_signal() { msg "cleaning FIFO pipes" rm -f "$run" "$completed" "$wipe" exit 1 } trap handle_bad_signal SIGINT for fifo in "$run" "$completed" "$wipe"; do if [ ! -e "$fifo" ]; then mkfifo "$fifo" # FIXME: Use more resctrictive permissions chmod 666 "$fifo" fi done while true; do msg "Waiting for experiments ..." tre=$(head -1 "$run") msg "Attempting to run: $tre" msg "Copying files to MN4..." # It fails if the user doesn't have nix-store, but is already copied # with the post build hook nix copy --to ssh://mn1 $tre || true msg "Launching the experiment..." garlic -R "$tre" msg "Fetching results..." garlic -FKv "$tre" echo -n "$tre" >> "$completed" msg "Waiting for nix to finish the build..." tre2=$(head -1 "$wipe") if [ "$tre" != "$tre2" ]; then msg "error: trebuchet mismatch" exit 1 fi msg "Removing temporal files..." garlic -D "$tre" echo -n "$tre" >> "$completed" msg "Execution completed :-)" done