diff --git a/Docker/Sonar/sonar.py b/Docker/Sonar/sonar.py index a14ad30..fc786f0 100755 --- a/Docker/Sonar/sonar.py +++ b/Docker/Sonar/sonar.py @@ -20,6 +20,7 @@ from rich import box from rich.text import Text from rich.progress import Progress, SpinnerColumn, BarColumn, TextColumn + from rich.prompt import Confirm except ImportError: print("Error: This script requires the 'rich' library.") print("Please install it using: pip install rich") @@ -845,6 +846,7 @@ def main(): parser.add_argument("--detailed", action="store_true", help="Show detailed breakdown of digests") parser.add_argument("--output", choices=['table', 'json'], default='table', help="Output format (default: table)") parser.add_argument("--debug-log", action="store_true", help="Enable debug logging to file") + parser.add_argument("--force", action="store_true", help="Force deletion without interactive prompt") args = parser.parse_args() @@ -857,21 +859,22 @@ def main(): [ (o) ] <<< SONAR >>> [/bold cyan]""") - parser = argparse.ArgumentParser(description="Sonar - A Docker image inspector for Cloudsmith.") - parser.add_argument("org", help="Cloudsmith Organization/User") - parser.add_argument("repo", help="Cloudsmith Repository") - parser.add_argument("img", nargs="?", help="Image Name (Optional - if omitted, scans all images)") - parser.add_argument("--untagged", action="store_true", help="Find untagged manifest lists") - parser.add_argument("--untagged-delete", action="store_true", help="Delete untagged manifest lists") - parser.add_argument("--delete-all", action="store_true", help="Delete ALL detected manifest lists") - parser.add_argument("--delete-tag", help="Delete manifest lists matching this specific tag") - parser.add_argument("--detailed", action="store_true", help="Show detailed breakdown of digests") - parser.add_argument("--output", choices=['table', 'json',], default='table', help="Output format (default: table)") - parser.add_argument("--debug-log", action="store_true", help="Enable debug logging to file") - - args = parser.parse_args() logger.info(f"Arguments: {args}") + # Interactive Confirmation for Deletion + if (args.untagged_delete or args.delete_all or args.delete_tag) and not args.force: + console.print(f"[bold red]WARNING: You have selected options that will DELETE packages from {args.org}/{args.repo}[/bold red]") + if args.untagged_delete: + console.print("[red] - Deleting: Untagged manifest lists[/red]") + if args.delete_all: + console.print("[red] - Deleting: ALL detected manifest lists[/red]") + if args.delete_tag: + console.print(f"[red] - Deleting: Manifest lists with tag '{args.delete_tag}'[/red]") + + if not Confirm.ask("Are you sure you want to proceed?"): + console.print("[bold red]Deletion cancelled by user.[/bold red]") + sys.exit(0) + images_to_scan = [] if args.img: