fosslight-dependency 4.1.6__py3-none-any.whl → 4.1.8__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_dependency/_package_manager.py +36 -92
- fosslight_dependency/package_manager/Carthage.py +4 -6
- fosslight_dependency/package_manager/Maven.py +3 -2
- fosslight_dependency/package_manager/Nuget.py +6 -10
- fosslight_dependency/package_manager/Pub.py +2 -5
- fosslight_dependency/package_manager/Pypi.py +3 -8
- fosslight_dependency/package_manager/Swift.py +1 -1
- fosslight_dependency/package_manager/Unity.py +22 -8
- fosslight_dependency/run_dependency_scanner.py +51 -30
- {fosslight_dependency-4.1.6.dist-info → fosslight_dependency-4.1.8.dist-info}/METADATA +3 -3
- {fosslight_dependency-4.1.6.dist-info → fosslight_dependency-4.1.8.dist-info}/RECORD +18 -21
- fosslight_dependency/third_party/askalono/askalono.exe +0 -0
- fosslight_dependency/third_party/askalono/askalono_macos +0 -0
- fosslight_dependency/third_party/nomos/nomossa +0 -0
- {fosslight_dependency-4.1.6.dist-info → fosslight_dependency-4.1.8.dist-info}/Apache-2.0.txt +0 -0
- {fosslight_dependency-4.1.6.dist-info → fosslight_dependency-4.1.8.dist-info}/LICENSE +0 -0
- {fosslight_dependency-4.1.6.dist-info → fosslight_dependency-4.1.8.dist-info}/LicenseRef-3rd_party_licenses.txt +0 -0
- {fosslight_dependency-4.1.6.dist-info → fosslight_dependency-4.1.8.dist-info}/MIT.txt +0 -0
- {fosslight_dependency-4.1.6.dist-info → fosslight_dependency-4.1.8.dist-info}/WHEEL +0 -0
- {fosslight_dependency-4.1.6.dist-info → fosslight_dependency-4.1.8.dist-info}/entry_points.txt +0 -0
- {fosslight_dependency-4.1.6.dist-info → fosslight_dependency-4.1.8.dist-info}/top_level.txt +0 -0
@@ -4,16 +4,17 @@
|
|
4
4
|
# SPDX-License-Identifier: Apache-2.0
|
5
5
|
|
6
6
|
import os
|
7
|
-
import sys
|
8
7
|
import logging
|
9
8
|
import platform
|
10
9
|
import re
|
11
10
|
import base64
|
12
11
|
import subprocess
|
13
12
|
import shutil
|
13
|
+
import stat
|
14
|
+
from packageurl.contrib import url2purl
|
15
|
+
from askalono import identify
|
14
16
|
import fosslight_util.constant as constant
|
15
17
|
import fosslight_dependency.constant as const
|
16
|
-
from packageurl.contrib import url2purl
|
17
18
|
|
18
19
|
try:
|
19
20
|
from github import Github
|
@@ -22,13 +23,9 @@ except Exception:
|
|
22
23
|
|
23
24
|
logger = logging.getLogger(constant.LOGGER_NAME)
|
24
25
|
|
25
|
-
# binary url to check license text
|
26
|
-
_license_scanner_linux = os.path.join('third_party', 'nomos', 'nomossa')
|
27
|
-
_license_scanner_macos = os.path.join('third_party', 'askalono', 'askalono_macos')
|
28
|
-
_license_scanner_windows = os.path.join('third_party', 'askalono', 'askalono.exe')
|
29
|
-
|
30
26
|
gradle_config = ['runtimeClasspath', 'runtime']
|
31
27
|
android_config = ['releaseRuntimeClasspath']
|
28
|
+
ASKALONO_THRESHOLD = 0.7
|
32
29
|
|
33
30
|
|
34
31
|
class PackageManager:
|
@@ -53,7 +50,6 @@ class PackageManager:
|
|
53
50
|
self.dep_items = []
|
54
51
|
|
55
52
|
self.platform = platform.system()
|
56
|
-
self.license_scanner_bin = check_license_scanner(self.platform)
|
57
53
|
|
58
54
|
def __del__(self):
|
59
55
|
self.input_package_list_file = []
|
@@ -112,10 +108,11 @@ class PackageManager:
|
|
112
108
|
cmd_gradle = "./gradlew"
|
113
109
|
else:
|
114
110
|
ret_task = False
|
115
|
-
logger.warning('No gradlew file exists
|
111
|
+
logger.warning('No gradlew file exists (Skip to find dependencies relationship.).')
|
116
112
|
if ret_plugin:
|
117
113
|
logger.warning('Also it cannot run android-dependency-scanning plugin.')
|
118
114
|
if ret_task:
|
115
|
+
current_mode = change_file_mode(cmd_gradle)
|
119
116
|
if ret_alldeps:
|
120
117
|
cmd = f"{cmd_gradle} allDeps"
|
121
118
|
try:
|
@@ -124,11 +121,10 @@ class PackageManager:
|
|
124
121
|
self.parse_dependency_tree(ret)
|
125
122
|
else:
|
126
123
|
self.set_direct_dependencies(False)
|
127
|
-
logger.warning("
|
124
|
+
logger.warning(f"Fail to run {cmd}")
|
128
125
|
except Exception as e:
|
129
126
|
self.set_direct_dependencies(False)
|
130
|
-
logger.
|
131
|
-
logger.warning('It cannot print the direct/transitive dependencies relationship.')
|
127
|
+
logger.warning(f"Cannot print 'depends on' information. (fail {cmd}: {e})")
|
132
128
|
|
133
129
|
if ret_plugin:
|
134
130
|
cmd = f"{cmd_gradle} generateLicenseTxt"
|
@@ -145,6 +141,7 @@ class PackageManager:
|
|
145
141
|
except Exception as e:
|
146
142
|
logger.error(f'Fail to run {cmd}: {e}')
|
147
143
|
ret_task = False
|
144
|
+
change_file_mode(cmd_gradle, current_mode)
|
148
145
|
|
149
146
|
if os.path.isfile(gradle_backup):
|
150
147
|
os.remove(const.SUPPORT_PACKAE.get(self.package_manager_name))
|
@@ -154,6 +151,9 @@ class PackageManager:
|
|
154
151
|
if os.path.isfile(module_gradle_backup):
|
155
152
|
os.remove(module_build_gradle)
|
156
153
|
shutil.move(module_gradle_backup, module_build_gradle)
|
154
|
+
if os.path.isfile(self.input_file_name):
|
155
|
+
logger.info(f'Found {self.input_file_name}, skip to run plugin.')
|
156
|
+
ret_task = True
|
157
157
|
return ret_task
|
158
158
|
|
159
159
|
def add_android_plugin_in_gradle(self, module_build_gradle):
|
@@ -313,9 +313,8 @@ def connect_github(github_token):
|
|
313
313
|
return g
|
314
314
|
|
315
315
|
|
316
|
-
def get_github_license(g, github_repo
|
316
|
+
def get_github_license(g, github_repo):
|
317
317
|
license_name = ''
|
318
|
-
tmp_license_txt_file_name = 'tmp_license.txt'
|
319
318
|
|
320
319
|
try:
|
321
320
|
repository = g.get_repo(github_repo)
|
@@ -331,94 +330,39 @@ def get_github_license(g, github_repo, platform, license_scanner_bin):
|
|
331
330
|
if license_name == "" or license_name == "NOASSERTION":
|
332
331
|
try:
|
333
332
|
license_txt_data = base64.b64decode(repository.get_license().content).decode('utf-8')
|
334
|
-
|
335
|
-
tmp_license_txt.write(license_txt_data)
|
336
|
-
tmp_license_txt.close()
|
337
|
-
license_name = check_and_run_license_scanner(platform, license_scanner_bin, tmp_license_txt_file_name)
|
333
|
+
license_name = check_license_name(license_txt_data)
|
338
334
|
except Exception:
|
339
|
-
logger.info("Cannot find the license name with
|
340
|
-
|
341
|
-
if os.path.isfile(tmp_license_txt_file_name):
|
342
|
-
os.remove(tmp_license_txt_file_name)
|
335
|
+
logger.info("Cannot find the license name with askalono.")
|
343
336
|
except Exception:
|
344
337
|
logger.info("Cannot find the license name with github api.")
|
345
338
|
|
346
339
|
return license_name
|
347
340
|
|
348
341
|
|
349
|
-
def
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
elif platform == const.MACOS:
|
355
|
-
license_scanner = _license_scanner_macos
|
356
|
-
elif platform == const.WINDOWS:
|
357
|
-
license_scanner = _license_scanner_windows
|
342
|
+
def check_license_name(license_txt, is_filepath=False):
|
343
|
+
license_name = ''
|
344
|
+
if is_filepath:
|
345
|
+
with open(license_txt, 'r', encoding='utf-8') as f:
|
346
|
+
license_content = f.read()
|
358
347
|
else:
|
359
|
-
|
348
|
+
license_content = license_txt
|
360
349
|
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
base_path = os.path.dirname(__file__)
|
366
|
-
|
367
|
-
data_path = os.path.join(base_path, license_scanner)
|
368
|
-
license_scanner_bin = data_path
|
369
|
-
|
370
|
-
return license_scanner_bin
|
371
|
-
|
372
|
-
|
373
|
-
def check_and_run_license_scanner(platform, license_scanner_bin, file_dir):
|
374
|
-
license_name = ''
|
350
|
+
detect_askalono = identify(license_content)
|
351
|
+
if detect_askalono.score > ASKALONO_THRESHOLD:
|
352
|
+
license_name = detect_askalono.name
|
353
|
+
return license_name
|
375
354
|
|
376
|
-
if not license_scanner_bin:
|
377
|
-
logger.error('Not supported OS for license scanner binary.')
|
378
355
|
|
379
|
-
|
380
|
-
|
356
|
+
def change_file_mode(filepath, mode=''):
|
357
|
+
current_mode = os.stat(filepath).st_mode
|
381
358
|
|
382
|
-
|
383
|
-
|
359
|
+
if not os.path.exists(filepath):
|
360
|
+
logger.debug(f"The file{filepath} does not exist.")
|
361
|
+
else:
|
362
|
+
if not mode:
|
363
|
+
new_mode = current_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
|
384
364
|
else:
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
elif platform == const.WINDOWS:
|
390
|
-
run_license_scanner = f"{license_scanner_bin} identify {file_dir} > {tmp_output_file_name}"
|
391
|
-
else:
|
392
|
-
run_license_scanner = ''
|
393
|
-
|
394
|
-
if run_license_scanner is None:
|
395
|
-
license_name = ""
|
396
|
-
return license_name
|
397
|
-
else:
|
398
|
-
ret = subprocess.run(run_license_scanner, shell=True, stderr=subprocess.PIPE)
|
399
|
-
if ret.returncode != 0 or ret.stderr:
|
400
|
-
os.remove(tmp_output_file_name)
|
401
|
-
return ""
|
402
|
-
|
403
|
-
fp = open(tmp_output_file_name, "r", encoding='utf8')
|
404
|
-
license_output = fp.read()
|
405
|
-
fp.close()
|
406
|
-
|
407
|
-
if platform == const.LINUX:
|
408
|
-
license_output_re = re.findall(r'.*contains license\(s\)\s(.*)', license_output)
|
409
|
-
else:
|
410
|
-
license_output_re = re.findall(r"License:\s{1}(\S*)\s{1}", license_output)
|
411
|
-
|
412
|
-
if len(license_output_re) == 1:
|
413
|
-
license_name = license_output_re[0]
|
414
|
-
if license_name == "No_license_found":
|
415
|
-
license_name = ""
|
416
|
-
else:
|
417
|
-
license_name = ""
|
418
|
-
os.remove(tmp_output_file_name)
|
419
|
-
|
420
|
-
except Exception as ex:
|
421
|
-
logger.error(f"Failed to run license scan binary. {ex}")
|
422
|
-
license_name = ""
|
423
|
-
|
424
|
-
return license_name
|
365
|
+
new_mode = mode
|
366
|
+
os.chmod(filepath, new_mode)
|
367
|
+
logger.debug(f"File mode of {filepath} has been changed to {oct(new_mode)}.")
|
368
|
+
return current_mode
|
@@ -9,8 +9,8 @@ import os
|
|
9
9
|
import fosslight_util.constant as constant
|
10
10
|
import fosslight_dependency.constant as const
|
11
11
|
from fosslight_dependency._package_manager import PackageManager
|
12
|
-
from fosslight_dependency._package_manager import connect_github, get_github_license
|
13
|
-
from fosslight_dependency._package_manager import get_url_to_purl
|
12
|
+
from fosslight_dependency._package_manager import connect_github, get_github_license
|
13
|
+
from fosslight_dependency._package_manager import get_url_to_purl, check_license_name
|
14
14
|
from fosslight_dependency.dependency_item import DependencyItem
|
15
15
|
from fosslight_util.oss_item import OssItem
|
16
16
|
|
@@ -79,9 +79,7 @@ class Carthage(PackageManager):
|
|
79
79
|
for license_file_reg in license_file_regs:
|
80
80
|
match_result = re.match(license_file_reg, filename_in_dir.lower())
|
81
81
|
if match_result is not None:
|
82
|
-
license_name =
|
83
|
-
self.license_scanner_bin,
|
84
|
-
filename_with_checkout_path)
|
82
|
+
license_name = check_license_name(filename_with_checkout_path, True)
|
85
83
|
find_license = True
|
86
84
|
break
|
87
85
|
if license_name == '':
|
@@ -89,7 +87,7 @@ class Carthage(PackageManager):
|
|
89
87
|
try:
|
90
88
|
if not g:
|
91
89
|
g = connect_github(self.github_token)
|
92
|
-
license_name = get_github_license(g, oss_path
|
90
|
+
license_name = get_github_license(g, oss_path)
|
93
91
|
except Exception as e:
|
94
92
|
logger.warning(f"Failed to get license with github api: {e}")
|
95
93
|
license_name == ''
|
@@ -13,7 +13,7 @@ import re
|
|
13
13
|
import fosslight_util.constant as constant
|
14
14
|
import fosslight_dependency.constant as const
|
15
15
|
from fosslight_dependency._package_manager import PackageManager
|
16
|
-
from fosslight_dependency._package_manager import version_refine, get_url_to_purl
|
16
|
+
from fosslight_dependency._package_manager import version_refine, get_url_to_purl, change_file_mode
|
17
17
|
from fosslight_dependency.dependency_item import DependencyItem, change_dependson_to_purl
|
18
18
|
from fosslight_util.oss_item import OssItem
|
19
19
|
|
@@ -142,7 +142,7 @@ class Maven(PackageManager):
|
|
142
142
|
else:
|
143
143
|
cmd_mvn = "mvn"
|
144
144
|
cmd = f"{cmd_mvn} license:aggregate-download-licenses"
|
145
|
-
|
145
|
+
current_mode = change_file_mode(cmd_mvn)
|
146
146
|
ret = subprocess.call(cmd, shell=True)
|
147
147
|
if ret != 0:
|
148
148
|
logger.error(f"Failed to run maven plugin: {cmd}")
|
@@ -159,6 +159,7 @@ class Maven(PackageManager):
|
|
159
159
|
except Exception as e:
|
160
160
|
logger.error(f"Failed to run '{cmd}': {e}")
|
161
161
|
self.set_direct_dependencies(False)
|
162
|
+
change_file_mode(cmd_mvn, current_mode)
|
162
163
|
|
163
164
|
def create_dep_stack(self, dep_line):
|
164
165
|
dep_stack = []
|
@@ -12,7 +12,7 @@ import requests
|
|
12
12
|
import fosslight_util.constant as constant
|
13
13
|
import fosslight_dependency.constant as const
|
14
14
|
from fosslight_dependency._package_manager import PackageManager
|
15
|
-
from fosslight_dependency._package_manager import
|
15
|
+
from fosslight_dependency._package_manager import check_license_name, get_url_to_purl
|
16
16
|
from fosslight_dependency.dependency_item import DependencyItem, change_dependson_to_purl
|
17
17
|
from fosslight_util.oss_item import OssItem
|
18
18
|
|
@@ -54,7 +54,8 @@ class Nuget(PackageManager):
|
|
54
54
|
oss_item.version = oss_version
|
55
55
|
|
56
56
|
license_name = ''
|
57
|
-
response = requests.get(f'{self.nuget_api_url}{oss_origin_name
|
57
|
+
response = requests.get(f'{self.nuget_api_url.lower()}{oss_origin_name.lower()}/ \
|
58
|
+
{oss_item.version.lower()}/{oss_origin_name.lower()}.nuspec')
|
58
59
|
if response.status_code == 200:
|
59
60
|
root = fromstring(response.text)
|
60
61
|
xmlns = ''
|
@@ -73,14 +74,9 @@ class Nuget(PackageManager):
|
|
73
74
|
if license_url is not None:
|
74
75
|
url_res = requests.get(license_url.text)
|
75
76
|
if url_res.status_code == 200:
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
license_name_with_license_scanner = check_and_run_license_scanner(self.platform,
|
80
|
-
self.license_scanner_bin,
|
81
|
-
tmp_license_txt_file_name)
|
82
|
-
if license_name_with_license_scanner != "":
|
83
|
-
license_name = license_name_with_license_scanner
|
77
|
+
license_name_with_scanner = check_license_name(url_res.text)
|
78
|
+
if license_name_with_scanner != "":
|
79
|
+
license_name = license_name_with_scanner
|
84
80
|
else:
|
85
81
|
license_name = license_url.text
|
86
82
|
oss_item.license = license_name
|
@@ -10,11 +10,10 @@ import re
|
|
10
10
|
import shutil
|
11
11
|
import yaml
|
12
12
|
import subprocess
|
13
|
-
from askalono import identify
|
14
13
|
import fosslight_util.constant as constant
|
15
14
|
import fosslight_dependency.constant as const
|
16
15
|
from fosslight_dependency._package_manager import PackageManager
|
17
|
-
from fosslight_dependency._package_manager import get_url_to_purl
|
16
|
+
from fosslight_dependency._package_manager import get_url_to_purl, check_license_name
|
18
17
|
from fosslight_dependency.dependency_item import DependencyItem, change_dependson_to_purl
|
19
18
|
from fosslight_util.oss_item import OssItem
|
20
19
|
|
@@ -135,9 +134,7 @@ class Pub(PackageManager):
|
|
135
134
|
purl_dict[f'{oss_origin_name}({oss_item.version})'] = dep_item.purl
|
136
135
|
license_txt = json_data['license']
|
137
136
|
if license_txt is not None:
|
138
|
-
|
139
|
-
if detect_askalono.score > 0.7:
|
140
|
-
oss_item.license = detect_askalono.name
|
137
|
+
oss_item.license = check_license_name(license_txt)
|
141
138
|
|
142
139
|
if self.direct_dep:
|
143
140
|
if oss_origin_name not in self.total_dep_list:
|
@@ -13,7 +13,7 @@ import re
|
|
13
13
|
import fosslight_util.constant as constant
|
14
14
|
import fosslight_dependency.constant as const
|
15
15
|
from fosslight_dependency._package_manager import PackageManager
|
16
|
-
from fosslight_dependency._package_manager import
|
16
|
+
from fosslight_dependency._package_manager import check_license_name, get_url_to_purl
|
17
17
|
from fosslight_dependency.dependency_item import DependencyItem, change_dependson_to_purl
|
18
18
|
from fosslight_util.oss_item import OssItem
|
19
19
|
|
@@ -111,7 +111,7 @@ class Pypi(PackageManager):
|
|
111
111
|
install_cmd = cmd_separator.join(install_cmd_list)
|
112
112
|
else:
|
113
113
|
logger.error(const.SUPPORT_PACKAE[self.package_manager_name])
|
114
|
-
logger.error('Cannot create virtualenv
|
114
|
+
logger.error('Cannot create virtualenv because it cannot find: '
|
115
115
|
+ ', '.join(const.SUPPORT_PACKAE[self.package_manager_name]))
|
116
116
|
logger.error("Please run with '-a' and '-d' option.")
|
117
117
|
return False
|
@@ -302,12 +302,7 @@ class Pypi(PackageManager):
|
|
302
302
|
if license_name is not None:
|
303
303
|
license_name = license_name.replace(';', ',')
|
304
304
|
else:
|
305
|
-
|
306
|
-
license_name_with_lic_scanner = check_and_run_license_scanner(self.platform,
|
307
|
-
self.license_scanner_bin,
|
308
|
-
license_file_dir)
|
309
|
-
if license_name_with_lic_scanner != "":
|
310
|
-
license_name = license_name_with_lic_scanner
|
305
|
+
license_name = check_license_name(d['LicenseFile'], True)
|
311
306
|
oss_item.license = license_name
|
312
307
|
|
313
308
|
if oss_init_name == self.package_name:
|
@@ -140,7 +140,7 @@ class Swift(PackageManager):
|
|
140
140
|
github_repo = "/".join(oss_item.homepage.split('/')[-2:])
|
141
141
|
dep_item.purl = get_url_to_purl(oss_item.download_location, self.package_manager_name, github_repo, oss_item.version)
|
142
142
|
purl_dict[f'{oss_origin_name}({oss_item.version})'] = dep_item.purl
|
143
|
-
oss_item.license = get_github_license(g, github_repo
|
143
|
+
oss_item.license = get_github_license(g, github_repo)
|
144
144
|
|
145
145
|
if self.direct_dep and len(self.direct_dep_list) > 0:
|
146
146
|
if oss_origin_name in self.direct_dep_list:
|
@@ -7,16 +7,16 @@ import os
|
|
7
7
|
import logging
|
8
8
|
import re
|
9
9
|
import yaml
|
10
|
+
import requests
|
10
11
|
import fosslight_util.constant as constant
|
11
12
|
import fosslight_dependency.constant as const
|
12
13
|
from fosslight_dependency._package_manager import PackageManager
|
13
|
-
from fosslight_dependency._package_manager import
|
14
|
+
from fosslight_dependency._package_manager import check_license_name, get_url_to_purl
|
14
15
|
from fosslight_dependency.dependency_item import DependencyItem
|
15
16
|
from fosslight_util.oss_item import OssItem
|
16
17
|
|
17
18
|
logger = logging.getLogger(constant.LOGGER_NAME)
|
18
19
|
proprietary_license = 'Proprietary License'
|
19
|
-
unclassifed_license = 'UnclassifiedLicense'
|
20
20
|
license_md = 'LICENSE.md'
|
21
21
|
third_party_md = 'Third Party Notices.md'
|
22
22
|
|
@@ -49,10 +49,8 @@ class Unity(PackageManager):
|
|
49
49
|
oss_packagecache_dir = os.path.join(self.packageCache_dir, f'{oss_item.name}@{oss_item.version}')
|
50
50
|
license_f = os.path.join(oss_packagecache_dir, license_md)
|
51
51
|
if os.path.isfile(license_f):
|
52
|
-
license_name =
|
53
|
-
|
54
|
-
license_f)
|
55
|
-
if license_name == unclassifed_license or license_name == '':
|
52
|
+
license_name = check_license_name(license_f, True)
|
53
|
+
if license_name == '':
|
56
54
|
with open(license_f, 'r', encoding='utf-8') as f:
|
57
55
|
for line in f:
|
58
56
|
matched_l = re.search(r'Unity\s[\s\w]*\sLicense', line)
|
@@ -76,11 +74,14 @@ class Unity(PackageManager):
|
|
76
74
|
if oss_item.homepage and oss_item.homepage.startswith('git@'):
|
77
75
|
oss_item.homepage = oss_item.homepage.replace('git@', 'https://')
|
78
76
|
if oss_item.homepage is None or oss_item.homepage.startswith(self.unity_internal_url):
|
79
|
-
if license_name != proprietary_license:
|
77
|
+
if (license_name != proprietary_license) and license_name != '':
|
80
78
|
oss_item.homepage = f'{self.mirror_url}{oss_item.name}'
|
81
79
|
if oss_item.homepage is None:
|
82
80
|
oss_item.homepage = ''
|
83
|
-
|
81
|
+
else:
|
82
|
+
if not check_url_alive(oss_item.homepage):
|
83
|
+
minor_version = '.'.join(oss_item.version.split('.')[0:2])
|
84
|
+
oss_item.homepage = f'https://docs.unity3d.com/Packages/{oss_item.name}@{minor_version}'
|
84
85
|
oss_item.download_location = oss_item.homepage
|
85
86
|
dep_item.purl = get_url_to_purl(oss_item.download_location, self.package_manager_name)
|
86
87
|
if dep_item.purl == 'None':
|
@@ -102,3 +103,16 @@ class Unity(PackageManager):
|
|
102
103
|
logger.error(f"Fail to parse unity oss information: {e}")
|
103
104
|
|
104
105
|
return
|
106
|
+
|
107
|
+
|
108
|
+
def check_url_alive(url):
|
109
|
+
alive = False
|
110
|
+
try:
|
111
|
+
response = requests.get(url)
|
112
|
+
if response.status_code == 200:
|
113
|
+
alive = True
|
114
|
+
else:
|
115
|
+
logger.debug(f"{url} returned status code {response.status_code}")
|
116
|
+
except requests.exceptions.RequestException as e:
|
117
|
+
logger.debug(f"Check if url({url})is alive err: {e}")
|
118
|
+
return alive
|
@@ -51,17 +51,17 @@ def paginate_file(file_path):
|
|
51
51
|
input("Press Enter to see the next page...")
|
52
52
|
|
53
53
|
|
54
|
-
def find_package_manager(input_dir, abs_path_to_exclude=[]):
|
54
|
+
def find_package_manager(input_dir, abs_path_to_exclude=[], manifest_file_name=[]):
|
55
55
|
ret = True
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
56
|
+
if not manifest_file_name:
|
57
|
+
for value in const.SUPPORT_PACKAE.values():
|
58
|
+
if isinstance(value, list):
|
59
|
+
manifest_file_name.extend(value)
|
60
|
+
else:
|
61
|
+
manifest_file_name.append(value)
|
62
62
|
|
63
63
|
found_manifest_file = []
|
64
|
-
for
|
64
|
+
for parent, dirs, files in os.walk(input_dir):
|
65
65
|
if len(files) < 1:
|
66
66
|
continue
|
67
67
|
if os.path.basename(parent) in _exclude_dir:
|
@@ -76,6 +76,13 @@ def find_package_manager(input_dir, abs_path_to_exclude=[]):
|
|
76
76
|
continue
|
77
77
|
if file in manifest_file_name:
|
78
78
|
found_manifest_file.append(file)
|
79
|
+
for dir in dirs:
|
80
|
+
for manifest_f in manifest_file_name:
|
81
|
+
manifest_l = manifest_f.split(os.path.sep)
|
82
|
+
if len(manifest_l) > 1:
|
83
|
+
if manifest_l[0] == dir:
|
84
|
+
if os.path.exists(os.path.join(parent, manifest_f)):
|
85
|
+
found_manifest_file.append(manifest_f)
|
79
86
|
if len(found_manifest_file) > 0:
|
80
87
|
input_dir = parent
|
81
88
|
break
|
@@ -99,7 +106,7 @@ def find_package_manager(input_dir, abs_path_to_exclude=[]):
|
|
99
106
|
logger.warning(f"### Set Package Manager = {', '.join(found_package_manager.keys())}")
|
100
107
|
else:
|
101
108
|
ret = False
|
102
|
-
logger.info("
|
109
|
+
logger.info("Cannot find the manifest file.")
|
103
110
|
|
104
111
|
return ret, found_package_manager, input_dir
|
105
112
|
|
@@ -168,17 +175,6 @@ def run_dependency_scanner(package_manager='', input_dir='', output_dir_file='',
|
|
168
175
|
logger.error(msg)
|
169
176
|
return False, scan_item
|
170
177
|
|
171
|
-
autodetect = True
|
172
|
-
if package_manager:
|
173
|
-
autodetect = False
|
174
|
-
support_packagemanager = list(const.SUPPORT_PACKAE.keys())
|
175
|
-
|
176
|
-
if package_manager not in support_packagemanager:
|
177
|
-
logger.error(f"(-m option) You entered the unsupported package manager({package_manager}).")
|
178
|
-
logger.error("Please enter the supported package manager({0}) with '-m' option."
|
179
|
-
.format(", ".join(support_packagemanager)))
|
180
|
-
return False, scan_item
|
181
|
-
|
182
178
|
if input_dir:
|
183
179
|
if os.path.isdir(input_dir):
|
184
180
|
os.chdir(input_dir)
|
@@ -192,20 +188,44 @@ def run_dependency_scanner(package_manager='', input_dir='', output_dir_file='',
|
|
192
188
|
os.chdir(input_dir)
|
193
189
|
scan_item.set_cover_pathinfo(input_dir, path_to_exclude)
|
194
190
|
|
191
|
+
autodetect = True
|
195
192
|
found_package_manager = {}
|
196
|
-
if
|
197
|
-
|
198
|
-
|
193
|
+
if package_manager:
|
194
|
+
autodetect = False
|
195
|
+
support_packagemanager = list(const.SUPPORT_PACKAE.keys())
|
196
|
+
|
197
|
+
if package_manager not in support_packagemanager:
|
198
|
+
logger.error(f"(-m option) You entered the unsupported package manager({package_manager}).")
|
199
|
+
logger.error("Please enter the supported package manager({0}) with '-m' option."
|
200
|
+
.format(", ".join(support_packagemanager)))
|
201
|
+
return False, scan_item
|
202
|
+
manifest_file_name = []
|
203
|
+
value = const.SUPPORT_PACKAE[package_manager]
|
204
|
+
if isinstance(value, list):
|
205
|
+
manifest_file_name.extend(value)
|
206
|
+
else:
|
207
|
+
manifest_file_name.append(value)
|
208
|
+
scan_item.set_cover_comment(f"Manual detect mode (-m {package_manager})")
|
209
|
+
else:
|
210
|
+
manifest_file_name = []
|
211
|
+
|
212
|
+
try:
|
213
|
+
ret, found_package_manager, input_dir = find_package_manager(input_dir, abs_path_to_exclude, manifest_file_name)
|
214
|
+
if ret:
|
199
215
|
os.chdir(input_dir)
|
200
|
-
|
216
|
+
except Exception as e:
|
217
|
+
if autodetect:
|
201
218
|
logger.error(f'Fail to find package manager: {e}')
|
202
219
|
ret = False
|
203
|
-
|
204
|
-
|
205
|
-
|
220
|
+
finally:
|
221
|
+
if not ret:
|
222
|
+
if not autodetect:
|
223
|
+
logger.info('Try to analyze dependency without manifest file. (Manual mode)')
|
224
|
+
found_package_manager[package_manager] = []
|
225
|
+
else:
|
226
|
+
logger.error("Terminated: package manager could not be found.")
|
206
227
|
ret = False
|
207
|
-
|
208
|
-
found_package_manager[package_manager] = ["manual detect ('-m option')"]
|
228
|
+
return False, scan_item
|
209
229
|
|
210
230
|
pass_key = 'PASS'
|
211
231
|
success_pm = []
|
@@ -242,7 +262,8 @@ def run_dependency_scanner(package_manager='', input_dir='', output_dir_file='',
|
|
242
262
|
'and https://fosslight.org/fosslight-guide-en/scanner/3_dependency.html#-prerequisite.'
|
243
263
|
scan_item.set_cover_comment(f"Analysis failed Package manager: {', '.join(fail_pm)} ({info_msg})")
|
244
264
|
else:
|
245
|
-
|
265
|
+
if autodetect:
|
266
|
+
scan_item.set_cover_comment("No Package manager detected.")
|
246
267
|
|
247
268
|
if ret and graph_path:
|
248
269
|
graph_path = os.path.abspath(graph_path)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: fosslight-dependency
|
3
|
-
Version: 4.1.
|
3
|
+
Version: 4.1.8
|
4
4
|
Summary: FOSSLight Dependency Scanner
|
5
5
|
Home-page: https://github.com/fosslight/fosslight_dependency_scanner
|
6
6
|
Author: LG Electronics
|
@@ -9,10 +9,10 @@ Download-URL: https://github.com/fosslight/fosslight_dependency_scanner
|
|
9
9
|
Platform: UNKNOWN
|
10
10
|
Classifier: License :: OSI Approved :: Apache Software License
|
11
11
|
Classifier: Programming Language :: Python :: 3
|
12
|
-
Classifier: Programming Language :: Python :: 3.6
|
13
|
-
Classifier: Programming Language :: Python :: 3.7
|
14
12
|
Classifier: Programming Language :: Python :: 3.8
|
15
13
|
Classifier: Programming Language :: Python :: 3.9
|
14
|
+
Classifier: Programming Language :: Python :: 3.10
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
16
16
|
Description-Content-Type: text/markdown
|
17
17
|
Requires-Dist: openpyxl
|
18
18
|
Requires-Dist: beautifulsoup4
|
@@ -2,36 +2,33 @@ fosslight_dependency/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
|
|
2
2
|
fosslight_dependency/_analyze_dependency.py,sha256=uYbHDlFfEf-LsCWc6hTKN-QCD1T_2jaEgBf3z4M_4Lk,4226
|
3
3
|
fosslight_dependency/_graph_convertor.py,sha256=D8GwmJfuj9Wg3_DeKRPLGGdyHSLcoU2Q0VzKQbkJG4g,2267
|
4
4
|
fosslight_dependency/_help.py,sha256=INeP24fFfV2HPhZJMqk_KCu08X7nneAumBqMWQ7Sbw8,3336
|
5
|
-
fosslight_dependency/_package_manager.py,sha256=
|
5
|
+
fosslight_dependency/_package_manager.py,sha256=GUqMLidGGVrek0XpApron3SWFf66VsmfycsmnvxQOkY,14890
|
6
6
|
fosslight_dependency/constant.py,sha256=FAkzrW1S6Ua_TAbvQ2y6d0dhEZcgonB11miKUj7lB98,1080
|
7
7
|
fosslight_dependency/dependency_item.py,sha256=wNLWcsNycf3HQ5Pib2WrMeo2dn0eHCRg20NLcL95Qew,3345
|
8
|
-
fosslight_dependency/run_dependency_scanner.py,sha256=
|
8
|
+
fosslight_dependency/run_dependency_scanner.py,sha256=zFlHAwj9fhsiaut_VhvQneX8Ngz82xgau4ThmHxk8pI,17399
|
9
9
|
fosslight_dependency/LICENSES/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
10
10
|
fosslight_dependency/LICENSES/LicenseRef-3rd_party_licenses.txt,sha256=EcsFt7aE1rp3OXAdJgmXayfOZdpRdBMcmRnyoqWMCsw,95687
|
11
11
|
fosslight_dependency/package_manager/Android.py,sha256=0UZFvbLxDIreerK4fR316YPyhUpPliV_kfZulrxkUyo,3218
|
12
12
|
fosslight_dependency/package_manager/Cargo.py,sha256=I27IKtUFf2fOr9ZngB8T9x6pPYhpk1m5CxbwM1dw9rk,5898
|
13
|
-
fosslight_dependency/package_manager/Carthage.py,sha256=
|
13
|
+
fosslight_dependency/package_manager/Carthage.py,sha256=VU506KafUiHBrr_62iOOXNI1fDOreOQgcC2EWM5PpQo,6122
|
14
14
|
fosslight_dependency/package_manager/Cocoapods.py,sha256=k_URV1ekMOU8l_y9_KIp_luu96ZGOl1xLIkH737VREA,8524
|
15
15
|
fosslight_dependency/package_manager/Go.py,sha256=O-6DTTRM2EoTpCVmlIPKFy8ZTz64EHTooOAoUimjeyk,6491
|
16
16
|
fosslight_dependency/package_manager/Gradle.py,sha256=IYmj9q3XiE_DPKdtll6lyRr98lFuyKWW2qz57X26Fn0,4359
|
17
17
|
fosslight_dependency/package_manager/Helm.py,sha256=ucx2Y0tWX37UHIzIGaRyTe7uQ2vlu2nUuO09hOMq9ZU,4223
|
18
|
-
fosslight_dependency/package_manager/Maven.py,sha256=
|
18
|
+
fosslight_dependency/package_manager/Maven.py,sha256=XDVTmxRjeQmATpJDP__yw47Pk5e4utXAkkEkskXPQCQ,10443
|
19
19
|
fosslight_dependency/package_manager/Npm.py,sha256=hwKC08m05KlHgfQpPX7lnDEJC-A7WKF9OniYW4n9TDM,10638
|
20
|
-
fosslight_dependency/package_manager/Nuget.py,sha256=
|
21
|
-
fosslight_dependency/package_manager/Pub.py,sha256=
|
22
|
-
fosslight_dependency/package_manager/Pypi.py,sha256=
|
23
|
-
fosslight_dependency/package_manager/Swift.py,sha256=
|
24
|
-
fosslight_dependency/package_manager/Unity.py,sha256=
|
20
|
+
fosslight_dependency/package_manager/Nuget.py,sha256=x1SPdxwXS2Oyi1RnLasvJJL-IFJl45VI2CXt3wReW24,8884
|
21
|
+
fosslight_dependency/package_manager/Pub.py,sha256=Rrz8_6wdrmMU6f3vbbuAwyMbODBauXNnBbI619OQgDk,10184
|
22
|
+
fosslight_dependency/package_manager/Pypi.py,sha256=A3pXJC_7H7PTa6i3B_PvJY85qsc6W9AqOze7kB8E3Ws,15831
|
23
|
+
fosslight_dependency/package_manager/Swift.py,sha256=8fdbdAXTNlp2NDoSqQXm48JGAg9UhxA91M1-NhHkT40,6752
|
24
|
+
fosslight_dependency/package_manager/Unity.py,sha256=n1006GZ6Qrk8wAdO6wla1Q-JD7Evin7REVj-HDeTARc,5142
|
25
25
|
fosslight_dependency/package_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
26
|
-
fosslight_dependency/
|
27
|
-
fosslight_dependency/
|
28
|
-
fosslight_dependency/
|
29
|
-
fosslight_dependency-4.1.
|
30
|
-
fosslight_dependency-4.1.
|
31
|
-
fosslight_dependency-4.1.
|
32
|
-
fosslight_dependency-4.1.
|
33
|
-
fosslight_dependency-4.1.
|
34
|
-
fosslight_dependency-4.1.
|
35
|
-
fosslight_dependency-4.1.6.dist-info/entry_points.txt,sha256=e1QZbnCrQvfbwe9L6PxXnkRZMhl-PSo0QyUes0dGjU8,91
|
36
|
-
fosslight_dependency-4.1.6.dist-info/top_level.txt,sha256=Jc0V7VcVCH0TEM8ksb8dwroTYz4AmRaQnlr3FB71Hcs,21
|
37
|
-
fosslight_dependency-4.1.6.dist-info/RECORD,,
|
26
|
+
fosslight_dependency-4.1.8.dist-info/Apache-2.0.txt,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
27
|
+
fosslight_dependency-4.1.8.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
28
|
+
fosslight_dependency-4.1.8.dist-info/LicenseRef-3rd_party_licenses.txt,sha256=EcsFt7aE1rp3OXAdJgmXayfOZdpRdBMcmRnyoqWMCsw,95687
|
29
|
+
fosslight_dependency-4.1.8.dist-info/METADATA,sha256=t5oEFJ8QBw9OduU3e6TB_IaeC4EcABk13D9D0mfO87Q,4984
|
30
|
+
fosslight_dependency-4.1.8.dist-info/MIT.txt,sha256=9cx4CbArgByWvkoEZNqpzbpJgA9TUe2D62rMocQpgfs,1082
|
31
|
+
fosslight_dependency-4.1.8.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
|
32
|
+
fosslight_dependency-4.1.8.dist-info/entry_points.txt,sha256=e1QZbnCrQvfbwe9L6PxXnkRZMhl-PSo0QyUes0dGjU8,91
|
33
|
+
fosslight_dependency-4.1.8.dist-info/top_level.txt,sha256=Jc0V7VcVCH0TEM8ksb8dwroTYz4AmRaQnlr3FB71Hcs,21
|
34
|
+
fosslight_dependency-4.1.8.dist-info/RECORD,,
|
Binary file
|
Binary file
|
Binary file
|
{fosslight_dependency-4.1.6.dist-info → fosslight_dependency-4.1.8.dist-info}/Apache-2.0.txt
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{fosslight_dependency-4.1.6.dist-info → fosslight_dependency-4.1.8.dist-info}/entry_points.txt
RENAMED
File without changes
|
File without changes
|