SemClone/osslili

GitHub: SemClone/osslili

osslili 是一款高性能的开源许可证与版权检测工具,通过三层检测机制精准识别本地源码中的许可证信息,助力软件供应链合规管理。

Stars: 7 | Forks: 1

# OSS 许可证与版权检测器 (osslili) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.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/osslili.svg)](https://pypi.org/project/osslili/) 一款用于识别本地源码中许可证和版权信息的高性能工具。生成详细的许可证检测证据,支持所有 700 多个 SPDX 许可证标识符,为 SEMCL.ONE 生态系统提供全面的合规性文档支持。 ## 功能 - **三层许可证检测**:Dice-Sørensen 相似度、TLSH 模糊哈希和正则表达式模式匹配 - **基于证据的输出**:精确的文件路径、置信度得分和检测方法 - **700 多个 SPDX 许可证**:全面支持所有 SPDX 许可证标识符 - **SEMCL.ONE 集成**:与 purl2notices、ospac 及其他生态系统工具无缝协作 ### 工作原理 #### 三层许可证检测系统 该工具使用复杂的多层方法以实现最高的准确性: 1. **第一层:Dice-Sørensen 相似度与 TLSH 确认** - 使用 Dice-Sørensen 系数比较许可证文本(97% 阈值) - 使用 TLSH 模糊哈希确认匹配,防止误报 - 对标准 SPDX 许可证实现 97-100% 的准确率 2. **第二层:TLSH 模糊哈希匹配** - 使用 Trend Micro 局部敏感哈希进行变体检测 - 捕获 MIT-0、BSD-2-Clause 与 BSD-3-Clause 等许可证变体 - 为所有 700 多个 SPDX 许可证预计算哈希值 3. **第三层:模式识别** - 基于正则表达式检测许可证引用和标识符 - 从注释、文件头和文档中提取 #### 其他检测方法 - **包元数据扫描**:从 package.json、composer.json、pyproject.toml 等文件中检测许可证 - **版权提取**:带有验证和去重功能的高级模式匹配 - **SPDX 标识符检测**:在源文件中查找 SPDX-License-Identifier 标签 ## 安装说明 ``` pip install osslili ``` 用于开发: ``` git clone https://github.com/SemClone/osslili.git cd osslili pip install -e . ``` ## 快速入门 ``` # 快速默认扫描 (LICENSE 文件 + metadata + docs) - 推荐 osslili . # 全面深度扫描 (所有源文件) osslili . --deep # 生成包含 license 证据的 SBOM osslili ./my-project -f cyclonedx-json -o sbom.json ``` ## 用法 ### 扫描模式 osslili 提供了三种针对不同用例优化的扫描模式: #### **默认模式**(推荐) 快速实用 - 扫描 LICENSE 文件、包元数据和文档。 ``` # 扫描: LICENSE*、README*、*.md、*.txt、package.json、go.mod 等 osslili ./my-project ``` **扫描内容:** - **LICENSE 文件**:LICENSE、COPYING、NOTICE、COPYRIGHT 等(28 种以上模式) - **文档**:README、CHANGELOG、CONTRIBUTING(.txt、.md、.rst、.adoc) - **包元数据**:package.json、go.mod、Cargo.toml、pom.xml 等(40 个以上文件) - **覆盖范围**:12 种以上的包生态系统(npm、Python、Go、Java、.NET、Rust、Ruby、PHP、Swift、Dart、Elixir、Scala) **性能**:在 ffmpeg-6.0(4,000 多个文件)上耗时约 8 秒 **适用场景**:日常开发、CI/CD 流水线、快速许可证检查 #### **深度模式**(全面) 彻底扫描所有源文件以查找嵌入的许可证。 ``` # 扫描所有文件: .py、.js、.java、.c、.go 等 osslili ./my-project --deep ``` **性能**:在 ffmpeg-6.0 上耗时约 5 分钟(比默认模式慢 40 倍) **适用场景**:法律合规审查、查找嵌入的许可证头 #### **严格模式**(最快) 仅扫描 LICENSE 文件 - 最大速度。 ``` # 仅扫描 LICENSE 文件 (无 metadata,无 README) osslili ./my-project --license-files-only ``` **性能**:在 ffmpeg-6.0 上耗时约 7 秒 **适用场景**:当您只需要已声明的许可证时 ### CLI 用法 ``` # 默认扫描 - 快速且智能 (推荐) osslili /path/to/project # 深度扫描 - 全面但较慢 osslili /path/to/project --deep # 严格扫描 - 仅限 LICENSE 文件 osslili /path/to/project --license-files-only # 生成不同的输出格式 osslili ./my-project -f kissbom -o kissbom.json osslili ./my-project -f cyclonedx-json -o sbom.json osslili ./my-project -f cyclonedx-xml -o sbom.xml # 使用并行处理进行扫描 (默认: 4 个线程) osslili ./my-project --threads 8 # 有限深度扫描 (仅深达 2 层) osslili ./my-project --max-depth 2 # 解压并扫描 archives osslili package.tar.gz --max-extraction-depth 2 # 使用 caching 加快重复扫描 osslili ./my-project --cache-dir ~/.cache/osslili # 检查版本 osslili --version # 将结果保存到文件 osslili ./my-project -o license-evidence.json # 使用自定义配置和详细输出 osslili ./src --config config.yaml --verbose # Debug 模式用于详细日志记录 osslili ./project --debug ``` ### 输出示例 ``` { "scan_results": [{ "path": "./project", "license_evidence": [ { "file": "/path/to/project/LICENSE", "detected_license": "Apache-2.0", "confidence": 0.988, "detection_method": "dice-sorensen", "category": "declared", "match_type": "text_similarity", "description": "Text matches Apache-2.0 license (98.8% similarity)" }, { "file": "/path/to/project/package.json", "detected_license": "Apache-2.0", "confidence": 1.0, "detection_method": "tag", "category": "declared", "match_type": "spdx_identifier", "description": "SPDX-License-Identifier: Apache-2.0 found" } ], "copyright_evidence": [ { "file": "/path/to/project/src/main.py", "holder": "Example Corp", "years": [2023, 2024], "statement": "Copyright 2023-2024 Example Corp" } ] }], "summary": { "total_files_scanned": 42, "declared_licenses": {"Apache-2.0": 2}, "detected_licenses": {}, "referenced_licenses": {}, "copyright_holders": ["Example Corp"] } } ``` ### 库用法 ``` from osslili import LicenseCopyrightDetector # 初始化 detector detector = LicenseCopyrightDetector() # 处理本地目录 result = detector.process_local_path("/path/to/source") # 处理单个文件 result = detector.process_local_path("/path/to/LICENSE") # 生成不同的输出格式 evidence = detector.generate_evidence([result]) kissbom = detector.generate_kissbom([result]) cyclonedx = detector.generate_cyclonedx([result], format_type="json") cyclonedx_xml = detector.generate_cyclonedx([result], format_type="xml") # 直接访问结果 for license in result.licenses: print(f"License: {license.spdx_id} ({license.confidence:.0%} confidence)") print(f" Category: {license.category}") # declared, detected, or referenced for copyright in result.copyrights: print(f"Copyright: © {copyright.holder}") ``` ## 输出格式 该工具输出显示以下内容的 JSON 证据: - **文件路径**:发现许可证的位置 - **检测到的许可证**:许可证的 SPDX 标识符 - **置信度**:检测的置信度(0.0 到 1.0) - **匹配类型**:许可证的检测方式(license_text、spdx_identifier、license_reference、text_similarity) - **描述**:关于所发现内容的人类可读描述 ## 配置 创建一个 `config.yaml` 文件: ``` similarity_threshold: 0.97 max_recursion_depth: 10 max_extraction_depth: 10 thread_count: 4 cache_dir: "~/.cache/osslili" custom_aliases: "Apache 2": "Apache-2.0" "MIT License": "MIT" ``` ## 文档 - [用户指南](docs/USAGE.md) - 全面的用法示例和配置 - [API 参考](docs/API.md) - Python API 文档和示例 - [SPDX 更新](docs/SPDX.md) - 如何更新 SPDX 许可证数据 - [性能基准测试](docs/BENCHMARK_SCANCODE.md) - 与其他工具的比较 ## 贡献 我们欢迎您的贡献!请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 以了解有关以下内容的详细信息: - 行为准则 - 开发环境设置 - 提交 Pull Request - 报告问题 ## 支持 如需支持和提问: - [GitHub Issues](https://github.com/SemClone/osslili/issues) - Bug 报告和功能请求 - [文档](https://github.com/SemClone/osslili) - 完整的项目文档 ## 许可证 Apache License 2.0 - 详情请参阅 [LICENSE](LICENSE) 文件。 ## 作者 请参阅 [AUTHORS.md](AUTHORS.md) 获取贡献者列表。 *隶属于用于全面 OSS 合规性和代码分析的 [SEMCL.ONE](https://semcl.one) 生态系统的一部分。*
标签:Dice-Sørensen相似度, Linux安全, Python, SEMCL.ONE, SPDX, TLSH模糊哈希, 云安全监控, 合规性审查, 安全合规, 开源合规, 开源许可协议识别, 无后门, 正则表达式匹配, 源码分析, 版权检测, 知识产权保护, 网络代理, 许可证提取, 逆向工具, 静态分析