123 lines
2.9 KiB
Bash
Executable File
123 lines
2.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
|
|
REPO_ROOT="$(readlink -f "$SCRIPT_DIR/..")"
|
|
UID_VALUE="$(id -u)"
|
|
GID_VALUE="$(id -g)"
|
|
RUNTIME_DIR="${XDG_RUNTIME_DIR:-/run/user/$UID_VALUE}"
|
|
IMAGE="${RETEAMSPEAK_AUDIO_IMAGE:-docker.io/library/rust:1.91-bookworm}"
|
|
|
|
if [[ $# -gt 0 && "$1" == "--" ]]; then
|
|
shift
|
|
if [[ $# -eq 0 ]]; then
|
|
printf 'Expected a container command after --\n' >&2
|
|
exit 1
|
|
fi
|
|
CONTAINER_CMD=("$@")
|
|
else
|
|
CONTAINER_CMD=(/usr/local/cargo/bin/cargo run -p re-teamspeak)
|
|
fi
|
|
|
|
quoted_cmd() {
|
|
local quoted=()
|
|
local part
|
|
for part in "$@"; do
|
|
quoted+=("$(printf '%q' "$part")")
|
|
done
|
|
printf '%s ' "${quoted[@]}"
|
|
}
|
|
|
|
PODMAN_ARGS=(
|
|
run
|
|
--rm
|
|
--network host
|
|
-v "$REPO_ROOT:/workspace:Z"
|
|
-w /workspace/src
|
|
-e CARGO_TARGET_DIR=/tmp/re-teamspeak-target
|
|
)
|
|
|
|
if [[ -t 0 && -t 1 ]]; then
|
|
PODMAN_ARGS+=( -it )
|
|
fi
|
|
|
|
if [[ -e /dev/snd ]]; then
|
|
PODMAN_ARGS+=( --device /dev/snd )
|
|
fi
|
|
|
|
if [[ -e /dev/dri ]]; then
|
|
PODMAN_ARGS+=( --device /dev/dri )
|
|
fi
|
|
|
|
if [[ -S "$RUNTIME_DIR/pulse/native" ]]; then
|
|
PODMAN_ARGS+=(
|
|
-v "$RUNTIME_DIR/pulse:$RUNTIME_DIR/pulse:Z"
|
|
-e "PULSE_SERVER=unix:$RUNTIME_DIR/pulse/native"
|
|
)
|
|
fi
|
|
|
|
if [[ -S "$RUNTIME_DIR/pipewire-0" ]]; then
|
|
PODMAN_ARGS+=(
|
|
-v "$RUNTIME_DIR/pipewire-0:$RUNTIME_DIR/pipewire-0:Z"
|
|
-v "$RUNTIME_DIR/pipewire-0-manager:$RUNTIME_DIR/pipewire-0-manager:Z"
|
|
-e "PIPEWIRE_REMOTE=$RUNTIME_DIR/pipewire-0"
|
|
-e "XDG_RUNTIME_DIR=$RUNTIME_DIR"
|
|
)
|
|
fi
|
|
|
|
if [[ -S "$RUNTIME_DIR/bus" ]]; then
|
|
PODMAN_ARGS+=(
|
|
-v "$RUNTIME_DIR/bus:$RUNTIME_DIR/bus:Z"
|
|
-e "DBUS_SESSION_BUS_ADDRESS=unix:path=$RUNTIME_DIR/bus"
|
|
)
|
|
fi
|
|
|
|
if [[ -n "${WAYLAND_DISPLAY:-}" && -S "$RUNTIME_DIR/$WAYLAND_DISPLAY" ]]; then
|
|
PODMAN_ARGS+=(
|
|
-v "$RUNTIME_DIR/$WAYLAND_DISPLAY:$RUNTIME_DIR/$WAYLAND_DISPLAY:Z"
|
|
-e "WAYLAND_DISPLAY=$WAYLAND_DISPLAY"
|
|
-e "XDG_RUNTIME_DIR=$RUNTIME_DIR"
|
|
)
|
|
elif [[ -n "${DISPLAY:-}" && -d /tmp/.X11-unix ]]; then
|
|
PODMAN_ARGS+=(
|
|
-v /tmp/.X11-unix:/tmp/.X11-unix:ro
|
|
-e "DISPLAY=$DISPLAY"
|
|
)
|
|
if [[ -n "${XAUTHORITY:-}" && -f "$XAUTHORITY" ]]; then
|
|
PODMAN_ARGS+=(
|
|
-v "$XAUTHORITY:$XAUTHORITY:ro,Z"
|
|
-e "XAUTHORITY=$XAUTHORITY"
|
|
)
|
|
fi
|
|
elif [[ ${CONTAINER_CMD[0]} == /usr/local/cargo/bin/cargo && ${CONTAINER_CMD[1]} == run ]]; then
|
|
printf 'No Wayland or X11 session detected in this shell.\n' >&2
|
|
printf 'Run this from a desktop session, or pass a custom container command with --.\n' >&2
|
|
exit 1
|
|
fi
|
|
|
|
APT_PACKAGES=(
|
|
cmake
|
|
pkg-config
|
|
libasound2-dev
|
|
libopus-dev
|
|
libxkbcommon0
|
|
libwayland-client0
|
|
libwayland-cursor0
|
|
libwayland-egl1
|
|
libx11-6
|
|
libxrandr2
|
|
libxi6
|
|
libxcursor1
|
|
libxinerama1
|
|
libgl1
|
|
libegl1
|
|
libdbus-1-3
|
|
)
|
|
|
|
APT_CMD="apt-get update >/dev/null && apt-get install -y --no-install-recommends $(quoted_cmd "${APT_PACKAGES[@]}") >/dev/null"
|
|
RUN_CMD="$(quoted_cmd "${CONTAINER_CMD[@]}")"
|
|
|
|
exec podman "${PODMAN_ARGS[@]}" "$IMAGE" \
|
|
bash -lc "$APT_CMD && $RUN_CMD"
|