flowchart TD
A[调用方 POST /api/vps/restart_dial?apikey=... body: id] --> B{apikey 与 id 是否合法}
B -- 否 --> B1[直接返回 400;避免未授权或无目标的远程 SSH 操作]
B -- 是 --> C[Database.get_vps_info_by_id 从 MySQL vps_info 读取 ip_port_info/username/password]
C --> D{是否查到记录}
D -- 否 --> D1[返回 404 未找到记录;不会继续连接远端]
D -- 是 --> E[ip_port_info 拆成 ip:port,创建 VPS 对象]
E --> F[VPS.connect 使用 Paramiko Transport 建 SSH]
F --> G{connect 返回是否为空字符串}
G -- 非空错误消息 --> G1[SSH 失败:score=0 delay=5 message=SSH错误 status=ok]
G1 --> G2[update_info_ssh 只写健康字段,不覆盖旧 proxy_ip]
G2 --> G3[返回 200:重拨失败,SSH 连接存在问题]
G -- 成功 --> H[VPS.update_proxy_ 执行 pppoe-stop -> pppoe-start -> ifconfig 解析 ppp0 IP]
H --> I{update_proxy_ 结果}
I -- 1 成功拿到新 IP --> J[status=ok;用代理访问百度 10 次计算 score 和 delay]
J --> J1{score=0 且 delay=5?}
J1 -- 是 --> J2[message=经测试网络延迟较高]
J1 -- 否 --> J3[message 可为空,表示代理可用]
I -- 2 停止拨号失败 --> K[message=停止拨号失败;仍测试当前 proxy_ip,status=ok]
K --> K1{测试是否全失败}
K1 -- 是 --> K2[message=停止拨号失败且网络延迟较高]
K1 -- 否 --> K3[保留停止失败提示,说明服务可能仍可用但重拨不干净]
I -- 异常对象 --> L[status=unavailable;message=重新拨号失败原因]
I -- 空/未命中且 ping 失败 --> M[status=networkError;message=VPS 内部连网失败]
J2 --> N[Database.update_info 写 proxy_ip/score/delay/message/time/status]
J3 --> N
K2 --> N
K3 --> N
L --> N
M --> N
N --> O[返回 200:数据已经更新;调用方再通过 get_ip/get_all 查看状态]