Skip to content

Commit 6921220

Browse files
committed
feat(cli): add merge subcommand
We add the merge subcommand which runs against a download directory and creates combined archive files, which can be used as input to license clearing tools that only support a single archive per component. Signed-off-by: Felix Moessbauer <[email protected]>
1 parent 0f31e7f commit 6921220

File tree

2 files changed

+51
-8
lines changed

2 files changed

+51
-8
lines changed

README.md

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,22 @@ Source packages are especially relevant for security as CVEs in the Debian ecosy
99
## Usage
1010

1111
```
12-
usage: debsbom [-h] [--version] [-v] [--progress] {generate,download} ...
12+
usage: debsbom [-h] [--version] [-v] [--progress] {generate,download,merge} ...
1313
1414
SBOM tool for Debian systems.
1515
1616
positional arguments:
17-
{generate,download} sub command help
18-
generate generate a SBOM for a Debian system
19-
download download referenced packages
17+
{generate,download,merge}
18+
sub command help
19+
generate generate a SBOM for a Debian system
20+
download download referenced packages
21+
merge merge referenced source packages
2022
2123
options:
22-
-h, --help show this help message and exit
23-
--version show program's version number and exit
24-
-v, --verbose be more verbose
25-
--progress report progress
24+
-h, --help show this help message and exit
25+
--version show program's version number and exit
26+
-v, --verbose be more verbose
27+
--progress report progress
2628
```
2729

2830
## Limitations

src/debsbom/cli.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
from urllib.parse import urlparse
1414
from pathlib import Path
1515

16+
from debsbom.download import Compression, SourceArchiveMerger
17+
1618
from .dpkg import package
1719
from .generate import Debsbom, SBOMType
1820
from .download import PackageDownloader, PackageResolver, PersistentResolverCache
@@ -198,6 +200,42 @@ def setup_parser(parser):
198200
parser.add_argument("--binaries", help="download binary packages", action="store_true")
199201

200202

203+
class MergeCmd:
204+
"""
205+
Processes an SBOM and merges the .orig and .debian tarballs. The tarballs have to be
206+
downloaded first.
207+
"""
208+
209+
@staticmethod
210+
def run(args):
211+
pkgdir = Path(args.pkgdir)
212+
outdir = Path(args.outdir or args.pkgdir)
213+
compress = Compression.from_tool(args.compress if args.compress != "no" else None)
214+
resolver = PackageResolver.create(Path(args.bomfile))
215+
merger = SourceArchiveMerger(pkgdir, outdir, compress)
216+
pkgs = list(resolver.sources())
217+
for idx, pkg in enumerate(pkgs):
218+
if args.progress:
219+
progress_cb(idx, len(pkgs), pkg.name)
220+
merger.merge(pkg)
221+
222+
@staticmethod
223+
def setup_parser(parser):
224+
parser.add_argument("bomfile", help="sbom file to process")
225+
parser.add_argument(
226+
"--pkgdir", default="downloads", help="directory with downloaded packages"
227+
)
228+
parser.add_argument(
229+
"--outdir", default="downloads", help="directory to store the merged files"
230+
)
231+
parser.add_argument(
232+
"--compress",
233+
help="compress merged tarballs (default: gzip)",
234+
choices=["no"] + [c.tool for c in Compression.formats()],
235+
default="gzip",
236+
)
237+
238+
201239
def main():
202240
parser = argparse.ArgumentParser(
203241
prog="debsbom",
@@ -217,13 +255,16 @@ def main():
217255
subparser.add_parser("generate", help="generate a SBOM for a Debian system")
218256
)
219257
DownloadCmd.setup_parser(subparser.add_parser("download", help="download referenced packages"))
258+
MergeCmd.setup_parser(subparser.add_parser("merge", help="merge referenced source packages"))
220259
args = parser.parse_args()
221260

222261
try:
223262
if args.cmd == "generate":
224263
GenerateCmd.run(args)
225264
elif args.cmd == "download":
226265
DownloadCmd.run(args)
266+
elif args.cmd == "merge":
267+
MergeCmd.run(args)
227268
except Exception as e:
228269
print("debsbom: error: {}".format(e))
229270
if args.verbose >= 1:

0 commit comments

Comments
 (0)