#!/bin/bash # Parahub Mesh Firmware Builder # Uses OpenWrt Image Builder to create custom firmware with mesh packages. # # Usage: ./scripts/build.sh # Example: ./scripts/build.sh axt1800 set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" OPENWRT_VERSION="${OPENWRT_VERSION:-25.12.0-rc4}" # ============================================================================ # Device Database (device → target/subtarget + Image Builder profile) # ============================================================================ device_config() { local device="$1" case "$device" in axt1800) OPENWRT_TARGET="qualcommax/ipq60xx" PROFILE="glinet_gl-axt1800" ;; mt3000) OPENWRT_TARGET="mediatek/filogic" PROFILE="glinet_gl-mt3000" ;; mt6000) OPENWRT_TARGET="mediatek/filogic" PROFILE="glinet_gl-mt6000" ;; ax6s) OPENWRT_TARGET="mediatek/filogic" PROFILE="xiaomi_redmi-router-ax6s" ;; ax53u) OPENWRT_TARGET="ramips/mt7621" PROFILE="asus_rt-ax53u" ;; *) return 1 ;; esac } # ============================================================================ # Packages # ============================================================================ PACKAGES_CORE=( # batman-adv mesh kmod-batman-adv batctl-full # 802.11s mesh support (replace basic wpad, includes OWE) wpad-mesh-mbedtls -wpad-basic-mbedtls # Yggdrasil overlay network yggdrasil # GRE6 tunnel (guest traffic → VPS gateway) kmod-gre6 # WireGuard (optional local Mullvad via parahub-mullvad script) kmod-wireguard wireguard-tools luci-proto-wireguard # DNS-over-HTTPS for guest privacy https-dns-proxy # SQM traffic shaping sqm-scripts kmod-sched-cake # Management luci luci-app-sqm ) PACKAGES_FULL=( "${PACKAGES_CORE[@]}" # Diagnostics tcpdump iperf3 iwinfo curl ) # ============================================================================ # Functions # ============================================================================ usage() { echo "Usage: $0 " echo "" echo "Devices:" echo " axt1800 GL.iNet GL-AXT1800 (Slate AX) qualcommax/ipq60xx" echo " mt3000 GL.iNet GL-MT3000 (Beryl AX) mediatek/filogic" echo " mt6000 GL.iNet GL-MT6000 (Flint 2) mediatek/filogic" echo " ax6s Xiaomi Redmi AX6S mediatek/filogic" echo " ax53u Asus RT-AX53U ramips/mt7621" echo "" echo "OpenWrt version: ${OPENWRT_VERSION} (override with OPENWRT_VERSION env var)" echo "" echo "Environment variables:" echo " OPENWRT_VERSION OpenWrt release (default: ${OPENWRT_VERSION})" echo " PACKAGES_EXTRA Additional packages (space-separated)" exit 1 } builder_dir() { echo "${PROJECT_DIR}/imagebuilder-${OPENWRT_VERSION}-${OPENWRT_TARGET//\//-}" } download_builder() { local dir dir="$(builder_dir)" if [ -d "$dir" ]; then echo "Image Builder already downloaded at ${dir##*/}, skipping..." return fi # OpenWrt 25.x uses .tar.zst, older uses .tar.xz local base_url="https://downloads.openwrt.org/releases/${OPENWRT_VERSION}/targets/${OPENWRT_TARGET}/openwrt-imagebuilder-${OPENWRT_VERSION}-${OPENWRT_TARGET//\//-}.Linux-x86_64" echo "Downloading OpenWrt Image Builder ${OPENWRT_VERSION} for ${OPENWRT_TARGET}..." mkdir -p "$dir" if wget -q --spider "${base_url}.tar.zst" 2>/dev/null; then wget -q --show-progress -O- "${base_url}.tar.zst" | zstd -d | tar -x --strip-components=1 -C "$dir" else wget -q --show-progress -O- "${base_url}.tar.xz" | tar -xJ --strip-components=1 -C "$dir" fi } build_firmware() { local dir dir="$(builder_dir)" local packages="${PACKAGES_FULL[*]} ${PACKAGES_EXTRA:-}" echo "Building firmware for profile: ${PROFILE}" echo "Packages: ${packages}" echo "Custom files: ${PROJECT_DIR}/files" make -C "$dir" image \ PROFILE="$PROFILE" \ PACKAGES="$packages" \ FILES="${PROJECT_DIR}/files" \ BIN_DIR="${PROJECT_DIR}/output" echo "" echo "Build complete! Firmware images:" ls -lh "${PROJECT_DIR}/output/"*.bin 2>/dev/null || true ls -lh "${PROJECT_DIR}/output/"*.img* 2>/dev/null || true ls -lh "${PROJECT_DIR}/output/"*.itb 2>/dev/null || true } # ============================================================================ # Main # ============================================================================ if [ $# -lt 1 ]; then usage fi INPUT="$1" if ! device_config "$INPUT"; then echo "Error: Unknown device '${INPUT}'" echo "" usage fi echo "=== Parahub Mesh Firmware Builder ===" echo "Device: ${INPUT}" echo "OpenWrt: ${OPENWRT_VERSION}" echo "Target: ${OPENWRT_TARGET}" echo "Profile: ${PROFILE}" echo "" download_builder build_firmware