流程图:/api/vps/restart_dial 单机重拨链路

这张图对应 vps_server1.py + vps_operate1.py + vps_sql1.py,讲清楚一次按 id 重拨如何改变代理状态。

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 查看状态]

说明

返回索引