Files
nixconfig/audit-desktop.sh

46 lines
1.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# Optional render node moves GPU work out of QEMU TCG; no physical display is changed.
set -euo pipefail
umask 077
if [[ "${1:-}" == --help ]]; then
echo 'Usage: ./audit-desktop.sh [accessible /dev/dri/renderD* or card* node]'
exit 0
fi
export NIXOS_AUDIT_REPO
NIXOS_AUDIT_REPO=$(dirname "$(readlink -f "$0")")
export NIXOS_AUDIT_RENDER_NODE=${1:-}
if [[ -n "$NIXOS_AUDIT_RENDER_NODE" ]] &&
[[ ! -r "$NIXOS_AUDIT_RENDER_NODE" || ! -w "$NIXOS_AUDIT_RENDER_NODE" ]]; then
echo "Render node is not accessible: $NIXOS_AUDIT_RENDER_NODE" >&2
exit 1
fi
base="${XDG_CACHE_HOME:-$HOME/.cache}/desktop-audit"
mkdir -p "$base"
output=$(mktemp -d "$base/run.XXXXXXXX")
export TMPDIR="$output/tmp"
mkdir -p "$TMPDIR"
driver=$(nix build --impure --no-update-lock-file --out-link "$output/driver" --print-out-paths --expr '
let
repo = builtins.getEnv "NIXOS_AUDIT_REPO";
f = builtins.getFlake repo;
node = builtins.getEnv "NIXOS_AUDIT_RENDER_NODE";
in (import (repo + "/desktop-test.nix") {
inputs = f.inputs;
pkgs = f.inputs.nixpkgs.legacyPackages.x86_64-linux;
hostRenderNode = if node == "" then null else node;
}).driver
')
if [[ -n "$NIXOS_AUDIT_RENDER_NODE" ]]; then
mesa=$(nix eval --impure --raw --expr '
(builtins.getFlake (builtins.getEnv "NIXOS_AUDIT_REPO")).inputs.nixpkgs.legacyPackages.x86_64-linux.mesa.outPath
')
# Isolated host-side Mesa software rendering, never global driver overrides.
# Prevent the test driver appending -nographic over the EGL-headless backend.
export DISPLAY=""
export LIBGL_ALWAYS_SOFTWARE=1 LP_NUM_THREADS=4
export GBM_BACKENDS_PATH="$mesa/lib/gbm" LIBGL_DRIVERS_PATH="$mesa/lib/dri"
export __EGL_VENDOR_LIBRARY_FILENAMES="$mesa/share/glvnd/egl_vendor.d/50_mesa.json"
fi
printf 'Audit output: %s\n' "$output"
exec "$driver/bin/nixos-test-driver" -o "$output"