Skip to content

Commit fd534e6

Browse files
author
Murat Kumykov
committed
--rescan-layer option added for scanning/re-scanning a single layer
1 parent 722ecf5 commit fd534e6

File tree

1 file changed

+42
-9
lines changed

1 file changed

+42
-9
lines changed

examples/scan_docker_image.py

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
optional arguments:
3232
-h, --help show this help message and exit
3333
--cleanup CLEANUP Delete project hierarchy only. Do not scan
34+
35+
--rescan-layer NUM Rescans specific layer. No project structure cleanup will be performed
3436
3537
'''
3638

@@ -120,7 +122,8 @@ def read_config(self):
120122

121123
class Detector():
122124
def __init__(self, hub):
123-
self.detecturl = 'https://blackducksoftware.github.io/hub-detect/hub-detect.sh'
125+
# self.detecturl = 'https://blackducksoftware.github.io/hub-detect/hub-detect.sh'
126+
self.detecturl = 'https://detect.synopsys.com/detect.sh'
124127
self.baseurl = hub.config['baseurl']
125128
self.filename = '/tmp/hub-detect.sh'
126129
self.token=hub.config['api_token']
@@ -190,6 +193,15 @@ def generate_project_structures(self):
190193
sub_project_release = self.hub.get_or_create_project_version(layer['name'], self.image_version, parameters=parameters)
191194
self.hub.add_version_as_component(main_project_release, sub_project_release)
192195

196+
def generate_single_layer_project_structure(self, layer_number):
197+
main_project_release = self.hub.get_or_create_project_version(self.image_name, self.image_version)
198+
199+
layer = self.layers[layer_number - 1]
200+
parameters = {}
201+
parameters['description'] = layer['command']['created_by']
202+
sub_project_release = self.hub.get_or_create_project_version(layer['name'], self.image_version, parameters=parameters)
203+
self.hub.add_version_as_component(main_project_release, sub_project_release)
204+
193205
def submit_layer_scans(self):
194206
for layer in self.layers:
195207
options = []
@@ -200,6 +212,16 @@ def submit_layer_scans(self):
200212
options.append('--detect.source.path={}/{}'.format(self.docker.imagedir, layer['path'].split('/')[0]))
201213
self.hub_detect.detect_run(options)
202214

215+
def submit_single_layer_scan(self, layer_number):
216+
layer = self.layers[layer_number-1]
217+
options = []
218+
options.append('--detect.project.name={}'.format(layer['name']))
219+
options.append('--detect.project.version.name="{}"'.format(self.image_version))
220+
options.append('--detect.blackduck.signature.scanner.disabled=false')
221+
options.append('--detect.code.location.name={}_{}_code_{}'.format(layer['name'],self.image_version,layer['path']))
222+
options.append('--detect.source.path={}/{}'.format(self.docker.imagedir, layer['path'].split('/')[0]))
223+
self.hub_detect.detect_run(options)
224+
203225
def cleanup_project_structure(self):
204226
release = self.hub.get_or_create_project_version(self.image_name,self.image_version)
205227

@@ -216,14 +238,18 @@ def cleanup_project_structure(self):
216238
print(self.hub.delete_project_by_name(self.image_name))
217239

218240

219-
def scan_container_image(imagespec):
241+
def scan_container_image(imagespec, layer_number=0):
220242

221243
hub = HubInstance()
222244
scanner = ContainerImageScanner(hub, imagespec)
223245
scanner.prepare_container_image()
224246
scanner.process_container_image()
225-
scanner.generate_project_structures()
226-
scanner.submit_layer_scans()
247+
if layer_number == 0:
248+
scanner.generate_project_structures()
249+
scanner.submit_layer_scans()
250+
else:
251+
scanner.generate_single_layer_project_structure(layer_number)
252+
scanner.submit_single_layer_scan(int(layer_number))
227253

228254

229255
def clean_container_project(imagespec):
@@ -241,15 +267,22 @@ def main(argv=None):
241267

242268
parser = ArgumentParser()
243269
parser.add_argument('imagespec', help="Container image tag, e.g. repository/imagename:version")
244-
parser.add_argument('--cleanup',default=False, help="Delete project hierarchy only. Do not scan")
270+
parser.add_argument('--cleanup', default=False, help="Delete project hierarchy only. Do not scan")
271+
parser.add_argument('--rescan-layer',default=0, type=int, help="Rescan specific layer in case of failure, 0 - scan as usual")
245272
args = parser.parse_args()
246273

274+
print (args);
275+
247276
hub = HubInstance()
248277

249-
clean_container_project(args.imagespec)
250-
if not args.cleanup:
251-
scan_container_image(args.imagespec)
252-
278+
if args.cleanup:
279+
clean_container_project(args.imagespec)
280+
else:
281+
if args.rescan_layer == 0:
282+
clean_container_project(args.imagespec)
283+
scan_container_image(args.imagespec)
284+
else:
285+
scan_container_image(args.imagespec, args.rescan_layer)
253286

254287
if __name__ == "__main__":
255288
sys.exit(main())

0 commit comments

Comments
 (0)