From 25c5ad259b2988da44386b71dde7d590c9324022 Mon Sep 17 00:00:00 2001 From: hotyue <52734432+hotyue@users.noreply.github.com> Date: Wed, 3 Jun 2026 03:19:08 +0000 Subject: [PATCH] =?UTF-8?q?fix(master):=20=E5=9B=9E=E6=BB=9A=E6=B1=A1?= =?UTF-8?q?=E6=9F=93=E6=8B=A6=E6=88=AA=E7=AD=96=E7=95=A5=EF=BC=8C=E5=AF=B9?= =?UTF-8?q?=20install=5Fmaster.sh=20=E4=BD=BF=E7=94=A8=E5=AD=90=E8=BF=9B?= =?UTF-8?q?=E7=A8=8B=E7=8B=AC=E7=AB=8B=E6=96=87=E4=BB=B6=E6=B5=81=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=EF=BC=8C=E5=BD=BB=E5=BA=95=E8=A7=A3=E5=86=B3=E6=8B=89?= =?UTF-8?q?=E5=8F=96=E4=BB=A3=E7=A0=81=E5=8D=A1=E6=AD=BB=E5=8F=8A=E8=BE=93?= =?UTF-8?q?=E5=85=A5=E4=B8=B2=E8=A1=8C=E9=97=AE=E9=A2=98=EF=BC=8C=E5=8E=9F?= =?UTF-8?q?=E7=89=88=E9=80=BB=E8=BE=91=20100%=20=E6=97=A0=E6=8D=9F?= =?UTF-8?q?=E5=88=86=E6=8B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install/build_master.sh | 34 +++++++++++++++-------------- install/master_setup.sh | 46 ++++++++++++++++------------------------ master/install_master.sh | 24 +++++++++++++++------ 3 files changed, 54 insertions(+), 50 deletions(-) diff --git a/install/build_master.sh b/install/build_master.sh index 5445c61a..3028a6e6 100755 --- a/install/build_master.sh +++ b/install/build_master.sh @@ -1,16 +1,18 @@ #!/bin/bash # ========================================================== # 模块名称: build_master.sh (v4.3.0 Orchestrator) -# 核心功能: Master 安装业务总指挥 +# 核心功能: Master 安装业务总指挥,按原版时序复用组件 # ========================================================== +# 传递中断引信 +trap 'exit 1' INT QUIT TERM + +# Master 仅需要复用 env_setup 和专属的 master_setup MODULES=( "env_setup.sh" "master_setup.sh" ) -echo "⏳ 正在装载中枢底层设施依赖..." - for mod in "${MODULES[@]}"; do curl -fsSL --connect-timeout 10 --retry 3 "${REPO_RAW_URL}/install/${mod}" -o "${SECURE_TMP}/${mod}" if [ ! -s "${SECURE_TMP}/${mod}" ]; then @@ -20,21 +22,21 @@ for mod in "${MODULES[@]}"; do source "${SECURE_TMP}/${mod}" done -echo -e "\033[32m✅ 中枢模块装载完毕,正在进入部署流程...\033[0m" - -# --- 核心业务编排流 --- +# ========================================================== +# 核心业务原子流 (100% 忠实于原版 install_master.sh 执行时序) +# ========================================================== # [复用模块: env_setup.sh] -do_master_env_precheck # 预检 +do_master_env_precheck # 预检 (复用了与 Agent 相同逻辑但修改了提示语,见下方) do_fetch_master_version # 抓取版本 -do_master_handle_menu # OTA 拦截与菜单选择 -do_install_deps # 安装 sqlite3 等依赖 - -# 如果选择卸载,模块内部会 exit +do_master_handle_menu # 拦截指令或展示交互菜单 +do_install_deps # [复用 Agent] 多分支依赖安装 # [专属模块: master_setup.sh] -do_master_clean_env # 验证环境与保护 DB -do_master_config # 交互获取 Token 并生成 conf -do_master_init_db # 初始化 SQLite 表结构 -do_master_deploy_core # 覆写内核并注入守护进程 -do_master_summary # 打印状态汇报与回执 +do_master_clean_env # 环境清理 +do_master_config # 令牌收集与 conf 生成 +do_master_init_db # SQLite 表结构固化 +do_master_deploy_core # 覆写内核、守护进程注入 +do_master_summary # 态势汇报与回执 + +exit 0 diff --git a/install/master_setup.sh b/install/master_setup.sh index 55c969a5..075884f9 100755 --- a/install/master_setup.sh +++ b/install/master_setup.sh @@ -4,24 +4,34 @@ # 核心功能: Master 环境清洗、令牌交互、SQLite 建库、守护进程注入与结果呈现 # ========================================================== -# ---------------------------------------------------------- -# [时序 M.1] 解析版本锚点 (复用/补充) -# ---------------------------------------------------------- +# 预检部分需要单独定制,因为 Master 有专属横幅 +do_master_env_precheck() { + echo -e "\n======================================" + echo -e "📊 \033[36mIP-Sentinel 中枢靶机环境侦测\033[0m" + echo -e "--------------------------------------" + echo -e "OS 架构 : $(get_os_info)" + echo -e "虚拟化 : $(get_virt_info)" + if is_systemd; then + echo -e "Init 系统 : systemd ✅" + else + echo -e "Init 系统 : 非 systemd ⚠️ (将自动降维至看门狗模式)" + fi + echo -e "======================================\n" + sleep 1 +} + do_fetch_master_version() { TARGET_VERSION=$( (curl -fsSL --connect-timeout 5 --retry 2 "${REPO_RAW_URL}/version.txt" || curl -4 -fsSL --connect-timeout 5 --retry 2 "${REPO_RAW_URL}/version.txt") 2>/dev/null | grep "^MASTER_VERSION=" | cut -d'=' -f2 | tr -d '[:space:]') TARGET_VERSION=${TARGET_VERSION:-"4.0.7"} - + MASTER_DIR="/opt/ip_sentinel_master" DB_FILE="${MASTER_DIR}/sentinel.db" - + echo "========================================================" echo " 🧠 欢迎使用 IP-Sentinel Master (控制中枢) v${TARGET_VERSION}" echo "========================================================" } -# ---------------------------------------------------------- -# [时序 M.2] 拦截交互菜单 / OTA 静默重载判定 -# ---------------------------------------------------------- do_master_handle_menu() { if [ "$SILENT_MASTER_OTA" == "true" ]; then echo -e "\n⏳ [OTA] 中枢重构指令已确认,正在剥离控制台交互..." @@ -56,7 +66,6 @@ do_master_handle_menu() { exit 0 fi - # [态势传承] 平滑接管探查并保护库文件 UPGRADE_MODE="false" KEEP_DB="true" @@ -86,9 +95,6 @@ do_master_handle_menu() { fi } -# ---------------------------------------------------------- -# [时序 M.3] 环境清洗 -# ---------------------------------------------------------- do_master_clean_env() { echo -e "\n⏳ 正在验证本地环境与数据..." @@ -105,9 +111,6 @@ do_master_clean_env() { mkdir -p "$MASTER_DIR" } -# ---------------------------------------------------------- -# [时序 M.4] 配置总线与交互 -# ---------------------------------------------------------- do_master_config() { if [ "$UPGRADE_MODE" == "false" ]; then echo -e "\n[2/4] 配置控制中枢机器人:" @@ -137,7 +140,6 @@ do_master_config() { fi fi - # [中枢身份生成] 提取宿主特征生成全局唯一标识 MASTER_IP=$( (curl -4 -s -m 3 api.ip.sb/ip || curl -4 -s -m 3 ifconfig.me) 2>/dev/null | tr -d '[:space:]' ) MASTER_HASH=$(echo "${MASTER_IP:-127.0.0.1}" | md5sum | cut -c 1-4 | tr 'a-z' 'A-Z') MASTER_NODE="$(hostname | tr -cd 'a-zA-Z0-9' | cut -c 1-10)-${MASTER_HASH}" @@ -173,7 +175,6 @@ EOF if ! grep -q "^ENABLE_MASTER_OTA=" "${MASTER_DIR}/master.conf"; then echo "ENABLE_MASTER_OTA=\"false\"" >> "${MASTER_DIR}/master.conf" fi - # [热修复] 为老版本司令部平滑补齐中枢标识 if ! grep -q "^MASTER_NODE_NAME=" "${MASTER_DIR}/master.conf"; then MASTER_IP=$( (curl -4 -s -m 3 api.ip.sb/ip || curl -4 -s -m 3 ifconfig.me) 2>/dev/null | tr -d '[:space:]' ) MASTER_HASH=$(echo "${MASTER_IP:-127.0.0.1}" | md5sum | cut -c 1-4 | tr 'a-z' 'A-Z') @@ -183,9 +184,6 @@ EOF fi } -# ---------------------------------------------------------- -# [时序 M.5] 初始化 SQLite -# ---------------------------------------------------------- do_master_init_db() { echo -e "\n[3/4] 正在初始化 SQLite 数据库表结构..." sqlite3 "$DB_FILE" </dev/null + exit 1 +} +trap cleanup_and_exit INT QUIT TERM +trap 'rm -rf "$SECURE_TMP" 2>/dev/null' EXIT HUP + if [ "$EUID" -ne 0 ]; then echo -e "\033[31m❌ 权限被拒绝: 部署 IP-Sentinel 需要最高系统权限。\033[0m" echo -e "💡 请切换到 root 用户 (执行 su root 或 sudo -i) 后重新运行指令。" @@ -11,12 +21,11 @@ if [ "$EUID" -ne 0 ]; then fi SECURE_TMP=$(mktemp -d /tmp/ips_master_install.XXXXXX) -trap 'rm -rf "$SECURE_TMP"' EXIT HUP INT QUIT TERM - REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/feature/v4.3.0-modular" echo -e "\n⏳ 正在拉取 IP-Sentinel Master v4.3.0 安装引擎..." +# 仅拉取编排大管家 curl -fsSL --connect-timeout 10 --retry 3 "${REPO_RAW_URL}/install/build_master.sh" -o "${SECURE_TMP}/build_master.sh" if [ ! -s "${SECURE_TMP}/build_master.sh" ]; then @@ -27,7 +36,10 @@ fi export SECURE_TMP export REPO_RAW_URL +# 【核心解法】不再使用 exec 劫持或 source 嵌套 +# 直接以子进程物理文件方式运行,这样终端交互 (TTY) 将自然纯净,毫无污染 chmod +x "${SECURE_TMP}/build_master.sh" -source "${SECURE_TMP}/build_master.sh" +bash "${SECURE_TMP}/build_master.sh" -exit 0 +# 透传子进程的退出状态码 +exit $?