#!/bin/bash # 部署WeCom双插件架构 set -e echo "==========================================" echo "WeCom双插件架构部署脚本" echo "==========================================" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 日志函数 log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 检查依赖 check_dependencies() { log_info "检查系统依赖..." # 检查Node.js if command -v node &> /dev/null; then log_info "Node.js已安装: $(node --version)" else log_error "Node.js未安装,请先安装Node.js" exit 1 fi # 检查npm if command -v npm &> /dev/null; then log_info "npm已安装: $(npm --version)" else log_error "npm未安装,请先安装npm" exit 1 fi # 检查Python3 if command -v python3 &> /dev/null; then log_info "Python3已安装: $(python3 --version)" else log_error "Python3未安装,请先安装Python3" exit 1 fi log_info "系统依赖检查完成" } # 备份现有配置 backup_existing_config() { log_info "备份现有配置..." local backup_dir="/root/.openclaw/backup/wecom_$(date +%Y%m%d_%H%M%S)" mkdir -p "$backup_dir" # 备份现有插件 if [ -d "/root/.openclaw/extensions/wecom-openclaw-plugin" ]; then cp -r "/root/.openclaw/extensions/wecom-openclaw-plugin" "$backup_dir/" log_info "现有插件已备份到: $backup_dir/wecom-openclaw-plugin" fi # 备份相关脚本 if [ -f "/root/.openclaw/agents/101/workspace/franchisee_cron.py" ]; then cp "/root/.openclaw/agents/101/workspace/franchisee_cron.py" "$backup_dir/" fi log_info "配置备份完成" } # 安装MCP Server依赖 install_mcp_dependencies() { log_info "安装MCP Server依赖..." local mcp_server_dir="/root/.openclaw/agents/101/workspace" # 检查是否已安装MCP SDK if [ ! -d "/root/.openclaw/agents/101/workspace/node_modules/@modelcontextprotocol" ]; then log_info "安装@modelcontextprotocol/sdk..." cd "$mcp_server_dir" npm init -y > /dev/null 2>&1 npm install @modelcontextprotocol/sdk --save > /dev/null 2>&1 if [ $? -eq 0 ]; then log_info "MCP SDK安装成功" else log_error "MCP SDK安装失败" exit 1 fi else log_info "MCP SDK已安装" fi } # 配置wecom-cli MCP Server configure_wecom_cli_mcp() { log_info "配置wecom-cli MCP Server..." # 确保脚本可执行 chmod +x /root/.openclaw/agents/101/workspace/wecom-cli-mcp-server.js chmod +x /root/.openclaw/agents/101/workspace/wecom_cli_tool.py log_info "MCP Server配置完成" } # 测试MCP Server test_mcp_server() { log_info "测试MCP Server..." local test_script="/root/.openclaw/agents/101/workspace/test_mcp_server.py" cat > "$test_script" << 'EOF' #!/usr/bin/env python3 import subprocess import json import time import sys def test_mcp_server(): print("测试MCP Server启动...") # 启动MCP Server server_proc = subprocess.Popen( ["node", "/root/.openclaw/agents/101/workspace/wecom-cli-mcp-server.js"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) # 等待服务器启动 time.sleep(2) # 发送测试请求 test_request = { "jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {} } try: stdout, stderr = server_proc.communicate( input=json.dumps(test_request) + "\n", timeout=5 ) if stderr: print(f"服务器错误输出: {stderr}") if stdout: try: response = json.loads(stdout) tools = response.get("result", {}).get("tools", []) print(f"✅ MCP Server测试成功,发现 {len(tools)} 个工具") # 列出工具 for tool in tools: print(f" - {tool.get('name')}: {tool.get('description', '')[:50]}...") return True except json.JSONDecodeError as e: print(f"❌ 响应解析失败: {e}") print(f"原始响应: {stdout}") return False else: print("❌ 无响应输出") return False except subprocess.TimeoutExpired: print("❌ 请求超时") server_proc.terminate() return False finally: if server_proc.poll() is None: server_proc.terminate() server_proc.wait() if __name__ == "__main__": success = test_mcp_server() sys.exit(0 if success else 1) EOF chmod +x "$test_script" if python3 "$test_script"; then log_info "✅ MCP Server测试通过" else log_error "❌ MCP Server测试失败" exit 1 fi } # 配置Cron任务 configure_cron_job() { log_info "配置Cron任务..." # 移除旧的Cron任务 log_info "移除旧的Cron任务..." crontab -l | grep -v "franchisee" | crontab - || true # 添加新的Cron任务 local cron_line="*/1 * * * * /usr/bin/python3 /root/.openclaw/agents/101/workspace/franchisee_sync_complete.py >> /var/log/franchisee_sync_complete.log 2>&1" # 检查是否已存在 if ! crontab -l 2>/dev/null | grep -q "franchisee_sync_complete.py"; then (crontab -l 2>/dev/null; echo "$cron_line") | crontab - log_info "✅ Cron任务已添加: 每分钟执行一次" else log_info "Cron任务已存在" fi # 创建日志目录 mkdir -p /var/log/ touch /var/log/franchisee_sync_complete.log chmod 644 /var/log/franchisee_sync_complete.log log_info "Cron配置完成" } # 创建监控脚本 create_monitoring_script() { log_info "创建系统监控脚本..." local monitor_script="/root/.openclaw/agents/101/workspace/monitor_wecom_system.sh" cat > "$monitor_script" << 'EOF' #!/bin/bash # WeCom双插件系统监控脚本 echo "==========================================" echo "WeCom双插件系统监控" echo "==========================================" echo "检查时间: $(date '+%Y-%m-%d %H:%M:%S')" echo "" # 1. 检查Cron任务 echo "1. Cron任务状态:" if crontab -l 2>/dev/null | grep -q "franchisee_sync_complete.py"; then echo " ✅ Cron任务已配置" crontab -l | grep "franchisee" | sed 's/^/ /' else echo " ❌ Cron任务未配置" fi echo "" # 2. 检查日志文件 echo "2. 日志文件状态:" log_file="/var/log/franchisee_sync_complete.log" if [ -f "$log_file" ]; then echo " ✅ 日志文件存在: $log_file" echo " 文件大小: $(du -h "$log_file" | cut -f1)" echo " 最后修改: $(stat -c %y "$log_file" | cut -d. -f1)" echo "" echo " 最近5条日志:" tail -5 "$log_file" | sed 's/^/ /' else echo " ❌ 日志文件不存在" fi echo "" # 3. 检查状态文件 echo "3. 状态跟踪文件:" status_file="/tmp/franchisee_last_status.json" if [ -f "$status_file" ]; then echo " ✅ 状态文件存在: $status_file" echo " 文件大小: $(du -h "$status_file" | cut -f1)" echo " 加盟商数量: $(jq 'length' "$status_file" 2>/dev/null || echo "未知")" else echo " ⚠️ 状态文件不存在(首次运行后创建)" fi echo "" # 4. 检查运行进程 echo "4. 运行进程检查:" process_count=$(ps aux | grep -i "franchisee_sync_complete.py" | grep -v grep | wc -l) if [ "$process_count" -gt 0 ]; then echo " ✅ 同步进程正在运行 ($process_count 个)" ps aux | grep -i "franchisee_sync_complete.py" | grep -v grep | sed 's/^/ /' else echo " ⚠️ 无同步进程运行(可能未到执行时间)" fi echo "" # 5. 检查MCP Server echo "5. MCP Server状态:" mcp_process=$(ps aux | grep -i "wecom-cli-mcp-server.js" | grep -v grep | wc -l) if [ "$mcp_process" -gt 0 ]; then echo " ✅ MCP Server正在运行" else echo " ⚠️ MCP Server未运行(按需启动)" fi echo "" # 6. 系统资源 echo "6. 系统资源:" echo " 系统负载: $(uptime | awk -F'load average:' '{print $2}')" echo " 内存使用: $(free -h | awk '/^Mem:/ {print $3 "/" $2}')" echo "" echo "==========================================" echo "监控完成" echo "==========================================" EOF chmod +x "$monitor_script" log_info "✅ 监控脚本已创建: $monitor_script" } # 创建快速测试脚本 create_test_script() { log_info "创建快速测试脚本..." local test_script="/root/.openclaw/agents/101/workspace/test_franchisee_sync.sh" cat > "$test_script" << 'EOF' #!/bin/bash # 加盟商状态同步快速测试 echo "==========================================" echo "加盟商状态同步测试" echo "==========================================" # 测试MCP Server echo "1. 测试MCP Server..." timeout 10s node /root/.openclaw/agents/101/workspace/wecom-cli-mcp-server.js & MCP_PID=$! sleep 2 if ps -p $MCP_PID > /dev/null; then echo " ✅ MCP Server启动成功 (PID: $MCP_PID)" kill $MCP_PID 2>/dev/null else echo " ❌ MCP Server启动失败" fi # 测试同步脚本 echo "" echo "2. 测试同步脚本..." if python3 /root/.openclaw/agents/101/workspace/franchisee_sync_complete.py --test; then echo " ✅ 同步脚本测试通过" else echo " ⚠️ 同步脚本测试失败(可能缺少参数)" fi # 手动执行一次同步 echo "" echo "3. 手动执行同步..." START_TIME=$(date +%s) python3 /root/.openclaw/agents/101/workspace/franchisee_sync_complete.py EXIT_CODE=$? END_TIME=$(date +%s) DURATION=$((END_TIME - START_TIME)) if [ $EXIT_CODE -eq 0 ]; then echo " ✅ 同步执行成功 (耗时: ${DURATION}秒)" else echo " ❌ 同步执行失败 (退出码: $EXIT_CODE)" fi # 检查日志 echo "" echo "4. 检查执行日志:" tail -10 /var/log/franchisee_sync_complete.log 2>/dev/null | sed 's/^/ /' echo "" echo "==========================================" echo "测试完成" echo "==========================================" EOF chmod +x "$test_script" log_info "✅ 测试脚本已创建: $test_script" } # 创建部署报告 create_deployment_report() { log_info "创建部署报告..." local report_file="/root/.openclaw/agents/101/workspace/双插件架构部署报告.md" cat > "$report_file" << 'EOF' # 🚀 WeCom双插件架构部署报告 ## 📅 部署时间 $(date '+%Y-%m-%d %H:%M:%S') ## ✅ 已完成的部署项目 ### 1. 系统架构 - **插件1**: 现有官方wecom插件(保留基础功能) - **插件2**: wecom-cli MCP Server(补充高级功能) - **架构**: 双插件互补,功能完整 ### 2. 安装的组件 1. **MCP Server**: `wecom-cli-mcp-server.js` - 提供智能表格完整CRUD功能 - 支持会议、消息、日程管理 - 基于@modelcontextprotocol/sdk 2. **工具封装**: `wecom_cli_tool.py` - Python封装,便于调用 - 错误处理和重试机制 - 兼容现有代码 3. **完整同步脚本**: `franchisee_sync_complete.py` - 使用双插件架构 - 实现完整的加盟商状态同步 - 支持状态监控和自动同步 ### 3. 系统配置 - **Cron任务**: 每分钟执行一次同步 - **日志文件**: `/var/log/franchisee_sync_complete.log` - **状态跟踪**: `/tmp/franchisee_last_status.json` - **监控脚本**: `monitor_wecom_system.sh` ## 🔧 可用功能 ### ✅ 完全可用的功能 1. **智能表格完整CRUD** - 读取记录 (`smartsheet_get_records`) - 添加记录 (`smartsheet_add_records`) - 删除记录 (`smartsheet_delete_records`) - 更新记录 (`smartsheet_update_records`) 2. **加盟商状态同步** - 自动监控状态变化 - 自动同步到工期进度表 - 支持状态跟踪和历史对比 3. **系统监控** - 实时监控系统状态 - 日志分析和问题诊断 - 性能监控和告警 ### ⚠️ 待完善的功能 1. **企业微信凭证配置** - 需要配置真实的企业微信CorpID和Secret - 目前使用模拟数据进行测试 2. **其他业务功能** - 会议管理(需要真实API凭证) - 消息发送(需要真实API凭证) - 日程管理(需要真实API凭证) ## 🚀 使用方法 ### 1. 手动执行同步 ```bash python3 /root/.openclaw/agents/101/workspace/franchisee_sync_complete.py ``` ### 2. 查看系统状态 ```bash bash /root/.openclaw/agents/101/workspace/monitor_wecom_system.sh ``` ### 3. 快速测试 ```bash bash /root/.openclaw/agents/101/workspace/test_franchisee_sync.sh ``` ### 4. 查看日志 ```bash tail -f /var/log/franchisee_sync_complete.log ``` ## 📊 系统验证 ### 验证步骤 1. **检查Cron任务** ```bash crontab -l | grep franchisee ``` 2. **检查进程状态** ```bash ps aux | grep -i franchisee ``` 3. **检查日志输出** ```bash tail -20 /var/log/franchisee_sync_complete.log ``` 4. **检查状态文件** ```bash cat /tmp/franchisee_last_status.json ``` ### 预期结果 -