77 lines
2.1 KiB
Nix
77 lines
2.1 KiB
Nix
{
|
|
lib,
|
|
pkgs,
|
|
mixRelease,
|
|
elixir,
|
|
fetchMixDeps,
|
|
}: let
|
|
pname = "frajtano";
|
|
pkg = mixRelease rec {
|
|
inherit pname;
|
|
version = "0.0.1";
|
|
|
|
inherit elixir;
|
|
src = builtins.path {
|
|
path = ./.;
|
|
name = "${pname}-source";
|
|
filter = path: _type: baseNameOf path != "flake.nix" && baseNameOf path != "flake.lock";
|
|
};
|
|
|
|
# Adapted from https://blog.eigenvalue.net/nix-rerunning-fixed-output-derivations/
|
|
# deps hash should change any time ./mix.lock changes, and not otherwise
|
|
mixFodDeps = let
|
|
deps = fetchMixDeps {
|
|
pname = "mix-deps-${pname}";
|
|
inherit version src;
|
|
sha256 = {
|
|
"x86_64-linux" = "sha256-/9Ushiv0z1wJL9FwebUF4gem8IOwlUPnQuDBiXV0Ib8=";
|
|
"aarch64-darwin" = "sha256-8gFgTV1qYrC3iw5/AyeEOMAYtcEK7wTXie+Z9RDrqUI=";
|
|
}.${pkgs.system};
|
|
};
|
|
hash = builtins.substring 11 32 "${./mix.lock}";
|
|
in
|
|
deps.overrideAttrs (attrs: {name = "${deps.name}-${hash}";});
|
|
|
|
ELIXIR_MAKE_CACHE_DIR = "/tmp/.elixir-make-cache";
|
|
meta.mainProgram = pname;
|
|
};
|
|
script = pkgs.writeShellScriptBin pname ''
|
|
set -e
|
|
${pkgs.coreutils}/bin/mkdir -p $FRAJTANO_DIR
|
|
file="$FRAJTANO_DIR/cookie"
|
|
(umask 077; [ -f "$file" ] || ${pkgs.coreutils}/bin/head -c 128 /dev/urandom | ${pkgs.coreutils}/bin/base64 -w0 > "$file")
|
|
export RELEASE_COOKIE=$(${pkgs.coreutils}/bin/cat "$file")
|
|
[ -z $RELEASE_NODE ] && export RELEASE_NODE="frajtano-$(${pkgs.coreutils}/bin/whoami)@$(${pkgs.toybox}/bin/hostname -s)"
|
|
run() {
|
|
exec ${lib.getExe pkg} "$@"
|
|
}
|
|
|
|
list() {
|
|
for i in "$@"; do
|
|
echo "\"$i\", "
|
|
done
|
|
}
|
|
|
|
case "''${1:-}" in
|
|
assimilate)
|
|
run rpc ":ok = ~S{$2} |> Frajtano.Agent.assimilate()"
|
|
;;
|
|
spawn)
|
|
shift
|
|
run rpc ":ok = Frajtano.Agent.spawn_backing_agent({\"/usr/bin/env\", [$(list "$@")]})"
|
|
;;
|
|
socket)
|
|
echo $FRAJTANO_DIR/agent.sock
|
|
;;
|
|
*)
|
|
run "$@"
|
|
;;
|
|
esac
|
|
'';
|
|
in
|
|
pkgs.symlinkJoin {
|
|
name = pname;
|
|
paths = [script pkg];
|
|
meta.mainProgram = pname;
|
|
}
|