一套跑在 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
82 lines
2.6 KiB
Bash
82 lines
2.6 KiB
Bash
#!/bin/bash
|
|
# OpenSOHO 真机行为探测:起一次临时实例,摸清 superuser / REST API / 集合名
|
|
# 用完必须清理(见脚本末尾的 cleanup 段)
|
|
set -u
|
|
SECRET='probe-secret-probe-secret-probe-32'
|
|
BIN=/tmp/opensoho
|
|
DIR=/tmp/oh-probe
|
|
LOG=/tmp/oh-probe.log
|
|
PORT=8099
|
|
|
|
echo "=== 0. 环境 ==="
|
|
id -un; uname -m
|
|
ls -l "$BIN" 2>&1
|
|
echo "--- 8099 / 8090 占用 ---"
|
|
ss -lntp 2>/dev/null | grep -E ':(8099|8090)\b' || echo "(未占用)"
|
|
|
|
echo
|
|
echo "=== 1. 版本 ==="
|
|
"$BIN" --help 2>&1 | head -30
|
|
|
|
echo
|
|
echo "=== 2. 启临时实例 ==="
|
|
rm -rf "$DIR" "$LOG"
|
|
mkdir -p "$DIR"
|
|
OPENSOHO_SHARED_SECRET="$SECRET" nohup "$BIN" serve --http 127.0.0.1:$PORT --dir "$DIR" > "$LOG" 2>&1 &
|
|
echo "pid=$!"
|
|
for i in $(seq 1 30); do
|
|
if curl -sf -o /dev/null "http://127.0.0.1:$PORT/_/" ; then echo "第 ${i}s 起好了"; break; fi
|
|
sleep 1
|
|
done
|
|
|
|
echo
|
|
echo "=== 3. 日志 ==="
|
|
cat "$LOG"
|
|
|
|
echo
|
|
echo "=== 4. 管理界面可达性 ==="
|
|
echo "-- /_/ --"; curl -s -o /dev/null -w '%{http_code}\n' "http://127.0.0.1:$PORT/_/"
|
|
echo "-- /api/health --"; curl -s "http://127.0.0.1:$PORT/api/health" ; echo
|
|
|
|
echo
|
|
echo "=== 5. superuser upsert ==="
|
|
"$BIN" superuser upsert probe@drouter.local 'ProbePass12345' --dir "$DIR" 2>&1 | head -20
|
|
echo "退出码=$?"
|
|
|
|
echo
|
|
echo "=== 6. 登录取 token ==="
|
|
TOK=$(curl -s -X POST "http://127.0.0.1:$PORT/api/collections/_superusers/auth-with-password" \
|
|
-H 'Content-type: application/json' \
|
|
-d '{"identity":"probe@drouter.local","password":"ProbePass12345"}' | python3 -c 'import sys,json;print(json.load(sys.stdin).get("token","")' 2>/dev/null)
|
|
echo "token 长度=${#TOK}"
|
|
|
|
echo
|
|
echo "=== 7. 列出集合 ==="
|
|
curl -s -H "Authorization: $TOK" "http://127.0.0.1:$PORT/api/collections" \
|
|
| python3 -c 'import sys,json
|
|
d=json.load(sys.stdin)
|
|
for c in d.get("items",d if isinstance(d,list) else []):
|
|
print(c.get("name"), "|", ",".join(sorted((c.get("schema") or {}).get("fields",{}).keys())[:14]))' 2>&1 | head -30
|
|
|
|
echo
|
|
echo "=== 8. devices / clients 列表(空库) ==="
|
|
for c in devices clients radios wifi leds settings; do
|
|
echo "-- $c --"
|
|
curl -s -H "Authorization: $TOK" "http://127.0.0.1:$PORT/api/collections/$c/records?perPage=1" | head -c 400; echo
|
|
done
|
|
|
|
echo
|
|
echo "=== 9. devicestatus v1 ==="
|
|
curl -s -o /dev/null -w '%{http_code}\n' -H "Authorization: $TOK" "http://127.0.0.1:$PORT/api/v1/devicestatus/00:11:22:33:44:55"
|
|
|
|
echo
|
|
echo "=== 10. 监听情况 ==="
|
|
ss -lntp 2>/dev/null | grep "$PORT" || echo "(无)"
|
|
|
|
echo
|
|
echo "=== 11. 清理 ==="
|
|
pkill -f "$BIN serve" ; sleep 2
|
|
rm -rf "$DIR" "$LOG"
|
|
ss -lntp 2>/dev/null | grep -E ':(8099|8090)\b' || echo "端口已释放"
|
|
echo "DONE"
|