#!/bin/bash PRIMARY_URL="https://tools.88de.de" BACKUP_URL1="https://dooki.tools.88de.de" BACKUP_URL2="" _region=$(curl -s --max-time 3 myip.ipip.net 2>/dev/null || true) if echo "$_region" | grep -qE '联通|移动'; then PRIMARY_URL="$BACKUP_URL1" BACKUP_URL1="https://tools.88de.de" fi TOOL_DIR="/opt/J-tools" TOOL_URL="${JTOOLS_URL:-$PRIMARY_URL}" TOOL_URL="${TOOL_URL%/}" printf '%s\n' "==========================================" printf '%s\n' " 极 Tools 安装程序" printf '%s\n' "==========================================" printf '\n' if [ "$(id -u)" -ne 0 ]; then printf '%s\n' "请使用 root 用户执行安装" exit 1 fi mkdirdi_status() { local label="$1" status="$2" color="$3" printf ' %-22s %b%s%b\n' "$label" "$color" "$status" "$RESET" } RESET=$'\033[0m' GREEN=$'\033[0;32m' RED=$'\033[0;31m' YELLOW=$'\033[0;33m' GRAY=$'\033[38;5;244m' # ---- 临时工作目录:所有文件先下到这里,全部通过才写入 $TOOL_DIR ---- WORKDIR="/tmp/jt_install" rm -rf "$WORKDIR" mkdir -p "$WORKDIR/ext" || exit 1 trap 'rm -rf "$WORKDIR" 2>/dev/null || true' EXIT dl_file() { local path="$1" output="$2" curl -fsSL --connect-timeout 5 "$PRIMARY_URL/$path" -o "$output" 2>/dev/null \ || curl -fsSL --connect-timeout 10 "$BACKUP_URL1/$path" -o "$output" 2>/dev/null \ || [ -n "$BACKUP_URL2" ] && curl -fsSL --connect-timeout 10 "$BACKUP_URL2/$path" -o "$output" 2>/dev/null } printf '%s\n' "正在安装工具箱..." printf '\n' core_exts="web.sh apps.sh tests.sh proxies.sh network_tests.sh" failed="" # ---- j-tools 串行 ---- if ! dl_file "j-tools" "$WORKDIR/j-tools"; then failed="$failed j-tools" fi # ---- ext 并发下载(最多 3 个同时) ---- count=0 for mod in $core_exts; do ( dl_file "ext/$mod" "$WORKDIR/ext/$mod" && { sed -i 's/\r$//;1s/^\xEF\xBB\xBF//' "$WORKDIR/ext/$mod" 2>/dev/null || true if command -v bash >/dev/null 2>&1; then bash -n "$WORKDIR/ext/$mod" 2>/dev/null || rm -f "$WORKDIR/ext/$mod" fi } [ -f "$WORKDIR/ext/$mod" ] && exit 0 || exit 1 ) & count=$((count + 1)) [ "$count" -ge 3 ] && { wait -n 2>/dev/null || true; } done wait # ---- proxies 失败重试一次 ---- if ! [ -f "$WORKDIR/ext/proxies.sh" ]; then if dl_file "ext/proxies.sh" "$WORKDIR/ext/proxies.sh"; then sed -i 's/\r$//;1s/^\xEF\xBB\xBF//' "$WORKDIR/ext/proxies.sh" 2>/dev/null || true if command -v bash >/dev/null 2>&1; then bash -n "$WORKDIR/ext/proxies.sh" 2>/dev/null || rm -f "$WORKDIR/ext/proxies.sh" fi fi fi # ---- 检查缺失 ---- [ -f "$WORKDIR/j-tools" ] || failed="$failed j-tools" for mod in $core_exts; do [ -f "$WORKDIR/ext/$mod" ] || failed="$failed $mod" done # ---- 有缺失 → 不动 $TOOL_DIR,直接退出 ---- if [ -n "$failed" ]; then printf '\n' for f in $failed; do mkdirdi_status "$f" "下载失败" "$RED" done printf '\n%b\n' "${RED}核心文件不完整,安装中止${RESET}" printf '%b\n' "${GRAY}请重新执行: bash <(curl -sL tools.88de.de)${RESET}" exit 1 fi # ---- 全部通过 → 一次性写入 $TOOL_DIR ---- mkdir -p "$TOOL_DIR/ext" || exit 1 cp "$WORKDIR/j-tools" "$TOOL_DIR/j-tools" chmod +x "$TOOL_DIR/j-tools" mkdirdi_status "j-tools" "语法校验通过" "$GREEN" for mod in $core_exts; do cp "$WORKDIR/ext/$mod" "$TOOL_DIR/ext/$mod" chmod +x "$TOOL_DIR/ext/$mod" mkdirdi_status "ext/$mod" "下载完成" "$GREEN" done cat > "$TOOL_DIR/source.conf" << EOF TOOL_URL=$TOOL_URL EOF cat > /usr/local/bin/j << 'EOF' #!/bin/bash TOOL_DIR="/opt/J-tools" if [ ! -f "$TOOL_DIR/j-tools" ]; then printf '%s\n' "工具箱文件丢失,请重新安装" exit 1 fi JTOOLS_DIR="$TOOL_DIR" exec "$TOOL_DIR/j-tools" EOF chmod +x /usr/local/bin/j ln -sf /usr/local/bin/j /usr/local/bin/J 2>/dev/null || true printf '\n' printf '%s\n' "安装完成!" printf '\n' printf '%s\n' "快捷启动命令:" printf '%s\n' " j 或 J" printf '\n' JTOOLS_DIR="$TOOL_DIR" exec "$TOOL_DIR/j-tools"