Skip to content

Commit 3752bb0

Browse files
authored
Add android scanning plugin automatically (#202)
Signed-off-by: jiyeong.seok <[email protected]>
1 parent 50ffbeb commit 3752bb0

File tree

2 files changed

+95
-23
lines changed

2 files changed

+95
-23
lines changed

src/fosslight_dependency/_package_manager.py

Lines changed: 83 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,12 @@ def __del__(self):
6868
self.package_name = ''
6969

7070
def run_plugin(self):
71+
ret = True
7172
if self.package_manager_name == const.GRADLE or self.package_manager_name == const.ANDROID:
72-
self.run_gradle_task()
73+
ret = self.run_gradle_task()
7374
else:
7475
logger.info(f"This package manager({self.package_manager_name}) skips the step to run plugin.")
75-
return True
76+
return ret
7677

7778
def append_input_package_list_file(self, input_package_file):
7879
self.input_package_list_file.append(input_package_file)
@@ -87,35 +88,101 @@ def parse_direct_dependencies(self):
8788
pass
8889

8990
def run_gradle_task(self):
91+
ret_task = True
9092
if os.path.isfile(const.SUPPORT_PACKAE.get(self.package_manager_name)):
9193
gradle_backup = f'{const.SUPPORT_PACKAE.get(self.package_manager_name)}_bk'
9294

9395
shutil.copy(const.SUPPORT_PACKAE.get(self.package_manager_name), gradle_backup)
94-
ret = self.add_allDeps_in_gradle()
95-
if ret:
96-
try:
97-
if os.path.isfile('gradlew') or os.path.isfile('gradlew.bat'):
98-
if self.platform == const.WINDOWS:
99-
cmd_gradle = "gradlew.bat"
100-
else:
101-
cmd_gradle = "./gradlew"
102-
103-
cmd = f"{cmd_gradle} allDeps"
96+
ret_alldeps = self.add_allDeps_in_gradle()
97+
98+
ret_plugin = False
99+
if (self.package_manager_name == const.ANDROID):
100+
module_build_gradle = os.path.join(self.app_name, const.SUPPORT_PACKAE.get(self.package_manager_name))
101+
module_gradle_backup = f'{module_build_gradle}_bk'
102+
if os.path.isfile(module_build_gradle) and (not os.path.isfile(self.input_file_name)):
103+
shutil.copy(module_build_gradle, module_gradle_backup)
104+
ret_plugin = self.add_android_plugin_in_gradle(module_build_gradle)
105+
106+
if os.path.isfile('gradlew') or os.path.isfile('gradlew.bat'):
107+
if self.platform == const.WINDOWS:
108+
cmd_gradle = "gradlew.bat"
109+
else:
110+
cmd_gradle = "./gradlew"
111+
else:
112+
ret_task = False
113+
logger.warning('No gradlew file exists. (skip to find dependencies relationship.')
114+
if ret_plugin:
115+
logger.warning('Also it cannot run android-dependency-scanning plugin.')
116+
if ret_task:
117+
if ret_alldeps:
118+
cmd = f"{cmd_gradle} allDeps"
119+
try:
104120
ret = subprocess.check_output(cmd, shell=True, encoding='utf-8')
105121
if ret != 0:
106122
self.parse_dependency_tree(ret)
107123
else:
108124
self.set_direct_dependencies(False)
109125
logger.warning("Failed to run allDeps task.")
110-
except Exception as e:
111-
self.set_direct_dependencies(False)
112-
logger.error(f'Fail to run allDeps: {e}')
113-
logger.warning('It cannot print the direct/transitive dependencies relationship.')
126+
except Exception as e:
127+
self.set_direct_dependencies(False)
128+
logger.error(f'Fail to run {cmd}: {e}')
129+
logger.warning('It cannot print the direct/transitive dependencies relationship.')
130+
131+
if ret_plugin:
132+
cmd = f"{cmd_gradle} generateLicenseTxt"
133+
try:
134+
ret = subprocess.check_output(cmd, shell=True, encoding='utf-8')
135+
if ret == 0:
136+
ret_task = False
137+
logger.error(f'Fail to run {cmd}')
138+
if os.path.isfile(self.input_file_name):
139+
logger.info('Automatically run android-dependency-scanning plugin and generate output.')
140+
self.plugin_auto_run = True
141+
else:
142+
logger.warning('Automatically run android-dependency-scanning plugin, but fail to generate output.')
143+
except Exception as e:
144+
logger.error(f'Fail to run {cmd}: {e}')
145+
ret_task = False
114146

115147
if os.path.isfile(gradle_backup):
116148
os.remove(const.SUPPORT_PACKAE.get(self.package_manager_name))
117149
shutil.move(gradle_backup, const.SUPPORT_PACKAE.get(self.package_manager_name))
118150

151+
if (self.package_manager_name == const.ANDROID):
152+
if os.path.isfile(module_gradle_backup):
153+
os.remove(module_build_gradle)
154+
shutil.move(module_gradle_backup, module_build_gradle)
155+
return ret_task
156+
157+
def add_android_plugin_in_gradle(self, module_build_gradle):
158+
ret = False
159+
build_script = '''buildscript {
160+
repositories {
161+
mavenCentral()
162+
}
163+
dependencies {
164+
//Android dependency scanning Plugin
165+
classpath 'org.fosslight:android-dependency-scanning:+'
166+
}
167+
}'''
168+
apply = "apply plugin: 'org.fosslight'\n"
169+
try:
170+
with open(const.SUPPORT_PACKAE.get(self.package_manager_name), 'r', encoding='utf-8') as original:
171+
data = original.read()
172+
with open(const.SUPPORT_PACKAE.get(self.package_manager_name), 'w', encoding='utf-8') as modified:
173+
modified.write(f"{build_script}\n{data}")
174+
ret = True
175+
except Exception as e:
176+
logging.warning(f"Cannot add the buildscript task in build.gradle: {e}")
177+
178+
try:
179+
with open(module_build_gradle, 'a', encoding='utf-8') as modified:
180+
modified.write(f'\n{apply}\n')
181+
ret = True
182+
except Exception as e:
183+
logging.warning(f"Cannot add the apply plugin in {module_build_gradle}: {e}")
184+
return ret
185+
119186
def add_allDeps_in_gradle(self):
120187
ret = False
121188
config = android_config if self.package_manager_name == 'android' else gradle_config

src/fosslight_dependency/package_manager/Android.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,32 @@
1111

1212
logger = logging.getLogger(constant.LOGGER_NAME)
1313

14-
_plugin_output_file = 'android_dependency_output.txt'
15-
1614

1715
class Android(PackageManager):
1816
package_manager_name = const.ANDROID
1917

18+
plugin_output_file = 'android_dependency_output.txt'
2019
app_name = const.default_app_name
2120
input_file_name = ''
21+
plugin_auto_run = False
2222

2323
def __init__(self, input_dir, output_dir, app_name):
2424
super().__init__(self.package_manager_name, '', input_dir, output_dir)
2525
if app_name:
2626
self.app_name = app_name
27-
self.input_file_name = self.check_input_path(self.app_name, _plugin_output_file)
27+
self.input_file_name = self.check_input_path()
2828
self.append_input_package_list_file(self.input_file_name)
2929

30-
def check_input_path(self, app_name, _plugin_output_file):
31-
if os.path.isfile(_plugin_output_file):
32-
return _plugin_output_file
30+
def __del__(self):
31+
if self.plugin_auto_run:
32+
if os.path.isfile(self.input_file_name):
33+
os.remove(self.input_file_name)
34+
35+
def check_input_path(self):
36+
if os.path.isfile(self.plugin_output_file):
37+
return self.plugin_output_file
3338
else:
34-
return os.path.join(app_name, _plugin_output_file)
39+
return os.path.join(self.app_name, self.plugin_output_file)
3540

3641
def parse_oss_information(self, f_name):
3742
with open(f_name, 'r', encoding='utf8') as input_fp:

0 commit comments

Comments
 (0)