compliance/test_dms_connection.py
2025-08-07 17:14:40 +08:00

317 lines
10 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
DMS服务连接测试脚本
专门用于测试DMS API的连接和SSL配置
"""
import requests
import urllib3
import json
import sys
import time
from urllib.parse import urljoin
def test_dms_connection():
"""测试DMS服务连接"""
# 配置
base_url = "https://www.dev.ideas.cnpc"
api_endpoint = "/api/schema/manage/schema"
full_url = urljoin(base_url, api_endpoint)
print("🔧 DMS服务连接测试")
print("=" * 60)
print(f"目标服务器: {base_url}")
print(f"API端点: {api_endpoint}")
print(f"完整URL: {full_url}")
print()
# 禁用SSL警告用于测试
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# 测试1: 忽略SSL证书验证
print("📡 测试1: 忽略SSL证书验证")
print("-" * 40)
try:
start_time = time.time()
response = requests.get(
full_url,
verify=False,
timeout=30,
headers={
'User-Agent': 'DMS-Compliance-Test/1.0',
'Accept': 'application/json'
}
)
end_time = time.time()
print(f"✅ 请求成功!")
print(f"⏱️ 响应时间: {end_time - start_time:.2f}")
print(f"📊 HTTP状态码: {response.status_code}")
print(f"📋 响应头:")
for key, value in response.headers.items():
print(f" {key}: {value}")
print(f"\n📄 响应内容:")
if response.status_code == 200:
try:
data = response.json()
print(f"✅ JSON解析成功")
print(f"📊 数据类型: {type(data)}")
if isinstance(data, dict):
print(f"🔑 响应键: {list(data.keys())}")
# 检查DMS特定的响应结构
if 'code' in data:
print(f"📈 业务代码: {data.get('code')}")
if 'message' in data:
print(f"💬 消息: {data.get('message')}")
if 'data' in data:
data_content = data.get('data')
print(f"📦 数据内容类型: {type(data_content)}")
if isinstance(data_content, dict) and 'records' in data_content:
records = data_content.get('records', [])
print(f"📝 记录数量: {len(records)}")
if records:
print(f"📋 第一条记录示例: {records[0] if len(records) > 0 else 'N/A'}")
# 显示响应内容的前500字符
response_text = json.dumps(data, ensure_ascii=False, indent=2)
if len(response_text) > 500:
print(f"📄 响应内容前500字符:")
print(response_text[:500] + "...")
else:
print(f"📄 完整响应内容:")
print(response_text)
except json.JSONDecodeError as e:
print(f"❌ JSON解析失败: {e}")
print(f"📄 原始响应内容前500字符:")
print(response.text[:500])
else:
print(f"⚠️ HTTP状态码异常: {response.status_code}")
print(f"📄 响应内容: {response.text[:500]}")
return True
except requests.exceptions.SSLError as e:
print(f"❌ SSL错误: {e}")
print("💡 建议: 使用 --ignore-ssl 参数")
return False
except requests.exceptions.ConnectionError as e:
print(f"❌ 连接错误: {e}")
print("💡 建议: 检查网络连接和服务器地址")
return False
except requests.exceptions.Timeout as e:
print(f"❌ 超时错误: {e}")
print("💡 建议: 增加超时时间或检查网络延迟")
return False
except Exception as e:
print(f"❌ 其他错误: {e}")
print(f"错误类型: {type(e).__name__}")
return False
def test_ssl_verification():
"""测试SSL证书验证"""
print("\n📡 测试2: 启用SSL证书验证")
print("-" * 40)
base_url = "https://www.dev.ideas.cnpc"
api_endpoint = "/api/schema/manage/schema"
full_url = urljoin(base_url, api_endpoint)
try:
start_time = time.time()
response = requests.get(
full_url,
verify=True, # 启用SSL验证
timeout=30,
headers={
'User-Agent': 'DMS-Compliance-Test/1.0',
'Accept': 'application/json'
}
)
end_time = time.time()
print(f"✅ SSL验证通过!")
print(f"⏱️ 响应时间: {end_time - start_time:.2f}")
print(f"📊 HTTP状态码: {response.status_code}")
return True
except requests.exceptions.SSLError as e:
print(f"❌ SSL验证失败这是预期的: {e}")
print("💡 这证明需要使用 --ignore-ssl 参数")
return False
except Exception as e:
print(f"❌ 其他错误: {e}")
return False
def test_basic_connectivity():
"""测试基础网络连接"""
print("\n📡 测试3: 基础网络连接")
print("-" * 40)
base_url = "https://www.dev.ideas.cnpc"
try:
# 测试根路径
print(f"🔍 测试根路径: {base_url}")
response = requests.get(base_url, verify=False, timeout=10)
print(f"✅ 根路径连接成功: {response.status_code}")
# 测试其他可能的端点
test_endpoints = [
"/",
"/api",
"/api/health",
"/health"
]
for endpoint in test_endpoints:
try:
test_url = urljoin(base_url, endpoint)
response = requests.get(test_url, verify=False, timeout=5)
print(f"{endpoint}: {response.status_code}")
except:
print(f"{endpoint}: 连接失败")
return True
except Exception as e:
print(f"❌ 基础连接失败: {e}")
return False
def test_domain_mapping():
"""测试域映射文件"""
print("\n📁 测试4: 域映射文件")
print("-" * 40)
domain_file = "./assets/doc/dms/domain.json"
try:
with open(domain_file, 'r', encoding='utf-8') as f:
domain_data = json.load(f)
print(f"✅ 域映射文件读取成功")
print(f"📁 文件路径: {domain_file}")
print(f"📊 域映射数据: {json.dumps(domain_data, ensure_ascii=False, indent=2)}")
return True
except FileNotFoundError:
print(f"❌ 域映射文件不存在: {domain_file}")
return False
except json.JSONDecodeError as e:
print(f"❌ 域映射文件JSON格式错误: {e}")
return False
except Exception as e:
print(f"❌ 读取域映射文件出错: {e}")
return False
def generate_curl_command():
"""生成等效的curl命令"""
print("\n🔧 等效的curl命令")
print("-" * 40)
base_url = "https://www.dev.ideas.cnpc"
api_endpoint = "/api/schema/manage/schema"
full_url = urljoin(base_url, api_endpoint)
curl_commands = [
f"# 忽略SSL证书验证:",
f"curl -k -v '{full_url}'",
f"",
f"# 带请求头:",
f"curl -k -v -H 'Accept: application/json' -H 'User-Agent: DMS-Compliance-Test/1.0' '{full_url}'",
f"",
f"# 启用SSL验证:",
f"curl -v '{full_url}'",
f"",
f"# 测试连接(仅获取响应头):",
f"curl -k -I '{full_url}'"
]
for cmd in curl_commands:
print(cmd)
def main():
"""主函数"""
print("🚀 DMS服务连接诊断工具")
print("=" * 80)
print("此工具将测试DMS服务的连接性和SSL配置")
print("=" * 80)
results = []
# 执行所有测试
results.append(("DMS API连接忽略SSL", test_dms_connection()))
results.append(("SSL证书验证", test_ssl_verification()))
results.append(("基础网络连接", test_basic_connectivity()))
results.append(("域映射文件", test_domain_mapping()))
# 生成curl命令
generate_curl_command()
# 总结结果
print("\n" + "=" * 80)
print("📋 测试结果总结")
print("=" * 80)
passed = 0
for test_name, result in results:
status = "✅ 通过" if result else "❌ 失败"
print(f"{test_name:25} : {status}")
if result:
passed += 1
print(f"\n📊 总计: {passed}/{len(results)} 个测试通过")
# 给出建议
print("\n💡 建议和解决方案:")
print("-" * 40)
if results[0][1]: # DMS API连接成功
print("✅ DMS API连接正常建议在主程序中使用 --ignore-ssl 参数")
print(" 命令示例:")
print(" python run_api_tests.py --dms ./assets/doc/dms/domain.json --ignore-ssl")
else:
print("❌ DMS API连接失败请检查:")
print(" 1. 网络连接是否正常")
print(" 2. 服务器地址是否正确")
print(" 3. 防火墙设置")
print(" 4. 服务器是否在线")
if not results[1][1]: # SSL验证失败
print("⚠️ SSL证书验证失败这是正常的使用 --ignore-ssl 参数即可")
if not results[3][1]: # 域映射文件问题
print("❌ 域映射文件有问题,请检查文件是否存在且格式正确")
return passed == len(results)
if __name__ == "__main__":
try:
success = main()
sys.exit(0 if success else 1)
except KeyboardInterrupt:
print("\n\n⚠️ 测试被用户中断")
sys.exit(1)
except Exception as e:
print(f"\n\n❌ 测试过程中发生未预期的错误: {e}")
import traceback
traceback.print_exc()
sys.exit(1)