fosslight-binary 5.1.0__tar.gz → 5.1.1__tar.gz
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_binary-5.1.0 → fosslight_binary-5.1.1}/PKG-INFO +1 -1
- {fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/setup.py +1 -1
- fosslight_binary-5.1.1/src/fosslight_binary/_simple_mode.py +118 -0
- {fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/src/fosslight_binary/binary_analysis.py +49 -32
- {fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/src/fosslight_binary/cli.py +1 -1
- {fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/src/fosslight_binary.egg-info/PKG-INFO +1 -1
- {fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/src/fosslight_binary.egg-info/SOURCES.txt +1 -0
- {fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/LICENSE +0 -0
- {fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/LICENSES/Apache-2.0.txt +0 -0
- {fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/LICENSES/LicenseRef-3rd_party_licenses.txt +0 -0
- {fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/MANIFEST.in +0 -0
- {fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/README.md +0 -0
- {fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/requirements.txt +0 -0
- {fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/setup.cfg +0 -0
- {fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/src/fosslight_binary/__init__.py +0 -0
- {fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/src/fosslight_binary/_binary.py +0 -0
- {fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/src/fosslight_binary/_binary_dao.py +0 -0
- {fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/src/fosslight_binary/_help.py +0 -0
- {fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/src/fosslight_binary/_jar_analysis.py +0 -0
- {fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/src/fosslight_binary.egg-info/dependency_links.txt +0 -0
- {fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/src/fosslight_binary.egg-info/entry_points.txt +0 -0
- {fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/src/fosslight_binary.egg-info/requires.txt +0 -0
- {fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/src/fosslight_binary.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# FOSSLight Binary analysis script
|
|
4
|
+
# Copyright (c) 2024 LG Electronics Inc.
|
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
6
|
+
import os
|
|
7
|
+
import re
|
|
8
|
+
import logging
|
|
9
|
+
import zipfile
|
|
10
|
+
import tarfile
|
|
11
|
+
import fosslight_util.constant as constant
|
|
12
|
+
from fosslight_util.write_txt import write_txt_file
|
|
13
|
+
from fosslight_util.set_log import init_log
|
|
14
|
+
|
|
15
|
+
REMOVE_FILE_EXTENSION_SIMPLE = ['ttf', 'otf', 'png', 'gif', 'jpg', 'bmp', 'jpeg']
|
|
16
|
+
logger = logging.getLogger(constant.LOGGER_NAME)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def is_compressed_file(filename):
|
|
20
|
+
if filename.lower().endswith('.jar'):
|
|
21
|
+
return False
|
|
22
|
+
return zipfile.is_zipfile(filename) or tarfile.is_tarfile(filename)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def exclude_bin_for_simple_mode(binary_list):
|
|
26
|
+
bin_list = []
|
|
27
|
+
compressed_list = []
|
|
28
|
+
|
|
29
|
+
for bin in binary_list:
|
|
30
|
+
file_lower_case = bin.bin_name_with_path.lower()
|
|
31
|
+
extension = os.path.splitext(file_lower_case)[1][1:].strip()
|
|
32
|
+
|
|
33
|
+
if is_compressed_file(bin.bin_name_with_path):
|
|
34
|
+
compressed_list.append(bin.bin_name_with_path)
|
|
35
|
+
continue
|
|
36
|
+
|
|
37
|
+
remove_file_ext_list = REMOVE_FILE_EXTENSION_SIMPLE
|
|
38
|
+
if any(extension == remove_ext for remove_ext in remove_file_ext_list):
|
|
39
|
+
continue
|
|
40
|
+
if re.search(r".*sources\.jar", bin.bin_name_with_path.lower()) or bin.exclude:
|
|
41
|
+
continue
|
|
42
|
+
|
|
43
|
+
bin_list.append(bin.bin_name_with_path)
|
|
44
|
+
return compressed_list, bin_list
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def convert_list_to_str(input_list):
|
|
48
|
+
output_text = '\n'.join(map(str, input_list))
|
|
49
|
+
return output_text
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def check_output_path(output, start_time):
|
|
53
|
+
compressed_list_txt = ""
|
|
54
|
+
simple_bin_list_txt = ""
|
|
55
|
+
output_path = ""
|
|
56
|
+
|
|
57
|
+
if output != "":
|
|
58
|
+
if not os.path.isdir(output) and output.endswith('.txt'):
|
|
59
|
+
output_path = os.path.dirname(output)
|
|
60
|
+
basename = os.path.basename(output)
|
|
61
|
+
basename_file, _ = os.path.splitext(basename)
|
|
62
|
+
compressed_list_txt = f"{basename_file}_compressed_list.txt"
|
|
63
|
+
simple_bin_list_txt = f"{basename_file}.txt"
|
|
64
|
+
else:
|
|
65
|
+
output_path = output
|
|
66
|
+
compressed_list_txt = f"compressed_list_{start_time}.txt"
|
|
67
|
+
simple_bin_list_txt = f"binary_list_{start_time}.txt"
|
|
68
|
+
else:
|
|
69
|
+
compressed_list_txt = f"compressed_list_{start_time}.txt"
|
|
70
|
+
simple_bin_list_txt = f"binary_list_{start_time}.txt"
|
|
71
|
+
|
|
72
|
+
if output_path == "":
|
|
73
|
+
output_path = os.getcwd()
|
|
74
|
+
else:
|
|
75
|
+
output_path = os.path.abspath(output_path)
|
|
76
|
+
|
|
77
|
+
compressed_list_txt = os.path.join(output_path, compressed_list_txt)
|
|
78
|
+
simple_bin_list_txt = os.path.join(output_path, simple_bin_list_txt)
|
|
79
|
+
|
|
80
|
+
return output_path, compressed_list_txt, simple_bin_list_txt
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def init_simple(output_file_name, pkg_name, start_time):
|
|
84
|
+
global logger, _result_log
|
|
85
|
+
|
|
86
|
+
output_path, compressed_list_txt, simple_bin_list_txt = check_output_path(output_file_name, start_time)
|
|
87
|
+
|
|
88
|
+
log_file = os.path.join(output_path, f"fosslight_log_bin_{start_time}.txt")
|
|
89
|
+
logger, _result_log = init_log(log_file, False, logging.INFO, logging.DEBUG, pkg_name)
|
|
90
|
+
|
|
91
|
+
return _result_log, compressed_list_txt, simple_bin_list_txt
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def print_simple_mode(compressed_list_txt, simple_bin_list_txt, compressed_list, bin_list):
|
|
95
|
+
results = []
|
|
96
|
+
success = True
|
|
97
|
+
msg = ""
|
|
98
|
+
output_file = ""
|
|
99
|
+
if compressed_list:
|
|
100
|
+
success, error = write_txt_file(compressed_list_txt, convert_list_to_str(compressed_list))
|
|
101
|
+
if success:
|
|
102
|
+
output_file = compressed_list_txt
|
|
103
|
+
else:
|
|
104
|
+
msg = f"Error to write compressed list file for simple mode : {error}"
|
|
105
|
+
results.append(tuple([success, msg, output_file]))
|
|
106
|
+
if bin_list:
|
|
107
|
+
success, error = write_txt_file(simple_bin_list_txt, convert_list_to_str(bin_list))
|
|
108
|
+
if success:
|
|
109
|
+
output_file = simple_bin_list_txt
|
|
110
|
+
else:
|
|
111
|
+
msg = f"Error to write binary list file for simple mode : {error}"
|
|
112
|
+
results.append(tuple([success, msg, output_file]))
|
|
113
|
+
return results
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def filter_binary(bin_list):
|
|
117
|
+
compressed_list, bin_list = exclude_bin_for_simple_mode(bin_list)
|
|
118
|
+
return compressed_list, bin_list
|
|
@@ -18,6 +18,7 @@ from fosslight_util.output_format import check_output_formats_v2, write_output_f
|
|
|
18
18
|
from ._binary_dao import get_oss_info_from_db
|
|
19
19
|
from ._binary import BinaryItem, TLSH_CHECKSUM_NULL
|
|
20
20
|
from ._jar_analysis import analyze_jar_file, merge_binary_list
|
|
21
|
+
from ._simple_mode import print_simple_mode, filter_binary, init_simple
|
|
21
22
|
from fosslight_util.correct import correct_with_yaml
|
|
22
23
|
from fosslight_util.oss_item import ScannerItem
|
|
23
24
|
import hashlib
|
|
@@ -41,7 +42,7 @@ _REMOVE_DIR = ['.git']
|
|
|
41
42
|
_REMOVE_DIR = [os.path.sep + dir_name + os.path.sep for dir_name in _REMOVE_DIR]
|
|
42
43
|
_error_logs = []
|
|
43
44
|
_root_path = ""
|
|
44
|
-
|
|
45
|
+
start_time = ""
|
|
45
46
|
windows = False
|
|
46
47
|
BYTES = 2048
|
|
47
48
|
BIN_EXT_HEADER = {'BIN_FL_Binary': ['ID', 'Binary Path', 'OSS Name',
|
|
@@ -72,18 +73,9 @@ def get_checksum_and_tlsh(bin_with_path):
|
|
|
72
73
|
|
|
73
74
|
|
|
74
75
|
def init(path_to_find_bin, output_file_name, formats, path_to_exclude=[]):
|
|
75
|
-
global
|
|
76
|
+
global logger, _result_log
|
|
76
77
|
|
|
77
78
|
_json_ext = ".json"
|
|
78
|
-
_start_time = datetime.now().strftime('%y%m%d_%H%M')
|
|
79
|
-
_result_log = {
|
|
80
|
-
"Tool Info": PKG_NAME
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
_root_path = path_to_find_bin
|
|
84
|
-
if not path_to_find_bin.endswith(os.path.sep):
|
|
85
|
-
_root_path += os.path.sep
|
|
86
|
-
|
|
87
79
|
success, msg, output_path, output_files, output_extensions, formats = check_output_formats_v2(output_file_name, formats)
|
|
88
80
|
|
|
89
81
|
if success:
|
|
@@ -100,20 +92,20 @@ def init(path_to_find_bin, output_file_name, formats, path_to_exclude=[]):
|
|
|
100
92
|
if formats:
|
|
101
93
|
if formats[i].startswith('spdx'):
|
|
102
94
|
if platform.system() != 'Windows':
|
|
103
|
-
output_files[i] = f"fosslight_spdx_bin_{
|
|
95
|
+
output_files[i] = f"fosslight_spdx_bin_{start_time}"
|
|
104
96
|
else:
|
|
105
97
|
logger.warning('spdx format is not supported on Windows. Please remove spdx from format.')
|
|
106
98
|
to_remove.append(i)
|
|
107
99
|
else:
|
|
108
100
|
if output_extension == _json_ext:
|
|
109
|
-
output_files[i] = f"fosslight_opossum_bin_{
|
|
101
|
+
output_files[i] = f"fosslight_opossum_bin_{start_time}"
|
|
110
102
|
else:
|
|
111
|
-
output_files[i] = f"fosslight_report_bin_{
|
|
103
|
+
output_files[i] = f"fosslight_report_bin_{start_time}"
|
|
112
104
|
else:
|
|
113
105
|
if output_extension == _json_ext:
|
|
114
|
-
output_files[i] = f"fosslight_opossum_bin_{
|
|
106
|
+
output_files[i] = f"fosslight_opossum_bin_{start_time}"
|
|
115
107
|
else:
|
|
116
|
-
output_files[i] = f"fosslight_report_bin_{
|
|
108
|
+
output_files[i] = f"fosslight_report_bin_{start_time}"
|
|
117
109
|
for index in sorted(to_remove, reverse=True):
|
|
118
110
|
# remove elements of spdx format on windows
|
|
119
111
|
del output_files[index]
|
|
@@ -127,7 +119,7 @@ def init(path_to_find_bin, output_file_name, formats, path_to_exclude=[]):
|
|
|
127
119
|
logger.error(f"Format error - {msg}")
|
|
128
120
|
sys.exit(1)
|
|
129
121
|
|
|
130
|
-
log_file = os.path.join(output_path, f"fosslight_log_bin_{
|
|
122
|
+
log_file = os.path.join(output_path, f"fosslight_log_bin_{start_time}.txt")
|
|
131
123
|
logger, _result_log = init_log(log_file, True, logging.INFO, logging.DEBUG,
|
|
132
124
|
PKG_NAME, path_to_find_bin, path_to_exclude)
|
|
133
125
|
|
|
@@ -176,6 +168,8 @@ def get_file_list(path_to_find, abs_path_to_exclude):
|
|
|
176
168
|
bin_item.exclude = True
|
|
177
169
|
elif extension in _EXCLUDE_FILE_EXTENSION:
|
|
178
170
|
bin_item.exclude = True
|
|
171
|
+
elif file.startswith('.'):
|
|
172
|
+
bin_item.exclude = True
|
|
179
173
|
bin_list.append(bin_item)
|
|
180
174
|
file_cnt += 1
|
|
181
175
|
return file_cnt, bin_list, found_jar
|
|
@@ -183,9 +177,21 @@ def get_file_list(path_to_find, abs_path_to_exclude):
|
|
|
183
177
|
|
|
184
178
|
def find_binaries(path_to_find_bin, output_dir, formats, dburl="", simple_mode=False,
|
|
185
179
|
correct_mode=True, correct_filepath="", path_to_exclude=[]):
|
|
180
|
+
global start_time, _root_path, _result_log
|
|
186
181
|
|
|
187
|
-
|
|
188
|
-
|
|
182
|
+
mode = "Normal Mode"
|
|
183
|
+
start_time = datetime.now().strftime('%y%m%d_%H%M')
|
|
184
|
+
|
|
185
|
+
_root_path = path_to_find_bin
|
|
186
|
+
if not path_to_find_bin.endswith(os.path.sep):
|
|
187
|
+
_root_path += os.path.sep
|
|
188
|
+
|
|
189
|
+
if simple_mode:
|
|
190
|
+
mode = "Simple Mode"
|
|
191
|
+
_result_log, compressed_list_txt, simple_bin_list_txt = init_simple(output_dir, PKG_NAME, start_time)
|
|
192
|
+
else:
|
|
193
|
+
_result_log, result_reports, output_extensions = init(
|
|
194
|
+
path_to_find_bin, output_dir, formats, path_to_exclude)
|
|
189
195
|
|
|
190
196
|
total_bin_cnt = 0
|
|
191
197
|
total_file_cnt = 0
|
|
@@ -201,7 +207,8 @@ def find_binaries(path_to_find_bin, output_dir, formats, dburl="", simple_mode=F
|
|
|
201
207
|
if not os.path.isdir(path_to_find_bin):
|
|
202
208
|
error_occured(error_msg=f"Can't find the directory : {path_to_find_bin}",
|
|
203
209
|
result_log=_result_log,
|
|
204
|
-
exit=True
|
|
210
|
+
exit=True,
|
|
211
|
+
mode=mode)
|
|
205
212
|
if not correct_filepath:
|
|
206
213
|
correct_filepath = path_to_find_bin
|
|
207
214
|
try:
|
|
@@ -210,12 +217,21 @@ def find_binaries(path_to_find_bin, output_dir, formats, dburl="", simple_mode=F
|
|
|
210
217
|
except Exception as ex:
|
|
211
218
|
error_occured(error_msg=f"Failed to check whether it is binary or not : {ex}",
|
|
212
219
|
result_log=_result_log,
|
|
213
|
-
exit=True
|
|
214
|
-
|
|
220
|
+
exit=True,
|
|
221
|
+
mode=mode)
|
|
215
222
|
if simple_mode:
|
|
216
|
-
|
|
223
|
+
try:
|
|
224
|
+
compressed_list, filtered_bin_list = filter_binary(return_list)
|
|
225
|
+
results = print_simple_mode(compressed_list_txt, simple_bin_list_txt, compressed_list, filtered_bin_list)
|
|
226
|
+
total_bin_cnt = len(filtered_bin_list)
|
|
227
|
+
except Exception as ex:
|
|
228
|
+
error_occured(error_msg=f"Failed to run simple mode: {ex}",
|
|
229
|
+
result_log=_result_log,
|
|
230
|
+
exit=True,
|
|
231
|
+
mode="Simple mode")
|
|
217
232
|
else:
|
|
218
|
-
|
|
233
|
+
total_bin_cnt = len(return_list)
|
|
234
|
+
scan_item = ScannerItem(PKG_NAME, start_time)
|
|
219
235
|
scan_item.set_cover_pathinfo(path_to_find_bin, path_to_exclude)
|
|
220
236
|
try:
|
|
221
237
|
# Run OWASP Dependency-check
|
|
@@ -262,7 +278,7 @@ def find_binaries(path_to_find_bin, output_dir, formats, dburl="", simple_mode=F
|
|
|
262
278
|
logger.error(f"Fail to generate result file.:{writing_msg}")
|
|
263
279
|
|
|
264
280
|
try:
|
|
265
|
-
print_result_log(success=True, result_log=_result_log,
|
|
281
|
+
print_result_log(mode=mode, success=True, result_log=_result_log,
|
|
266
282
|
file_cnt=str(total_file_cnt),
|
|
267
283
|
bin_file_cnt=str(total_bin_cnt),
|
|
268
284
|
auto_bin_cnt=str(db_loaded_cnt), bin_list=bin_list)
|
|
@@ -279,7 +295,7 @@ def return_bin_only(file_list, need_checksum_tlsh=True):
|
|
|
279
295
|
if need_checksum_tlsh:
|
|
280
296
|
file_item.checksum, file_item.tlsh, error_msg = get_checksum_and_tlsh(file_item.bin_name_with_path)
|
|
281
297
|
if error_msg:
|
|
282
|
-
error_occured(
|
|
298
|
+
error_occured(modeerror_msg=error_msg, exit=False)
|
|
283
299
|
yield file_item
|
|
284
300
|
except Exception as ex:
|
|
285
301
|
logger.debug(f"Exception in get_file_list: {ex}")
|
|
@@ -317,21 +333,22 @@ def check_binary(file_with_path):
|
|
|
317
333
|
return is_bin_confirmed
|
|
318
334
|
|
|
319
335
|
|
|
320
|
-
def error_occured(error_msg, exit=False, result_log={}):
|
|
336
|
+
def error_occured(error_msg, exit=False, result_log={}, mode="Normal mode"):
|
|
321
337
|
global _error_logs
|
|
322
338
|
_error_logs.append(error_msg)
|
|
323
339
|
if exit:
|
|
324
|
-
print_result_log(success=False, result_log=result_log)
|
|
340
|
+
print_result_log(mode, success=False, result_log=result_log)
|
|
325
341
|
sys.exit()
|
|
326
342
|
|
|
327
343
|
|
|
328
|
-
def print_result_log(success=True, result_log={}, file_cnt="", bin_file_cnt="", auto_bin_cnt="", bin_list=[]):
|
|
344
|
+
def print_result_log(mode="Normal Mode", success=True, result_log={}, file_cnt="", bin_file_cnt="", auto_bin_cnt="", bin_list=[]):
|
|
329
345
|
|
|
330
346
|
if "Running time" in result_log:
|
|
331
|
-
|
|
347
|
+
starttime = result_log["Running time"]
|
|
332
348
|
else:
|
|
333
|
-
|
|
334
|
-
result_log["
|
|
349
|
+
starttime = start_time
|
|
350
|
+
result_log["Mode"] = mode
|
|
351
|
+
result_log["Running time"] = starttime + " ~ " + \
|
|
335
352
|
datetime.now().strftime('%Y%m%d_%H%M%S')
|
|
336
353
|
result_log["Execution result"] = 'Success' if success else 'Error occurred'
|
|
337
354
|
result_log["Binaries / Scanned files"] = f"{bin_file_cnt}/{file_cnt}"
|
|
@@ -11,6 +11,7 @@ src/fosslight_binary/_binary.py
|
|
|
11
11
|
src/fosslight_binary/_binary_dao.py
|
|
12
12
|
src/fosslight_binary/_help.py
|
|
13
13
|
src/fosslight_binary/_jar_analysis.py
|
|
14
|
+
src/fosslight_binary/_simple_mode.py
|
|
14
15
|
src/fosslight_binary/binary_analysis.py
|
|
15
16
|
src/fosslight_binary/cli.py
|
|
16
17
|
src/fosslight_binary.egg-info/PKG-INFO
|
|
File without changes
|
|
File without changes
|
{fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/LICENSES/LicenseRef-3rd_party_licenses.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/src/fosslight_binary.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/src/fosslight_binary.egg-info/entry_points.txt
RENAMED
|
File without changes
|
{fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/src/fosslight_binary.egg-info/requires.txt
RENAMED
|
File without changes
|
{fosslight_binary-5.1.0 → fosslight_binary-5.1.1}/src/fosslight_binary.egg-info/top_level.txt
RENAMED
|
File without changes
|