16
16
17
17
Main project will be named "repository/image-name" and will have "version" as a version
18
18
19
+ Docker Inspector scan project on squashed imaged will be named as "repository/image-name"_squashed and will have "version" as a version
20
+
19
21
Sub-projects for layers will be named as
20
22
repository/image-name_layer_1
21
23
repository/image-name_layer_2
@@ -149,6 +151,18 @@ def detect_run(self, options=['--help']):
149
151
cmd .extend (options )
150
152
subprocess .run (cmd )
151
153
154
+ def detect_inspector_run (self , options = ['--help' ]):
155
+ cmd = ['bash' ]
156
+ cmd .append (self .filename )
157
+ cmd .append ('--blackduck.url=%s' % self .baseurl )
158
+ cmd .append ('--blackduck.api.token=' + self .token )
159
+ cmd .append ('--blackduck.trust.cert=true' )
160
+ cmd .append ('--detect.tools=DOCKER' )
161
+ #cmd.append('--detect.docker.inspector.air.gap.path=/root/packaged-inspectors/docker')
162
+ cmd .extend (options )
163
+ subprocess .run (cmd )
164
+
165
+
152
166
class ContainerImageScanner ():
153
167
154
168
def __init__ (self , hub , container_image_name , workdir = '/tmp/workdir' , dockerfile = None , base_image = None , omit_base_layers = False ):
@@ -223,13 +237,11 @@ def generate_project_structures(self, base_layers=None):
223
237
if not self .omit_base_layers :
224
238
main_project_release_base = self .hub .get_or_create_project_version (self .image_name , base_image_version )
225
239
for layer in base :
226
- parameters = {}
227
- parameters ['description' ] = layer ['command' ]['created_by' ]
240
+ parameters = {'description' : layer ['command' ]['created_by' ]}
228
241
sub_project_release = self .hub .get_or_create_project_version (layer ['name' ], self .image_version , parameters = parameters )
229
242
self .hub .add_version_as_component (main_project_release_base , sub_project_release )
230
243
for layer in addon :
231
- parameters = {}
232
- parameters ['description' ] = layer ['command' ]['created_by' ]
244
+ parameters = {'description' : layer ['command' ]['created_by' ]}
233
245
sub_project_release = self .hub .get_or_create_project_version (layer ['name' ], self .image_version , parameters = parameters )
234
246
self .hub .add_version_as_component (main_project_release_addon , sub_project_release )
235
247
else :
@@ -268,10 +280,21 @@ def submit_single_layer_scan(self, layer_number):
268
280
options .append ('--detect.source.path={}/{}' .format (self .docker .imagedir , layer ['path' ].split ('/' )[0 ]))
269
281
self .hub_detect .detect_run (options )
270
282
283
+ def submit_docker_inspector_scan (self ):
284
+ main_project_release = self .hub .get_or_create_project_version (self .image_name , self .image_version )
285
+ sub_project_release = self .hub .get_or_create_project_version (self .image_name + "_squashed" , self .image_version )
286
+ self .hub .add_version_as_component (main_project_release , sub_project_release )
287
+ options = ['--detect.project.name={}_squashed' .format (self .image_name ),
288
+ '--detect.project.version.name="{}"' .format (self .image_version ),
289
+ '--detect.code.location.name=DI_{}' .format (self .docker .imagefile ),
290
+ '--detect.docker.tar={}' .format (self .docker .imagefile )]
291
+ self .hub_detect .detect_inspector_run (options )
292
+
271
293
def cleanup_project_structure (self ):
272
294
release = self .hub .get_or_create_project_version (self .image_name ,self .image_version )
273
295
base_release = self .hub .get_project_version_by_name (self .image_name ,self .image_version + "__base_layers" )
274
296
addon_release = self .hub .get_project_version_by_name (self .image_name ,self .image_version + "_addon_layers" )
297
+ squahed_release = self .hub .get_project_version_by_name (self .image_name ,self .image_version + "_squashed" )
275
298
276
299
print ("--------" )
277
300
print (base_release )
@@ -301,6 +324,8 @@ def cleanup_project_structure(self):
301
324
print (self .hub .delete_project_version_by_name (self .image_name ,self .image_version + "__base_layers" ))
302
325
if addon_release :
303
326
print (self .hub .delete_project_version_by_name (self .image_name ,self .image_version + "_addon_layers" ))
327
+ if squahed_release :
328
+ print (self .hub .delete_project_version_by_name (self .image_name , self .image_version + "_squashed" ))
304
329
project = self .hub .get_project_by_name (self .image_name )
305
330
versions = self .hub .get_project_versions (project )
306
331
if versions ['totalCount' ] == 1 :
@@ -357,6 +382,14 @@ def scan_container_image(imagespec, layer_number=0):
357
382
scanner .generate_single_layer_project_structure (layer_number )
358
383
scanner .submit_single_layer_scan (int (layer_number ))
359
384
385
+
386
+ def scan_squashed_image (imagespec ) :
387
+ hub = HubInstance ()
388
+ scanner = ContainerImageScanner (hub , imagespec )
389
+ scanner .prepare_container_image ()
390
+ scanner .submit_docker_inspector_scan ()
391
+
392
+
360
393
def scan_container_image_with_dockerfile (imagespec , dockerfile , base_image , omit_base_layers ):
361
394
hub = HubInstance ()
362
395
scanner = ContainerImageScanner (hub , imagespec , dockerfile = dockerfile , base_image = base_image , omit_base_layers = omit_base_layers )
@@ -367,7 +400,8 @@ def scan_container_image_with_dockerfile(imagespec, dockerfile, base_image, omit
367
400
scanner .process_container_image ()
368
401
scanner .generate_project_structures (base_layers )
369
402
scanner .submit_layer_scans ()
370
-
403
+
404
+
371
405
def clean_container_project (imagespec ):
372
406
hub = HubInstance ()
373
407
scanner = ContainerImageScanner (hub , imagespec )
@@ -383,6 +417,7 @@ def main(argv=None):
383
417
384
418
parser = ArgumentParser ()
385
419
parser .add_argument ('imagespec' , help = "Container image tag, e.g. repository/imagename:version" )
420
+ parser .add_argument ('--inspector' , default = False , help = "Runs Docker Inspector scan on squashed image" )
386
421
parser .add_argument ('--cleanup' , default = False , help = "Delete project hierarchy only. Do not scan" )
387
422
parser .add_argument ('--rescan-layer' ,default = 0 , type = int , help = "Rescan specific layer in case of failure, 0 - scan as usual" )
388
423
parser .add_argument ('--dockerfile' ,default = None , type = str , help = "Specify dockerfile used to build this container(experimantal), can't use with --base-image" )
@@ -416,7 +451,8 @@ def main(argv=None):
416
451
scan_container_image (args .imagespec )
417
452
else :
418
453
scan_container_image (args .imagespec , args .rescan_layer )
419
-
454
+ if args .inspector :
455
+ scan_squashed_image (args .imagespec )
456
+
420
457
if __name__ == "__main__" :
421
458
sys .exit (main ())
422
-
0 commit comments