- 删除旧的 build-all.sh 和 upload.sh 脚本 - 新增 all-build.sh 和 all-upload-release.sh 脚本,支持从 version.json 自动读取版本号 - 更新 Makefile 和 README.md 以反映脚本名称的更改和新功能
628 lines
17 KiB
Markdown
628 lines
17 KiB
Markdown
# LinkMaster Node
|
||
|
||
LinkMaster 节点服务,用于执行网络测试任务。
|
||
|
||
## 功能
|
||
|
||
- HTTP GET/POST 测试
|
||
- Ping 测试
|
||
- DNS 查询
|
||
- Traceroute 路由追踪
|
||
- Socket 连接测试
|
||
- TCPing 端口延迟测试
|
||
- FindPing IP段批量ping检测
|
||
- 持续 Ping/TCPing 测试
|
||
- 心跳上报
|
||
- 日志文件输出(支持配置日志文件路径和级别)
|
||
- 心跳故障排查工具
|
||
|
||
## 安装
|
||
|
||
### 方式一:一键安装(推荐)
|
||
|
||
从 GitHub 一键安装,只需指定后端服务器地址。安装脚本会自动克隆源码并编译安装:
|
||
|
||
```bash
|
||
# 基本用法(替换为实际的 GitHub 仓库地址)
|
||
curl -fsSL https://raw.githubusercontent.com/yourbask/linkmaster-node/main/install.sh | bash -s -- http://your-backend-server:8080
|
||
|
||
# 示例
|
||
# 节点和后端在同一服务器
|
||
curl -fsSL https://raw.githubusercontent.com/yourbask/linkmaster-node/main/install.sh | bash -s -- http://localhost:8080
|
||
|
||
# 节点和后端在不同服务器
|
||
curl -fsSL https://raw.githubusercontent.com/yourbask/linkmaster-node/main/install.sh | bash -s -- http://192.168.1.100:8080
|
||
```
|
||
|
||
**重要说明:**
|
||
- 节点端需要直接连接后端服务器(端口 8080),不是前端地址
|
||
- 前端通过 `/api` 路径代理到后端,但节点端不使用代理
|
||
- 如果后端在公网,使用公网 IP 或域名
|
||
- 如果后端在内网,使用内网 IP
|
||
- **本项目是独立的 GitHub 仓库**,与前后端项目分离
|
||
|
||
**安装说明:**
|
||
- 自动检测系统类型和架构
|
||
- 自动安装系统依赖(包括 Git 和 Go)
|
||
- 从 GitHub 克隆源码到 `/opt/linkmaster-node`
|
||
- 自动编译并安装二进制文件
|
||
- 自动创建 systemd 服务
|
||
- 自动启动服务并验证
|
||
|
||
**指定分支安装:**
|
||
```bash
|
||
GITHUB_BRANCH=develop curl -fsSL https://raw.githubusercontent.com/yourbask/linkmaster-node/main/install.sh | bash -s -- http://your-backend-server:8080
|
||
```
|
||
|
||
### 方式二:手动编译安装
|
||
|
||
```bash
|
||
# 克隆仓库
|
||
git clone https://github.com/yourbask/linkmaster-node.git
|
||
cd linkmaster-node
|
||
|
||
# 编译
|
||
go build -o agent ./cmd/agent
|
||
|
||
# 安装(需要root权限)
|
||
sudo cp agent /usr/local/bin/linkmaster-node
|
||
sudo chmod +x /usr/local/bin/linkmaster-node
|
||
|
||
# 或使用安装脚本
|
||
./install.sh http://your-backend-server:8080
|
||
```
|
||
|
||
### 方式三:手动运行
|
||
|
||
```bash
|
||
# 克隆仓库
|
||
git clone https://github.com/yourbask/linkmaster-node.git
|
||
cd linkmaster-node
|
||
|
||
# 运行(会自动拉取最新代码并编译)
|
||
BACKEND_URL=http://your-backend-server:8080 ./run.sh start
|
||
```
|
||
|
||
## 配置
|
||
|
||
### 环境变量
|
||
|
||
- `BACKEND_URL`: 后端服务地址(必需,默认: http://localhost:8080)
|
||
- `CONFIG_PATH`: 配置文件路径(可选,默认: config.yaml)
|
||
- `LOG_FILE`: 日志文件路径(可选,默认: node.log)
|
||
|
||
### 配置文件(可选)
|
||
|
||
创建 `config.yaml` 文件:
|
||
|
||
```yaml
|
||
server:
|
||
port: 2200
|
||
backend:
|
||
url: http://your-backend-server:8080
|
||
heartbeat:
|
||
interval: 60
|
||
log:
|
||
file: node.log # 日志文件路径(默认: node.log,空则输出到标准错误)
|
||
level: info # 日志级别: debug, info, warn, error(默认: info)
|
||
debug: false
|
||
```
|
||
|
||
**日志配置说明:**
|
||
- `log.file`: 日志文件路径。如果为空,日志将输出到标准错误(stderr)
|
||
- `log.level`: 日志级别,支持 `debug`、`info`、`warn`、`error`
|
||
- 也可以通过环境变量 `LOG_FILE` 设置日志文件路径
|
||
- 日志文件会自动创建,如果目录不存在会自动创建
|
||
|
||
## 运行脚本
|
||
|
||
使用 `run.sh` 脚本管理节点端。**每次启动时会自动拉取最新代码并重新编译**:
|
||
|
||
```bash
|
||
# 启动服务(会自动拉取最新代码并编译)
|
||
./run.sh start
|
||
|
||
# 停止服务
|
||
./run.sh stop
|
||
|
||
# 重启服务(会拉取最新代码并重新编译)
|
||
./run.sh restart
|
||
|
||
# 查看状态
|
||
./run.sh status
|
||
|
||
# 查看日志
|
||
./run.sh logs
|
||
|
||
# 查看完整日志
|
||
./run.sh logs-all
|
||
|
||
# 指定后端地址启动
|
||
BACKEND_URL=http://192.168.1.100:8080 ./run.sh start
|
||
```
|
||
|
||
**重要提示:**
|
||
- 启动脚本会自动执行 `git pull` 拉取最新代码
|
||
- 拉取代码后会自动执行 `go mod download` 更新依赖
|
||
- 然后自动编译生成新的二进制文件
|
||
- 如果 Git 拉取失败(如网络问题),会使用当前代码继续编译
|
||
- 如果编译失败,服务不会启动
|
||
|
||
## 脚本工具
|
||
|
||
项目提供了多个脚本工具,方便安装、卸载、运行、编译和发布。
|
||
|
||
### 1. install.sh - 一键安装脚本
|
||
|
||
自动安装 LinkMaster 节点端到系统,包括依赖安装、源码编译、systemd 服务配置等。
|
||
|
||
**使用方法:**
|
||
|
||
```bash
|
||
# 通过 curl 下载并安装(推荐)
|
||
curl -fsSL https://gitee.nas.cpolar.cn/yoyo/linkmaster-node/raw/branch/main/install.sh | bash -s -- http://your-backend-server:8080
|
||
|
||
# 本地运行安装脚本
|
||
./install.sh http://your-backend-server:8080
|
||
|
||
# 指定分支安装
|
||
GITHUB_BRANCH=develop curl -fsSL https://gitee.nas.cpolar.cn/yoyo/linkmaster-node/raw/branch/main/install.sh | bash -s -- http://your-backend-server:8080
|
||
```
|
||
|
||
**功能特性:**
|
||
- 自动检测系统类型和架构(Linux/macOS, amd64/arm64)
|
||
- 自动检测并配置最快的镜像源(Ubuntu/Debian/CentOS)
|
||
- 自动安装系统依赖(curl, wget, git, ping, traceroute 等)
|
||
- 自动安装 Go 环境(优先使用系统包管理器,失败则从官网下载)
|
||
- 优先从 Releases 下载预编译二进制文件,失败则从源码编译
|
||
- 自动创建 systemd 服务并配置自启动
|
||
- 自动配置防火墙规则(开放 2200 端口)
|
||
- 自动登记节点到后端服务器
|
||
- 自动启动服务并验证安装
|
||
|
||
**安装位置:**
|
||
- 二进制文件:`/usr/local/bin/linkmaster-node`
|
||
- 源码目录:`/opt/linkmaster-node`
|
||
- 服务文件:`/etc/systemd/system/linkmaster-node.service`
|
||
- 配置文件:`/opt/linkmaster-node/config.yaml`
|
||
|
||
### 2. uninstall.sh - 一键卸载脚本
|
||
|
||
完全卸载 LinkMaster 节点端,包括停止服务、删除文件、清理配置等。
|
||
|
||
**使用方法:**
|
||
|
||
```bash
|
||
# 通过 curl 下载并运行
|
||
curl -fsSL https://gitee.nas.cpolar.cn/yoyo/linkmaster-node/raw/branch/main/uninstall.sh | bash
|
||
|
||
# 本地运行卸载脚本
|
||
./uninstall.sh
|
||
|
||
# 卸载并删除防火墙规则
|
||
./uninstall.sh --remove-firewall
|
||
```
|
||
|
||
**功能特性:**
|
||
- 停止并禁用 systemd 服务
|
||
- 删除 systemd 服务文件和配置目录
|
||
- 删除二进制文件(`/usr/local/bin/linkmaster-node`)
|
||
- 删除源码目录(`/opt/linkmaster-node`)
|
||
- 清理所有残留进程
|
||
- 重新加载 systemd daemon
|
||
- 可选:删除防火墙规则(默认保留)
|
||
|
||
**注意事项:**
|
||
- 卸载前会询问确认(交互式环境)
|
||
- 默认保留防火墙规则,避免影响其他服务
|
||
- 使用 `--remove-firewall` 参数可删除防火墙规则
|
||
|
||
### 3. run.sh - 运行管理脚本
|
||
|
||
用于管理节点端的启动、停止、重启、状态查看和日志查看。**每次启动时会自动拉取最新代码并重新编译**。
|
||
|
||
**使用方法:**
|
||
|
||
```bash
|
||
# 启动服务(会自动拉取最新代码并编译)
|
||
./run.sh start
|
||
|
||
# 停止服务
|
||
./run.sh stop
|
||
|
||
# 重启服务(会拉取最新代码并重新编译)
|
||
./run.sh restart
|
||
|
||
# 查看运行状态
|
||
./run.sh status
|
||
|
||
# 实时查看日志
|
||
./run.sh logs
|
||
|
||
# 查看完整日志
|
||
./run.sh logs-all
|
||
|
||
# 显示帮助信息
|
||
./run.sh help
|
||
|
||
# 指定后端地址启动
|
||
BACKEND_URL=http://192.168.1.100:8080 ./run.sh start
|
||
```
|
||
|
||
**功能特性:**
|
||
- 启动时自动执行 `git pull` 拉取最新代码
|
||
- 自动执行 `go mod download` 更新依赖
|
||
- 自动编译生成新的二进制文件
|
||
- 自动检测端口占用并提示处理
|
||
- 后台运行并保存 PID 文件
|
||
- 健康检查验证服务状态
|
||
- 支持通过环境变量 `BACKEND_URL` 指定后端地址
|
||
|
||
**环境变量:**
|
||
- `BACKEND_URL`: 后端服务地址(默认: `http://localhost:8080`)
|
||
|
||
### 4. start-systemd.sh - systemd 启动脚本
|
||
|
||
用于 systemd 服务启动,直接运行二进制文件。如果二进制文件不存在,会自动拉取代码并编译。
|
||
|
||
**使用场景:**
|
||
- 由 systemd 服务自动调用
|
||
- 不需要手动运行
|
||
|
||
**功能特性:**
|
||
- 检查二进制文件是否存在且有效
|
||
- 如果二进制文件不存在,自动拉取代码并编译
|
||
- 使用 vendor 目录编译(无需网络连接)
|
||
- 直接运行二进制文件(systemd 管理进程)
|
||
|
||
**注意事项:**
|
||
- 此脚本由 systemd 服务调用,通常不需要手动运行
|
||
- 需要确保源码目录存在且是 Git 仓库
|
||
- 需要 Go 环境已安装并在 PATH 中
|
||
|
||
### 5. all-build.sh - 跨平台编译脚本
|
||
|
||
编译多个操作系统和架构的二进制文件,支持并行编译。**版本号自动从 `version.json` 读取**。
|
||
|
||
**使用方法:**
|
||
|
||
```bash
|
||
# 编译所有平台(自动使用 version.json 中的版本号)
|
||
./all-build.sh
|
||
|
||
# 只编译指定平台
|
||
./all-build.sh -p linux/amd64
|
||
|
||
# 编译前清理输出目录
|
||
./all-build.sh -c
|
||
|
||
# 设置并行编译数量
|
||
./all-build.sh -j 2
|
||
|
||
# 覆盖版本号(覆盖 version.json 中的版本)
|
||
./all-build.sh -v 1.0.0
|
||
|
||
# 只生成不带版本号的文件
|
||
./all-build.sh -s
|
||
|
||
# 列出所有支持的平台
|
||
./all-build.sh -l
|
||
|
||
# 显示帮助信息
|
||
./all-build.sh -h
|
||
```
|
||
|
||
**支持的平台:**
|
||
- `linux/amd64` - Linux x86_64
|
||
- `linux/arm64` - Linux ARM64
|
||
- `darwin/amd64` - macOS Intel
|
||
- `darwin/arm64` - macOS Apple Silicon
|
||
- `windows/amd64` - Windows x86_64
|
||
- `windows/arm64` - Windows ARM64
|
||
|
||
**功能特性:**
|
||
- ✅ **自动从 `version.json` 读取版本号**(无需手动指定)
|
||
- ✅ 支持并行编译(默认 4 个任务)
|
||
- ✅ 自动生成带版本号和不带版本号的文件
|
||
- ✅ 输出到 `bin/` 目录
|
||
- ✅ 显示编译进度和结果
|
||
- ✅ 支持清理输出目录
|
||
|
||
**输出文件:**
|
||
- `bin/agent-{os}-{arch}` - 不带版本号的二进制文件
|
||
- `bin/agent-{os}-{arch}-{version}` - 带版本号的二进制文件
|
||
- Windows 平台会自动添加 `.exe` 扩展名
|
||
|
||
**版本管理:**
|
||
版本号统一从 `version.json` 文件读取:
|
||
```json
|
||
{
|
||
"version": "1.1.0",
|
||
"tag": "v1.1.0"
|
||
}
|
||
```
|
||
|
||
### 6. all-upload-release.sh - 发布上传脚本
|
||
|
||
将编译好的二进制文件上传到 Releases 或通过其他方式发布。**版本号和标签自动从 `version.json` 读取,Token 已硬编码**。
|
||
|
||
**使用方法:**
|
||
|
||
```bash
|
||
# 上传到 Gitea Releases(自动从 version.json 和 .git/config 读取信息)
|
||
./all-upload-release.sh -m gitea
|
||
|
||
# 上传到 Gitea Releases(覆盖版本号和标签)
|
||
./all-upload-release.sh -m gitea -t v1.2.0 -v 1.2.0
|
||
|
||
# 上传到 GitHub Releases
|
||
./all-upload-release.sh -m github -r owner/repo -t v1.0.0 -v 1.0.0
|
||
|
||
# 通过 SCP 上传
|
||
./all-upload-release.sh -m scp -H example.com -u user -d /path/to/release
|
||
|
||
# 通过 SCP 上传(指定私钥)
|
||
./all-upload-release.sh -m scp -H example.com -u user -d /path/to/release -k ~/.ssh/id_rsa
|
||
|
||
# 通过 FTP 上传
|
||
./all-upload-release.sh -m ftp -H ftp.example.com -u user -d /path/to/release
|
||
|
||
# 复制到本地目录
|
||
./all-upload-release.sh -m local -d /path/to/release
|
||
|
||
# 只打包不上传
|
||
./all-upload-release.sh --pack-only
|
||
|
||
# 不上传压缩包,直接上传二进制文件
|
||
./all-upload-release.sh -m scp --no-pack -H example.com -u user -d /path/to/release
|
||
|
||
# 显示帮助信息
|
||
./all-upload-release.sh -h
|
||
```
|
||
|
||
**支持的上传方式:**
|
||
- `gitea` - Gitea Releases(自动从 .git/config 读取仓库信息)
|
||
- `github` - GitHub Releases(需要 GitHub CLI `gh`)
|
||
- `scp` - 通过 SCP 上传到远程服务器
|
||
- `ftp` - 通过 FTP 上传
|
||
- `local` - 复制到本地目录
|
||
|
||
**功能特性:**
|
||
- ✅ **自动从 `version.json` 读取版本号和标签**(无需手动指定)
|
||
- ✅ **Token 已硬编码**(无需手动指定)
|
||
- ✅ 自动打包二进制文件(tar.gz 或 zip)
|
||
- ✅ 自动创建发布说明
|
||
- ✅ 支持指定平台上传
|
||
- ✅ 支持自定义版本号和标签(覆盖配置文件)
|
||
- ✅ 支持自定义发布说明
|
||
- ✅ 自动检测并处理已存在的 Release
|
||
|
||
**参数说明:**
|
||
- `-m, --method`: 上传方式(gitea|github|scp|ftp|local,默认: gitea)
|
||
- `-v, --version`: 版本号(默认: 从 version.json 读取)
|
||
- `-t, --tag`: Git 标签(默认: 从 version.json 读取)
|
||
- `-p, --platform`: 只上传指定平台
|
||
- `-T, --token`: 访问令牌(已硬编码,此选项已废弃)
|
||
- `-H, --host`: 主机地址(SCP/FTP)
|
||
- `-u, --user`: 用户名(SCP/FTP)
|
||
- `-d, --dest`: 目标路径(SCP/FTP/local)
|
||
- `-k, --key`: 私钥路径(SCP)
|
||
- `--pack-only`: 只打包不上传
|
||
- `--no-pack`: 不上传压缩包,直接上传二进制文件
|
||
|
||
**版本管理:**
|
||
版本号和标签统一从 `version.json` 文件读取:
|
||
```json
|
||
{
|
||
"version": "1.1.0",
|
||
"tag": "v1.1.0"
|
||
}
|
||
```
|
||
|
||
**典型工作流程:**
|
||
```bash
|
||
# 1. 编译所有平台(自动使用 version.json 中的版本号)
|
||
./all-build.sh
|
||
|
||
# 2. 上传到 Gitea Releases(自动使用 version.json 中的版本号和标签)
|
||
./all-upload-release.sh -m gitea
|
||
```
|
||
|
||
### 7. vendor.sh - Vendor 依赖打包脚本
|
||
|
||
将项目依赖下载到 vendor 目录,客户端克隆后可直接编译,无需网络连接。
|
||
|
||
**使用方法:**
|
||
|
||
```bash
|
||
# 运行脚本(会自动下载依赖并创建 vendor 目录)
|
||
./vendor.sh
|
||
```
|
||
|
||
**功能特性:**
|
||
- 检查 Go 环境
|
||
- 配置 Go 代理(使用官方源)
|
||
- 下载所有依赖包
|
||
- 创建 vendor 目录
|
||
- 更新 .gitignore(允许 vendor 目录被提交)
|
||
- 自动添加到 Git 暂存区
|
||
|
||
**使用场景:**
|
||
- 项目需要离线编译能力
|
||
- 需要确保依赖版本一致性
|
||
- 客户端环境网络受限
|
||
|
||
**注意事项:**
|
||
- 需要 Go 环境已安装
|
||
- vendor 目录会比较大,需要提交到 Git
|
||
- 编译时使用 `-mod=vendor` 标志
|
||
|
||
**编译命令(使用 vendor):**
|
||
```bash
|
||
go build -mod=vendor -o agent ./cmd/agent
|
||
```
|
||
|
||
## API
|
||
|
||
### POST /api/test
|
||
|
||
统一测试接口
|
||
|
||
```json
|
||
{
|
||
"type": "ceGet|cePost|cePing|ceDns|ceTrace|ceSocket|ceTCPing|ceFindPing",
|
||
"url": "测试目标",
|
||
"params": {}
|
||
}
|
||
```
|
||
|
||
### POST /api/continuous/start
|
||
|
||
启动持续测试
|
||
|
||
```json
|
||
{
|
||
"type": "ping|tcping",
|
||
"target": "测试目标",
|
||
"interval": 10,
|
||
"max_duration": 60
|
||
}
|
||
```
|
||
|
||
### POST /api/continuous/stop
|
||
|
||
停止持续测试
|
||
|
||
```json
|
||
{
|
||
"task_id": "任务ID"
|
||
}
|
||
```
|
||
|
||
### GET /api/continuous/status?task_id=xxx
|
||
|
||
查询任务状态
|
||
|
||
### GET /api/health
|
||
|
||
健康检查
|
||
|
||
## 故障排查
|
||
|
||
### 心跳同步问题排查
|
||
|
||
如果节点无法同步心跳,可以使用排查脚本进行诊断:
|
||
|
||
```bash
|
||
# 运行心跳故障排查脚本
|
||
./check-heartbeat.sh
|
||
```
|
||
|
||
排查脚本会自动检查以下项目:
|
||
|
||
1. **进程状态** - 检查节点进程是否正在运行
|
||
2. **配置文件** - 检查配置文件是否存在和正确
|
||
3. **网络连接** - 检查能否连接到后端服务器
|
||
4. **日志分析** - 分析日志中的心跳相关错误
|
||
5. **手动测试** - 手动发送心跳测试连接
|
||
6. **系统资源** - 检查磁盘空间和内存使用情况
|
||
|
||
**常见问题及解决方案:**
|
||
|
||
1. **进程未运行**
|
||
```bash
|
||
./run.sh start
|
||
```
|
||
|
||
2. **网络连接失败**
|
||
- 检查后端服务是否正常运行
|
||
- 检查防火墙规则(确保可以访问后端端口)
|
||
- 检查 BACKEND_URL 配置是否正确
|
||
|
||
3. **心跳发送失败**
|
||
- 查看日志: `./run.sh logs`
|
||
- 检查后端服务日志
|
||
- 确认后端 `/api/node/heartbeat` 接口正常
|
||
|
||
4. **配置文件问题**
|
||
- 检查 `config.yaml` 文件格式是否正确
|
||
- 确认 `BACKEND_URL` 环境变量或配置文件中的 URL 正确
|
||
|
||
5. **查看详细日志**
|
||
```bash
|
||
# 实时查看日志
|
||
./run.sh logs
|
||
|
||
# 查看完整日志
|
||
./run.sh logs-all
|
||
```
|
||
|
||
### 日志功能
|
||
|
||
节点端支持将日志直接写入文件,便于排查问题和监控运行状态。
|
||
|
||
**日志配置方式:**
|
||
|
||
1. **环境变量**(推荐)
|
||
```bash
|
||
LOG_FILE=/var/log/linkmaster-node.log ./run.sh start
|
||
```
|
||
|
||
2. **配置文件**
|
||
在 `config.yaml` 中配置:
|
||
```yaml
|
||
log:
|
||
file: node.log # 日志文件路径
|
||
level: info # 日志级别: debug, info, warn, error
|
||
```
|
||
|
||
3. **默认行为**
|
||
- 默认日志文件:`node.log`(当前目录)
|
||
- 默认日志级别:`info`
|
||
- 如果未设置日志文件,日志输出到标准错误(stderr)
|
||
|
||
**日志特性:**
|
||
- ✅ 自动创建日志文件和目录
|
||
- ✅ 追加模式,不会覆盖已有日志
|
||
- ✅ JSON 格式,便于日志分析
|
||
- ✅ 包含调用信息(文件名和行号)
|
||
- ✅ Error 级别日志包含堆栈信息
|
||
|
||
**查看日志:**
|
||
```bash
|
||
# 实时查看日志
|
||
tail -f node.log
|
||
|
||
# 查看心跳相关日志
|
||
grep -i "心跳" node.log
|
||
|
||
# 查看错误日志
|
||
grep -i "error" node.log
|
||
|
||
# 查看最后100行
|
||
tail -n 100 node.log
|
||
```
|
||
|
||
## 更新日志
|
||
|
||
### v1.1.0 (最新)
|
||
|
||
**新增功能:**
|
||
- ✨ 添加日志文件输出功能,支持配置日志文件路径和级别
|
||
- ✨ 添加心跳故障排查工具 `check-heartbeat.sh`
|
||
- ✨ 支持通过环境变量 `LOG_FILE` 设置日志文件路径
|
||
- ✨ 日志自动创建目录,支持相对路径和绝对路径
|
||
|
||
**改进:**
|
||
- 🔧 优化日志初始化逻辑,支持直接写入文件
|
||
- 🔧 改进配置加载,支持日志配置项
|
||
- 📝 完善文档,添加故障排查章节
|
||
|
||
### v1.0.0
|
||
|
||
- 🎉 初始版本发布
|
||
- ✅ 支持 HTTP GET/POST 测试
|
||
- ✅ 支持 Ping、DNS、Traceroute 等网络测试
|
||
- ✅ 支持持续 Ping/TCPing 测试
|
||
- ✅ 支持心跳上报
|