fix
This commit is contained in:
@@ -4,6 +4,11 @@
|
|||||||
# 如果没有设置项目级apikey 就用全局 API Key
|
# 如果没有设置项目级apikey 就用全局 API Key
|
||||||
access_key: "YOUR_ACCESS_KEY_HERE"
|
access_key: "YOUR_ACCESS_KEY_HERE"
|
||||||
|
|
||||||
|
# 是否显示详细日志(控制台输出 + 写入日志文件)
|
||||||
|
# true: 显示所有执行过程(默认)
|
||||||
|
# false: 秒回复成功,仅在脚本不存在时返回错误
|
||||||
|
show_log: true
|
||||||
|
|
||||||
# 项目配置
|
# 项目配置
|
||||||
projects:
|
projects:
|
||||||
xsinfo:
|
xsinfo:
|
||||||
|
|||||||
+18
-2
@@ -111,6 +111,7 @@ class WebhookHandler(BaseHTTPRequestHandler):
|
|||||||
|
|
||||||
config = load_config()
|
config = load_config()
|
||||||
global_key = config.get("access_key", "")
|
global_key = config.get("access_key", "")
|
||||||
|
show_log = config.get("show_log", True)
|
||||||
|
|
||||||
# 优先项目级 key,否则用全局 key
|
# 优先项目级 key,否则用全局 key
|
||||||
proj = get_project_config(config, param_val) if param_val else None
|
proj = get_project_config(config, param_val) if param_val else None
|
||||||
@@ -129,8 +130,9 @@ class WebhookHandler(BaseHTTPRequestHandler):
|
|||||||
referer = self.headers.get("Referer", "N/A")
|
referer = self.headers.get("Referer", "N/A")
|
||||||
|
|
||||||
# 执行脚本
|
# 执行脚本
|
||||||
result, status_code = self._execute_script(proj, param_val, client_ip, user_agent, referer)
|
result, status_code = self._execute_script(show_log, proj, param_val, client_ip, user_agent, referer)
|
||||||
script_res = result.get("script", {})
|
script_res = result.get("script", {})
|
||||||
|
if show_log:
|
||||||
log_event(
|
log_event(
|
||||||
"script_executed",
|
"script_executed",
|
||||||
{
|
{
|
||||||
@@ -147,7 +149,7 @@ class WebhookHandler(BaseHTTPRequestHandler):
|
|||||||
)
|
)
|
||||||
self.send_json(status_code, {"ok": status_code == 200, "param": param_val, **result})
|
self.send_json(status_code, {"ok": status_code == 200, "param": param_val, **result})
|
||||||
|
|
||||||
def _execute_script(self, proj: dict, param: str, client_ip: str, user_agent: str, referer: str) -> tuple[dict, int]:
|
def _execute_script(self, show_log: bool, proj: dict, param: str, client_ip: str, user_agent: str, referer: str) -> tuple[dict, int]:
|
||||||
"""执行脚本,key 对了就执行,不管什么请求"""
|
"""执行脚本,key 对了就执行,不管什么请求"""
|
||||||
print(f"\n{'='*60}")
|
print(f"\n{'='*60}")
|
||||||
print(f"🚀 执行脚本 | param={param}")
|
print(f"🚀 执行脚本 | param={param}")
|
||||||
@@ -166,6 +168,11 @@ class WebhookHandler(BaseHTTPRequestHandler):
|
|||||||
script_path = os.path.expanduser(proj["script"])
|
script_path = os.path.expanduser(proj["script"])
|
||||||
script_cwd = os.path.dirname(os.path.abspath(__file__))
|
script_cwd = os.path.dirname(os.path.abspath(__file__))
|
||||||
if os.path.exists(script_path):
|
if os.path.exists(script_path):
|
||||||
|
if not show_log:
|
||||||
|
# 秒回复模式:不等待执行,不记录日志,直接返回成功
|
||||||
|
self._quick_run(script_path, script_cwd)
|
||||||
|
return {"script": {"executed": False, "status": "background", "exit_code": None, "stdout": None, "stderr": None, "error": None}}, 200
|
||||||
|
|
||||||
os.chmod(script_path, 0o755)
|
os.chmod(script_path, 0o755)
|
||||||
try:
|
try:
|
||||||
result = subprocess.run(
|
result = subprocess.run(
|
||||||
@@ -196,6 +203,7 @@ class WebhookHandler(BaseHTTPRequestHandler):
|
|||||||
script_result["error"] = str(e)
|
script_result["error"] = str(e)
|
||||||
print(f"⚠️ 执行失败 - {e}")
|
print(f"⚠️ 执行失败 - {e}")
|
||||||
else:
|
else:
|
||||||
|
# 文件不存在时即使 show_log=False 也返回错误
|
||||||
script_result["executed"] = True
|
script_result["executed"] = True
|
||||||
script_result["status"] = "not_found"
|
script_result["status"] = "not_found"
|
||||||
script_result["error"] = f"script not found: {script_path}"
|
script_result["error"] = f"script not found: {script_path}"
|
||||||
@@ -218,6 +226,14 @@ class WebhookHandler(BaseHTTPRequestHandler):
|
|||||||
|
|
||||||
return {"script": script_result}, status_code
|
return {"script": script_result}, status_code
|
||||||
|
|
||||||
|
def _quick_run(self, script_path: str, script_cwd: str):
|
||||||
|
"""后台静默执行脚本,不等待,不记录日志。"""
|
||||||
|
import threading
|
||||||
|
def _run():
|
||||||
|
os.chmod(script_path, 0o755)
|
||||||
|
subprocess.run([script_path], cwd=script_cwd, capture_output=True, text=True)
|
||||||
|
threading.Thread(target=_run, daemon=True).start()
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
# 启动前检查配置文件
|
# 启动前检查配置文件
|
||||||
|
|||||||
Reference in New Issue
Block a user