diff --git a/strix/interface/main.py b/strix/interface/main.py index 063dc10d..fbaea976 100644 --- a/strix/interface/main.py +++ b/strix/interface/main.py @@ -292,6 +292,13 @@ def parse_arguments() -> argparse.Namespace: help="Custom name for this penetration test run", ) + parser.add_argument( + "-r", + "--reuse-container", + action="store_true", + help="Reuse Docker container that already has this run-name (skip pull/copy). 'strix-scan-'.", + ) + parser.add_argument( "-n", "--non-interactive", @@ -447,6 +454,23 @@ def main() -> None: args = parse_arguments() check_docker_installed() + + if args.run_name: + container_name = f"strix-scan-{args.run_name}" + try: + import docker + client = docker.from_env() + duplicates = client.containers.list(all=True, filters={"name": f"^{container_name}$"}) + if duplicates and not args.reuse_container: + print( + f"\n[!] A container named '{container_name}' already exists.\n" + f" Use --reuse-container (-r) to run on the existing container,\n" + f" or choose a different --run-name.\n" + ) + sys.exit(1) + except Exception: + pass + pull_docker_image() validate_environment() diff --git a/strix/interface/utils.py b/strix/interface/utils.py index 8faba593..fbba5004 100644 --- a/strix/interface/utils.py +++ b/strix/interface/utils.py @@ -136,8 +136,8 @@ def generate_run_name() -> str: # fmt: on adj = secrets.choice(adjectives) noun = secrets.choice(nouns) - number = secrets.randbelow(900) + 100 - return f"{adj}-{noun}-{number}" + timestamp = int(time.time() * 1_000) + return f"{adj}-{noun}-{timestamp}" # Target processing utilities