diff --git a/focker.py b/focker.py index 5947ff1..239796f 100644 --- a/focker.py +++ b/focker.py @@ -4,7 +4,8 @@ import os # from weir import zfs, process from .image import command_image_build, \ command_image_untag, \ - command_image_list + command_image_list, \ + command_image_prune import sys from .zfs import zfs_init from .jail import command_jail_run @@ -28,6 +29,9 @@ def create_parser(): parser.set_defaults(func=command_image_list) parser.add_argument('--full-sha256', '-f', action='store_true') + parser = subparsers.add_parser('prune') + parser.set_defaults(func=command_image_prune) + subparsers = subparsers_top.add_parser('jail').add_subparsers() parser = subparsers.add_parser('run') parser.set_defaults(func=command_jail_run) diff --git a/image.py b/image.py index c0759fc..26bc53c 100644 --- a/image.py +++ b/image.py @@ -88,3 +88,23 @@ def command_image_list(args): a[2] if args.full_sha256 else a[2][:7], a[4].split('/')[-1].split('@')[0] ], lst)) print(tabulate(lst, headers=['Tags', 'Size', 'SHA256', 'Base'])) + + +def command_image_prune(args): + again = True + while again: + again = False + lst = zfs_parse_output(['zfs', 'list', '-o', 'focker:sha256,focker:tags,origin,name', '-H']) + used = set() + for r in lst: + if r[2] == '-': + continue + used.add(r[2].split('@')[0]) + for r in lst: + if r[0] == '-' or r[1] != '-': + continue + if r[3] not in used: + print('Removing:', r[3]) + zfs_run(['zfs', 'destroy', '-f', r[3]]) + again = True + # zfs_parse_output(['zfs'])