#!/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)