A lean CLI tool for normalizing security scanner findings based on DefectDojo parsers.
Project description
norm-findings
A lean CLI tool for normalizing security scanner findings based on DefectDojo parsers.
This project provides a standalone Python package and a minimal Docker image to convert findings from O(100) security scanners into a normalized format.
Open Source Attribution
This project is based on the excellent work of the DefectDojo community. We leverage their parser logic while providing a lean, dependency-minimized execution environment. See the NOTICE file for more details.
Installation
The default installation includes the core CLI and all parser dependencies, providing full functionality out-of-the-box.
Standard (Core + Parsers)
pip install .
Optional: Server Support
If you need the REST API server, install the server extra:
pip install ".[server]"
Optional: Development
For running tests or contributing:
pip install ".[dev]"
Running Tests
Unit Tests
Verify the core installation and stubs:
pytest tests/test_cli.py
E2E Parser Verification (Development only)
To verify all 200+ parsers against real DefectDojo sample data:
- Ensure the development dependencies are installed (
pip install ".[dev]"). - Run the updater to fetch sample data:
python -m norm_findings.updater
- Run the E2E tests:
pytest tests/test_e2e.py
Usage
CLI
norm-findings convert --parser TrivyParser --input-file trivy.json --output-file findings.json
Docker
docker run -v $(pwd):/dojo -it ghcr.io/scribe-security/norm-findings:latest convert --parser TrivyParser --input-file /dojo/trivy.json --output-file /dojo/findings.json
Using as a Library
You can use norm-findings in your own Python projects to parse security reports programmatically:
from norm_findings.parsers.trivy.parser import TrivyParser
import json
parser = TrivyParser()
with open("trivy.json", "r") as f:
findings = parser.get_findings(f, "test-identification")
for finding in findings:
print(f"Found: {finding.title} ({finding.severity})")
Legacy Version
The original monkey-patched version of this tool is preserved in the legacy-monkeypatch branch and tagged as v1.x-legacy.
To use the legacy version:
git checkout v1.x-legacy
Automatic Updates
norm-findings includes a built-in updater that fetches the latest parsers and tests from DefectDojo:
python -m norm_findings.updater
Development
Workflow
- Branching: Create a new branch for your feature or bugfix from
main. - Syncing Parsers: Run the updater to ensure you have the latest DefectDojo parsers:
python -m norm_findings.updater
- Testing: Always run the test suite before pushing:
pytest tests/test_cli.py pytest tests/test_e2e.py --ignore norm_findings/stubs/models.py
- Pushing: Push your branch to GitHub and open a Pull Request.
Versioning
norm-findings uses setuptools-scm for automatic versioning.
- The version is automatically derived from the most recent Git tag.
- When working on local uncommitted changes, the version will include a
.devsuffix and the current timestamp. - The version is written to
norm_findings/_version.pyduring the build process.
Releasing
Releases are automated via GitHub Actions and are triggered by pushing a version tag:
- Create a tag: Create a semantic version tag starting with
v(e.g.,v1.1.0):git tag -a v1.1.0 -m "Release version 1.1.0"
- Push the tag:
git push origin v1.1.0
- Automated Pipeline: The build workflow will automatically:
- Run all tests.
- Build the Python wheel and source distribution.
- Publish to PyPI.
- Build and push the Docker image to GHCR (tagged with the version and
latest).
Automatic Parser Updates
A daily GitHub Action runs the updater.py logic. If new parsers or updates are detected in DefectDojo:
- A new branch
auto-update-parsersis created. - A Pull Request is opened with a summary of the changes.
- Maintainers can review and merge the PR to keep
norm-findingsup-to-date.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file norm_findings-0.2.1.dev0.tar.gz.
File metadata
- Download URL: norm_findings-0.2.1.dev0.tar.gz
- Upload date:
- Size: 526.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b0a31d21781655b6b7e1ec84b856cd980b9e86700bbfc8b39863bd05232025db
|
|
| MD5 |
ad5cf67123e0a53a0dbc874caf42b870
|
|
| BLAKE2b-256 |
c8a4835c17f6f91ee0f43ec76a2f1b04e23dfe5bc2416b6551c12c48880cb135
|
File details
Details for the file norm_findings-0.2.1.dev0-py3-none-any.whl.
File metadata
- Download URL: norm_findings-0.2.1.dev0-py3-none-any.whl
- Upload date:
- Size: 526.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0f722dc22ef2846cb7c949ef8ce3995f452aa327fd15ab0853c3828d639675c2
|
|
| MD5 |
5a0408211844c58dd8d649f3369cd6fb
|
|
| BLAKE2b-256 |
18a28a5d056b5a8b89d2b4456989092480dead59728ee355b4638ff9ce60e702
|