gripebomb/ThreatDeck
GitHub: gripebomb/ThreatDeck
一款基于 Rust 终端 UI 的威胁情报多源聚合、关键词匹配与自动告警平台。
Stars: 0 | Forks: 0
# ThreatDeck
## 订阅源预览
## 警报预览
## 文章预览
## 关键词预览
## 标签预览
## 功能特性
- **多源订阅源管理** — 聚合来自 API、RSS/Atom 订阅源、网站抓取以及通过 Tor 访问的 `.onion` 站点的威胁情报
- **JSONPath API 模板** — 使用可配置的 JSONPath 表达式从 JSON API 中提取结构化数据(包括标题、描述、日期、URL 和来源字段)
- **关键词匹配** — 基于简单文本或正则表达式的关键词匹配,支持 4 个严重级别(低、中、高、严重)
- **警报生成** — 自动创建警报并支持去重(内容哈希)、摘要提取和元数据保留
- **文章缓存订阅** — 浏览 RSS/API 源中的每个缓存条目,并直接在终端中阅读清洗后的文章文本
- **标签系统** — 使用带有颜色的自定义标签来组织订阅源、关键词和警报
- **通知** — 通过电子邮件 (SMTP)、Webhook 或 Discord 发送警报,支持为每个通知渠道设置最低严重级别阈值
- **仪表盘概览** — 便捷的统计视图、严重程度分布、近期警报和 7 天趋势可视化
- **订阅源健康监控** — 跟踪连续失败次数、健康状态(健康/警告/错误/已禁用)以及详细的健康日志
- **设置管理** — 警报保留策略、主题选择、通知渠道配置
- **5 款内置主题** — dark、light、solarized、dracula、monokai
## 安装说明
### 从源代码安装 (Cargo)
要求 Rust 1.75 或更高版本。
```
# 克隆仓库
git clone https://github.com/gripebomb/ThreatDeck.git
cd ThreatDeck
# 构建和安装
cargo install --path .
# 或直接从 git 安装
cargo install --git https://github.com/gripebomb/ThreatDeck.git
```
该二进制文件将作为 `ThreatDeck` 安装在您的 Cargo bin 目录中(通常为 `~/.cargo/bin/`)。
### 从源代码构建
```
git clone https://github.com/gripebomb/ThreatDeck.git
cd ThreatDeck
# Debug 构建
cargo build
# Release 构建(已优化)
cargo build --release
# Binary 位置
target/release/ThreatDeck
```
## 快速入门
### 首次运行
首次启动时,`ThreatDeck` 会自动创建其配置和数据目录:
```
ThreatDeck
```
默认路径:
- **配置文件**: `~/.config/ThreatDeck/config.toml`
- **数据库**: `~/.local/share/ThreatDeck/ThreatDeck.db`
要查看您系统上的确切路径:
```
ThreatDeck --config-paths
```
### 添加订阅源
1. 启动应用程序:`ThreatDeck`
2. 按 `2` 导航至 **Feeds** (订阅源) 界面
3. 按 `a` 添加新的订阅源
4. 填写订阅源详情(使用 Tab 键切换字段,Enter 键保存):
- **Name (名称)**: 订阅源的描述性名称
- **URL**: 订阅源的 endpoint URL
- **Type (类型)**: API、RSS、Website 或 Onion
- **Interval (间隔)**: 轮询间隔,以秒为单位(最少 60 秒)
- 对于 API 订阅源:选择一个 API 模板并视情况提供 API 密钥
- 对于 Onion 订阅源:配置 Tor 代理(例如,`socks5h://127.0.0.1:9050`)
### 创建关键词
1. 按 `4` 导航至 **Keywords** (关键词) 界面
2. 按 `a` 添加关键词
3. 进行配置:
- **Pattern (模式)**: 用于匹配的文本或正则表达式模式
- **Type (类型)**: 简单文本 (Simple text) 或正则表达式 (Regex)
- **Case Sensitive (区分大小写)**: 匹配时是否区分大小写
- **Criticality (严重性)**: 低、中、高或严重
4. 在保存之前按 `t` 可针对样例输入测试该模式
### 查看警报
1. 按 `3` 导航至 **Alerts** (警报) 界面
2. 使用 `j`/`k` 或方向键浏览警报
3. 按 `r` 切换已读/未读状态
4. 按 `R` 将所有警报标记为已读
5. 按 `d` 删除单个警报,按 `D` 进入批量删除模式
## 配置
配置文件存储在 `~/.config/ThreatDeck/config.toml`:
```
theme = "dark" # dark, light, solarized, dracula, monokai
alert_retention_days = 30 # Auto-delete alerts older than N days
dashboard_refresh_secs = 30 # Dashboard data refresh interval
tick_rate_ms = 250 # UI tick rate (lower = more responsive)
max_health_log_entries = 100 # Maximum feed health log entries to retain
```
### 主题设置
通过设置界面 (`7`) 动态更改主题,或者直接编辑 `config.toml`:
| 主题 | 描述 |
|-----------|------------------------------------------|
| `dark` | 默认深色主题,色调柔和 |
| `light` | 适用于明亮终端的简洁浅色主题 |
| `solarized` | Ethan Schoonover 的 Solarized Dark 主题 |
| `dracula` | 流行的 Dracula 配色方案 |
| `monokai` | 经典的 Monokai 语法高亮主题 |
## 订阅源类型
### API (配合 JSONPath 模板)
对于 JSON REST API,使用 JSONPath 表达式提取字段。内置了两个模板:
| 模板 | 标题路径 | 描述路径 | 日期路径 | URL 路径 |
|---------------|-------------------|------------------|-----------------|------------|
| Ransomfeed.it | `$.post_title` | `$.description` | `$.discovered` | `$.source` |
| RansomLook | `$.name` | `$.description` | `$.published` | `$.url` |
可以通过 SQL 或 API 创建自定义模板。`pagination_config` 字段支持 offset/limit 和基于页码的分页策略。
**API 订阅源配置示例:**
- URL: `https://api.ransomfeed.it/v1/posts`
- 类型: `API`
- 模板: `Ransomfeed.it`
- 间隔: `300`(5 分钟)
### RSS / Atom
系统会自动解析标准的 RSS 2.0 和 Atom 1.0 订阅源。只需提供订阅源 URL 并选择类型为 `RSS`。
**RSS 订阅源示例:**
- `https://feeds.securityweek.com/securityweek`
- `https://www.bleepingcomputer.com/feed/`
### 网站抓取
对于没有结构化订阅源的 HTML 页面,抓取器会从页面主体提取文本内容以进行关键词匹配。提供目标 URL 并选择类型为 `Website`。
**示例:**
- URL: `https://www.cisa.gov/news-events/cybersecurity-advisories`
- 类型: `Website`
- 间隔: `600`(10 分钟)
### Onion / Tor
通过 Tor SOCKS5 代理访问 `.onion` 威胁情报源。配置 Tor 代理地址(默认为:`socks5h://127.0.0.1:9050`)并提供一个 `.onion` URL。
**前提条件:** 必须在本地运行带有 SOCKS5 监听器的 Tor。
**示例:**
- URL: `http://ransomxifxwc5ste.onion/posts`
- 类型: `Onion`
- Tor 代理: `socks5h://127.0.0.1:9050`
## 键盘快捷键
### 全局按键
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `1` | 仪表盘界面 |
| `2` | 订阅源界面 |
| `3` | 警报界面 |
| `4` | 文章界面 |
| `5` | 关键词界面 |
| `6` | 标签界面 |
| `7` | 日志界面 |
| `8` | 设置界面 |
| `q` | 退出应用程序 |
| `?` / `F1` | 切换帮助覆盖层 |
| `Esc` | 取消当前操作 / 返回上一级 |
### 仪表盘
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `r` | 刷新仪表盘数据 |
| `1-8` | 导航至其他界面 |
### 订阅源
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `j` / `↓` | 向下移动选择项 |
| `k` / `↑` | 向上移动选择项 |
| `a` / `n` | 添加新的订阅源 |
| `e` | 编辑选定的订阅源 |
| `d` | 删除选定的订阅源 (需确认) |
| `m` | 触发手动抓取 |
| `t` | 为订阅源分配标签 |
| `Enter` | 查看订阅源详情 |
| `Space` | 切换订阅源的启用/禁用状态 |
| `/` | 过滤订阅源 |
| `s` | 切换排序方式 |
### 警报
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `j` / `↓` | 向下移动选择项 |
| `k` / `↑` | 向上移动选择项 |
| `r` | 切换已读/未读状态 |
| `R` | 将所有警报标记为已读 |
| `d` | 删除选定的警报 |
| `D` | 进入批量删除模式 |
| `t` | 为警报分配标签 |
| `/` | 过滤警报 |
**批量模式 (在按下 `D` 之后):**
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `Space` | 切换当前警报的选择状态 |
| `a` | 选择所有警报 |
| `d` | 删除选定的警报 |
| `Esc` | 退出批量模式 |
### 文章
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `j` / `↓` | 向下移动选择项 |
| `k` / `↑` | 向上移动选择项 |
| `Enter` | 如有需要则抓取全文,然后打开阅读器 |
| `r` | 切换已读/未读状态 |
| `u` | 切换“仅显示未读”过滤器 |
| `/` | 过滤缓存的文章 |
| `Esc` | 关闭文章阅读器 |
### 关键词
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `j` / `↓` | 向下移动选择项 |
| `k` / `↑` | 向上移动选择项 |
| `a` / `n` | 添加新的关键词 |
| `e` | 编辑选定的关键词 |
| `d` | 删除选定的关键词 |
| `t` | 针对样例输入测试模式 |
| `Enter` | 切换关键词的启用/禁用状态 |
### 标签
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `j` / `↓` | 向下移动选择项 |
| `k` / `↑` | 向上移动选择项 |
| `a` / `n` | 添加新的标签 |
| `e` | 编辑选定的标签 |
| `d` | 删除选定的标签 |
### 日志
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `j` / `↓` | 向下移动选择项 |
| `k` / `↑` | 向上移动选择项 |
### 设置
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `Tab` | 在“常规/通知”选项卡之间切换 |
### 表单 (添加/编辑)
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `Tab` | 下一个字段 |
| `Shift+Tab` | 上一个字段 |
| `Enter` | 保存 |
| `Esc` | 取消并关闭表单 |
## 架构概览
```
ThreatDeck/
├── src/
│ ├── main.rs # CLI args, terminal setup, main event loop
│ ├── app.rs # Application state, screen navigation, key routing
│ ├── config.rs # Config file (TOML) loading and saving
│ ├── db.rs # SQLite database operations (rusqlite)
│ ├── types.rs # Core data structures and enums
│ ├── theme.rs # Color theme definitions
│ ├── schema.sql # Database schema with default data
│ ├── scheduler.rs # Background feed polling scheduler
│ ├── notify.rs # Notification channels (Email, Webhook, Discord)
│ ├── alert.rs # Alert processing and deduplication logic
│ ├── keyword.rs # Keyword matching engine (text + regex)
│ ├── tag.rs # Tag management
│ ├── template.rs # API template management
│ ├── ai.rs # AI/ML analysis integration placeholder
│ ├── feed/ # Feed processing modules
│ │ ├── mod.rs # Feed dispatcher and common types
│ │ ├── api.rs # JSON API feed fetcher with JSONPath
│ │ ├── rss.rs # RSS/Atom feed parser
│ │ ├── web.rs # Website HTML scraper
│ │ ├── onion.rs # Tor/onion site fetcher
│ │ └── utils.rs # Feed utility functions
│ └── ui/ # TUI rendering modules
│ ├── mod.rs # Main draw dispatcher, help, notifications
│ ├── dashboard.rs # Stats, pie chart, recent alerts, trend
│ ├── feeds.rs # Feed list, add/edit form
│ ├── alerts.rs # Alert list, bulk operations
│ ├── keywords.rs # Keyword list, test mode
│ ├── tags.rs # Tag management screen
│ ├── logs.rs # Feed health log viewer
│ ├── settings.rs # General settings and notifications
│ └── utils.rs # UI helper functions
├── Cargo.toml
└── README.md
```
### 核心设计决策
- **SQLite (内置)**: 零外部依赖的自包含数据库;启用内置特性的 rusqlite 确保了跨平台构建的一致性
- **ratatui + crossterm**: 具异步事件处理能力的跨平台终端 UI 框架
- **用于 API 的 JSONPath**: 无需为每个订阅源编写自定义解析器即可进行声明式数据提取
- **内容哈希**: 基于SHA-256的去重机制可防止相同内容产生重复警报
- **模块化订阅源引擎**: 每种订阅源类型都实现了通用接口,便于轻松添加新的来源
## 开发
### 前置条件
- Rust 1.75+ 及 Cargo
- sqlite3 命令行工具 (用于 `demo-seed.sh`)
### 构建
```
# Debug 构建
cargo build
# 带优化的 Release 构建
cargo build --release
# 使用 cargo 运行
cargo run
# 运行并打印 config 路径
cargo run -- --config-paths
```
### 测试
```
# 运行所有测试
cargo test
# 运行并输出
cargo test -- --nocapture
```
### 代码质量
```
# Format 检查
cargo fmt --check
# 应用 Format
cargo fmt
# 运行 Clippy lints
cargo clippy -- -D warnings
# 开启所有 features 运行 Clippy
cargo clippy --all-targets --all-features -- -D warnings
```
### 填充演示数据
提供了一个辅助脚本用于向数据库填充逼真的演示数据:
```
# 使用默认 database 路径
./demo-seed.sh
# 或指定自定义 database 路径
./demo-seed.sh /path/to/custom.db
```
这会创建 6 个订阅源、8 个关键词、15 条警报以及用于测试和演示的标签分配。
### 数据库 Schema
应用程序使用以下 SQLite Schema(参见 `src/schema.sql`):
- **feeds** — 带有健康跟踪的订阅源
- **api_templates** — JSONPath 提取模板
- **keywords** — 带有严重级别的匹配模式
- **alerts** — 带有去重哈希的已生成警报
- **tags** — 带有颜色的标签
- **feed_tags / keyword_tags / alert_tags** — 多对多标签分配
- **notifications** — 通知渠道配置
- **feed_health_logs** — 每个订阅源的健康状态历史记录
## 许可证
本项目采用 [MIT 许可证](LICENSE) 进行授权。
基于终端的威胁情报监控和警报平台
面向 SOC、安全研究人员和威胁情报分析师
## 订阅源预览
## 警报预览
## 文章预览
## 关键词预览
## 标签预览
## 功能特性
- **多源订阅源管理** — 聚合来自 API、RSS/Atom 订阅源、网站抓取以及通过 Tor 访问的 `.onion` 站点的威胁情报
- **JSONPath API 模板** — 使用可配置的 JSONPath 表达式从 JSON API 中提取结构化数据(包括标题、描述、日期、URL 和来源字段)
- **关键词匹配** — 基于简单文本或正则表达式的关键词匹配,支持 4 个严重级别(低、中、高、严重)
- **警报生成** — 自动创建警报并支持去重(内容哈希)、摘要提取和元数据保留
- **文章缓存订阅** — 浏览 RSS/API 源中的每个缓存条目,并直接在终端中阅读清洗后的文章文本
- **标签系统** — 使用带有颜色的自定义标签来组织订阅源、关键词和警报
- **通知** — 通过电子邮件 (SMTP)、Webhook 或 Discord 发送警报,支持为每个通知渠道设置最低严重级别阈值
- **仪表盘概览** — 便捷的统计视图、严重程度分布、近期警报和 7 天趋势可视化
- **订阅源健康监控** — 跟踪连续失败次数、健康状态(健康/警告/错误/已禁用)以及详细的健康日志
- **设置管理** — 警报保留策略、主题选择、通知渠道配置
- **5 款内置主题** — dark、light、solarized、dracula、monokai
## 安装说明
### 从源代码安装 (Cargo)
要求 Rust 1.75 或更高版本。
```
# 克隆仓库
git clone https://github.com/gripebomb/ThreatDeck.git
cd ThreatDeck
# 构建和安装
cargo install --path .
# 或直接从 git 安装
cargo install --git https://github.com/gripebomb/ThreatDeck.git
```
该二进制文件将作为 `ThreatDeck` 安装在您的 Cargo bin 目录中(通常为 `~/.cargo/bin/`)。
### 从源代码构建
```
git clone https://github.com/gripebomb/ThreatDeck.git
cd ThreatDeck
# Debug 构建
cargo build
# Release 构建(已优化)
cargo build --release
# Binary 位置
target/release/ThreatDeck
```
## 快速入门
### 首次运行
首次启动时,`ThreatDeck` 会自动创建其配置和数据目录:
```
ThreatDeck
```
默认路径:
- **配置文件**: `~/.config/ThreatDeck/config.toml`
- **数据库**: `~/.local/share/ThreatDeck/ThreatDeck.db`
要查看您系统上的确切路径:
```
ThreatDeck --config-paths
```
### 添加订阅源
1. 启动应用程序:`ThreatDeck`
2. 按 `2` 导航至 **Feeds** (订阅源) 界面
3. 按 `a` 添加新的订阅源
4. 填写订阅源详情(使用 Tab 键切换字段,Enter 键保存):
- **Name (名称)**: 订阅源的描述性名称
- **URL**: 订阅源的 endpoint URL
- **Type (类型)**: API、RSS、Website 或 Onion
- **Interval (间隔)**: 轮询间隔,以秒为单位(最少 60 秒)
- 对于 API 订阅源:选择一个 API 模板并视情况提供 API 密钥
- 对于 Onion 订阅源:配置 Tor 代理(例如,`socks5h://127.0.0.1:9050`)
### 创建关键词
1. 按 `4` 导航至 **Keywords** (关键词) 界面
2. 按 `a` 添加关键词
3. 进行配置:
- **Pattern (模式)**: 用于匹配的文本或正则表达式模式
- **Type (类型)**: 简单文本 (Simple text) 或正则表达式 (Regex)
- **Case Sensitive (区分大小写)**: 匹配时是否区分大小写
- **Criticality (严重性)**: 低、中、高或严重
4. 在保存之前按 `t` 可针对样例输入测试该模式
### 查看警报
1. 按 `3` 导航至 **Alerts** (警报) 界面
2. 使用 `j`/`k` 或方向键浏览警报
3. 按 `r` 切换已读/未读状态
4. 按 `R` 将所有警报标记为已读
5. 按 `d` 删除单个警报,按 `D` 进入批量删除模式
## 配置
配置文件存储在 `~/.config/ThreatDeck/config.toml`:
```
theme = "dark" # dark, light, solarized, dracula, monokai
alert_retention_days = 30 # Auto-delete alerts older than N days
dashboard_refresh_secs = 30 # Dashboard data refresh interval
tick_rate_ms = 250 # UI tick rate (lower = more responsive)
max_health_log_entries = 100 # Maximum feed health log entries to retain
```
### 主题设置
通过设置界面 (`7`) 动态更改主题,或者直接编辑 `config.toml`:
| 主题 | 描述 |
|-----------|------------------------------------------|
| `dark` | 默认深色主题,色调柔和 |
| `light` | 适用于明亮终端的简洁浅色主题 |
| `solarized` | Ethan Schoonover 的 Solarized Dark 主题 |
| `dracula` | 流行的 Dracula 配色方案 |
| `monokai` | 经典的 Monokai 语法高亮主题 |
## 订阅源类型
### API (配合 JSONPath 模板)
对于 JSON REST API,使用 JSONPath 表达式提取字段。内置了两个模板:
| 模板 | 标题路径 | 描述路径 | 日期路径 | URL 路径 |
|---------------|-------------------|------------------|-----------------|------------|
| Ransomfeed.it | `$.post_title` | `$.description` | `$.discovered` | `$.source` |
| RansomLook | `$.name` | `$.description` | `$.published` | `$.url` |
可以通过 SQL 或 API 创建自定义模板。`pagination_config` 字段支持 offset/limit 和基于页码的分页策略。
**API 订阅源配置示例:**
- URL: `https://api.ransomfeed.it/v1/posts`
- 类型: `API`
- 模板: `Ransomfeed.it`
- 间隔: `300`(5 分钟)
### RSS / Atom
系统会自动解析标准的 RSS 2.0 和 Atom 1.0 订阅源。只需提供订阅源 URL 并选择类型为 `RSS`。
**RSS 订阅源示例:**
- `https://feeds.securityweek.com/securityweek`
- `https://www.bleepingcomputer.com/feed/`
### 网站抓取
对于没有结构化订阅源的 HTML 页面,抓取器会从页面主体提取文本内容以进行关键词匹配。提供目标 URL 并选择类型为 `Website`。
**示例:**
- URL: `https://www.cisa.gov/news-events/cybersecurity-advisories`
- 类型: `Website`
- 间隔: `600`(10 分钟)
### Onion / Tor
通过 Tor SOCKS5 代理访问 `.onion` 威胁情报源。配置 Tor 代理地址(默认为:`socks5h://127.0.0.1:9050`)并提供一个 `.onion` URL。
**前提条件:** 必须在本地运行带有 SOCKS5 监听器的 Tor。
**示例:**
- URL: `http://ransomxifxwc5ste.onion/posts`
- 类型: `Onion`
- Tor 代理: `socks5h://127.0.0.1:9050`
## 键盘快捷键
### 全局按键
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `1` | 仪表盘界面 |
| `2` | 订阅源界面 |
| `3` | 警报界面 |
| `4` | 文章界面 |
| `5` | 关键词界面 |
| `6` | 标签界面 |
| `7` | 日志界面 |
| `8` | 设置界面 |
| `q` | 退出应用程序 |
| `?` / `F1` | 切换帮助覆盖层 |
| `Esc` | 取消当前操作 / 返回上一级 |
### 仪表盘
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `r` | 刷新仪表盘数据 |
| `1-8` | 导航至其他界面 |
### 订阅源
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `j` / `↓` | 向下移动选择项 |
| `k` / `↑` | 向上移动选择项 |
| `a` / `n` | 添加新的订阅源 |
| `e` | 编辑选定的订阅源 |
| `d` | 删除选定的订阅源 (需确认) |
| `m` | 触发手动抓取 |
| `t` | 为订阅源分配标签 |
| `Enter` | 查看订阅源详情 |
| `Space` | 切换订阅源的启用/禁用状态 |
| `/` | 过滤订阅源 |
| `s` | 切换排序方式 |
### 警报
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `j` / `↓` | 向下移动选择项 |
| `k` / `↑` | 向上移动选择项 |
| `r` | 切换已读/未读状态 |
| `R` | 将所有警报标记为已读 |
| `d` | 删除选定的警报 |
| `D` | 进入批量删除模式 |
| `t` | 为警报分配标签 |
| `/` | 过滤警报 |
**批量模式 (在按下 `D` 之后):**
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `Space` | 切换当前警报的选择状态 |
| `a` | 选择所有警报 |
| `d` | 删除选定的警报 |
| `Esc` | 退出批量模式 |
### 文章
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `j` / `↓` | 向下移动选择项 |
| `k` / `↑` | 向上移动选择项 |
| `Enter` | 如有需要则抓取全文,然后打开阅读器 |
| `r` | 切换已读/未读状态 |
| `u` | 切换“仅显示未读”过滤器 |
| `/` | 过滤缓存的文章 |
| `Esc` | 关闭文章阅读器 |
### 关键词
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `j` / `↓` | 向下移动选择项 |
| `k` / `↑` | 向上移动选择项 |
| `a` / `n` | 添加新的关键词 |
| `e` | 编辑选定的关键词 |
| `d` | 删除选定的关键词 |
| `t` | 针对样例输入测试模式 |
| `Enter` | 切换关键词的启用/禁用状态 |
### 标签
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `j` / `↓` | 向下移动选择项 |
| `k` / `↑` | 向上移动选择项 |
| `a` / `n` | 添加新的标签 |
| `e` | 编辑选定的标签 |
| `d` | 删除选定的标签 |
### 日志
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `j` / `↓` | 向下移动选择项 |
| `k` / `↑` | 向上移动选择项 |
### 设置
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `Tab` | 在“常规/通知”选项卡之间切换 |
### 表单 (添加/编辑)
| 按键 | 操作 |
|----------------|---------------------------------------------|
| `Tab` | 下一个字段 |
| `Shift+Tab` | 上一个字段 |
| `Enter` | 保存 |
| `Esc` | 取消并关闭表单 |
## 架构概览
```
ThreatDeck/
├── src/
│ ├── main.rs # CLI args, terminal setup, main event loop
│ ├── app.rs # Application state, screen navigation, key routing
│ ├── config.rs # Config file (TOML) loading and saving
│ ├── db.rs # SQLite database operations (rusqlite)
│ ├── types.rs # Core data structures and enums
│ ├── theme.rs # Color theme definitions
│ ├── schema.sql # Database schema with default data
│ ├── scheduler.rs # Background feed polling scheduler
│ ├── notify.rs # Notification channels (Email, Webhook, Discord)
│ ├── alert.rs # Alert processing and deduplication logic
│ ├── keyword.rs # Keyword matching engine (text + regex)
│ ├── tag.rs # Tag management
│ ├── template.rs # API template management
│ ├── ai.rs # AI/ML analysis integration placeholder
│ ├── feed/ # Feed processing modules
│ │ ├── mod.rs # Feed dispatcher and common types
│ │ ├── api.rs # JSON API feed fetcher with JSONPath
│ │ ├── rss.rs # RSS/Atom feed parser
│ │ ├── web.rs # Website HTML scraper
│ │ ├── onion.rs # Tor/onion site fetcher
│ │ └── utils.rs # Feed utility functions
│ └── ui/ # TUI rendering modules
│ ├── mod.rs # Main draw dispatcher, help, notifications
│ ├── dashboard.rs # Stats, pie chart, recent alerts, trend
│ ├── feeds.rs # Feed list, add/edit form
│ ├── alerts.rs # Alert list, bulk operations
│ ├── keywords.rs # Keyword list, test mode
│ ├── tags.rs # Tag management screen
│ ├── logs.rs # Feed health log viewer
│ ├── settings.rs # General settings and notifications
│ └── utils.rs # UI helper functions
├── Cargo.toml
└── README.md
```
### 核心设计决策
- **SQLite (内置)**: 零外部依赖的自包含数据库;启用内置特性的 rusqlite 确保了跨平台构建的一致性
- **ratatui + crossterm**: 具异步事件处理能力的跨平台终端 UI 框架
- **用于 API 的 JSONPath**: 无需为每个订阅源编写自定义解析器即可进行声明式数据提取
- **内容哈希**: 基于SHA-256的去重机制可防止相同内容产生重复警报
- **模块化订阅源引擎**: 每种订阅源类型都实现了通用接口,便于轻松添加新的来源
## 开发
### 前置条件
- Rust 1.75+ 及 Cargo
- sqlite3 命令行工具 (用于 `demo-seed.sh`)
### 构建
```
# Debug 构建
cargo build
# 带优化的 Release 构建
cargo build --release
# 使用 cargo 运行
cargo run
# 运行并打印 config 路径
cargo run -- --config-paths
```
### 测试
```
# 运行所有测试
cargo test
# 运行并输出
cargo test -- --nocapture
```
### 代码质量
```
# Format 检查
cargo fmt --check
# 应用 Format
cargo fmt
# 运行 Clippy lints
cargo clippy -- -D warnings
# 开启所有 features 运行 Clippy
cargo clippy --all-targets --all-features -- -D warnings
```
### 填充演示数据
提供了一个辅助脚本用于向数据库填充逼真的演示数据:
```
# 使用默认 database 路径
./demo-seed.sh
# 或指定自定义 database 路径
./demo-seed.sh /path/to/custom.db
```
这会创建 6 个订阅源、8 个关键词、15 条警报以及用于测试和演示的标签分配。
### 数据库 Schema
应用程序使用以下 SQLite Schema(参见 `src/schema.sql`):
- **feeds** — 带有健康跟踪的订阅源
- **api_templates** — JSONPath 提取模板
- **keywords** — 带有严重级别的匹配模式
- **alerts** — 带有去重哈希的已生成警报
- **tags** — 带有颜色的标签
- **feed_tags / keyword_tags / alert_tags** — 多对多标签分配
- **notifications** — 通知渠道配置
- **feed_health_logs** — 每个订阅源的健康状态历史记录
## 许可证
本项目采用 [MIT 许可证](LICENSE) 进行授权。
使用 ratatui 和 Rust 构建。
标签:API集成, Atom, Feed管理, JSONPath, .onion, RSS, Rust, Tor, TUI, 关键词匹配, 去重, 可观测性, 可视化界面, 告警平台, 告警生成, 威胁情报, 威胁情报分析师, 安全研究员, 安全运营中心, 实时处理, 开发者工具, 开源安全工具, 情报聚合, 数据提取, 文章缓存, 终端UI, 网站抓取, 网络安全, 网络映射, 网络流量审计, 逆向工程平台, 通知系统, 隐私保护