diff --git a/scripts/build.sh b/scripts/build.sh index b273b9f..0b06667 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -2,41 +2,59 @@ # Parahub Mesh Firmware Builder # Uses OpenWrt Image Builder to create custom firmware with mesh packages. # -# Usage: ./scripts/build.sh -# Example: ./scripts/build.sh glinet_gl-axt1800 +# 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}" + # ============================================================================ -# Configuration +# Device Database (device → target/subtarget + Image Builder profile) # ============================================================================ -OPENWRT_VERSION="${OPENWRT_VERSION:-23.05.5}" -OPENWRT_TARGET="${OPENWRT_TARGET:-mediatek/filogic}" -BUILDER_URL="https://downloads.openwrt.org/releases/${OPENWRT_VERSION}/targets/${OPENWRT_TARGET}/openwrt-imagebuilder-${OPENWRT_VERSION}-${OPENWRT_TARGET//\//-}.Linux-x86_64.tar.xz" -BUILDER_DIR="${PROJECT_DIR}/imagebuilder" - -# Profile mapping (friendly name → Image Builder profile) -declare -A PROFILES=( - ["axt1800"]="glinet_gl-axt1800" - ["mt3000"]="glinet_gl-mt3000" - ["ax6s"]="xiaomi_redmi-router-ax6s" -) +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 # ============================================================================ -# Core mesh packages (always included) PACKAGES_CORE=( # batman-adv mesh kmod-batman-adv batctl-full - # 802.11s mesh support + # 802.11s mesh support (replace basic wpad) wpad-mesh-mbedtls -wpad-basic-mbedtls @@ -44,12 +62,11 @@ PACKAGES_CORE=( sqm-scripts kmod-sched-cake - # Utilities + # Management luci luci-app-sqm ) -# Full package set PACKAGES_FULL=( "${PACKAGES_CORE[@]}" @@ -65,49 +82,68 @@ PACKAGES_FULL=( # ============================================================================ usage() { - echo "Usage: $0 " + echo "Usage: $0 " echo "" - echo "Profiles:" - for key in "${!PROFILES[@]}"; do - echo " ${key} → ${PROFILES[$key]}" - done + 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 " OPENWRT_TARGET Target platform (default: ${OPENWRT_TARGET})" echo " PACKAGES_EXTRA Additional packages (space-separated)" exit 1 } +builder_dir() { + echo "${PROJECT_DIR}/imagebuilder-${OPENWRT_VERSION}-${OPENWRT_TARGET//\//-}" +} + download_builder() { - if [ -d "$BUILDER_DIR" ]; then - echo "Image Builder already downloaded, skipping..." + local dir + dir="$(builder_dir)" + + if [ -d "$dir" ]; then + echo "Image Builder already downloaded at ${dir##*/}, skipping..." return fi - echo "Downloading OpenWrt Image Builder ${OPENWRT_VERSION}..." - mkdir -p "$BUILDER_DIR" - wget -q --show-progress -O- "$BUILDER_URL" | tar -xJ --strip-components=1 -C "$BUILDER_DIR" + # 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 profile="$1" + local dir + dir="$(builder_dir)" local packages="${PACKAGES_FULL[*]} ${PACKAGES_EXTRA:-}" - echo "Building firmware for profile: ${profile}" + echo "Building firmware for profile: ${PROFILE}" echo "Packages: ${packages}" echo "Custom files: ${PROJECT_DIR}/files" - make -C "$BUILDER_DIR" image \ - PROFILE="$profile" \ + 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 || echo "(no .bin files found)" - ls -lh "${PROJECT_DIR}/output/"*.img* 2>/dev/null || echo "(no .img files found)" + 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 } # ============================================================================ @@ -118,21 +154,20 @@ if [ $# -lt 1 ]; then usage fi -INPUT_PROFILE="$1" +INPUT="$1" -# Resolve profile name -if [ -n "${PROFILES[$INPUT_PROFILE]+x}" ]; then - PROFILE="${PROFILES[$INPUT_PROFILE]}" -else - # Assume it's a raw Image Builder profile name - PROFILE="$INPUT_PROFILE" +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 "$PROFILE" +build_firmware