Skip to content

Commit 3c975dc

Browse files
committed
Added support for Docker Inspector --inspector
1 parent e1380ad commit 3c975dc

File tree

1 file changed

+52
-45
lines changed

1 file changed

+52
-45
lines changed

examples/scan_docker_image.py

Lines changed: 52 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
1515
repository/image-name:version
1616
17-
Main project will be named "Docker_repository/image-name" and will have "version" as a version
17+
Main project will be named "repository/image-name" and will have "version" as a version
1818
19-
Docker Inspector scan project will be named as DI_"repository/image-name" and will have "version" as a version
19+
Docker Inspector scan project on squashed imaged will be named as "repository/image-name"_squashed and will have "version" as a version
2020
2121
Sub-projects for layers will be named as
2222
repository/image-name_layer_1
@@ -165,12 +165,11 @@ def detect_inspector_run(self, options=['--help']):
165165

166166
class ContainerImageScanner():
167167

168-
def __init__(self, hub, container_image_name, proj_name, workdir='/tmp/workdir', dockerfile=None, base_image=None, omit_base_layers=False):
168+
def __init__(self, hub, container_image_name, workdir='/tmp/workdir', dockerfile=None, base_image=None, omit_base_layers=False):
169169
self.hub = hub
170170
self.hub_detect = Detector(hub)
171171
self.docker = DockerWrapper(workdir)
172172
self.container_image_name = container_image_name
173-
self.proj_name = proj_name
174173
cindex = container_image_name.rfind(':')
175174
if cindex == -1:
176175
self.image_name = container_image_name
@@ -199,7 +198,7 @@ def process_container_image(self):
199198
offset = 0
200199
for i in self.manifest[0]['Layers']:
201200
layer = {}
202-
layer['name'] = self.proj_name + "_layer_" + str(num)
201+
layer['name'] = self.image_name + "_layer_" + str(num)
203202
layer['path'] = i
204203
while self.config['history'][num + offset -1].get('empty_layer', False):
205204
offset = offset + 1
@@ -210,7 +209,7 @@ def process_container_image(self):
210209
print (json.dumps(self.layers, indent=4))
211210

212211
def generate_project_structures(self, base_layers=None):
213-
main_project_release = self.hub.get_or_create_project_version("Docker_" + self.proj_name, self.image_version)
212+
main_project_release = self.hub.get_or_create_project_version(self.image_name, self.image_version)
214213

215214
for layer in self.layers:
216215
parameters = {}
@@ -234,17 +233,15 @@ def generate_project_structures(self, base_layers=None):
234233
print ("Number of addon layers {}".format(len(addon)))
235234

236235
if (len(base) > 0):
237-
main_project_release_addon = self.hub.get_or_create_project_version(self.proj_name, addon_image_version)
236+
main_project_release_addon = self.hub.get_or_create_project_version(self.image_name, addon_image_version)
238237
if not self.omit_base_layers:
239-
main_project_release_base = self.hub.get_or_create_project_version(self.proj_name, base_image_version)
238+
main_project_release_base = self.hub.get_or_create_project_version(self.image_name, base_image_version)
240239
for layer in base:
241-
parameters = {}
242-
parameters['description'] = layer['command']['created_by']
240+
parameters = {'description': layer['command']['created_by']}
243241
sub_project_release = self.hub.get_or_create_project_version(layer['name'], self.image_version, parameters=parameters)
244242
self.hub.add_version_as_component(main_project_release_base, sub_project_release)
245243
for layer in addon:
246-
parameters = {}
247-
parameters['description'] = layer['command']['created_by']
244+
parameters = {'description': layer['command']['created_by']}
248245
sub_project_release = self.hub.get_or_create_project_version(layer['name'], self.image_version, parameters=parameters)
249246
self.hub.add_version_as_component(main_project_release_addon, sub_project_release)
250247
else:
@@ -255,7 +252,7 @@ def generate_project_structures(self, base_layers=None):
255252
print("************************************************************")
256253

257254
def generate_single_layer_project_structure(self, layer_number):
258-
main_project_release = self.hub.get_or_create_project_version("Docker_" + self.proj_name, self.image_version)
255+
main_project_release = self.hub.get_or_create_project_version(self.image_name, self.image_version)
259256

260257
layer = self.layers[layer_number - 1]
261258
parameters = {}
@@ -284,20 +281,20 @@ def submit_single_layer_scan(self, layer_number):
284281
self.hub_detect.detect_run(options)
285282

286283
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)
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)
289286
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))
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)]
295291
self.hub_detect.detect_inspector_run(options)
296292

297293
def cleanup_project_structure(self):
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")
294+
release = self.hub.get_or_create_project_version(self.image_name,self.image_version)
295+
base_release = self.hub.get_project_version_by_name(self.image_name,self.image_version + "__base_layers")
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")
301298

302299
print("--------")
303300
print(base_release)
@@ -324,15 +321,17 @@ def cleanup_project_structure(self):
324321
print(self.hub.delete_project_version_by_name(sub_name, sub_version_name))
325322

326323
if base_release:
327-
print(self.hub.delete_project_version_by_name(self.proj_name,self.image_version + "__base_layers"))
324+
print(self.hub.delete_project_version_by_name(self.image_name,self.image_version + "__base_layers"))
328325
if addon_release:
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)
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"))
329+
project = self.hub.get_project_by_name(self.image_name)
331330
versions = self.hub.get_project_versions(project)
332331
if versions['totalCount'] == 1:
333-
print(self.hub.delete_project_by_name(self.proj_name))
332+
print(self.hub.delete_project_by_name(self.image_name))
334333
else:
335-
print(self.hub.delete_project_version_by_name(self.proj_name,self.image_version))
334+
print(self.hub.delete_project_version_by_name(self.image_name,self.image_version))
336335

337336
def get_base_layers(self):
338337
if (not self.dockerfile)and (not self.base_image):
@@ -370,10 +369,10 @@ def get_base_layers(self):
370369
return base_layers
371370

372371

373-
def scan_container_image(imagespec, projname, layer_number=0):
372+
def scan_container_image(imagespec, layer_number=0):
374373

375374
hub = HubInstance()
376-
scanner = ContainerImageScanner(hub, imagespec, projname)
375+
scanner = ContainerImageScanner(hub, imagespec)
377376
scanner.prepare_container_image()
378377
scanner.process_container_image()
379378
if layer_number == 0:
@@ -382,23 +381,30 @@ def scan_container_image(imagespec, projname, layer_number=0):
382381
else:
383382
scanner.generate_single_layer_project_structure(layer_number)
384383
scanner.submit_single_layer_scan(int(layer_number))
384+
385+
386+
def scan_squashed_image(imagespec) :
387+
hub = HubInstance()
388+
scanner = ContainerImageScanner(hub, imagespec)
389+
scanner.prepare_container_image()
385390
scanner.submit_docker_inspector_scan()
386391

387-
def scan_container_image_with_dockerfile(imagespec, projname, dockerfile, base_image, omit_base_layers):
392+
393+
def scan_container_image_with_dockerfile(imagespec, dockerfile, base_image, omit_base_layers):
388394
hub = HubInstance()
389-
scanner = ContainerImageScanner(hub, imagespec, projname, dockerfile=dockerfile, base_image=base_image, omit_base_layers=omit_base_layers)
395+
scanner = ContainerImageScanner(hub, imagespec, dockerfile=dockerfile, base_image=base_image, omit_base_layers=omit_base_layers)
390396
base_layers = scanner.get_base_layers()
391397
print (json.dumps(base_layers, indent=2))
392398
# sys.exit()
393399
scanner.prepare_container_image()
394400
scanner.process_container_image()
395401
scanner.generate_project_structures(base_layers)
396402
scanner.submit_layer_scans()
397-
scanner.submit_docker_inspector_scan()
398-
399-
def clean_container_project(imagespec, projname):
403+
404+
405+
def clean_container_project(imagespec):
400406
hub = HubInstance()
401-
scanner = ContainerImageScanner(hub, imagespec, projname)
407+
scanner = ContainerImageScanner(hub, imagespec)
402408
scanner.cleanup_project_structure()
403409

404410

@@ -411,7 +417,7 @@ def main(argv=None):
411417

412418
parser = ArgumentParser()
413419
parser.add_argument('imagespec', help="Container image tag, e.g. repository/imagename:version")
414-
parser.add_argument('projname', help="Project Name")
420+
parser.add_argument('--inspector', default=False, help="Runs Docker Inspector scan on squashed image")
415421
parser.add_argument('--cleanup', default=False, help="Delete project hierarchy only. Do not scan")
416422
parser.add_argument('--rescan-layer',default=0, type=int, help="Rescan specific layer in case of failure, 0 - scan as usual")
417423
parser.add_argument('--dockerfile',default=None, type=str, help="Specify dockerfile used to build this container(experimantal), can't use with --base-image")
@@ -434,18 +440,19 @@ def main(argv=None):
434440
sys.exit(1)
435441

436442
if args.cleanup:
437-
clean_container_project(args.imagespec, args.projname)
443+
clean_container_project(args.imagespec)
438444
sys.exit(1)
439445
if args.dockerfile or args.base_image:
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)
446+
clean_container_project(args.imagespec)
447+
scan_container_image_with_dockerfile(args.imagespec, args.dockerfile, args.base_image, args.omit_base_layers)
442448
else:
443449
if args.rescan_layer == 0:
444-
clean_container_project(args.imagespec, args.projname)
445-
scan_container_image(args.imagespec, args.projname)
450+
clean_container_project(args.imagespec)
451+
scan_container_image(args.imagespec)
446452
else:
447-
scan_container_image(args.imagespec, args.rescan_layer, args.projname)
448-
453+
scan_container_image(args.imagespec, args.rescan_layer)
454+
if args.inspector :
455+
scan_squashed_image(args.imagespec)
456+
449457
if __name__ == "__main__":
450458
sys.exit(main())
451-

0 commit comments

Comments
 (0)