186 lines
6.5 KiB
Python
186 lines
6.5 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
测试NAS和VPN可用性
|
|
"""
|
|
import sys
|
|
import os
|
|
import json
|
|
import time
|
|
import subprocess
|
|
from datetime import datetime
|
|
from typing import Dict, List, Optional
|
|
import logging
|
|
|
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class NASVPNTester:
|
|
"""NAS和VPN可用性测试"""
|
|
|
|
def test_nas_connection(self, nas_path: str) -> Dict:
|
|
"""测试NAS连接性"""
|
|
logger.info(f"测试NAS连接: {nas_path}")
|
|
|
|
results = {
|
|
"timestamp": datetime.now().isoformat(),
|
|
"nas_path": nas_path,
|
|
"accessibility": {
|
|
"exists": False,
|
|
"writable": False,
|
|
"free_space": 0
|
|
}
|
|
}
|
|
|
|
try:
|
|
# 检查路径是否存在
|
|
if os.path.exists(nas_path):
|
|
results["accessibility"]["exists"] = True
|
|
|
|
# 检查可写性
|
|
try:
|
|
test_file = os.path.join(nas_path, ".test_write")
|
|
with open(test_file, 'w') as f:
|
|
f.write("test")
|
|
os.remove(test_file)
|
|
results["accessibility"]["writable"] = True
|
|
|
|
# 检查可用空间
|
|
stat = os.statvfs(nas_path)
|
|
free_gb = (stat.f_bavail * stat.f_frsize) / (1024**3)
|
|
results["accessibility"]["free_space"] = free_gb
|
|
|
|
logger.info(f"✅ NAS连接正常: {nas_path}")
|
|
logger.info(f" 可用空间: {free_gb:.2f} GB")
|
|
|
|
if free_gb < 20:
|
|
logger.warning(f"⚠️ NAS空间不足: 可用 {free_gb:.2f} GB, 建议 30GB+")
|
|
else:
|
|
logger.info(f"✅ NAS空间充足: {free_gb:.2f} GB")
|
|
|
|
else:
|
|
logger.warning(f"⚠️ NAS路径不存在: {nas_path}")
|
|
|
|
except Exception as e:
|
|
logger.error(f"❌ NAS连接测试失败: {e}")
|
|
results["error"] = str(e)
|
|
|
|
# 保存结果
|
|
test_file = os.path.join(os.path.dirname(__file__), "nas_test_results.json")
|
|
with open(test_file, 'w') as f:
|
|
json.dump(results, f, indent=2)
|
|
|
|
logger.info(f"NAS连接测试完成,结果保存: {test_file}")
|
|
|
|
return results
|
|
|
|
def test_vpn_connectivity(self) -> Dict:
|
|
"""测试VPN连接性"""
|
|
logger.info("测试VPN连接性")
|
|
|
|
vpn_results = {
|
|
"timestamp": datetime.now().isoformat(),
|
|
"vpn_status": "unknown",
|
|
"connection_tests": []
|
|
}
|
|
|
|
# 测试目标
|
|
test_targets = [
|
|
{"name": "akshare", "host": "push2his.eastmoney.com"},
|
|
{"name": "tushare", "host": "tushare.org"},
|
|
{"name": "github", "host": "github.com"},
|
|
{"name": "baidu", "host": "baidu.com"}
|
|
]
|
|
|
|
for target in test_targets:
|
|
logger.info(f"测试VPN连接: {target['name']} ({target['host']})")
|
|
|
|
try:
|
|
# 使用curl测试连接
|
|
result = subprocess.run(
|
|
["curl", "-I", "-m", "10", f"http://{target['host']}"],
|
|
capture_output=True,
|
|
text=True,
|
|
timeout=15
|
|
)
|
|
|
|
test_result = {
|
|
"target": target["name"],
|
|
"host": target["host"],
|
|
"status": "success" if result.returncode == 0 else "failed",
|
|
"response_time": time.time()
|
|
}
|
|
|
|
if result.returncode == 0:
|
|
logger.info(f" ✅ VPN连接正常: {target['name']}")
|
|
else:
|
|
logger.warning(f" ⚠️ VPN连接失败: {target['name']}")
|
|
|
|
vpn_results["connection_tests"].append(test_result)
|
|
|
|
except Exception as e:
|
|
logger.error(f"❌ VPN连接测试失败: {target['name']} - {e}")
|
|
|
|
# 评估VPN状态
|
|
success_count = sum(1 for test in vpn_results["connection_tests"]
|
|
if test.get("status") == "success")
|
|
total_tests = len(vpn_results["connection_tests"])
|
|
|
|
if success_count == total_tests:
|
|
vpn_results["vpn_status"] = "excellent"
|
|
vpn_results["summary"] = "VPN连接性优秀,所有目标可访问"
|
|
logger.info("VPN连接性: 优秀")
|
|
elif success_count >= 2:
|
|
vpn_results["vpn_status"] = "good"
|
|
vpn_results["summary"] = "VPN连接性良好,主要目标可访问"
|
|
logger.info("VPN连接性: 良好")
|
|
else:
|
|
vpn_results["vpn_status"] = "poor"
|
|
vpn_results["summary"] = "VPN连接性较差,需要优化配置"
|
|
logger.warning("VPN连接性: 较差")
|
|
|
|
# 保存结果
|
|
vpn_file = os.path.join(os.path.dirname(__file__), "vpn_test_results.json")
|
|
with open(vpn_file, 'w') as f:
|
|
json.dump(vpn_results, f, indent=2)
|
|
|
|
logger.info(f"VPN连接性测试完成,结果保存: {vpn_file}")
|
|
|
|
return vpn_results
|
|
|
|
|
|
def main():
|
|
"""主函数"""
|
|
logger.info("开始测试NAS和VPN可用性")
|
|
|
|
tester = NASVPNTester()
|
|
|
|
# 检查VPN连接性
|
|
logger.info("1. 测试VPN连接性...")
|
|
vpn_results = tester.test_vpn_connectivity()
|
|
|
|
# 测试AKShare数据源
|
|
logger.info("2. 测试AKShare数据源可用性...")
|
|
akshare_results = tester.test_akshare_with_vpn()
|
|
|
|
logger.info("\n" + "="*70)
|
|
logger.info("📋 测试结果摘要")
|
|
logger.info("="*70)
|
|
|
|
logger.info("✅ VPN连接性:")
|
|
for test in vpn_results.get("connection_tests", []):
|
|
status = "✅" if test.get("status") == "success" else "⚠️"
|
|
logger.info(f" {status} {test.get('target')}: {test.get('status')}")
|
|
|
|
logger.info("\n📊 最终评估:")
|
|
logger.info(f" VPN状态: {vpn_results.get('vpn_status', 'unknown')}")
|
|
logger.info(f" 总结: {vpn_results.get('summary', '无评估')}")
|
|
|
|
logger.info("\n" + "="*70)
|
|
logger.info("🎯 下一步:等待姜维将军提供NAS配置信息")
|
|
logger.info("🚀 配置获取后立即开始分钟数据下载")
|
|
logger.info("="*70)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |