fosslight-util 1.4.47__py3-none-any.whl → 2.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fosslight_util/compare_yaml.py +18 -11
- fosslight_util/constant.py +11 -0
- fosslight_util/convert_excel_to_yaml.py +1 -1
- fosslight_util/correct.py +47 -91
- fosslight_util/cover.py +19 -6
- fosslight_util/help.py +3 -4
- fosslight_util/oss_item.py +148 -155
- fosslight_util/output_format.py +7 -5
- fosslight_util/parsing_yaml.py +45 -30
- fosslight_util/read_excel.py +29 -35
- fosslight_util/set_log.py +20 -3
- fosslight_util/spdx_licenses.py +2 -1
- fosslight_util/write_excel.py +88 -156
- fosslight_util/write_opossum.py +14 -20
- fosslight_util/write_scancodejson.py +31 -31
- fosslight_util/write_spdx.py +30 -35
- fosslight_util/write_txt.py +2 -1
- fosslight_util/write_yaml.py +43 -54
- {fosslight_util-1.4.47.dist-info → fosslight_util-2.0.0.dist-info}/METADATA +7 -8
- fosslight_util-2.0.0.dist-info/RECORD +31 -0
- {fosslight_util-1.4.47.dist-info → fosslight_util-2.0.0.dist-info}/WHEEL +1 -1
- fosslight_util-1.4.47.dist-info/RECORD +0 -31
- {fosslight_util-1.4.47.dist-info → fosslight_util-2.0.0.dist-info}/LICENSE +0 -0
- {fosslight_util-1.4.47.dist-info → fosslight_util-2.0.0.dist-info}/entry_points.txt +0 -0
- {fosslight_util-1.4.47.dist-info → fosslight_util-2.0.0.dist-info}/top_level.txt +0 -0
fosslight_util/compare_yaml.py
CHANGED
|
@@ -4,9 +4,7 @@
|
|
|
4
4
|
# SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
|
|
6
6
|
import logging
|
|
7
|
-
import os
|
|
8
7
|
from fosslight_util.constant import LOGGER_NAME
|
|
9
|
-
from fosslight_util.parsing_yaml import parsing_yml
|
|
10
8
|
|
|
11
9
|
logger = logging.getLogger(LOGGER_NAME)
|
|
12
10
|
VERSION = 'version'
|
|
@@ -14,12 +12,16 @@ LICENSE = 'license'
|
|
|
14
12
|
NAME = 'name'
|
|
15
13
|
|
|
16
14
|
|
|
17
|
-
def compare_yaml(
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
def compare_yaml(before_fileitems, after_fileitems):
|
|
16
|
+
bf_raw = []
|
|
17
|
+
af_raw = []
|
|
18
|
+
for bf in before_fileitems:
|
|
19
|
+
bf_raw.extend(bf.get_print_json())
|
|
20
|
+
for af in after_fileitems:
|
|
21
|
+
af_raw.extend(af.get_print_json())
|
|
20
22
|
|
|
21
|
-
before_items = get_merged_item(
|
|
22
|
-
after_items = get_merged_item(
|
|
23
|
+
before_items = get_merged_item(bf_raw)
|
|
24
|
+
after_items = get_merged_item(af_raw)
|
|
23
25
|
|
|
24
26
|
new_before = []
|
|
25
27
|
for bi in before_items:
|
|
@@ -72,13 +74,18 @@ def compare_yaml(before_file, after_file):
|
|
|
72
74
|
def get_merged_item(oss_items):
|
|
73
75
|
item_list = []
|
|
74
76
|
for oi in oss_items:
|
|
75
|
-
if oi.exclude:
|
|
77
|
+
if oi.get("exclude", None):
|
|
76
78
|
continue
|
|
77
|
-
|
|
79
|
+
oi_name = oi.get("name", '')
|
|
80
|
+
oi_version = oi.get("version", '')
|
|
81
|
+
oi_license = oi.get("license", '')
|
|
82
|
+
if not (oi_name and oi_version and oi_license):
|
|
83
|
+
continue
|
|
84
|
+
item_info = {NAME: oi_name, VERSION: oi_version, LICENSE: oi_license}
|
|
78
85
|
|
|
79
|
-
filtered = next(filter(lambda oss_dict: oss_dict[NAME] ==
|
|
86
|
+
filtered = next(filter(lambda oss_dict: oss_dict[NAME] == oi_name and oss_dict[VERSION] == oi_version, item_list), None)
|
|
80
87
|
if filtered:
|
|
81
|
-
filtered[LICENSE].extend(
|
|
88
|
+
filtered[LICENSE].extend(oi_license)
|
|
82
89
|
filtered[LICENSE] = list(set(filtered[LICENSE]))
|
|
83
90
|
else:
|
|
84
91
|
item_list.append(item_info)
|
fosslight_util/constant.py
CHANGED
|
@@ -15,6 +15,17 @@ supported_sheet_and_scanner = {'SRC': FL_SOURCE,
|
|
|
15
15
|
f'BIN_{FL_BINARY}': FL_BINARY,
|
|
16
16
|
f'DEP_{FL_DEPENDENCY}': FL_DEPENDENCY}
|
|
17
17
|
|
|
18
|
+
FOSSLIGHT_SCANNER = 'fosslight_scanner'
|
|
19
|
+
FOSSLIGHT_SOURCE = 'fosslight_source'
|
|
20
|
+
FOSSLIGHT_DEPENDENCY = 'fosslight_dependency'
|
|
21
|
+
FOSSLIGHT_BINARY = 'fosslight_binary'
|
|
22
|
+
|
|
23
|
+
SHEET_NAME_FOR_SCANNER = {
|
|
24
|
+
FOSSLIGHT_SOURCE: 'SRC_FL_Source',
|
|
25
|
+
FOSSLIGHT_BINARY: 'BIN_FL_Binary',
|
|
26
|
+
FOSSLIGHT_DEPENDENCY: 'DEP_FL_Dependency'
|
|
27
|
+
}
|
|
28
|
+
|
|
18
29
|
# Github : https://github.com/(owner)/(repo)
|
|
19
30
|
# npm : https://www.npmjs.com/package/(package)/v/(version)
|
|
20
31
|
# npm2 : https://www.npmjs.com/package/@(group)/(package)/v/(version)
|
|
@@ -33,7 +33,7 @@ def find_report_file(path_to_find):
|
|
|
33
33
|
return ""
|
|
34
34
|
|
|
35
35
|
|
|
36
|
-
def convert_excel_to_yaml(oss_report_to_read, output_file, sheet_names=""):
|
|
36
|
+
def convert_excel_to_yaml(oss_report_to_read: str, output_file: str, sheet_names: str = "") -> None:
|
|
37
37
|
_file_extension = ".yaml"
|
|
38
38
|
yaml_dict = {}
|
|
39
39
|
|
fosslight_util/correct.py
CHANGED
|
@@ -7,19 +7,16 @@ import logging
|
|
|
7
7
|
import os
|
|
8
8
|
import copy
|
|
9
9
|
import re
|
|
10
|
-
from fosslight_util.constant import LOGGER_NAME
|
|
10
|
+
from fosslight_util.constant import LOGGER_NAME, FOSSLIGHT_SOURCE
|
|
11
11
|
from fosslight_util.parsing_yaml import parsing_yml
|
|
12
|
-
import fosslight_util.constant as constant
|
|
13
|
-
from fosslight_util.oss_item import OssItem
|
|
14
12
|
|
|
15
13
|
logger = logging.getLogger(LOGGER_NAME)
|
|
16
14
|
SBOM_INFO_YAML = r"sbom(-|_)info[\s\S]*.ya?ml"
|
|
17
15
|
|
|
18
16
|
|
|
19
|
-
def correct_with_yaml(correct_filepath, path_to_scan,
|
|
17
|
+
def correct_with_yaml(correct_filepath, path_to_scan, scan_item):
|
|
20
18
|
success = True
|
|
21
19
|
msg = ""
|
|
22
|
-
correct_list = {}
|
|
23
20
|
correct_yaml = ""
|
|
24
21
|
if correct_filepath == "":
|
|
25
22
|
correct_filepath = path_to_scan
|
|
@@ -33,101 +30,60 @@ def correct_with_yaml(correct_filepath, path_to_scan, scanner_oss_list):
|
|
|
33
30
|
if not correct_yaml:
|
|
34
31
|
msg = f"Cannot find sbom-info.yaml in {correct_filepath}."
|
|
35
32
|
success = False
|
|
36
|
-
return success, msg,
|
|
33
|
+
return success, msg, scan_item
|
|
37
34
|
|
|
38
35
|
rel_path = os.path.relpath(path_to_scan, correct_filepath)
|
|
39
36
|
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
yaml_file_list, _, err_msg = parsing_yml(correct_yaml, os.path.dirname(correct_yaml), print_log=True)
|
|
42
38
|
find_match = False
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
for idx, oss_raw_item in enumerate(sheet_contents):
|
|
54
|
-
if len(oss_raw_item) < 9:
|
|
55
|
-
logger.warning(f"sheet list is too short ({len(oss_raw_item)}): {oss_raw_item}")
|
|
39
|
+
for scanner_name, _ in scan_item.file_items.items():
|
|
40
|
+
correct_fileitems = []
|
|
41
|
+
exclude_fileitems = []
|
|
42
|
+
for yaml_file_item in yaml_file_list:
|
|
43
|
+
yaml_path_exists = False
|
|
44
|
+
if yaml_file_item.source_name_or_path == '':
|
|
45
|
+
if scanner_name == FOSSLIGHT_SOURCE:
|
|
46
|
+
correct_item = copy.deepcopy(yaml_file_item)
|
|
47
|
+
correct_item.comment = 'Added by sbom-info.yaml'
|
|
48
|
+
correct_fileitems.append(correct_item)
|
|
56
49
|
continue
|
|
57
|
-
|
|
58
|
-
|
|
50
|
+
for idx, scan_file_item in enumerate(scan_item.file_items[scanner_name]):
|
|
51
|
+
oss_rel_path = os.path.normpath(os.path.join(rel_path, scan_file_item.source_name_or_path))
|
|
52
|
+
yi_path = yaml_file_item.source_name_or_path
|
|
53
|
+
if ((os.path.normpath(yi_path) == os.path.normpath(oss_rel_path)) or
|
|
54
|
+
((os.path.normpath(oss_rel_path).startswith(os.path.normpath(yi_path.rstrip('*')))))):
|
|
55
|
+
correct_item = copy.deepcopy(scan_file_item)
|
|
56
|
+
correct_item.exclude = yaml_file_item.exclude
|
|
57
|
+
correct_item.oss_items = copy.deepcopy(yaml_file_item.oss_items)
|
|
58
|
+
correct_item.comment = ''
|
|
59
|
+
correct_item.comment = 'Loaded from sbom-info.yaml'
|
|
60
|
+
correct_fileitems.append(correct_item)
|
|
59
61
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
oss_rel_path = os.path.normpath(os.path.join(rel_path, oss_item.source_name_or_path[0]))
|
|
63
|
-
for y_idx, yi in enumerate(yaml_oss_list):
|
|
64
|
-
if not yi.source_name_or_path:
|
|
65
|
-
continue
|
|
66
|
-
for ys_idx, yi_path in enumerate(yi.source_name_or_path):
|
|
67
|
-
yi_item = copy.deepcopy(yi)
|
|
68
|
-
if ((os.path.normpath(yi_path) == os.path.normpath(oss_rel_path)) or
|
|
69
|
-
((os.path.normpath(oss_rel_path).startswith(os.path.normpath(yi_path.rstrip('*')))))):
|
|
70
|
-
find_match = True
|
|
71
|
-
yi_item.source_name_or_path = []
|
|
72
|
-
yi_item.source_name_or_path = oss_item.source_name_or_path[0]
|
|
73
|
-
matched_source_path_with_sbom.append(oss_item.source_name_or_path[0])
|
|
74
|
-
matched_yi.append(yi_item)
|
|
75
|
-
matched_yaml[y_idx][ys_idx] = 1
|
|
76
|
-
if len(matched_yi) > 0:
|
|
77
|
-
for matched_yi_item in matched_yi:
|
|
78
|
-
matched_oss_item = copy.deepcopy(matched_yi_item)
|
|
79
|
-
if matched_oss_item.comment:
|
|
80
|
-
matched_oss_item.comment += '/'
|
|
81
|
-
matched_oss_item.comment += 'Loaded from sbom-info.yaml'
|
|
82
|
-
if sheet_name == 'BIN_FL_Binary':
|
|
83
|
-
matched_oss_item.bin_vulnerability = oss_item.bin_vulnerability
|
|
84
|
-
matched_oss_item.bin_tlsh = oss_item.bin_tlsh
|
|
85
|
-
matched_oss_item.bin_sha1 = oss_item.bin_sha1
|
|
86
|
-
matched_oss_array = matched_oss_item.get_print_array(scanner_name)[0]
|
|
87
|
-
correct_contents.append(matched_oss_array)
|
|
88
|
-
oss_item.exclude = True
|
|
89
|
-
if oss_item.comment:
|
|
90
|
-
oss_item.comment += '/'
|
|
91
|
-
oss_item.comment += 'Excluded by sbom-info.yaml'
|
|
92
|
-
correct_contents[idx] = oss_item.get_print_array(scanner_name)[0]
|
|
93
|
-
else:
|
|
94
|
-
oss_item.exclude = True
|
|
95
|
-
if oss_item.comment:
|
|
96
|
-
oss_item.comment += '/'
|
|
97
|
-
oss_item.comment += 'Excluded by sbom-info.yaml'
|
|
98
|
-
correct_contents[idx] = oss_item.get_print_array(scanner_name)[0]
|
|
62
|
+
yaml_path_exists = True
|
|
63
|
+
exclude_fileitems.append(idx)
|
|
99
64
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
continue
|
|
119
|
-
for y_path in y_item.source_name_or_path:
|
|
120
|
-
y_item_i = copy.deepcopy(y_item)
|
|
121
|
-
if not os.path.exists(os.path.normpath(os.path.join(correct_filepath, y_path))):
|
|
122
|
-
y_item_i.exclude = True
|
|
123
|
-
y_item_i.source_name_or_path = []
|
|
124
|
-
y_item_i.source_name_or_path = y_path
|
|
125
|
-
correct_contents.append(y_item_i.get_print_array()[0])
|
|
126
|
-
correct_list[sheet_name] = correct_contents
|
|
65
|
+
if not yaml_path_exists:
|
|
66
|
+
correct_item = copy.deepcopy(yaml_file_item)
|
|
67
|
+
if os.path.exists(os.path.normpath(yaml_file_item.source_name_or_path)):
|
|
68
|
+
correct_item.comment = 'Loaded from sbom-info.yaml'
|
|
69
|
+
correct_fileitems.append(correct_item)
|
|
70
|
+
else:
|
|
71
|
+
if scanner_name == FOSSLIGHT_SOURCE:
|
|
72
|
+
correct_item.exclude = True
|
|
73
|
+
correct_item.comment = 'Added by sbom-info.yaml'
|
|
74
|
+
correct_fileitems.append(correct_item)
|
|
75
|
+
if correct_fileitems:
|
|
76
|
+
scan_item.append_file_items(correct_fileitems, scanner_name)
|
|
77
|
+
find_match = True
|
|
78
|
+
if exclude_fileitems:
|
|
79
|
+
exclude_fileitems = list(set(exclude_fileitems))
|
|
80
|
+
for e_idx in exclude_fileitems:
|
|
81
|
+
scan_item.file_items[scanner_name][e_idx].exclude = True
|
|
82
|
+
scan_item.file_items[scanner_name][e_idx].comment = 'Excluded by sbom-info.yaml'
|
|
127
83
|
|
|
128
84
|
if not find_match:
|
|
129
85
|
success = False
|
|
130
86
|
err_msg = 'No match items in sbom-info.yaml'
|
|
131
|
-
return success, err_msg,
|
|
87
|
+
return success, err_msg, scan_item
|
|
132
88
|
|
|
133
|
-
return success, msg,
|
|
89
|
+
return success, msg, scan_item
|
fosslight_util/cover.py
CHANGED
|
@@ -9,16 +9,31 @@ from fosslight_util.help import print_package_version
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class CoverItem:
|
|
12
|
-
tool_name_key = "Tool
|
|
13
|
-
tool_version_key = "Tool version"
|
|
12
|
+
tool_name_key = "Tool information"
|
|
14
13
|
start_time_key = "Start time"
|
|
15
14
|
python_ver_key = "Python version"
|
|
16
15
|
analyzed_path_key = "Analyzed path"
|
|
17
16
|
excluded_path_key = "Excluded path"
|
|
18
17
|
comment_key = "Comment"
|
|
19
18
|
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
PKG_NAMES = [
|
|
20
|
+
"fosslight_scanner",
|
|
21
|
+
"fosslight_source",
|
|
22
|
+
"fosslight_dependency",
|
|
23
|
+
"fosslight_binary"
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
def __init__(self, tool_name="", start_time="", input_path="", comment="", exclude_path=[], simple_mode=True):
|
|
27
|
+
if simple_mode:
|
|
28
|
+
self.tool_name = f'{tool_name} v{print_package_version(tool_name, "", False)}'
|
|
29
|
+
else:
|
|
30
|
+
first_pkg = f'{self.PKG_NAMES[0]} v{print_package_version(self.PKG_NAMES[0], "", False)}'
|
|
31
|
+
remaining_pkgs = ", ".join([
|
|
32
|
+
f'{pkg_name} v{print_package_version(pkg_name, "", False)}'
|
|
33
|
+
for pkg_name in self.PKG_NAMES[1:]
|
|
34
|
+
])
|
|
35
|
+
self.tool_name = f'{first_pkg} ({remaining_pkgs})'
|
|
36
|
+
|
|
22
37
|
if start_time:
|
|
23
38
|
date, time = start_time.split('_')
|
|
24
39
|
self.start_time = f'{date}, {time[0:2]}:{time[2:4]}'
|
|
@@ -28,7 +43,6 @@ class CoverItem:
|
|
|
28
43
|
self.exclude_path = ", ".join(exclude_path)
|
|
29
44
|
self.comment = comment
|
|
30
45
|
|
|
31
|
-
self.tool_version = print_package_version(self.tool_name, "", False)
|
|
32
46
|
self.python_version = f'{sys.version_info.major}.{sys.version_info.minor}'
|
|
33
47
|
|
|
34
48
|
def __del__(self):
|
|
@@ -37,7 +51,6 @@ class CoverItem:
|
|
|
37
51
|
def get_print_json(self):
|
|
38
52
|
json_item = {}
|
|
39
53
|
json_item[self.tool_name_key] = self.tool_name
|
|
40
|
-
json_item[self.tool_version_key] = self.tool_version
|
|
41
54
|
json_item[self.start_time_key] = self.start_time
|
|
42
55
|
json_item[self.python_ver_key] = self.python_version
|
|
43
56
|
json_item[self.analyzed_path_key] = self.input_path
|
fosslight_util/help.py
CHANGED
|
@@ -35,12 +35,11 @@ _HELP_MESSAGE_DOWNLOAD = """
|
|
|
35
35
|
|
|
36
36
|
|
|
37
37
|
class PrintHelpMsg():
|
|
38
|
-
message_suffix = ""
|
|
39
38
|
|
|
40
|
-
def __init__(self, value):
|
|
39
|
+
def __init__(self, value: str = ""):
|
|
41
40
|
self.message_suffix = value
|
|
42
41
|
|
|
43
|
-
def print_help_msg(self, exitopt):
|
|
42
|
+
def print_help_msg(self, exitopt: bool) -> None:
|
|
44
43
|
print(_HELP_MESSAGE_COMMON)
|
|
45
44
|
print(self.message_suffix)
|
|
46
45
|
|
|
@@ -48,7 +47,7 @@ class PrintHelpMsg():
|
|
|
48
47
|
sys.exit()
|
|
49
48
|
|
|
50
49
|
|
|
51
|
-
def print_package_version(pkg_name, msg="", exitopt=True):
|
|
50
|
+
def print_package_version(pkg_name: str, msg: str = "", exitopt: bool = True) -> str:
|
|
52
51
|
if msg == "":
|
|
53
52
|
msg = f"{pkg_name} Version:"
|
|
54
53
|
cur_version = pkg_resources.get_distribution(pkg_name).version
|