14
14
15
15
repository/image-name:version
16
16
17
- Main project will be named "repository/image-name" and will have "version" as a version
17
+ Main project will be named "Docker_repository/image-name" and will have "version" as a version
18
+
19
+ Docker Inspector scan project will be named as DI_"repository/image-name" and will have "version" as a version
18
20
19
21
Sub-projects for layers will be named as
20
22
repository/image-name_layer_1
@@ -149,13 +151,26 @@ 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
- def __init__ (self , hub , container_image_name , workdir = '/tmp/workdir' , dockerfile = None , base_image = None , omit_base_layers = False ):
168
+ def __init__ (self , hub , container_image_name , proj_name , workdir = '/tmp/workdir' , dockerfile = None , base_image = None , omit_base_layers = False ):
155
169
self .hub = hub
156
170
self .hub_detect = Detector (hub )
157
171
self .docker = DockerWrapper (workdir )
158
172
self .container_image_name = container_image_name
173
+ self .proj_name = proj_name
159
174
cindex = container_image_name .rfind (':' )
160
175
if cindex == - 1 :
161
176
self .image_name = container_image_name
@@ -184,7 +199,7 @@ def process_container_image(self):
184
199
offset = 0
185
200
for i in self .manifest [0 ]['Layers' ]:
186
201
layer = {}
187
- layer ['name' ] = self .image_name + "_layer_" + str (num )
202
+ layer ['name' ] = self .proj_name + "_layer_" + str (num )
188
203
layer ['path' ] = i
189
204
while self .config ['history' ][num + offset - 1 ].get ('empty_layer' , False ):
190
205
offset = offset + 1
@@ -195,7 +210,7 @@ def process_container_image(self):
195
210
print (json .dumps (self .layers , indent = 4 ))
196
211
197
212
def generate_project_structures (self , base_layers = None ):
198
- main_project_release = self .hub .get_or_create_project_version (self .image_name , self .image_version )
213
+ main_project_release = self .hub .get_or_create_project_version ("Docker_" + self .proj_name , self .image_version )
199
214
200
215
for layer in self .layers :
201
216
parameters = {}
@@ -219,9 +234,9 @@ def generate_project_structures(self, base_layers=None):
219
234
print ("Number of addon layers {}" .format (len (addon )))
220
235
221
236
if (len (base ) > 0 ):
222
- main_project_release_addon = self .hub .get_or_create_project_version (self .image_name , addon_image_version )
237
+ main_project_release_addon = self .hub .get_or_create_project_version (self .proj_name , addon_image_version )
223
238
if not self .omit_base_layers :
224
- main_project_release_base = self .hub .get_or_create_project_version (self .image_name , base_image_version )
239
+ main_project_release_base = self .hub .get_or_create_project_version (self .proj_name , base_image_version )
225
240
for layer in base :
226
241
parameters = {}
227
242
parameters ['description' ] = layer ['command' ]['created_by' ]
@@ -240,7 +255,7 @@ def generate_project_structures(self, base_layers=None):
240
255
print ("************************************************************" )
241
256
242
257
def generate_single_layer_project_structure (self , layer_number ):
243
- main_project_release = self .hub .get_or_create_project_version (self .image_name , self .image_version )
258
+ main_project_release = self .hub .get_or_create_project_version ("Docker_" + self .proj_name , self .image_version )
244
259
245
260
layer = self .layers [layer_number - 1 ]
246
261
parameters = {}
@@ -268,10 +283,21 @@ def submit_single_layer_scan(self, layer_number):
268
283
options .append ('--detect.source.path={}/{}' .format (self .docker .imagedir , layer ['path' ].split ('/' )[0 ]))
269
284
self .hub_detect .detect_run (options )
270
285
286
+ def submit_docker_inspector_scan (self ):
287
+ main_project_release = self .hub .get_or_create_project_version ("Docker_" + self .proj_name , self .image_version )
288
+ sub_project_release = self .hub .get_or_create_project_version ('DI_{}' .format (self .proj_name ), self .image_version )
289
+ self .hub .add_version_as_component (main_project_release , sub_project_release )
290
+ options = []
291
+ options .append ('--detect.project.name=DI_{}' .format (self .proj_name ))
292
+ options .append ('--detect.project.version.name="{}"' .format (self .image_version ))
293
+ options .append ('--detect.code.location.name=DI_{}' .format (self .docker .imagefile ))
294
+ options .append ('--detect.docker.tar={}' .format (self .docker .imagefile ))
295
+ self .hub_detect .detect_inspector_run (options )
296
+
271
297
def cleanup_project_structure (self ):
272
- release = self .hub .get_or_create_project_version (self .image_name ,self .image_version )
273
- base_release = self .hub .get_project_version_by_name (self .image_name ,self .image_version + "__base_layers" )
274
- addon_release = self .hub .get_project_version_by_name (self .image_name ,self .image_version + "_addon_layers" )
298
+ release = self .hub .get_or_create_project_version (self .proj_name ,self .image_version )
299
+ base_release = self .hub .get_project_version_by_name (self .proj_name ,self .image_version + "__base_layers" )
300
+ addon_release = self .hub .get_project_version_by_name (self .proj_name ,self .image_version + "_addon_layers" )
275
301
276
302
print ("--------" )
277
303
print (base_release )
@@ -298,15 +324,15 @@ def cleanup_project_structure(self):
298
324
print (self .hub .delete_project_version_by_name (sub_name , sub_version_name ))
299
325
300
326
if base_release :
301
- print (self .hub .delete_project_version_by_name (self .image_name ,self .image_version + "__base_layers" ))
327
+ print (self .hub .delete_project_version_by_name (self .proj_name ,self .image_version + "__base_layers" ))
302
328
if addon_release :
303
- print (self .hub .delete_project_version_by_name (self .image_name ,self .image_version + "_addon_layers" ))
304
- project = self .hub .get_project_by_name (self .image_name )
329
+ print (self .hub .delete_project_version_by_name (self .proj_name ,self .image_version + "_addon_layers" ))
330
+ project = self .hub .get_project_by_name (self .proj_name )
305
331
versions = self .hub .get_project_versions (project )
306
332
if versions ['totalCount' ] == 1 :
307
- print (self .hub .delete_project_by_name (self .image_name ))
333
+ print (self .hub .delete_project_by_name (self .proj_name ))
308
334
else :
309
- print (self .hub .delete_project_version_by_name (self .image_name ,self .image_version ))
335
+ print (self .hub .delete_project_version_by_name (self .proj_name ,self .image_version ))
310
336
311
337
def get_base_layers (self ):
312
338
if (not self .dockerfile )and (not self .base_image ):
@@ -344,10 +370,10 @@ def get_base_layers(self):
344
370
return base_layers
345
371
346
372
347
- def scan_container_image (imagespec , layer_number = 0 ):
373
+ def scan_container_image (imagespec , projname , layer_number = 0 ):
348
374
349
375
hub = HubInstance ()
350
- scanner = ContainerImageScanner (hub , imagespec )
376
+ scanner = ContainerImageScanner (hub , imagespec , projname )
351
377
scanner .prepare_container_image ()
352
378
scanner .process_container_image ()
353
379
if layer_number == 0 :
@@ -356,21 +382,23 @@ def scan_container_image(imagespec, layer_number=0):
356
382
else :
357
383
scanner .generate_single_layer_project_structure (layer_number )
358
384
scanner .submit_single_layer_scan (int (layer_number ))
385
+ scanner .submit_docker_inspector_scan ()
359
386
360
- def scan_container_image_with_dockerfile (imagespec , dockerfile , base_image , omit_base_layers ):
387
+ def scan_container_image_with_dockerfile (imagespec , projname , dockerfile , base_image , omit_base_layers ):
361
388
hub = HubInstance ()
362
- scanner = ContainerImageScanner (hub , imagespec , dockerfile = dockerfile , base_image = base_image , omit_base_layers = omit_base_layers )
389
+ scanner = ContainerImageScanner (hub , imagespec , projname , dockerfile = dockerfile , base_image = base_image , omit_base_layers = omit_base_layers )
363
390
base_layers = scanner .get_base_layers ()
364
391
print (json .dumps (base_layers , indent = 2 ))
365
392
# sys.exit()
366
393
scanner .prepare_container_image ()
367
394
scanner .process_container_image ()
368
395
scanner .generate_project_structures (base_layers )
369
396
scanner .submit_layer_scans ()
397
+ scanner .submit_docker_inspector_scan ()
370
398
371
- def clean_container_project (imagespec ):
399
+ def clean_container_project (imagespec , projname ):
372
400
hub = HubInstance ()
373
- scanner = ContainerImageScanner (hub , imagespec )
401
+ scanner = ContainerImageScanner (hub , imagespec , projname )
374
402
scanner .cleanup_project_structure ()
375
403
376
404
@@ -383,6 +411,7 @@ def main(argv=None):
383
411
384
412
parser = ArgumentParser ()
385
413
parser .add_argument ('imagespec' , help = "Container image tag, e.g. repository/imagename:version" )
414
+ parser .add_argument ('projname' , help = "Project Name" )
386
415
parser .add_argument ('--cleanup' , default = False , help = "Delete project hierarchy only. Do not scan" )
387
416
parser .add_argument ('--rescan-layer' ,default = 0 , type = int , help = "Rescan specific layer in case of failure, 0 - scan as usual" )
388
417
parser .add_argument ('--dockerfile' ,default = None , type = str , help = "Specify dockerfile used to build this container(experimantal), can't use with --base-image" )
@@ -405,17 +434,17 @@ def main(argv=None):
405
434
sys .exit (1 )
406
435
407
436
if args .cleanup :
408
- clean_container_project (args .imagespec )
437
+ clean_container_project (args .imagespec , args . projname )
409
438
sys .exit (1 )
410
439
if args .dockerfile or args .base_image :
411
- clean_container_project (args .imagespec )
412
- scan_container_image_with_dockerfile (args .imagespec , args .dockerfile , args .base_image , args .omit_base_layers )
440
+ clean_container_project (args .imagespec , args . projname )
441
+ scan_container_image_with_dockerfile (args .imagespec , args .projname , args . dockerfile , args .base_image , args .omit_base_layers )
413
442
else :
414
443
if args .rescan_layer == 0 :
415
- clean_container_project (args .imagespec )
416
- scan_container_image (args .imagespec )
444
+ clean_container_project (args .imagespec , args . projname )
445
+ scan_container_image (args .imagespec , args . projname )
417
446
else :
418
- scan_container_image (args .imagespec , args .rescan_layer )
447
+ scan_container_image (args .imagespec , args .rescan_layer , args . projname )
419
448
420
449
if __name__ == "__main__" :
421
450
sys .exit (main ())
0 commit comments