Skip to content

Commit 027983a

Browse files
committed
Redefine the disk storage structure
Signed-off-by: ziadhany <ziadhany2016@gmail.com>
1 parent 49ff11d commit 027983a

2 files changed

Lines changed: 77 additions & 78 deletions

File tree

vulnerabilities/management/commands/export.py

Lines changed: 57 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
# See https://aboutcode.org for more information about nexB OSS projects.
88
#
99
import logging
10+
import os
1011
from pathlib import Path
1112

1213
import saneyaml
@@ -45,6 +46,7 @@ def export_data(self, git_path):
4546
ecosystems = [pkg.type for pkg in Package.objects.distinct("type")]
4647

4748
for ecosystem in ecosystems:
49+
version_files = {} # {"version path": "data" }
4850
package_files = {} # {"package path": "data" }
4951
vul_files = {} # {"vulnerability path": "data" }
5052

@@ -53,73 +55,76 @@ def export_data(self, git_path):
5355
.prefetch_related("vulnerabilities")
5456
.paginated()
5557
):
56-
5758
purl_without_version = PackageURL(
5859
type=purl.type,
5960
namespace=purl.namespace,
6061
name=purl.name,
6162
)
62-
package_dir = create_sub_paths(git_path, purl.type, purl.namespace, purl.name)
63-
filename = f"{purl.type}-{purl.namespace}-{purl.name}.yml".replace("/", " ")
64-
package_dir_file = package_dir.joinpath(filename)
65-
if package_dir_file in package_files:
66-
package_data = {
67-
"purl": str(purl),
68-
"affected_by_vulnerabilities": [
69-
vuln.vulnerability_id for vuln in purl.affected_by
70-
],
71-
"fixing_vulnerabilities": [vuln.vulnerability_id for vuln in purl.fixing],
72-
}
73-
package_files[package_dir_file]["versions"].append(package_data)
63+
64+
# ./aboutcode-packages-ed5/maven/org.apache.log4j/log4j-core/versions/vulnerabilities.yml
65+
pkg_filepath = (
66+
f"./aboutcode-packages-ed5/{purl.type}/{purl.namespace}/{purl.name}"
67+
f"/versions/vulnerabilities.yml"
68+
)
69+
70+
# ./aboutcode-packages-ed5/maven/org.apache.log4j/log4j-core/versions/1.2.3/vulnerabilities.yml
71+
version_filepath = (
72+
f"./aboutcode-packages-ed5/{purl.type}/{purl.namespace}/{purl.name}/versions/"
73+
f"{purl.version}/vulnerabilities.yml"
74+
)
75+
76+
package_data = {
77+
"purl": str(purl),
78+
"affected_by_vulnerabilities": [
79+
vuln.vulnerability_id for vuln in purl.affected_by
80+
],
81+
"fixing_vulnerabilities": [vuln.vulnerability_id for vuln in purl.fixing],
82+
}
83+
84+
if pkg_filepath in package_files:
85+
package_files[pkg_filepath]["versions"].append(package_data)
7486
else:
75-
package_files[package_dir_file] = {
87+
package_files[pkg_filepath] = {
7688
"package": str(purl_without_version),
77-
"versions": [
78-
{
79-
"purl": str(purl),
80-
"affected_by_vulnerabilities": [
81-
vuln.vulnerability_id for vuln in purl.affected_by
82-
],
83-
"fixing_vulnerabilities": [
84-
vuln.vulnerability_id for vuln in purl.fixing
85-
],
86-
}
87-
],
89+
"versions": [package_data],
8890
}
91+
version_files[version_filepath] = package_data
8992

9093
for vul in purl.vulnerabilities.all():
91-
vul_filepath = package_dir.joinpath(f"{vul.vulnerability_id}.yml")
92-
vul_files[vul_filepath] = saneyaml.dump(
93-
{
94-
"vulnerability_id": vul.vulnerability_id,
95-
"aliases": [alias.alias for alias in vul.get_aliases],
96-
"summary": vul.summary,
97-
"severities": [severity for severity in vul.severities.values()],
98-
"references": [ref for ref in vul.references.values()],
99-
"weaknesses": [
100-
"CWE-" + str(weakness["cwe_id"])
101-
for weakness in vul.weaknesses.values()
102-
],
103-
}
94+
vulnerability_id = vul.vulnerability_id
95+
# ./aboutcode-vulnerabilities-1223/3434/VCID-1223-3434-34343/VCID-1223-3434-34343.yml
96+
vul_filepath = (
97+
f"./aboutcode-vulnerabilities-{vulnerability_id[5:9]}/{vulnerability_id[10:14]}"
98+
f"/{vulnerability_id}/{vulnerability_id}.yml"
10499
)
100+
vul_files[vul_filepath] = {
101+
"vulnerability_id": vul.vulnerability_id,
102+
"aliases": [alias.alias for alias in vul.get_aliases],
103+
"summary": vul.summary,
104+
"severities": [severity for severity in vul.severities.values()],
105+
"references": [ref for ref in vul.references.values()],
106+
"weaknesses": [
107+
"CWE-" + str(weakness["cwe_id"]) for weakness in vul.weaknesses.values()
108+
],
109+
}
105110

106-
for k, v in package_files.items():
107-
data = saneyaml.dump(v)
108-
with open(k, encoding="utf-8", mode="w") as f:
109-
f.write(data)
111+
for items in [package_files, version_files, vul_files]:
112+
for filepath, data in items.items():
113+
create_file(filepath, git_path, data)
110114

111-
for k, v in vul_files.items():
112-
with open(k, encoding="utf-8", mode="w") as f:
113-
f.write(v)
114115
self.stdout.write(f"Successfully exported {ecosystem} data")
115116

116117

117-
def create_sub_paths(git_path, purl_type, purl_namespace, purl_name):
118+
def create_file(filepath, git_path, data):
118119
"""
119-
create the directories if it doesn't exist : `path/purl_type/purl_namespace/purl_name`
120+
Check if the directories exist if it doesn't exist create a new one then Create the file
121+
./aboutcode-vulnerabilities-1223/3434/VCID-1223-3434-34343/VCID-1223-3434-34343.yml
122+
./aboutcode-packages-ed5/maven/org.apache.log4j/log4j-core/versions/vulnerabilities.yml
123+
./aboutcode-packages-ed5/maven/org.apache.log4j/log4j-core/versions/1.2.3/vulnerabilities.yml
120124
"""
121-
ecosystem_dir = git_path.joinpath(purl_type)
122-
namespace_dir = ecosystem_dir.joinpath(purl_namespace)
123-
package_dir = namespace_dir.joinpath(purl_name)
124-
package_dir.mkdir(parents=True, exist_ok=True)
125-
return package_dir
125+
filepath = git_path.joinpath(filepath)
126+
dirname = os.path.dirname(filepath)
127+
os.makedirs(dirname, exist_ok=True)
128+
data = saneyaml.dump(data)
129+
with open(filepath, encoding="utf-8", mode="w") as f:
130+
f.write(data)

vulnerabilities/tests/test_export.py

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
from django.core.management import call_command
99
from django.core.management.base import CommandError
1010

11-
from vulnerabilities.management.commands.export import create_sub_paths
1211
from vulnerabilities.models import Alias
1312
from vulnerabilities.models import Package
1413
from vulnerabilities.models import PackageRelatedVulnerability
@@ -19,27 +18,6 @@
1918
from vulnerabilities.models import Weakness
2019

2120

22-
@pytest.mark.parametrize(
23-
"purl_type,purl_namespace,purl_name",
24-
[
25-
("generic", "", "nginx"),
26-
("github", "package-url", "purl-spec"),
27-
("pypi", "", "django"),
28-
],
29-
)
30-
def test_create_sub_paths(tmp_path, purl_type, purl_namespace, purl_name):
31-
create_sub_paths(tmp_path, purl_type, purl_namespace, purl_name)
32-
33-
ecosystem_dir = os.path.join(tmp_path, purl_type)
34-
assert os.path.isdir(ecosystem_dir)
35-
36-
namespace_dir = os.path.join(ecosystem_dir, purl_namespace)
37-
assert os.path.isdir(namespace_dir)
38-
39-
name_dir = os.path.join(namespace_dir, purl_name)
40-
assert os.path.isdir(name_dir)
41-
42-
4321
@pytest.fixture
4422
def package(db):
4523
return Package.objects.create(
@@ -109,7 +87,7 @@ def test_bad_path_fail_error(self):
10987

11088

11189
@pytest.mark.django_db
112-
def test_write_vul_data(
90+
def test_export_data(
11391
tmp_path, package_related_vulnerability, vulnerability_reference, vulnerability_severity
11492
):
11593
expected_vul = {
@@ -140,11 +118,27 @@ def test_write_vul_data(
140118
},
141119
],
142120
}
121+
expected_version = {
122+
"purl": "pkg:generic/nginx/test@2",
123+
"affected_by_vulnerabilities": ["VCID-pst6-b358-aaap"],
124+
"fixing_vulnerabilities": [],
125+
}
143126

144127
call_command("export", tmp_path, stdout=StringIO())
145-
# path: type/namespace/name
146-
vul_filepath = os.path.join(tmp_path, "generic/nginx/test/VCID-pst6-b358-aaap.yml")
147-
pck_filepath = os.path.join(tmp_path, "generic/nginx/test/generic-nginx-test.yml")
128+
129+
vul_filepath = os.path.join(
130+
tmp_path,
131+
"./aboutcode-vulnerabilities-pst6/b358/VCID-pst6-b358-aaap/VCID-pst6-b358-aaap.yml",
132+
)
133+
pck_filepath = os.path.join(
134+
tmp_path,
135+
"./aboutcode-packages-ed5/generic/nginx/test/versions/vulnerabilities.yml",
136+
)
137+
version_filepath = os.path.join(
138+
tmp_path,
139+
"./aboutcode-packages-ed5/generic/nginx/test/versions/2/vulnerabilities.yml",
140+
)
148141

149142
assert Path(vul_filepath).read_text() == saneyaml.dump(expected_vul)
150143
assert Path(pck_filepath).read_text() == saneyaml.dump(expected_pkg)
144+
assert Path(version_filepath).read_text() == saneyaml.dump(expected_version)

0 commit comments

Comments
 (0)