flowchart TD
A[新 VPS 节点:供应商给出 ip:port/root 密码/ADSL 账号] --> B[安装脚本 VPS(addr) 通过 Paramiko 建 SSH]
B --> C[SFTP 上传 install_files 到 /root]
C --> D[安装代理服务]
D --> D1[tinyproxy:解压源码 -> configure/make/install -> 覆盖 tinyproxy.conf -> 启动]
D --> D2[danted:清理旧包 -> yum localinstall/rpm -> 创建日志目录 -> 覆盖 sockd.conf -> systemctl start]
D1 --> E[创建代理认证用户/密码,保证外部访问代理需要认证]
D2 --> E
E --> F[可选安装 auto_dial.service:ExecStart=/usr/bin/python3 -u /root/auto_dial.py,Restart=always]
F --> G[远端 auto_dial.py 常驻循环]
G --> H{当前 ppp0 proxy_ip 是否存在且控制端未要求停止?}
H -- 是 --> H1[继续 sleep,避免无意义重拨]
H1 --> G
H -- 否/需要停止 --> I[restart:pppoe-stop;失败则 kill /usr/sbin/pppd;再 pppoe-start 获取新 IP]
I --> J{新 IP 是否存在且不同于旧 IP?}
J -- 否 --> I
J -- 是 --> K[restart_tinyproxy:杀旧 tinyproxy 进程并重新启动,确保代理服务使用新链路]
K --> L[post_proxy 调用控制端 upload,上报新代理]
L --> M{上报成功?}
M -- 是 --> N[等待 120 秒后回到循环,避免频繁拨号]
M -- 否 --> I
N --> G
O[testPPPoe2.py 线程池巡检多台服务器] --> P[SSH 连接每台 VPS]
P --> Q[check_danted_status:systemctl status danted]
Q --> R{Danted inactive/failed?}
R -- 是 --> R1[systemctl restart danted,最多重试]
R -- 否 --> S[check_pppoe_status 检查 pppoe/ppp0 状态]
R1 --> S
S --> T{PPPoE 正常且 Danted 正常?}
T -- 是 --> U[ping 百度,记录丢包率/连通性]
T -- 否 --> V[跳过 ping 并写日志,等待下一轮或人工介入]
U --> W[每轮 sleep 后继续巡检]
V --> W