Skip to content

Commit e1380ad

Browse files
committed
Added support for Docker Inspector and some cosmetic changes
1 parent 1ebcf49 commit e1380ad

File tree

1 file changed

+56
-27
lines changed

1 file changed

+56
-27
lines changed

examples/scan_docker_image.py

Lines changed: 56 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
1515
repository/image-name:version
1616
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
1820
1921
Sub-projects for layers will be named as
2022
repository/image-name_layer_1
@@ -149,13 +151,26 @@ def detect_run(self, options=['--help']):
149151
cmd.extend(options)
150152
subprocess.run(cmd)
151153

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+
152166
class ContainerImageScanner():
153167

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):
155169
self.hub = hub
156170
self.hub_detect = Detector(hub)
157171
self.docker = DockerWrapper(workdir)
158172
self.container_image_name = container_image_name
173+
self.proj_name = proj_name
159174
cindex = container_image_name.rfind(':')
160175
if cindex == -1:
161176
self.image_name = container_image_name
@@ -184,7 +199,7 @@ def process_container_image(self):
184199
offset = 0
185200
for i in self.manifest[0]['Layers']:
186201
layer = {}
187-
layer['name'] = self.image_name + "_layer_" + str(num)
202+
layer['name'] = self.proj_name + "_layer_" + str(num)
188203
layer['path'] = i
189204
while self.config['history'][num + offset -1].get('empty_layer', False):
190205
offset = offset + 1
@@ -195,7 +210,7 @@ def process_container_image(self):
195210
print (json.dumps(self.layers, indent=4))
196211

197212
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)
199214

200215
for layer in self.layers:
201216
parameters = {}
@@ -219,9 +234,9 @@ def generate_project_structures(self, base_layers=None):
219234
print ("Number of addon layers {}".format(len(addon)))
220235

221236
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)
223238
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)
225240
for layer in base:
226241
parameters = {}
227242
parameters['description'] = layer['command']['created_by']
@@ -240,7 +255,7 @@ def generate_project_structures(self, base_layers=None):
240255
print("************************************************************")
241256

242257
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)
244259

245260
layer = self.layers[layer_number - 1]
246261
parameters = {}
@@ -268,10 +283,21 @@ def submit_single_layer_scan(self, layer_number):
268283
options.append('--detect.source.path={}/{}'.format(self.docker.imagedir, layer['path'].split('/')[0]))
269284
self.hub_detect.detect_run(options)
270285

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+
271297
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")
275301

276302
print("--------")
277303
print(base_release)
@@ -298,15 +324,15 @@ def cleanup_project_structure(self):
298324
print(self.hub.delete_project_version_by_name(sub_name, sub_version_name))
299325

300326
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"))
302328
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)
305331
versions = self.hub.get_project_versions(project)
306332
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))
308334
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))
310336

311337
def get_base_layers(self):
312338
if (not self.dockerfile)and (not self.base_image):
@@ -344,10 +370,10 @@ def get_base_layers(self):
344370
return base_layers
345371

346372

347-
def scan_container_image(imagespec, layer_number=0):
373+
def scan_container_image(imagespec, projname, layer_number=0):
348374

349375
hub = HubInstance()
350-
scanner = ContainerImageScanner(hub, imagespec)
376+
scanner = ContainerImageScanner(hub, imagespec, projname)
351377
scanner.prepare_container_image()
352378
scanner.process_container_image()
353379
if layer_number == 0:
@@ -356,21 +382,23 @@ def scan_container_image(imagespec, layer_number=0):
356382
else:
357383
scanner.generate_single_layer_project_structure(layer_number)
358384
scanner.submit_single_layer_scan(int(layer_number))
385+
scanner.submit_docker_inspector_scan()
359386

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):
361388
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)
363390
base_layers = scanner.get_base_layers()
364391
print (json.dumps(base_layers, indent=2))
365392
# sys.exit()
366393
scanner.prepare_container_image()
367394
scanner.process_container_image()
368395
scanner.generate_project_structures(base_layers)
369396
scanner.submit_layer_scans()
397+
scanner.submit_docker_inspector_scan()
370398

371-
def clean_container_project(imagespec):
399+
def clean_container_project(imagespec, projname):
372400
hub = HubInstance()
373-
scanner = ContainerImageScanner(hub, imagespec)
401+
scanner = ContainerImageScanner(hub, imagespec, projname)
374402
scanner.cleanup_project_structure()
375403

376404

@@ -383,6 +411,7 @@ def main(argv=None):
383411

384412
parser = ArgumentParser()
385413
parser.add_argument('imagespec', help="Container image tag, e.g. repository/imagename:version")
414+
parser.add_argument('projname', help="Project Name")
386415
parser.add_argument('--cleanup', default=False, help="Delete project hierarchy only. Do not scan")
387416
parser.add_argument('--rescan-layer',default=0, type=int, help="Rescan specific layer in case of failure, 0 - scan as usual")
388417
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):
405434
sys.exit(1)
406435

407436
if args.cleanup:
408-
clean_container_project(args.imagespec)
437+
clean_container_project(args.imagespec, args.projname)
409438
sys.exit(1)
410439
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)
413442
else:
414443
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)
417446
else:
418-
scan_container_image(args.imagespec, args.rescan_layer)
447+
scan_container_image(args.imagespec, args.rescan_layer, args.projname)
419448

420449
if __name__ == "__main__":
421450
sys.exit(main())

0 commit comments

Comments
 (0)