07-Server首阶段实现清单.md 5.6 KB

Server 首阶段实现清单

1. 目标

定义 Linux Server 从零开始时,第一阶段应该优先完成的模块、接口、数据结构和验证顺序。

第一阶段目标不是立即改 IP,而是先把“发现 + 连接 + 读取状态”整条只读链路打通。

2. 第一阶段范围

第一阶段只实现以下能力:

  1. Server 启动
  2. 读取固定运行配置
  3. 启动前为管理接口挂载维护地址
  4. UDP 广播发现
  5. HTTP 服务启动
  6. 固定密码鉴权
  7. 设备信息读取
  8. 真实接口枚举与识别
  9. 返回接口列表

第一阶段暂不实现:

  1. netplan 写入
  2. 配置校验
  3. 配置应用
  4. 自动回滚
  5. 重启与关机

3. 第一阶段必须完成的 HTTP 接口

3.1 GET /api/health

用途:

  1. 客户端探活
  2. 判断 Server 是否运行

最低返回:

  1. 运行状态
  2. Server 版本

3.2 GET /api/device/info

用途:

  1. 展示设备基础信息
  2. 确认设备身份

最低返回:

  1. 设备 ID
  2. 主机名
  3. Ubuntu 版本
  4. Server 版本
  5. 运行时长

3.3 GET /api/network/interfaces

用途:

  1. 返回真实接口列表
  2. 返回当前管理接口
  3. 返回建议目标接口
  4. 为设备页提供数据

最低返回:

  1. management_interface
  2. suggested_target_interface
  3. requires_target_selection
  4. interfaces[]

4. 第一阶段必须完成的 UDP 能力

4.1 UDP 广播监听

要求:

  1. 监听固定发现端口
  2. 能接收 Windows 广播报文
  3. 能正确解析 discover 请求

4.2 UDP 发现响应

要求:

  1. 回传 request_id
  2. 返回设备基础信息
  3. 返回维护地址 169.254.100.2
  4. 返回 auth_required=true

5. 第一阶段建议模块顺序

5.1 config

先完成一个最小配置模块,至少输出:

  1. HTTP 端口
  2. UDP 端口
  3. 固定维护地址
  4. 固定密码
  5. Server 版本
  6. HTTP 默认端口 48888
  7. 支持 --ip--port 启动参数
  8. 支持 --password 启动参数,默认密码为 2026

建议示例:

./nettool-server --ip 169.254.100.2 --port 48888 --password '2026'

5.2 logger

提供统一日志入口。

最低要求:

  1. 信息日志
  2. 错误日志
  3. 敏感头过滤

5.3 deviceinfo

负责提供:

  1. 主机名
  2. OS 版本
  3. 设备 ID
  4. 运行时长

5.4 network/interfaces

这是第一阶段最关键模块之一。

最低要求:

  1. 枚举物理有线接口
  2. 过滤虚拟接口
  3. 返回接口名、MAC、链路状态、IPv4
  4. 判断当前管理接口
  5. 判断建议目标接口
  6. 在维护地址不存在时,为管理接口执行运行时注入

5.5 auth

最低要求:

  1. 校验 X-Admin-Password
  2. 返回统一失败结果

5.6 httpserver

最低要求:

  1. 路由注册
  2. 统一 JSON 输出
  3. 接入 auth

5.7 discovery

最低要求:

  1. 启动 UDP 监听
  2. 收包后读取 deviceinfo
  3. 收包后优先读取接收网卡上的管理地址
  4. 返回发现响应

6. 第一阶段建议数据结构

6.1 ServerConfig

建议字段:

type ServerConfig struct {
    HttpPort          int
    UdpPort           int
    MaintenanceIP     string
    MaintenanceCIDR   string
    AdminPassword     string
    Version           string
}

6.2 DeviceInfo

建议字段:

type DeviceInfo struct {
    DeviceID      string
    Hostname      string
    OSVersion     string
    ServerVersion  string
    UptimeSeconds int64
}

6.3 NetworkInterface

建议字段:

type NetworkInterface struct {
    Name                 string
    SystemName           string
    Role                 string
    LinkUp               bool
    IsManagement         bool
    IsSuggestedTarget    bool
    MAC                  string
    IPv4                 []IPv4Address
    Gateway              string
    DNS                  []string
}

6.4 IPv4Address

建议字段:

type IPv4Address struct {
    Address string
    Prefix  int
    Source  string
}

6.5 InterfacesResponse

建议字段:

type InterfacesResponse struct {
    ManagementInterface     string
    SuggestedTargetInterface string
    RequiresTargetSelection bool
    Interfaces              []NetworkInterface
}

7. 第一阶段建议目录落地

建议优先创建:

server/
  cmd/
    nettool-server/
  internal/
    config/
    logger/
    auth/
    deviceinfo/
    discovery/
    httpserver/
    network/
      interfaces/

8. 第一阶段联调前置条件

在 Windows 客户端开始联调前,Server 至少应满足:

  1. 能在 Ubuntu 24 上正常启动
  2. 能监听 HTTP 端口
  3. 能响应 UDP 发现
  4. 能返回设备信息
  5. 能返回真实接口列表
  6. 能识别当前管理接口

9. 第一阶段验证顺序

建议按下面顺序验证:

  1. 本机直接访问 GET /api/health
  2. 本机直接访问 GET /api/device/info
  3. 本机直接访问 GET /api/network/interfaces
  4. Windows 端发送 UDP 发现
  5. Windows 端通过密码访问上述 3 个接口

10. 第一阶段完成标准

满足以下条件即可认为第一阶段完成:

  1. Windows 能发现设备
  2. Windows 能通过固定密码连接设备
  3. Windows 能看到设备信息
  4. Windows 能看到真实接口列表
  5. Windows 能自动识别当前管理接口
  6. 当接口数为 2 时,Windows 能拿到建议目标接口

11. 第二阶段入口

第一阶段完成后,再进入第二阶段:

  1. GET /api/network/config
  2. POST /api/network/validate
  3. POST /api/network/apply
  4. POST /api/network/rollback
  5. GET /api/tasks/{task_id}

也就是先把“只读链路”做稳,再开始改配置。