SemClone/src2purl

GitHub: SemClone/src2purl

从源代码目录中识别开源组件的包坐标(名称、版本、许可证、PURL),采用哈希指纹与清单解析的混合发现策略,覆盖多生态并支持 Software Heritage 溯源。

Stars: 3 | Forks: 0

# SRC2PURL - 源代码到 Package URL 的发现工具 [![License](https://img.shields.io/badge/License-AGPL--3.0-blue.svg)](https://opensource.org/licenses/AGPL-3.0) [![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/) [![PyPI version](https://img.shields.io/pypi/v/src2purl.svg)](https://pypi.org/project/src2purl/) 一款 Python 工具,通过结合使用 manifest 解析、代码指纹识别、仓库搜索和 Software Heritage 归档集成的混合发现策略,从源代码目录中识别包坐标(名称、版本、许可证、PURL)。 ## 特性 - **两阶段发现策略**:基于 hash 的识别,辅以 manifest 解析增强 - **多生态系统支持**:PyPI、NPM、Maven、Go、Ruby Gems、PHP、.NET 等 - **高性能**:典型项目仅需 5-15 秒(使用 SWH 则需 90 秒以上) - **SEMCL.ONE 集成**:与 upmex、osslili 及其他生态系统工具无缝协作 ## 安装 ``` pip install src2purl ``` 用于开发环境: ``` git clone https://github.com/SemClone/src2purl.git cd src2purl pip install -e . ``` ## 快速入门 ``` # 从源代码识别 package src2purl /path/to/source/code # 使用 Software Heritage archive(全面但较慢) src2purl /path/to/source --use-swh ``` ## 用法 ### CLI 用法 ``` # 快速发现(默认) - 使用 manifest 解析 + SCANOSS + GitHub(5-15 秒) src2purl /path/to/source/code # 全面发现 - 包含 Software Heritage archive(90+ 秒) src2purl /path/to/source --use-swh # 仅高置信度匹配 src2purl /path/to/source --confidence-threshold 0.85 # 用于集成的 JSON 输出格式 src2purl /path/to/source --output-format json # 检测 monorepo 中的子组件 src2purl /path/to/source --detect-subcomponents ``` ### Python API ``` from src2purl import identify_package # 基本识别 result = identify_package("/path/to/source") print(f"Package: {result.name}@{result.version}") print(f"PURL: {result.purl}") # 带选项 result = identify_package( path="/path/to/source", use_swh=True, confidence_threshold=0.85 ) ``` ### 发现策略示例 ``` # 默认:2-Phase 混合方法(5-15 秒) # Phase 1:基于 Hash 的发现 + Phase 2:UPMEX manifest 解析 # 适用于:大多数用例,平衡了速度和准确性 src2purl /path/to/project # 全面:包含 Software Heritage archive(90+ 秒) # Phase 1 包含深度来源发现 + Phase 2:UPMEX 增强 # 适用于:安全审计、研究、历史分析 export SWH_API_TOKEN=your_token # Optional but recommended src2purl /path/to/project --use-swh # 高置信度:仅报告置信度高的匹配 # 将结果筛选为两个阶段中置信度最高的发现 src2purl /path/to/project --confidence-threshold 0.85 ``` ### API 认证 **无需 API 密钥!** 本工具可直接使用免费的公共 API。API 密钥仅用于提升速率限制和启用附加功能。 #### 推荐的 API 密钥(可选) **1. GitHub API** - **最有价值**(免费,2 分钟即可完成设置) ``` export GITHUB_TOKEN=your_github_personal_access_token ``` - **获取令牌**:https://github.com/settings/tokens(无需特殊权限) - **优势**: - **速率限制**:10 → 5000 次请求/小时 - **更佳搜索**:更准确的仓库识别 - **完全免费**:无任何成本 - **影响**:显著提升仓库发现能力 **2. SCANOSS API** - **锦上添花**(免费,可选) ``` export SCANOSS_API_KEY=your_scanoss_key ``` - **获取令牌**:在 https://www.scanoss.com 注册 - **优势**: - **完全免费**:提供免费套餐 - **提升速率限制**:高级 API 端点 - **附加功能**:可能获取额外的元数据 - **影响**:轻微提升(即使没有密钥,SCANOSS 也表现出色) **3. Software Heritage API** - **适用于重度使用**(免费,仅在启用 `--use-swh` 时需要) ``` export SWH_API_TOKEN=your_swh_token ``` - **获取令牌**:在 https://archive.softwareheritage.org/api/ 注册 - **优势**: - **绕过速率限制**:无需等待 60 秒 - **更快的全面扫描**:在使用 `--use-swh` 时 - **影响**:对 `--use-swh` 标志至关重要,默认的快速模式不需要 #### 性能对比 | 配置 | 典型耗时 | API 调用 | 适用场景 | |---------------|-------------|-----------|----------| | **无 API 密钥** | 5-15 秒 | 最少 | 大多数用户 | | **+ GitHub token** | 5-15 秒 | 增强 | 推荐配置 | | **+ 所有 token** | 5-15 秒 | 高级 | 生产环境使用 | | **+ SWH 模式** | 90+ 秒 | 繁重 | 安全审计 | **建议**:从**仅使用 GitHub token** 开始——它不仅免费、设置快,而且能提供最大的改善。 ### SWHID 验证 ``` # 为目录生成并验证 SWHID src2purl-validate /path/to/directory # 与预期的 SWHID 进行比较 src2purl-validate /path/to/directory --expected-swhid swh:1:dir:abc123... # 使用 fallback 实现 src2purl-validate /path/to/directory --use-fallback --verbose ``` ### 命令行选项 #### **核心选项** - `path`:要分析的目录路径(必填) - `--confidence-threshold`:报告匹配结果的最低置信度(默认值:0.3) - `--output-format`:输出格式:'json' 或 'table'(默认值:table) - `--verbose`:用于调试的详细输出 #### **发现控制** - `--use-swh`:包含 Software Heritage 归档检查(可选,会增加 90 秒以上的耗时) - `--no-license-detection`:跳过从本地源代码自动检测许可证(速度更快) - `--detect-subcomponents`:检测并识别 monorepo 中的子组件 - `--max-depth`:扫描的最大目录深度(默认值:2) #### **性能与缓存** - `--no-cache`:禁用 API 响应缓存 - `--clear-cache`:清除所有已缓存的 API 响应并退出 #### **认证** - `--api-token`:Software Heritage API 令牌(仅在使用 --use-swh 时有效) - 环境变量:`GITHUB_TOKEN`、`SCANOSS_API_KEY`、`SWH_API_TOKEN` #### **发现方法详解** ``` # 默认:2-Phase 发现(基于 Hash + UPMEX manifest 解析) src2purl /path/to/project # Phase 1:SWHID 生成 → GitHub/SCANOSS 搜索 # Phase 2:UPMEX manifest 提取 → 交叉验证与增强 # 添加 Software Heritage 以实现全面的来源发现 src2purl /path/to/project --use-swh # Phase 1:SWHID 生成 → Software Heritage archive → Fallback 搜索 # Phase 2:UPMEX manifest 提取 → 交叉验证与增强 # 性能优化选项 src2purl /path/to/project --no-license-detection # Skip license enhancement src2purl /path/to/project --use-swh --verbose # Full discovery with details ``` ## 与 SEMCL.ONE 集成 SRC2PURL 是 SEMCL.ONE 生态系统的核心组件: - 使用 **upmex** 进行 manifest 解析和包元数据提取 - 集成 **osslili** 以增强许可证检测 - 为 **purl2src** 提供 PURL 以下载源代码包 - 支持 **purl2notices** 生成归属说明文档 - 支持使用已识别的包启用 **ospac** 策略评估 ## 配置 通过环境变量进行配置: ``` # API token(可选,但推荐) export GITHUB_TOKEN=your_github_token export SCANOSS_API_KEY=your_scanoss_key export SWH_API_TOKEN=your_swh_token # 性能设置 export SRC2PURL_CACHE_DIR=~/.cache/src2purl export SRC2PURL_MAX_DEPTH=2 ``` ## 文档 - [用户指南](docs/user-guide.md) - 全面的用法示例 - [API 参考](docs/api.md) - Python API 文档 - [发现方法](docs/discovery-methods.md) - 识别策略的详细说明 - [示例](docs/examples.md) - 常见用例与工作流 ## 贡献 我们欢迎各种贡献!有关以下内容的详细信息,请参阅 [CONTRIBUTING.md](CONTRIBUTING.md): - 行为准则 - 开发环境设置 - 提交 Pull Request - 报告问题 ## 支持 获取支持与提问: - [GitHub Issues](https://github.com/SemClone/src2purl/issues) - Bug 报告和功能请求 - [文档](https://github.com/SemClone/src2purl) - 完整的项目文档 - [SEMCL.ONE 社区](https://semcl.one) - 生态系统支持与讨论 ## 许可证 GNU Affero General Public License v3.0 (AGPL-3.0) - 详见 [LICENSE](LICENSE) 文件。 ## 作者 贡献者列表请见 [AUTHORS.md](AUTHORS.md)。 *全面 OSS 合规与代码分析 [SEMCL.ONE](https://semcl.one) 生态系统的一部分。*
标签:API安全, API集成, Cilium, Go模块, JSON输出, Maven, NPM, OpenVAS, Package URL, PHP, PURL, PyPI, Python, Ruby Gems, SCANOSS, Software Heritage, 仓库搜索, 代码指纹, 代码溯源, 依赖识别, 包管理, 可观测性, 哈希识别, 开源许可证, 文档结构分析, 无后门, 混合发现策略, 清单解析, 源代码分析, 漏洞验证, 组件发现, 软件资产管理, 逆向工具