Skip to content

Commit f5c947d

Browse files
authored
Merge pull request #130 from fosslight/temp
Apply simple mode
2 parents 9d3465f + 1b52f82 commit f5c947d

File tree

3 files changed

+168
-33
lines changed

3 files changed

+168
-33
lines changed

src/fosslight_binary/_simple_mode.py

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

src/fosslight_binary/binary_analysis.py

Lines changed: 49 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from ._binary_dao import get_oss_info_from_db
1919
from ._binary import BinaryItem, TLSH_CHECKSUM_NULL
2020
from ._jar_analysis import analyze_jar_file, merge_binary_list
21+
from ._simple_mode import print_simple_mode, filter_binary, init_simple
2122
from fosslight_util.correct import correct_with_yaml
2223
from fosslight_util.oss_item import ScannerItem
2324
import hashlib
@@ -41,7 +42,7 @@
4142
_REMOVE_DIR = [os.path.sep + dir_name + os.path.sep for dir_name in _REMOVE_DIR]
4243
_error_logs = []
4344
_root_path = ""
44-
_start_time = ""
45+
start_time = ""
4546
windows = False
4647
BYTES = 2048
4748
BIN_EXT_HEADER = {'BIN_FL_Binary': ['ID', 'Binary Path', 'OSS Name',
@@ -72,18 +73,9 @@ def get_checksum_and_tlsh(bin_with_path):
7273

7374

7475
def init(path_to_find_bin, output_file_name, formats, path_to_exclude=[]):
75-
global _root_path, logger, _start_time
76+
global logger, _result_log
7677

7778
_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-
8779
success, msg, output_path, output_files, output_extensions, formats = check_output_formats_v2(output_file_name, formats)
8880

8981
if success:
@@ -100,20 +92,20 @@ def init(path_to_find_bin, output_file_name, formats, path_to_exclude=[]):
10092
if formats:
10193
if formats[i].startswith('spdx'):
10294
if platform.system() != 'Windows':
103-
output_files[i] = f"fosslight_spdx_bin_{_start_time}"
95+
output_files[i] = f"fosslight_spdx_bin_{start_time}"
10496
else:
10597
logger.warning('spdx format is not supported on Windows. Please remove spdx from format.')
10698
to_remove.append(i)
10799
else:
108100
if output_extension == _json_ext:
109-
output_files[i] = f"fosslight_opossum_bin_{_start_time}"
101+
output_files[i] = f"fosslight_opossum_bin_{start_time}"
110102
else:
111-
output_files[i] = f"fosslight_report_bin_{_start_time}"
103+
output_files[i] = f"fosslight_report_bin_{start_time}"
112104
else:
113105
if output_extension == _json_ext:
114-
output_files[i] = f"fosslight_opossum_bin_{_start_time}"
106+
output_files[i] = f"fosslight_opossum_bin_{start_time}"
115107
else:
116-
output_files[i] = f"fosslight_report_bin_{_start_time}"
108+
output_files[i] = f"fosslight_report_bin_{start_time}"
117109
for index in sorted(to_remove, reverse=True):
118110
# remove elements of spdx format on windows
119111
del output_files[index]
@@ -127,7 +119,7 @@ def init(path_to_find_bin, output_file_name, formats, path_to_exclude=[]):
127119
logger.error(f"Format error - {msg}")
128120
sys.exit(1)
129121

130-
log_file = os.path.join(output_path, f"fosslight_log_bin_{_start_time}.txt")
122+
log_file = os.path.join(output_path, f"fosslight_log_bin_{start_time}.txt")
131123
logger, _result_log = init_log(log_file, True, logging.INFO, logging.DEBUG,
132124
PKG_NAME, path_to_find_bin, path_to_exclude)
133125

@@ -176,16 +168,30 @@ def get_file_list(path_to_find, abs_path_to_exclude):
176168
bin_item.exclude = True
177169
elif extension in _EXCLUDE_FILE_EXTENSION:
178170
bin_item.exclude = True
171+
elif file.startswith('.'):
172+
bin_item.exclude = True
179173
bin_list.append(bin_item)
180174
file_cnt += 1
181175
return file_cnt, bin_list, found_jar
182176

183177

184178
def find_binaries(path_to_find_bin, output_dir, formats, dburl="", simple_mode=False,
185179
correct_mode=True, correct_filepath="", path_to_exclude=[]):
180+
global start_time, _root_path, _result_log
186181

187-
_result_log, result_reports, output_extensions = init(
188-
path_to_find_bin, output_dir, formats, path_to_exclude)
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)
189195

190196
total_bin_cnt = 0
191197
total_file_cnt = 0
@@ -201,7 +207,8 @@ def find_binaries(path_to_find_bin, output_dir, formats, dburl="", simple_mode=F
201207
if not os.path.isdir(path_to_find_bin):
202208
error_occured(error_msg=f"Can't find the directory : {path_to_find_bin}",
203209
result_log=_result_log,
204-
exit=True)
210+
exit=True,
211+
mode=mode)
205212
if not correct_filepath:
206213
correct_filepath = path_to_find_bin
207214
try:
@@ -210,12 +217,21 @@ def find_binaries(path_to_find_bin, output_dir, formats, dburl="", simple_mode=F
210217
except Exception as ex:
211218
error_occured(error_msg=f"Failed to check whether it is binary or not : {ex}",
212219
result_log=_result_log,
213-
exit=True)
214-
total_bin_cnt = len(return_list)
220+
exit=True,
221+
mode=mode)
215222
if simple_mode:
216-
bin_list = [bin.bin_name_with_path for bin in return_list]
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")
217232
else:
218-
scan_item = ScannerItem(PKG_NAME, _start_time)
233+
total_bin_cnt = len(return_list)
234+
scan_item = ScannerItem(PKG_NAME, start_time)
219235
scan_item.set_cover_pathinfo(path_to_find_bin, path_to_exclude)
220236
try:
221237
# Run OWASP Dependency-check
@@ -262,7 +278,7 @@ def find_binaries(path_to_find_bin, output_dir, formats, dburl="", simple_mode=F
262278
logger.error(f"Fail to generate result file.:{writing_msg}")
263279

264280
try:
265-
print_result_log(success=True, result_log=_result_log,
281+
print_result_log(mode=mode, success=True, result_log=_result_log,
266282
file_cnt=str(total_file_cnt),
267283
bin_file_cnt=str(total_bin_cnt),
268284
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):
279295
if need_checksum_tlsh:
280296
file_item.checksum, file_item.tlsh, error_msg = get_checksum_and_tlsh(file_item.bin_name_with_path)
281297
if error_msg:
282-
error_occured(error_msg=error_msg, exit=False)
298+
error_occured(modeerror_msg=error_msg, exit=False)
283299
yield file_item
284300
except Exception as ex:
285301
logger.debug(f"Exception in get_file_list: {ex}")
@@ -317,21 +333,22 @@ def check_binary(file_with_path):
317333
return is_bin_confirmed
318334

319335

320-
def error_occured(error_msg, exit=False, result_log={}):
336+
def error_occured(error_msg, exit=False, result_log={}, mode="Normal mode"):
321337
global _error_logs
322338
_error_logs.append(error_msg)
323339
if exit:
324-
print_result_log(success=False, result_log=result_log)
340+
print_result_log(mode, success=False, result_log=result_log)
325341
sys.exit()
326342

327343

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=[]):
329345

330346
if "Running time" in result_log:
331-
start_time = result_log["Running time"]
347+
starttime = result_log["Running time"]
332348
else:
333-
start_time = _start_time
334-
result_log["Running time"] = start_time + " ~ " + \
349+
starttime = start_time
350+
result_log["Mode"] = mode
351+
result_log["Running time"] = starttime + " ~ " + \
335352
datetime.now().strftime('%Y%m%d_%H%M%S')
336353
result_log["Execution result"] = 'Success' if success else 'Error occurred'
337354
result_log["Binaries / Scanned files"] = f"{bin_file_cnt}/{file_cnt}"

src/fosslight_binary/cli.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def main():
4949
print_package_version(_PKG_NAME, "FOSSLight Binary Scanner Version:")
5050
sys.exit(0)
5151

52-
if args.simple:
52+
if args.simple: # -s option
5353
simple_mode = True
5454

5555
if args.path: # -p option

0 commit comments

Comments
 (0)