#!/usr/bin/env bash set -euo pipefail # 1) Install system dependencies (Arch Linux) sudo pacman -S --needed --noconfirm git rustup protobuf gcc pulseaudio tailscale snapd # Enable and start snapd if not already: sudo systemctl enable --now snapd.socket # Create classic symlink for snap (one-time): sudo ln -sf /var/lib/snapd/snap /snap # Install µStreamer via Snap (if you actually need streaming) if ! snap list | grep -q ustreamer; then sudo snap install ustreamer fi # 2) Ensure Rust toolchain is present rustup toolchain install stable sudo install -Dm755 target/release/navka-server /usr/local/bin/navka-server sudo install -Dm755 gadget/navka-gadget.sh /usr/local/bin/navka-gadget.sh # 3) Determine repo URL from the current directory REPO_DIR="$(cd "$(dirname "$0")/.." && pwd)" REPO_URL="$(git -C "$REPO_DIR" config --get remote.origin.url)" if [ -z "$REPO_URL" ]; then echo "Error: could not read git remote.origin.url from $REPO_DIR" exit 1 fi # 4) Where to clone/build if not already present WORK="/opt/navka" if [ ! -d "$WORK" ]; then sudo git clone "$REPO_URL" "$WORK" else sudo git -C "$WORK" fetch --all sudo git -C "$WORK" reset --hard origin/$(sudo git -C "$WORK" rev-parse --abbrev-ref HEAD) fi # 5) Build navka-server (and ensure gadget script is in place) cd "$WORK" cargo build --release --manifest-path server/Cargo.toml sudo install -Dm755 target/release/navka-server /usr/local/bin/navka-server sudo install -Dm755 gadget/navka-gadget.sh /usr/local/bin/navka-gadget.sh # 6) Install systemd unit for navka-gadget (USB gadget) cat | sudo tee /etc/systemd/system/navka-gadget.service >/dev/null <<'EOF' [Unit] Description=Navka USB Gadget (HID + Audio) [Service] Type=oneshot ExecStart=/usr/local/bin/navka-gadget.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target EOF # 7) Install systemd unit for navka-server (Rust relay) cat | sudo tee /etc/systemd/system/navka-server.service >/dev/null <<'EOF' [Unit] Description=Navka Relay Server (HID over gRPC) After=network.target navka-gadget.service [Service] ExecStart=/usr/local/bin/navka-server Restart=always User=root [Install] WantedBy=multi-user.target EOF # 8) Reload & enable both services sudo systemctl daemon-reload sudo systemctl enable --now navka-gadget.service navka-server.service echo "navka-server installed and running."