Skip to content

Commit 6c904cc

Browse files
authored
Merge pull request #85 from blackducksoftware/sghosh
Added support for Docker Inspector and some cosmetic changes
2 parents 33ecee0 + 3c975dc commit 6c904cc

File tree

1 file changed

+43
-7
lines changed

1 file changed

+43
-7
lines changed

examples/scan_docker_image.py

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
1717
Main project will be named "repository/image-name" and will have "version" as a version
1818
19+
Docker Inspector scan project on squashed imaged will be named as "repository/image-name"_squashed and will have "version" as a version
20+
1921
Sub-projects for layers will be named as
2022
repository/image-name_layer_1
2123
repository/image-name_layer_2
@@ -149,6 +151,18 @@ 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

154168
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):
223237
if not self.omit_base_layers:
224238
main_project_release_base = self.hub.get_or_create_project_version(self.image_name, base_image_version)
225239
for layer in base:
226-
parameters = {}
227-
parameters['description'] = layer['command']['created_by']
240+
parameters = {'description': layer['command']['created_by']}
228241
sub_project_release = self.hub.get_or_create_project_version(layer['name'], self.image_version, parameters=parameters)
229242
self.hub.add_version_as_component(main_project_release_base, sub_project_release)
230243
for layer in addon:
231-
parameters = {}
232-
parameters['description'] = layer['command']['created_by']
244+
parameters = {'description': layer['command']['created_by']}
233245
sub_project_release = self.hub.get_or_create_project_version(layer['name'], self.image_version, parameters=parameters)
234246
self.hub.add_version_as_component(main_project_release_addon, sub_project_release)
235247
else:
@@ -268,10 +280,21 @@ def submit_single_layer_scan(self, layer_number):
268280
options.append('--detect.source.path={}/{}'.format(self.docker.imagedir, layer['path'].split('/')[0]))
269281
self.hub_detect.detect_run(options)
270282

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+
271293
def cleanup_project_structure(self):
272294
release = self.hub.get_or_create_project_version(self.image_name,self.image_version)
273295
base_release = self.hub.get_project_version_by_name(self.image_name,self.image_version + "__base_layers")
274296
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")
275298

276299
print("--------")
277300
print(base_release)
@@ -301,6 +324,8 @@ def cleanup_project_structure(self):
301324
print(self.hub.delete_project_version_by_name(self.image_name,self.image_version + "__base_layers"))
302325
if addon_release:
303326
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"))
304329
project = self.hub.get_project_by_name(self.image_name)
305330
versions = self.hub.get_project_versions(project)
306331
if versions['totalCount'] == 1:
@@ -357,6 +382,14 @@ def scan_container_image(imagespec, layer_number=0):
357382
scanner.generate_single_layer_project_structure(layer_number)
358383
scanner.submit_single_layer_scan(int(layer_number))
359384

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+
360393
def scan_container_image_with_dockerfile(imagespec, dockerfile, base_image, omit_base_layers):
361394
hub = HubInstance()
362395
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
367400
scanner.process_container_image()
368401
scanner.generate_project_structures(base_layers)
369402
scanner.submit_layer_scans()
370-
403+
404+
371405
def clean_container_project(imagespec):
372406
hub = HubInstance()
373407
scanner = ContainerImageScanner(hub, imagespec)
@@ -383,6 +417,7 @@ def main(argv=None):
383417

384418
parser = ArgumentParser()
385419
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")
386421
parser.add_argument('--cleanup', default=False, help="Delete project hierarchy only. Do not scan")
387422
parser.add_argument('--rescan-layer',default=0, type=int, help="Rescan specific layer in case of failure, 0 - scan as usual")
388423
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):
416451
scan_container_image(args.imagespec)
417452
else:
418453
scan_container_image(args.imagespec, args.rescan_layer)
419-
454+
if args.inspector :
455+
scan_squashed_image(args.imagespec)
456+
420457
if __name__ == "__main__":
421458
sys.exit(main())
422-

0 commit comments

Comments
 (0)