Files
parahub-mesh/scripts/build.sh
Parahub AI 859033635b feat: local Mullvad WireGuard + policy routing for guest traffic
- parahub-mullvad script: setup/status/remove for owner's Mullvad key
- WireGuard packages: kmod-wireguard, wireguard-tools, luci-proto-wireguard
- Policy routing: ip4table='100' + guest subnet rule (fixes guest→VPN flow)
- setup: auto-detects country, registers key, creates WG interface, switches firewall
- remove: reverts to GRE6→VPS gateway

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 15:42:45 +00:00

188 lines
5.1 KiB
Bash
Executable File

#!/bin/bash
# Parahub Mesh Firmware Builder
# Uses OpenWrt Image Builder to create custom firmware with mesh packages.
#
# Usage: ./scripts/build.sh <device>
# 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 <device>"
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