Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .envrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
use flake
22 changes: 19 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Created by https://www.toptal.com/developers/gitignore/api/windows,linux,macos,visualstudio,rider,csharp
# Edit at https://www.toptal.com/developers/gitignore?templates=windows,linux,macos,visualstudio,rider,csharp
# Created by https://www.toptal.com/developers/gitignore/api/windows,linux,macos,direnv,visualstudio,visualstudiocode,rider,csharp
# Edit at https://www.toptal.com/developers/gitignore?templates=windows,linux,macos,direnv,visualstudio,visualstudiocode,rider,csharp

### Csharp ###
## Ignore Visual Studio temporary files, build results, and
Expand Down Expand Up @@ -399,6 +399,9 @@ FodyWeavers.xsd
# JetBrains Rider
*.sln.iml

### direnv ###
/.direnv/

### Linux ###

# temporary files which can be created if a process still has a handle open of a deleted file
Expand Down Expand Up @@ -525,6 +528,19 @@ fabric.properties
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser

### VisualStudioCode ###
!.vscode/*.code-snippets

# Local History for Visual Studio Code

# Built Visual Studio Code Extensions
*.vsix

### VisualStudioCode Patch ###
# Ignore all local history of files
.history
.ionide

### Windows ###
# Windows thumbnail cache files
Thumbs.db
Expand Down Expand Up @@ -727,6 +743,6 @@ $RECYCLE.BIN/
### VisualStudio Patch ###
# Additional files built by Visual Studio

# End of https://www.toptal.com/developers/gitignore/api/windows,linux,macos,visualstudio,rider,csharp
# End of https://www.toptal.com/developers/gitignore/api/windows,linux,macos,direnv,visualstudio,visualstudiocode,rider,csharp

*.lscache
166 changes: 33 additions & 133 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,146 +1,46 @@
# xidio Agents Instructions

xidio(XiDian Internet Diagnostic Intelligence Operator)是一款跨平台的校园网诊断工具,由 Project Hazelita 基于 C# 和 .NET 开发,专门针对西安电子科技大学的网络环境
xidio(Xidian Internet Diagnostic Intelligence Operator) Project Hazelita 基于 C# 和 .NET 10 开发的跨平台西电校园网诊断工具

在为 xidio 贡献代码前,请先阅读 `README.md` 了解项目最新情况,并仔细阅读本文件、遵循下面的指引。请确保你的修改是**最小化**的,并且与项目的现有内容保持一致、互不冲突。
## 开始工作前

## 各部分功能
1. 阅读 `README.md` 了解当前能力与构建方式。
2. 阅读 `docs/architecture.md` 和修改模块的相关文档。
3. 对照 `ROADMAP.md` 确认需求边界;路线图是开发方向,不代表功能已实现。
4. 检查当前分支和工作区,保留用户的现有修改。

`xidio.Core` 主要负责诊断、修复和上报。
## 修改原则

### 诊断 / Diagnostics
- 保持修改最小化,避免与任务无关的重构、格式化或依赖升级。
- 优先使用 .NET 跨平台 API;平台专用能力必须放入对应的 `xidio.Platform.*` Provider。
- 不得在 `xidio.Core` 中使用 `Console`、Spectre.Console、Avalonia 或其他 UI API。
- `xidio.Core` 应输出结构化数据,并明确分离诊断、修复和上报逻辑。
- 所有 I/O 与长时间操作使用异步 API,接受 `CancellationToken`,必要时报告结构化进度。
- 探测失败也是诊断数据;保留目标、时间、耗时、错误类型与必要原始信息,不得只返回布尔值。
- 未获得用户明确同意时,不收集 hosts、代理、VPN、防火墙、安全软件、账号业务状态等敏感信息,不执行修复。
- MAC、BSSID、账号、在线设备与日志中的个人信息默认脱敏;任何上报都必须 opt-in 且可预览。

xidio 需要诊断用户设备,确定网络问题的根源。诊断过程分为**信息收集**和**分析**两步。
## 架构边界

#### 收集信息
- `xidio.Core`:诊断、分析、修复、上报的抽象、模型与通用逻辑。
- `xidio.CLI`:终端交互、进度展示、结果渲染与平台 Provider 组装。
- `xidio.Platform.Windows`:Windows 系统 API、WLAN、RAS/PPPoE 及其他 Windows 专用收集。
- `xidio.Platform.macOS`:macOS 系统命令与 API 适配。
- `xidio.Platform.Linux`:Linux 系统 API,以及 `ip`、`resolvectl`、`nmcli`、`iw` 等工具的可控适配。

xidio 将从用户及其设备上收集必要信息。以下列出部分需要采集的信息类别
新增平台信息时,先在 Core 定义平台无关的模型和接口,再在各 Provider 中实现。单一平台不支持某项能力时,应返回明确的“不支持/不可用”结果,不得伪造数据或导致整份报告失败

##### 用户场景信息
## 验证

xidio 会主动询问:
- 根据修改范围运行最小相关构建或测试,再考虑完整解决方案构建。
- Windows:`dotnet build xidio/xidio.slnx -c Release`。
- Linux/macOS:`dotnet build xidio/xidio.CLI/xidio.CLI.csproj -c Release -f net10.0`。
- 平台专用修改必须说明实际验证平台;不得把交叉编译当作真实系统行为验证。
- 对外部命令的解析应覆盖空输出、命令不存在、非零退出码、本地化输出和权限不足。

1. 用户所在位置。
2. 当前连接方式。连接方式划分为:
- **直接连接**:用户直接通过 Wi-Fi 连接校内任意 AP,或通过网口以 PPPoE 方式连接。
- **间接连接**:用户通过路由器等方式接入,数据经校园网设施传输。
- **其他连接**:用户通过手机热点等方式连接,数据未经过校园网设施。
3. 遇到的问题。例如:无法连接 Wi-Fi;已连接但显示“无 Internet”;未跳转到 Portal;Portal 认证成功但无法打开网页;部分应用不能使用;拨号失败;拨号成功但无 Internet 等。
4. 问题波及范围。例如:仅本机有问题;同宿舍其他人也有问题;同楼层其他人也有问题;不清楚。
## Git 与文档

这些信息有助于网管会判断是否为区域性问题。

##### 系统与网卡基础信息

xidio 需要收集:

1. 操作系统信息:操作系统类型(Windows、Linux 或 macOS)、版本号;xidio 版本号;xidio 是否以管理员/root 权限运行。
2. 时间:本机时间、某 NTP 服务器时间,以及两者的差值。
3. 网络接口:所有网络接口及主网络接口(物理接口)的接口名称、类型、是否启用、是否已连接、(若有)MAC 地址、链路速度、MTU、接口 metric 等,以及当前默认路由所使用的具体网卡。

如果用户使用 Wi-Fi 连接,还需收集:当前 Wi-Fi 的 SSID、BSSID、RSSI、频段、信道、PHY 类型、认证/加密类型、连接时长、当前连接速率,以及可见的 SSID 列表。

如果用户使用 PPPoE 连接,还需收集:网线是否插好;对端是否有链路;链路速度;是否存在 PPPoE/宽带连接,若存在,则获取 PPPoE 的当前状态、分配到的 IP、DNS、默认路由。在可行的情况下,可尝试进行一次 RAS 拨号并记录 RAS 错误码;(在 Windows 上)还要检查宽带连接名称是否含有非 ASCII 字符,以及用户是否安装了 Npcap 或 WinPcap。

##### IP、DHCP、DNS、路由、ARP 信息

如果用户已连接到至少一个网络,xidio 将收集:IPv4 地址、IPv6 地址、子网掩码/前缀长度、是否通过 DHCP 获取地址(若是,则收集 DHCP 服务器地址、租约开始和过期时间)、默认网关、DNS 服务器、路由表、ARP/IPv6 Neighbor 表。

##### 本机因素

在征得用户同意后,xidio 可以进一步收集:

1. 系统代理设置:包括 Windows Internet Options 代理、WinHTTP 代理、系统代理、环境变量 `HTTP_PROXY`/`HTTPS_PROXY`、macOS 网络代理等。
2. VPN/TUN/TAP 相关状态:如 Clash TUN、v2rayN、WireGuard、OpenVPN、ZeroTier、Tailscale、WARP、VMware/VirtualBox 虚拟网卡、WSL 虚拟网卡等。
3. DNS-over-HTTPS 与 Secure DNS 状态。
4. hosts 文件内容。
5. 防火墙状态。
6. 安全软件及过滤型驱动。
7. 浏览器代理设置。

##### 认证与业务状态

在征得用户同意后,xidio 可检查:认证服务器是否可达;当前用户是否已通过校园网认证;当前账号是否在线;当前设备是否出现在在线列表中;套餐是否生效;用户所属运营商/套餐类型;宽带优先级;是否欠费;是否达到设备数量上限。

##### 主动探测信息

我们选定以下目标进行主动探测:

1. 校园内目标:认证服务器域名和 IP、校内若干服务的 HTTP/HTTPS 域名。
2. 校园外目标:xidio 官方域名、HTTP 204 端点、HTTPS 固定响应体端点、TCP Echo 或 Connect 端点、UDP Echo/Jitter 端点。

执行探测或收集:ARP 默认网关信息;ICMP Ping 情况;到 80、443、53(TCP)的 TCP Connect 情况;UDP DNS 查询;UDP Echo/Jitter/丢包测试;HTTP GET 情况;HTTPS 握手与证书校验;DNS 解析情况(包括使用系统解析器和直接向当前 DNS 服务器查询,分别测试 A 和 AAAA 记录)。更进一步,还可进行 Traceroute/MTR、MTU/PMTUD 测试。

#### 分析

我们按以下顺序逐层排查问题。每次检测需覆盖所有层,且每层不能仅返回“是/否”,必须附带完整的探测信息。

```text
本机网卡 -> 有线/Wi-Fi 情况 -> IP 获取 -> 默认网关可达 -> 认证服务可达 -> 认证服务正常 -> DNS 正常 -> 探测目标可达 -> 具体协议
```

下面给出典型的判断流程,xidio 默认按照该顺序排查,后续也支持用户自定义判断规则。

##### Wi-Fi 场景

###### 无法连接 Wi-Fi

适用于设备附近扫不到校园 SSID、信号极弱,或认证失败的情形。SSID 不可见可能是 AP 覆盖不足或无线网卡问题;SSID 可见且信号不弱但无法连接,可能是配置文件损坏、认证方式错误或 AP 故障。xidio 可建议用户忘记网络后重新连接、移动到 AP 附近等。

###### Wi-Fi 连接成功但未获取到 IP

适用于已关联 SSID/BSSID,但 IPv4 地址为 `169.254.x.x` 或为空,DHCP 服务器为空或请求超时等情形。若连接其他 SSID 也失败,则可能是本机 DHCP 服务、防火墙或驱动问题;若同一 AP 下仅个别用户失败,可能是本机网络栈或网卡驱动问题;若多个用户同时失败,则可能是 AP/接入交换机/VLAN/DHCP 中继问题。

###### 获取到 IP 但没有默认网关

适用于 DHCP 成功分配 IP,但默认网关为空,或路由表中无 `0.0.0.0/0` 的情形。可能由 DHCP 配置异常,或用户自行配置了错误的网络参数导致。

###### 有默认网关但不可达

适用于有默认网关,但 ARP 表中无对应 MAC 地址,且 Ping/TCP 探测网关失败、校园认证 IP 也不可达等情况。可能是 AP/交换机/网关/VLAN 异常。

###### 网关可达但认证页面打不开

如果解析 Portal 域名失败但 IP 可达,则可能是 DNS 故障,此时可检查 DNS 和 DoH/公共 DNS 状况。

如果 Portal 的域名和 IP 均不可达,可能是校内认证服务存在故障。

###### 认证成功但无法上网

按层次分析:如果能访问公网 IP 但无法解析域名,则问题可能在 DNS。若 DNS 正常但 TCP 80/443 不通,可能是出口路由、防火墙、代理或 VPN 问题。若 TCP 80/443 正常但浏览器无法打开网页,可能是系统代理、浏览器代理、证书、系统时间或插件问题。若 TCP 正常但 UDP 丢包严重,可能与 UDP/QoS/运营商出口/CDN/上游拥塞有关。若 IPv4 正常但 IPv6 异常(或反之),则可能是双栈配置问题,浏览器 Happy Eyeballs 机制或地址优先级导致体验异常。

##### PPPoE 场景

###### 以太网无链路

适用于以太网未连接、无 carrier 或链路速度为 0 的情形。通常由网线未连接或连接错误导致。

###### 有链路但未拨号

适用于以太网处于 `up` 状态,但没有 PPP 接口和 PPPoE 默认路由的情形,一般是因为尚未拨号。

###### PPPoE 拨号失败

若有拨号错误码,可对照错误码进行诊断。如果接口有链路但 PPPoE Discovery 无任何响应,则优先考虑接入侧问题。

###### PPPoE 拨号成功但无法联网

需检查 PPP 接口是否获取到 IP、DNS,默认路由是否经过 PPP 接口,以及是否开启了系统代理等。

##### 其他连接场景

对于其他连接方式,xidio 不提供专门的分析帮助,因为这些情况通常与校园网无关。

#### 其他问题

##### Captive Portal Detection 失效

若未自动弹出认证页面,但可手动访问 Portal,则只是 Captive Portal 探测机制失效;若域名访问失败而 IP 访问成功,则为 DNS 问题;若两者均失败,则通常是认证服务器路径或网关问题。

##### Windows 侧的“无 Internet”连接

Windows 显示的“无 Internet”主要依赖 NCSI 探测结果。xidio 不应仅以此为依据,应手动测试默认网关、Portal、DNS、HTTP 204、HTTPS 以及主动探测目标等情况,以判断是否真正无 Internet 连接。

##### 仅部分应用无法访问互联网

适用于能上 QQ 但不能打开网页等场景。此类问题成因复杂,xidio 可进行基本探测,如基础 HTTP/HTTPS 连通性、DNS 解析、TCP 443、UDP 443/QUIC 等。
- 遵循 Git Flow:功能与普通修复从 `develop` 分支开始,已发布版本的紧急修复从 `main` 建立 `hotfix/*`。
- 提交信息遵循 Conventional Commits,推荐使用精确 scope,例如 `feat(linux): collect wireless details`。
- 不要重写、压缩或删除用户现有提交,除非用户明确要求。
- 功能范围或计划变化时更新 `ROADMAP.md`;用户可见的使用、构建或平台状态变化时同步更新 `README.md` 和 `CHANGELOG.md`。
41 changes: 41 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Changelog

本项目的所有重要变更都将记录在此文件中。

本文档格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),项目遵循 [Semantic Versioning](https://semver.org/lang/zh-CN/)。

## [Unreleased]

## [0.1.1] - 2026-07-11

### Added

- 增加 Linux 平台 Provider,支持系统与权限、物理网卡与驱动、Wi-Fi、DHCP、路由、metric、默认路由和邻居表信息收集。
- 增加 Nix flake、锁文件与 direnv 集成,为 Linux 开发环境提供 .NET 10、`iproute2`、NetworkManager 和 `iw`。
- 增加 Roadmap、Contributing、MIT License 与完整的项目文档。
- 增加项目图标与 Logo 的 PNG 资源。

### Changed

- 重写 `AGENTS.md`,将开发路线与诊断范围迁移至 `ROADMAP.md`。
- 根据当前 nixpkgs 支持范围,Nix devShell 支持 `x86_64-linux`、`aarch64-linux` 和 `aarch64-darwin`。

### Fixed

- 修复未征得用户同意即收集系统代理信息的隐私问题。
- 修复 CLI 原样显示 MAC、BSSID 与邻居链路层地址的问题,默认隐藏设备标识字节。

## [0.1.0] - 2026-05-22

### Added

- 增加交互式 CLI,用于收集用户场景并展示网络诊断报告。
- 增加 `xidio.Core` 诊断抽象、结构化模型、进度报告和可取消的信息收集流程。
- 增加 Windows 平台网络诊断 Provider,覆盖网络接口、地址、网关、DHCP、DNS、metric、路由和 Wi-Fi 信息。
- 增加 macOS 平台网络诊断 Provider 的初始实现。
- 增加项目 Logo、图标与 Figma 设计源文件。
- 增加 CI、标签发布工作流与 Nerdbank.GitVersioning 版本管理。

[0.1.0]: https://github.com/LyCecilion/xidio/releases/tag/v0.1.0
[0.1.1]: https://github.com/LyCecilion/xidio/compare/v0.1.0...v0.1.1
[Unreleased]: https://github.com/LyCecilion/xidio/compare/v0.1.1...HEAD
47 changes: 47 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# Contributing to xidio

感谢你愿意帮助 xidio 更准确地诊断西电校园网问题。我们接受 Issue 和 Pull Request;不论是问题复现、平台适配、诊断规则还是文档改进,都欢迎参与。

## 提交 Issue

在新建 Issue 前,请先搜索是否已有相同问题。报告 Bug 时建议包含:

- xidio 版本、操作系统与系统版本;
- 连接方式与可稳定复现的步骤;
- 期望结果、实际结果与必要日志;
- 是否以管理员或 root 权限运行。

发布日志、截图或诊断报告前,请删除账号、密码、完整 MAC/BSSID、IP 等不必要的个人或网络标识信息。

## 提交 Pull Request

1. 从最新的 `develop` 分支创建短期分支:新功能使用 `feature/<name>`,普通修复使用 `fix/<name>`。仅针对已发布版本的紧急修复从 `main` 创建 `hotfix/<name>`。
2. 保持修改最小化,不要在同一 PR 中混入无关重构。
3. 提交信息遵循 [Conventional Commits](https://www.conventionalcommits.org/),例如 `feat(linux): collect default route` 或 `fix(core): preserve probe cancellation`。
4. 根据修改所在平台运行构建和相关测试,并在 PR 中说明未能验证的平台。
5. 默认将 PR 提交到 `develop`,在描述中关联 Issue,并说明用户可见变化、验证方法与隐私影响。

## 开发约定

- 先阅读 [`README.md`](./README.md)、[`AGENTS.md`](./AGENTS.md) 与 [`docs/architecture.md`](./docs/architecture.md)。
- `xidio.Core` 不得依赖 CLI/GUI,应输出结构化数据,并为长任务提供异步、进度与取消支持。
- 平台专用能力放入相应的 `xidio.Platform.*` 项目,通过 Core 中的抽象调用。
- 收集敏感信息或执行修复前必须获得用户明确同意;上报始终保持 opt-in。

## 构建

Windows:

```powershell
dotnet restore xidio/xidio.slnx
dotnet build xidio/xidio.slnx -c Release --no-restore
```

Linux 或 macOS:

```bash
dotnet restore xidio/xidio.CLI/xidio.CLI.csproj
dotnet build xidio/xidio.CLI/xidio.CLI.csproj -c Release -f net10.0 --no-restore
```

更多开发环境信息见 [`README.md`](./README.md#-development)。
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 Project Hazelita

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Loading
Loading