chore: publish secure public mirror

This commit is contained in:
qiangayi
2026-08-14 15:35:50 +08:00
commit 37e018e0e0
20 changed files with 7008 additions and 0 deletions
+10
View File
@@ -0,0 +1,10 @@
{
"transit_url": "https://ts.henlo.net",
"server_id": "",
"access_token": "",
"expires_at": "",
"user_name": "",
"client_code": "",
"client_title": "",
"client_list": []
}
File diff suppressed because it is too large Load Diff
+289
View File
@@ -0,0 +1,289 @@
#!/usr/bin/env python3
"""
Oracle Jump Query - AI Skill
通过中转服务查询远程 Oracle 存储过程元数据
使用方式:
python oracle_skill.py analyze BOS M_RETAIL_SUBMIT
python oracle_skill.py list BOS
python oracle_skill.py source BOS M_RETAIL_SUBMIT
python oracle_skill.py deps BOS M_RETAIL_SUBMIT
python oracle_skill.py tables BOS M_RETAIL_SUBMIT
python oracle_skill.py servers
"""
import json
import os
import sys
import requests
# ============================================================
# 配置(修改为你的中转服务地址和认证信息)
# ============================================================
TRANSIT_URL = "http://bos.henlo.net:6357"
AUTH_TOKEN = ""
DEFAULT_SERVER_ID = "server-001"
def get_script_dir():
"""获取脚本自身所在目录"""
return os.path.dirname(os.path.abspath(__file__))
def get_config():
"""从 config.json 加载配置(优先脚本目录,其次当前目录)"""
# 优先从脚本同目录加载
cfg_path = os.path.join(get_script_dir(), "config.json")
try:
with open(cfg_path, "r", encoding="utf-8") as f:
cfg = json.load(f)
return cfg
except FileNotFoundError:
pass
# 其次从当前目录加载
try:
with open("config.json", "r", encoding="utf-8") as f:
cfg = json.load(f)
return cfg
except FileNotFoundError:
return None
def make_headers():
"""构建 HTTP 请求头"""
headers = {"Content-Type": "application/json"}
token = AUTH_TOKEN
cfg = get_config()
if cfg:
token = cfg.get("auth_token", token)
if token:
headers["Authorization"] = f"Bearer {token}"
return headers
def get_transit_url():
"""获取中转服务 URL"""
cfg = get_config()
if cfg and "transit_url" in cfg:
return cfg["transit_url"]
return TRANSIT_URL
def get_server_id():
"""获取默认服务器 ID"""
cfg = get_config()
if cfg and "server_id" in cfg:
return cfg["server_id"]
return DEFAULT_SERVER_ID
def query(server_id, action, schema="", name="", timeout=60):
"""发送查询请求到中转服务"""
url = f"{get_transit_url()}/api/query"
payload = {
"server_id": server_id,
"action": action,
"schema": schema,
"name": name,
"timeout": timeout,
}
try:
resp = requests.post(url, json=payload, headers=make_headers(), timeout=timeout + 5)
resp.raise_for_status()
return resp.json()
except requests.exceptions.ConnectionError:
return {"success": False, "error": "无法连接中转服务,请检查地址和端口"}
except requests.exceptions.Timeout:
return {"success": False, "error": "请求超时,Agent 可能未响应"}
except requests.exceptions.HTTPError as e:
return {"success": False, "error": f"HTTP 错误: {e}"}
def list_servers():
"""列出所有在线的 Agent 服务器"""
url = f"{get_transit_url()}/api/servers"
try:
resp = requests.get(url, headers=make_headers(), timeout=10)
resp.raise_for_status()
return resp.json()
except Exception as e:
return {"error": str(e)}
def health_check():
"""检查中转服务健康状态"""
url = f"{get_transit_url()}/api/health"
try:
resp = requests.get(url, timeout=5)
resp.raise_for_status()
return resp.json()
except Exception as e:
return {"error": str(e)}
def print_result(result):
"""格式化输出结果"""
if result.get("success"):
data = result.get("data", "")
print(data)
else:
error = result.get("error", "未知错误")
print(f"❌ 错误: {error}")
def interactive_mode():
"""交互式模式"""
print("=" * 50)
print(" Oracle Jump Query - AI Skill")
print(" 输入 help 查看命令,exit 退出")
print("=" * 50)
# Check transit server
health = health_check()
if "error" in health:
print(f"⚠️ 中转服务不可用: {health['error']}")
print("请检查 config.json 中的 transit_url 配置")
else:
print(f"✅ 中转服务正常 (在线 Agent: {health.get('agents', 0)})")
print()
while True:
try:
line = input("> ").strip()
except (EOFError, KeyboardInterrupt):
print("\n再见!")
break
if not line:
continue
parts = line.split()
cmd = parts[0].lower()
if cmd == "exit" or cmd == "quit":
print("再见!")
break
elif cmd == "help":
print("""
可用命令:
analyze <schema> <procedure> - 分析存储过程(源码+依赖+表+触发器)
list <schema> - 列出 schema 下的所有存储过程
source <schema> <procedure> - 获取存储过程源码
deps <schema> <procedure> - 获取存储过程依赖
tables <schema> <procedure> - 获取相关表结构
servers - 列出在线 Agent
health - 检查中转服务状态
server <server_id> - 切换目标服务器
exit - 退出
""")
elif cmd == "servers":
result = list_servers()
if "error" in result:
print(f"❌ {result['error']}")
else:
servers = result.get("servers", [])
if not servers:
print("没有在线的 Agent")
else:
for s in servers:
print(f" 🟢 {s['server_id']}")
elif cmd == "health":
result = health_check()
if "error" in result:
print(f"❌ {result['error']}")
else:
print(f"✅ 中转服务正常 (在线 Agent: {result.get('agents', 0)})")
elif cmd == "server":
if len(parts) < 2:
print(f"当前服务器: {get_server_id()}")
else:
global DEFAULT_SERVER_ID
DEFAULT_SERVER_ID = parts[1]
print(f"切换到服务器: {parts[1]}")
elif cmd == "analyze":
if len(parts) < 3:
print("用法: analyze <schema> <procedure>")
continue
result = query(get_server_id(), "analyze_procedure", parts[1], parts[2], timeout=120)
print_result(result)
elif cmd == "list":
if len(parts) < 2:
print("用法: list <schema>")
continue
result = query(get_server_id(), "list_procedures", parts[1], timeout=30)
print_result(result)
elif cmd == "source":
if len(parts) < 3:
print("用法: source <schema> <procedure>")
continue
result = query(get_server_id(), "get_source", parts[1], parts[2], timeout=60)
print_result(result)
elif cmd == "deps":
if len(parts) < 3:
print("用法: deps <schema> <procedure>")
continue
result = query(get_server_id(), "get_dependencies", parts[1], parts[2], timeout=60)
print_result(result)
elif cmd == "tables":
if len(parts) < 3:
print("用法: tables <schema> <procedure>")
continue
result = query(get_server_id(), "get_tables", parts[1], parts[2], timeout=60)
print_result(result)
else:
print(f"未知命令: {cmd},输入 help 查看帮助")
def main():
if len(sys.argv) == 1:
interactive_mode()
return
cmd = sys.argv[1].lower()
if cmd == "servers":
result = list_servers()
print(json.dumps(result, indent=2, ensure_ascii=False))
elif cmd == "health":
result = health_check()
print(json.dumps(result, indent=2, ensure_ascii=False))
elif cmd == "analyze" and len(sys.argv) >= 4:
result = query(get_server_id(), "analyze_procedure", sys.argv[2], sys.argv[3], timeout=120)
print_result(result)
elif cmd == "list" and len(sys.argv) >= 3:
result = query(get_server_id(), "list_procedures", sys.argv[2], timeout=30)
print_result(result)
elif cmd == "source" and len(sys.argv) >= 4:
result = query(get_server_id(), "get_source", sys.argv[2], sys.argv[3], timeout=60)
print_result(result)
elif cmd == "deps" and len(sys.argv) >= 4:
result = query(get_server_id(), "get_dependencies", sys.argv[2], sys.argv[3], timeout=60)
print_result(result)
elif cmd == "tables" and len(sys.argv) >= 4:
result = query(get_server_id(), "get_tables", sys.argv[2], sys.argv[3], timeout=60)
print_result(result)
else:
print(__doc__)
if __name__ == "__main__":
main()