一套跑在 Debian 13 (trixie) 上的软路由管理系统,提供 43 个功能页面的 Web 管理面板:WAN 接入、PPPoE 多拨、DHCP/DNS、IPv6、防火墙、QoS 限速、 访问控制、DDNS、文件共享、Docker 管理等。 核心设计原则:不重新实现任何协议 PPPoE 交给 ppp,DHCP 交给 dnsmasq,IPv6 RA 交给 radvd,NAT 交给 nftables。 Web 面板只做三件事:渲染原生配置文件 → 语法预检 → 原子写入并 reload。 面板删掉后,系统仍是一台配置完好的 Debian 路由器。 安全默认值 · 安装后不接管网络:不改默认路由、不开 IP 转发、不启动 DHCP 服务 · 所有改网络的动作都需要用户在面板上亲手点「应用」 · 避开 5900 端口,不触碰 VNC / X 会话 · 配置写入前先做语法预检,失败则回滚 架构 · backend/ Python 3 标准库,零第三方依赖(9 个模块) · web/ 原生 JS/CSS,无构建步骤 · 常驻 helper 通过 Unix socket 提供 75 个动作,socket 不可用时回退 subprocess · 鉴权走 X-Token 请求头 打包 · packaging/build-deb.sh → drouter_1.0.0_all.deb(含 6 个 systemd 单元) · scripts/make-offline-deps.sh → 236 个依赖 .deb + 本地仓库索引 · packaging/build-offline-bundle.sh → 自包含离线包,目标机零外网可装 · packaging/build-docker.sh → 容器镜像(体验用) 测试 40 套单元测试 + 3 个前端检查脚本(菜单映射 / 离线渲染 / 手机适配), 全部挂在 devtools/sync.sh 的预检链里。 许可:MIT
43 lines
1.8 KiB
Bash
43 lines
1.8 KiB
Bash
#!/bin/bash
|
||
# 清理回归测试残留:PPPoE 测试账号(peers / chap-secrets / pap-secrets)
|
||
set -u
|
||
echo "=== 清理前 ==="
|
||
grep -l "test12345" /etc/ppp/peers/* /etc/ppp/*-secrets 2>/dev/null
|
||
|
||
echo "=== 删除测试生成的 PPPoE 文件 ==="
|
||
rm -f /etc/ppp/peers/drouter-wan
|
||
# secrets 文件如果是本次测试生成的(仅含测试账号),恢复为空的模板
|
||
for f in /etc/ppp/chap-secrets /etc/ppp/pap-secrets; do
|
||
if [ -f "$f" ] && [ "$(wc -l < "$f")" -le 1 ] && grep -q "test12345" "$f" 2>/dev/null; then
|
||
printf '# 由 drouter 自动生成:PPPoE 认证凭据\n# 在 WEB 界面填写 PPPoE 账号密码并保存后,此处会被写入\n' > "$f"
|
||
chmod 600 "$f"; chown root:root "$f"
|
||
echo "已重置 $f"
|
||
fi
|
||
done
|
||
|
||
echo "=== 重置数据库 pppoe 配置块 ==="
|
||
python3 - <<'PY'
|
||
import sqlite3, json
|
||
db = '/opt/drouter/data/drouter.db'
|
||
c = sqlite3.connect(db); c.row_factory = sqlite3.Row
|
||
row = c.execute("SELECT value FROM settings WHERE key='pppoe'").fetchone()
|
||
cur = json.loads(row['value']) if row else {}
|
||
cur.setdefault('isp', 'auto'); cur.setdefault('mtu', 1492); cur.setdefault('mru', 1492)
|
||
cur.setdefault('persist', True); cur.setdefault('maxfail', 0); cur.setdefault('holdoff', 5)
|
||
cur.setdefault('service_name', '')
|
||
cur['iface'] = ''; cur['username'] = ''; cur['password'] = ''
|
||
cur['saved_only'] = True; cur['note'] = '仅保存凭据,未执行拨号'
|
||
c.execute("UPDATE settings SET value=? WHERE key='pppoe'", (json.dumps(cur, ensure_ascii=False),))
|
||
c.commit()
|
||
print('pppoe ->', json.dumps(cur, ensure_ascii=False))
|
||
PY
|
||
|
||
echo "=== 清理后核对 ==="
|
||
if grep -rq "test12345" /etc/ppp/ 2>/dev/null; then
|
||
echo "仍有残留!"; grep -rn "test12345" /etc/ppp/ 2>/dev/null
|
||
else
|
||
echo "无测试账号残留 ✔"
|
||
fi
|
||
ls -la /etc/ppp/peers/ /etc/ppp/chap-secrets /etc/ppp/pap-secrets 2>&1
|
||
echo "CLEANUP_DONE"
|