xref: /OK3568_Linux_fs/yocto/poky/meta/lib/oe/sbom.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1#
2# SPDX-License-Identifier: GPL-2.0-only
3#
4
5import collections
6
7DepRecipe = collections.namedtuple("DepRecipe", ("doc", "doc_sha1", "recipe"))
8DepSource = collections.namedtuple("DepSource", ("doc", "doc_sha1", "recipe", "file"))
9
10
11def get_recipe_spdxid(d):
12    return "SPDXRef-%s-%s" % ("Recipe", d.getVar("PN"))
13
14
15def get_package_spdxid(pkg):
16    return "SPDXRef-Package-%s" % pkg
17
18
19def get_source_file_spdxid(d, idx):
20    return "SPDXRef-SourceFile-%s-%d" % (d.getVar("PN"), idx)
21
22
23def get_packaged_file_spdxid(pkg, idx):
24    return "SPDXRef-PackagedFile-%s-%d" % (pkg, idx)
25
26
27def get_image_spdxid(img):
28    return "SPDXRef-Image-%s" % img
29
30
31def get_sdk_spdxid(sdk):
32    return "SPDXRef-SDK-%s" % sdk
33
34
35def write_doc(d, spdx_doc, subdir, spdx_deploy=None, indent=None):
36    from pathlib import Path
37
38    if spdx_deploy is None:
39        spdx_deploy = Path(d.getVar("SPDXDEPLOY"))
40
41    dest = spdx_deploy / subdir / (spdx_doc.name + ".spdx.json")
42    dest.parent.mkdir(exist_ok=True, parents=True)
43    with dest.open("wb") as f:
44        doc_sha1 = spdx_doc.to_json(f, sort_keys=True, indent=indent)
45
46    l = spdx_deploy / "by-namespace" / spdx_doc.documentNamespace.replace("/", "_")
47    l.parent.mkdir(exist_ok=True, parents=True)
48    l.symlink_to(os.path.relpath(dest, l.parent))
49
50    return doc_sha1
51
52
53def read_doc(fn):
54    import hashlib
55    import oe.spdx
56    import io
57    import contextlib
58
59    @contextlib.contextmanager
60    def get_file():
61        if isinstance(fn, io.IOBase):
62            yield fn
63        else:
64            with fn.open("rb") as f:
65                yield f
66
67    with get_file() as f:
68        sha1 = hashlib.sha1()
69        while True:
70            chunk = f.read(4096)
71            if not chunk:
72                break
73            sha1.update(chunk)
74
75        f.seek(0)
76        doc = oe.spdx.SPDXDocument.from_json(f)
77
78    return (doc, sha1.hexdigest())
79