commit cd2992e68875f62da8eb9c60e30e14f97e807a25
Author: huangxi <854692090@qq.com>
Date:   Tue May 6 15:41:49 2025 +0800

    init

diff --git a/webhook.py b/webhook.py
new file mode 100644
index 0000000..abff12d
--- /dev/null
+++ b/webhook.py
@@ -0,0 +1,131 @@
+import subprocess
+from flask import Flask, request, jsonify
+import logging
+import socket
+import os
+import shutil
+
+# 配置日志
+logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
+logger = logging.getLogger(__name__)
+
+app = Flask(__name__)
+WEBHOOK_TOKEN = "gitea_webhook_token_2024"  # 设置一个固定的token
+PROJECT_PATH = "/www/wwwroot/Jewlery_Classification"  # 设置项目路径
+GIT_REPO_URL = "http://gitea.petutopia.chat/huangxi/graduateDesign.git"  # 设置git仓库地址
+
+def init_git_repo():
+    """初始化git仓库"""
+    try:
+        # 检查目录是否存在
+        if not os.path.exists(PROJECT_PATH):
+            logger.info(f"创建项目目录: {PROJECT_PATH}")
+            os.makedirs(PROJECT_PATH, exist_ok=True)
+        
+        # 检查是否是git仓库
+        if not os.path.exists(os.path.join(PROJECT_PATH, '.git')):
+            logger.info("目录不是git仓库,开始初始化...")
+            # 如果目录不为空,先清空
+            if os.listdir(PROJECT_PATH):
+                logger.info("目录不为空,清空目录...")
+                shutil.rmtree(PROJECT_PATH)
+                os.makedirs(PROJECT_PATH)
+            
+            # 克隆仓库
+            logger.info(f"开始克隆仓库: {GIT_REPO_URL}")
+            result = subprocess.run(["git", "clone", GIT_REPO_URL, PROJECT_PATH], 
+                                  capture_output=True, text=True, check=True)
+            logger.info(f"克隆输出: {result.stdout}")
+            logger.info("仓库克隆完成")
+        else:
+            # 配置git
+            logger.info("配置git...")
+            subprocess.run(["git", "-C", PROJECT_PATH, "config", "--local", "user.name", "webhook"], check=True)
+            subprocess.run(["git", "-C", PROJECT_PATH, "config", "--local", "user.email", "webhook@example.com"], check=True)
+            
+            # 确保远程仓库配置正确
+            logger.info("检查远程仓库配置...")
+            result = subprocess.run(["git", "-C", PROJECT_PATH, "remote", "-v"], 
+                                  capture_output=True, text=True, check=True)
+            logger.info(f"当前远程仓库配置: {result.stdout}")
+            
+            if "origin" not in result.stdout:
+                logger.info("添加远程仓库...")
+                subprocess.run(["git", "-C", PROJECT_PATH, "remote", "add", "origin", GIT_REPO_URL], check=True)
+            
+        return True
+    except Exception as e:
+        logger.error(f"初始化git仓库失败: {str(e)}", exc_info=True)
+        return False
+
+@app.route('/', methods=['GET'])
+def index():
+    logger.info("收到根路径访问请求")
+    return "Webhook服务器正在运行"
+
+@app.route('/webhook', methods=['POST'])
+def handle_webhook():
+    logger.info("收到新的webhook请求")
+    logger.info(f"请求头: {dict(request.headers)}")
+    
+    # 验证请求签名
+    received_token = request.headers.get('X-Gitea-Signature')
+    logger.info(f"收到的token: {received_token}")
+    logger.info(f"期望的token: {WEBHOOK_TOKEN}")
+    
+    if received_token != WEBHOOK_TOKEN:
+        logger.warning("Token验证失败")
+        return jsonify({"status": "invalid token"}), 403
+    
+    event = request.headers.get('X-Gitea-Event')
+    payload = request.json
+    logger.info(f"事件类型: {event}")
+    logger.info(f"请求体: {payload}")
+    
+    # 只处理push事件
+    if event == 'push' and payload['ref'] == 'refs/heads/master':
+        logger.info("检测到master分支的push事件,开始处理")
+        try:
+            # 初始化git仓库
+            if not init_git_repo():
+                raise Exception("初始化git仓库失败")
+            
+            # 拉取最新代码
+            logger.info("开始拉取最新代码...")
+            result = subprocess.run(["git", "-C", PROJECT_PATH, "pull", "origin", "master"], 
+                                  capture_output=True, text=True, check=True)
+            logger.info(f"拉取输出: {result.stdout}")
+            logger.info("代码拉取成功")
+            
+            # 重启服务
+            logger.info("开始重启服务...")
+            logger.info("终止旧进程...")
+            subprocess.run(["pkill", "-f", "server.py"])
+            logger.info("启动新进程...")
+            subprocess.Popen(["python3", f"{PROJECT_PATH}/server.py"], 
+                            stdout=open(f"{PROJECT_PATH}/server.log", 'a'),
+                            stderr=subprocess.STDOUT)
+            logger.info("服务重启完成")
+            
+            return jsonify({"status": "success"}), 200
+        except Exception as e:
+            logger.error(f"处理过程中发生错误: {str(e)}", exc_info=True)
+            return jsonify({"error": str(e)}), 500
+    
+    logger.info("忽略非master分支的push事件或其他类型事件")
+    return jsonify({"status": "ignored event"}), 200
+
+if __name__ == '__main__':
+    try:
+        # 获取本机IP地址
+        hostname = socket.gethostname()
+        local_ip = socket.gethostbyname(hostname)
+        logger.info(f"服务器主机名: {hostname}")
+        logger.info(f"服务器IP地址: {local_ip}")
+        logger.info(f"Webhook服务器启动在 0.0.0.0:9001")
+        logger.info("你可以通过以下地址访问服务器:")
+        logger.info(f"- 本地访问: http://127.0.0.1:9001")
+        logger.info(f"- 局域网访问: http://{local_ip}:9001")
+        app.run(host='0.0.0.0', port=9001, debug=True)
+    except Exception as e:
+        logger.error(f"服务器启动失败: {str(e)}", exc_info=True)
\ No newline at end of file