#!/usr/bin/env bash download_xray() { # Download Xray core and install to outdir/xray local outdir="$1" ver="${XRAY_VER:-}" url tmp zipname="xray.zip" mkdir -p "$outdir" if [[ -n "${XRAY_VER:-}" ]]; then ver="${XRAY_VER}"; fi if [[ -z "$ver" ]]; then echo "Downloading latest xray" ver="$(curl -fsSL https://api.github.com/repos/XTLS/Xray-core/releases/latest | grep -Eo '"tag_name":\s*"v[^"]+"' | sed -E 's/.*"v([^"]+)".*/\1/' | head -n1)" || true fi if [[ -z "$ver" ]]; then echo "[xray] Failed to get version" return 1 fi if [[ "$RID_DIR" == "linux-arm64" ]]; then url="https://github.com/XTLS/Xray-core/releases/download/v${ver}/Xray-linux-arm64-v8a.zip" else url="https://github.com/XTLS/Xray-core/releases/download/v${ver}/Xray-linux-64.zip" fi echo "[+] Download xray: $url" tmp="$(mktemp -d)" trap '[[ -n "${tmp:-}" ]] && rm -rf "$tmp"' RETURN curl -fL "$url" -o "$tmp/$zipname" unzip -q "$tmp/$zipname" -d "$tmp" install -Dm755 "$tmp/xray" "$outdir/xray" } download_singbox() { # Download sing-box core and install to outdir/sing-box local outdir="$1" ver="${SING_VER:-}" url tmp tarname="singbox.tar.gz" bin mkdir -p "$outdir" if [[ -n "${SING_VER:-}" ]]; then ver="${SING_VER}"; fi if [[ -z "$ver" ]]; then echo "Downloading latest sing-box" ver="$(curl -fsSL https://api.github.com/repos/SagerNet/sing-box/releases/latest | grep -Eo '"tag_name":\s*"v[^"]+"' | sed -E 's/.*"v([^"]+)".*/\1/' | head -n1)" || true fi if [[ -z "$ver" ]]; then echo "[sing-box] Failed to get version" return 1 fi if [[ "$RID_DIR" == "linux-arm64" ]]; then url="https://github.com/SagerNet/sing-box/releases/download/v${ver}/sing-box-${ver}-linux-arm64.tar.gz" else url="https://github.com/SagerNet/sing-box/releases/download/v${ver}/sing-box-${ver}-linux-amd64.tar.gz" fi echo "[+] Download sing-box: $url" tmp="$(mktemp -d)" trap '[[ -n "${tmp:-}" ]] && rm -rf "$tmp"' RETURN curl -fL "$url" -o "$tmp/$tarname" tar -C "$tmp" -xzf "$tmp/$tarname" bin="$(find "$tmp" -type f -name 'sing-box' | head -n1 || true)" [[ -n "$bin" ]] || { echo "[!] sing-box unpack failed" return 1 } install -Dm755 "$bin" "$outdir/sing-box" } # Move geo files to a unified path: outroot/bin unify_geo_layout() { local outroot="$1" mkdir -p "$outroot/bin" local names=( "geosite.dat" "geoip.dat" "geoip-only-cn-private.dat" "Country.mmdb" "geoip.metadb" ) for n in "${names[@]}"; do # If file exists under bin/xray/, move it up to bin/ if [[ -f "$outroot/bin/xray/$n" ]]; then mv -f "$outroot/bin/xray/$n" "$outroot/bin/$n" fi # If file already in bin/, leave it as-is if [[ -f "$outroot/bin/$n" ]]; then : fi done } # Download geo/rule assets; then unify to bin/ download_geo_assets() { local outroot="$1" local bin_dir="$outroot/bin" local srss_dir="$bin_dir/srss" mkdir -p "$bin_dir" "$srss_dir" echo "[+] Download Xray Geo to ${bin_dir}" curl -fsSL -o "$bin_dir/geosite.dat" \ "https://github.com/Loyalsoldier/V2ray-rules-dat/releases/latest/download/geosite.dat" curl -fsSL -o "$bin_dir/geoip.dat" \ "https://github.com/Loyalsoldier/V2ray-rules-dat/releases/latest/download/geoip.dat" curl -fsSL -o "$bin_dir/geoip-only-cn-private.dat" \ "https://raw.githubusercontent.com/Loyalsoldier/geoip/release/geoip-only-cn-private.dat" curl -fsSL -o "$bin_dir/Country.mmdb" \ "https://raw.githubusercontent.com/Loyalsoldier/geoip/release/Country.mmdb" echo "[+] Download sing-box rule DB & rule-sets" curl -fsSL -o "$bin_dir/geoip.metadb" \ "https://github.com/MetaCubeX/meta-rules-dat/releases/latest/download/geoip.metadb" || true for f in \ geoip-private.srs geoip-cn.srs geoip-facebook.srs geoip-fastly.srs \ geoip-google.srs geoip-netflix.srs geoip-telegram.srs geoip-twitter.srs; do curl -fsSL -o "$srss_dir/$f" \ "https://raw.githubusercontent.com/2dust/sing-box-rules/rule-set-geoip/$f" || true done for f in \ geosite-cn.srs geosite-gfw.srs geosite-greatfire.srs \ geosite-geolocation-cn.srs geosite-category-ads-all.srs geosite-private.srs; do curl -fsSL -o "$srss_dir/$f" \ "https://raw.githubusercontent.com/2dust/sing-box-rules/rule-set-geosite/$f" || true done # Unify to bin/ unify_geo_layout "$outroot" }