Files
drouter/_dev/probe-opensoho.sh
T
liuzhuohua 64df3cf331 feat: Drouter 1.0.0 —— Debian 13 软路由管理系统
一套跑在 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
2026-09-30 19:26:24 +08:00

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"