diff --git a/cli/cli.py b/cli/cli.py index 5ffe84623b..37b7ac9615 100644 --- a/cli/cli.py +++ b/cli/cli.py @@ -1,5 +1,6 @@ import typer +from prowler.config.config import available_compliance_frameworks from prowler.lib.banner import print_banner from prowler.lib.check.check import ( bulk_load_checks_metadata, @@ -65,6 +66,15 @@ def list_compliance_requirements( ) +def validate_frameworks(compliance_frameworks: list[str] = None): + if not compliance_frameworks: + raise typer.BadParameter("Expected at least one argument") + for framework in compliance_frameworks: + if framework not in available_compliance_frameworks: + print(f"{framework} is not a valid Compliance Framework\n") + return compliance_frameworks + + def create_list_commands(provider_typer: typer.Typer): provider_name = provider_typer.info.name @@ -96,12 +106,17 @@ def create_list_commands(provider_typer: typer.Typer): def list_compliance_command(): list_resources(provider_name, "compliance") + # The compliance requirements should be inside available_compliance_frameworks @provider_typer.command( "list-compliance-requirements", help=f"List the {provider_name} compliance frameworks requirements that are supported by Prowler.", ) def list_compliance_requirements_command( - list_compliance_frameworks: list[str] = typer.Argument(None), + list_compliance_frameworks: list[str] = typer.Argument( + help="List requirements and checks per compliance framework", + callback=validate_frameworks, + default=None, + ), ): list_compliance_requirements(provider_name, list_compliance_frameworks) diff --git a/cli/tests/cli_tests.py b/cli/tests/cli_tests.py index 5734f33ef3..5314c9f35e 100644 --- a/cli/tests/cli_tests.py +++ b/cli/tests/cli_tests.py @@ -54,8 +54,18 @@ def test_list_compliance_requirements_aws(): def test_list_compliance_requirements_no_compliance_aws(): result = runner.invoke(app, ["aws", "list-compliance-requirements"]) + assert result.exit_code == 2 + assert "Expected at least one" in result.output + + +def test_list_compliance_requirements_one_invalid_aws(): + invalid_name = "invalid" + result = runner.invoke( + app, ["aws", "list-compliance-requirements", "cis_2.0_aws", invalid_name] + ) assert result.exit_code == 0 - assert "No compliance frameworks specified." in result.output + assert "Listing CIS 2.0 AWS Compliance Requirements:" in result.output + assert f"{invalid_name} is not a valid Compliance Framework" in result.output def test_list_checks_aws():