From 5745f87dd2235f5986d3cab46d7ee89fb492d3cf Mon Sep 17 00:00:00 2001 From: hotyue <52734432+hotyue@users.noreply.github.com> Date: Wed, 1 Apr 2026 10:26:44 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20V5.0=20=E8=BE=B9=E7=BC=98=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E9=87=8D=E6=9E=84=20-=20=E5=BC=95=E5=85=A5=20Python?= =?UTF-8?q?=20Webhook=20=E8=A2=AB=E5=8A=A8=E7=9B=91=E5=90=AC=E4=B8=8E=20Ma?= =?UTF-8?q?ster=20=E8=87=AA=E5=8A=A8=E6=B3=A8=E5=86=8C=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/agent_daemon.sh | 75 ++++++++++++++++++++++++++++++++++++++++++++ core/install.sh | 57 ++++++++++++++++++--------------- 2 files changed, 106 insertions(+), 26 deletions(-) create mode 100644 core/agent_daemon.sh diff --git a/core/agent_daemon.sh b/core/agent_daemon.sh new file mode 100644 index 0000000..41a9569 --- /dev/null +++ b/core/agent_daemon.sh @@ -0,0 +1,75 @@ +#!/bin/bash + +# ========================================================== +# 脚本名称: agent_daemon.sh (受控节点 Webhook 守护进程) +# 核心功能: 向 Master 汇报公网 IP 注册、监听本地 HTTP 唤醒指令 +# ========================================================== + +INSTALL_DIR="/opt/ip_sentinel" +CONFIG_FILE="${INSTALL_DIR}/config.conf" + +[ ! -f "$CONFIG_FILE" ] && exit 1 +source "$CONFIG_FILE" + +# 如果没有配置 TG,说明未开启联控模式,直接退出 +[ -z "$TG_TOKEN" ] || [ -z "$CHAT_ID" ] && exit 0 + +# 默认 Webhook 监听端口,可在安装时动态写入配置 +AGENT_PORT=${AGENT_PORT:-9527} +# 截取主机名作为节点唯一标识 (可限制长度防超长) +NODE_NAME=$(hostname | cut -c 1-15) + +# 1. 获取本机原生公网 IPv4 +AGENT_IP=$(curl -4 -s -m 5 api.ip.sb/ip) + +if [ -n "$AGENT_IP" ]; then + # 2. 向 Master 发送注册暗号 (借助 TG API) + # 格式严格匹配 Master 端的正则: #REGISTER#||| + REG_MSG="#REGISTER#|${NODE_NAME}|${AGENT_IP}|${AGENT_PORT}" + + curl -s -m 5 -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \ + -d "chat_id=${CHAT_ID}" \ + -d "text=${REG_MSG}" > /dev/null + + echo "✅ [Agent] 已向司令部发送注册/续期请求: $NODE_NAME ($AGENT_IP:$AGENT_PORT)" +fi + +# 3. 启动轻量级 Python3 Webhook 监听服务 +# (相比纯 Bash 的 nc 命令,Python3 的 HTTP 库在各发行版间兼容性最完美,且支持并发) +cat > "${INSTALL_DIR}/core/webhook.py" << 'EOF' +import http.server +import socketserver +import subprocess +import sys + +PORT = int(sys.argv[1]) + +class AgentHandler(http.server.BaseHTTPRequestHandler): + def do_GET(self): + # 统一返回成功,防止 Master 请求超时阻塞 + self.send_response(200) + self.send_header("Content-type", "text/plain") + self.end_headers() + self.wfile.write(b"Agent Received Action\n") + + # 路由分发 + if self.path == '/trigger_run': + # 另起后台进程执行深度伪装,不阻塞 Webhook 响应 + subprocess.Popen(['bash', '/opt/ip_sentinel/core/mod_google.sh']) + elif self.path == '/trigger_report': + # 另起后台进程执行战报生成 + subprocess.Popen(['bash', '/opt/ip_sentinel/core/tg_report.sh']) + + def log_message(self, format, *args): + # 关闭默认的控制台日志输出,保持后台清爽 + pass + +try: + with socketserver.TCPServer(("", PORT), AgentHandler) as httpd: + httpd.serve_forever() +except Exception as e: + sys.exit(1) +EOF + +# 保持前台运行 (被 Cron 的 nohup 放入后台守护) +python3 "${INSTALL_DIR}/core/webhook.py" "$AGENT_PORT" \ No newline at end of file diff --git a/core/install.sh b/core/install.sh index a209bf1..5eae86e 100755 --- a/core/install.sh +++ b/core/install.sh @@ -1,8 +1,8 @@ #!/bin/bash # ========================================================== -# 脚本名称: install.sh (IP-Sentinel 一键部署脚本 V4.0 最终版) -# 核心功能: 区域选择、一键卸载、解析冷数据、配置高频调度与互动守护 +# 脚本名称: install.sh (IP-Sentinel 分布式边缘节点部署脚本 V5.0) +# 核心功能: 区域选择、一键卸载、解析冷数据、配置高频调度与 Webhook 守护 # ========================================================== # 你的专属 Forgejo 仓库 Raw 数据直链前缀 @@ -11,19 +11,19 @@ INSTALL_DIR="/opt/ip_sentinel" CONFIG_FILE="${INSTALL_DIR}/config.conf" echo "========================================================" -echo " 🛡️ 欢迎使用 IP-Sentinel (VPS IP 自动养护哨兵)" +echo " 🛡️ 欢迎使用 IP-Sentinel (边缘节点 Edge Agent)" echo "========================================================" -# 1. 依赖检查与安装 -echo -e "\n[1/6] 正在安装必要环境依赖 (curl, jq, cron, procps)..." +# 1. 依赖检查与安装 (新增 python3 用于轻量级 Webhook 服务) +echo -e "\n[1/6] 正在安装必要环境依赖 (curl, jq, cron, procps, python3)..." if [ -f /etc/debian_version ]; then apt-get update -y >/dev/null 2>&1 - apt-get install -y curl jq cron procps >/dev/null 2>&1 + apt-get install -y curl jq cron procps python3 >/dev/null 2>&1 elif [ -f /etc/redhat-release ]; then - yum install -y curl jq cronie procps-ng >/dev/null 2>&1 + yum install -y curl jq cronie procps-ng python3 >/dev/null 2>&1 systemctl enable crond && systemctl start crond else - echo "⚠️ 未知系统,请确保已手动安装 curl, jq 和 pgrep" + echo "⚠️ 未知系统,请确保已手动安装 curl, jq, pgrep 和 python3" fi # 2. 交互式引导 (包含卸载选项) @@ -33,7 +33,7 @@ echo " 2) 🇺🇸 美国 (美西 - US)" echo " 3) 🗑️ 一键卸载 IP-Sentinel" read -p "请输入选择 [1-3] (默认1): " REGION_CHOICE -# 【新增升级】如果选择卸载,拉取卸载脚本执行并退出 +# 如果选择卸载,拉取卸载脚本执行并退出 if [ "$REGION_CHOICE" == "3" ]; then echo -e "\n⏳ 正在拉取卸载程序..." curl -sL "${REPO_RAW_URL}/core/uninstall.sh" -o "/tmp/ip_uninstall.sh" @@ -49,18 +49,22 @@ case ${REGION_CHOICE:-1} in *) REGION_CODE="JP" ;; esac -# 本地工作目录初始化 (确保在确定安装后才创建目录) +# 本地工作目录初始化 mkdir -p "${INSTALL_DIR}/core" mkdir -p "${INSTALL_DIR}/data/keywords" mkdir -p "${INSTALL_DIR}/logs" -echo -e "\n[3/6] 是否配置 Telegram 机器人进行互动控制与战报接收?(y/n)" +# 3. 接入 Master 中枢配置 +echo -e "\n[3/6] 是否接入 Master 司令部?(需要配置与主控相同的 TG 机器人) (y/n)" read -p "请输入选择 [y/n] (默认n): " TG_CHOICE TG_TOKEN="" CHAT_ID="" +AGENT_PORT="9527" if [[ "$TG_CHOICE" =~ ^[Yy]$ ]]; then - read -p "请输入 Telegram Bot Token: " TG_TOKEN - read -p "请输入你的 Chat ID: " CHAT_ID + read -p "请输入 Telegram Bot Token (与主控一致): " TG_TOKEN + read -p "请输入你的 Chat ID (与主控一致): " CHAT_ID + read -p "请输入本机用于接收指令的 Webhook 端口 (默认 9527,请确保防火墙已放开此端口): " INPUT_PORT + [ -n "$INPUT_PORT" ] && AGENT_PORT="$INPUT_PORT" fi # 4. 远程拉取冷数据并解析固化 @@ -91,18 +95,19 @@ VALID_URL_SUFFIX="$VALID_URL_SUFFIX" TG_TOKEN="$TG_TOKEN" CHAT_ID="$CHAT_ID" +AGENT_PORT="$AGENT_PORT" INSTALL_DIR="$INSTALL_DIR" LOG_FILE="${INSTALL_DIR}/logs/sentinel.log" EOF -# 5. 拉取全套组件 (引擎、业务、更新、战报、守护进程、卸载脚本及热数据) -echo -e "\n[5/6] 正在部署核心引擎、互动组件与热数据..." +# 5. 拉取全套组件 (引擎、业务、更新、战报、Webhook守护进程、卸载脚本及热数据) +echo -e "\n[5/6] 正在部署核心引擎、Webhook 组件与热数据..." curl -sL "${REPO_RAW_URL}/core/runner.sh" -o "${INSTALL_DIR}/core/runner.sh" curl -sL "${REPO_RAW_URL}/core/mod_google.sh" -o "${INSTALL_DIR}/core/mod_google.sh" curl -sL "${REPO_RAW_URL}/core/updater.sh" -o "${INSTALL_DIR}/core/updater.sh" curl -sL "${REPO_RAW_URL}/core/tg_report.sh" -o "${INSTALL_DIR}/core/tg_report.sh" -curl -sL "${REPO_RAW_URL}/core/tg_daemon.sh" -o "${INSTALL_DIR}/core/tg_daemon.sh" -# 【确保拉取备用的卸载脚本】 +# 【核心替换】下载边缘节点的 Webhook 守护进程 +curl -sL "${REPO_RAW_URL}/core/agent_daemon.sh" -o "${INSTALL_DIR}/core/agent_daemon.sh" curl -sL "${REPO_RAW_URL}/core/uninstall.sh" -o "${INSTALL_DIR}/core/uninstall.sh" chmod +x ${INSTALL_DIR}/core/*.sh @@ -118,28 +123,28 @@ echo "*/30 * * * * ${INSTALL_DIR}/core/runner.sh >/dev/null 2>&1" >> /tmp/cron_b # 养料更新模块: 每周日凌晨 3 点静默去云端更新热数据 echo "0 3 * * 0 ${INSTALL_DIR}/core/updater.sh >/dev/null 2>&1" >> /tmp/cron_backup -# TG 相关任务 +# 如果配置了联控,启动 Webhook 与战报任务 if [[ -n "$TG_TOKEN" ]] && [[ -n "$CHAT_ID" ]]; then # 每天早上 8 点发送昨天的统计战报 echo "0 8 * * * ${INSTALL_DIR}/core/tg_report.sh >/dev/null 2>&1" >> /tmp/cron_backup - # 守护进程看门狗: 每分钟检查一次 tg_daemon.sh,如果掉了就拉起来 - echo "* * * * * pgrep -f tg_daemon.sh >/dev/null || nohup bash ${INSTALL_DIR}/core/tg_daemon.sh >/dev/null 2>&1 &" >> /tmp/cron_backup - # 安装时立刻启动一次守护进程 - pgrep -f tg_daemon.sh >/dev/null || nohup bash "${INSTALL_DIR}/core/tg_daemon.sh" >/dev/null 2>&1 & + # 边缘守护进程看门狗: 检查 agent_daemon.sh (或其拉起的 webhook.py) 是否存活 + echo "* * * * * pgrep -f webhook.py >/dev/null || nohup bash ${INSTALL_DIR}/core/agent_daemon.sh >/dev/null 2>&1 &" >> /tmp/cron_backup + + # 安装时立刻启动一次边缘守护进程 (触发注册与 Webhook 监听) + pgrep -f webhook.py >/dev/null || nohup bash "${INSTALL_DIR}/core/agent_daemon.sh" >/dev/null 2>&1 & fi crontab /tmp/cron_backup rm -f /tmp/cron_backup echo "========================================================" -echo "🎉 IP-Sentinel 部署流程彻底完成!" +echo "🎉 边缘节点 (Agent) 部署流程彻底完成!" echo "📍 你的本地守护区域已锁定为: $REGION_NAME" echo "⚙️ 哨兵现已开启 [每30分钟] 的高频高拟真养护循环。" if [[ -n "$TG_TOKEN" ]]; then - echo "📱 Telegram 互动控制中心已上线!" - echo " 马上打开 TG 给你的机器人发送 /help 试试吧!" + echo "📡 Webhook 监听已启动 (端口: $AGENT_PORT) 并向中枢发送了注册请求。" + echo "⚠️ 请务必确保本机的防火墙放行了 TCP $AGENT_PORT 端口!" fi -# 【保留提示】本地卸载途径提示 echo "🗑️ 若未来需卸载,可重新运行本脚本选择[3]或执行: bash ${INSTALL_DIR}/core/uninstall.sh" echo "========================================================" \ No newline at end of file