conviso-ast 3.0.0.dev1__tar.gz → 3.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/PKG-INFO +4 -4
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/conviso_ast.egg-info/PKG-INFO +4 -4
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/conviso_ast.egg-info/SOURCES.txt +4 -5
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/conviso_ast.egg-info/requires.txt +3 -3
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/common/retry_handler.py +2 -2
- conviso_ast-3.0.1/convisoappsec/flow/util/__init__.py +5 -0
- conviso_ast-3.0.1/convisoappsec/flowcli/ast/dry_run.py +99 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/ast/entrypoint.py +2 -1
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/time_.py +0 -2
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/versioning_style.py +0 -2
- conviso_ast-3.0.1/convisoappsec/flowcli/iac/dry_run.py +94 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/iac/entrypoint.py +2 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/iac/run.py +4 -1
- conviso_ast-3.0.1/convisoappsec/flowcli/sast/dry_run.py +159 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/sast/entrypoint.py +2 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/sbom/generate.py +1 -1
- conviso_ast-3.0.1/convisoappsec/flowcli/sca/dry_run.py +108 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/sca/entrypoint.py +2 -0
- conviso_ast-3.0.1/convisoappsec/version.py +1 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/setup.py +3 -3
- conviso_ast-3.0.0.dev1/convisoappsec/flow/source_code_scanner/__init__.py +0 -9
- conviso_ast-3.0.0.dev1/convisoappsec/flow/source_code_scanner/exceptions.py +0 -2
- conviso_ast-3.0.0.dev1/convisoappsec/flow/source_code_scanner/scc.py +0 -68
- conviso_ast-3.0.0.dev1/convisoappsec/flow/source_code_scanner/source_code_scanner.py +0 -177
- conviso_ast-3.0.0.dev1/convisoappsec/flow/util/__init__.py +0 -7
- conviso_ast-3.0.0.dev1/convisoappsec/flow/util/metrics.py +0 -16
- conviso_ast-3.0.0.dev1/convisoappsec/version.py +0 -1
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/README.md +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/conviso_ast.egg-info/dependency_links.txt +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/conviso_ast.egg-info/entry_points.txt +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/conviso_ast.egg-info/top_level.txt +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/common/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/common/box.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/common/cleaner.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/common/docker.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/common/exceptions.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/common/git_data_parser.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/common/graphql/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/common/graphql/error_handlers.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/common/graphql/errors.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/common/graphql/low_client.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/common/strings.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/api.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/cleaner.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/client.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/models/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/models/issues/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/models/issues/container.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/models/issues/iac.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/models/issues/normalize.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/models/issues/sast.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/models/issues/sca.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/resources_api.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/schemas/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/schemas/mutations/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/beta/schemas/resolvers/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/v1/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/v1/client.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/v1/models/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/v1/models/asset.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/v1/models/issues.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/v1/models/project.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/v1/resources_api.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/v1/schemas/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/v1/schemas/mutations/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/graphql_api/v1/schemas/resolvers/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/util/ci_provider.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/util/source_code_compressor.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/version_control_system_adapter.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/version_searchers/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/version_searchers/sorted_by_versioning_style.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/version_searchers/timebased_version_seacher.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/version_searchers/version_searcher_result.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/versioning_style/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flow/versioning_style/semantic_versioning.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/__main__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/assets/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/assets/create.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/assets/entrypoint.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/assets/ls.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/ast/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/common.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/companies/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/companies/ls.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/container/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/container/entrypoint.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/container/run.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/context.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/context.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/entrypoint.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/with_/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/with_/entrypoint.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/context.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/entrypoint.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/with_/tag_tracker/sort_by/entrypoint.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/deploy/create/with_/values.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/entrypoint.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/environment_checker.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/findings/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/findings/create/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/findings/create/entrypoint.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/findings/create/with_/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/findings/create/with_/entrypoint.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/findings/create/with_/version_tracker.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/findings/entrypoint.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/findings/import_sarif/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/findings/import_sarif/entrypoint.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/help_option.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/iac/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/requirements_verifier.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/sast/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/sast/run.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/sbom/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/sbom/entrypoint.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/sca/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/sca/run.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/vulnerability/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/vulnerability/assert_security_rules.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/vulnerability/container_vulnerability_manager.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/vulnerability/entrypoint.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/vulnerability/rules_schema.json +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/flowcli/vulnerability/run.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/logger.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/sast/__init__.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/sast/decision.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/convisoappsec/sast/sastbox.py +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/scripts/shell_completer/flow_bash_completer.sh +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/scripts/shell_completer/flow_fish_completer.fish +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/scripts/shell_completer/flow_zsh_completer.sh +0 -0
- {conviso_ast-3.0.0.dev1 → conviso_ast-3.0.1}/setup.cfg +0 -0
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: conviso-ast
|
|
3
|
-
Version: 3.0.
|
|
3
|
+
Version: 3.0.1
|
|
4
4
|
Maintainer: Conviso
|
|
5
5
|
Maintainer-email: development@convisoappsec.com
|
|
6
6
|
Project-URL: Source, https://github.com/convisoappsec/convisocli/
|
|
7
7
|
Requires-Python: >=3.9
|
|
8
8
|
Description-Content-Type: text/markdown
|
|
9
|
-
Requires-Dist: GitPython==3.1.
|
|
9
|
+
Requires-Dist: GitPython==3.1.46
|
|
10
10
|
Requires-Dist: click==8.1.8
|
|
11
11
|
Requires-Dist: requests==2.32.5
|
|
12
|
-
Requires-Dist: urllib3==2.
|
|
12
|
+
Requires-Dist: urllib3==2.6.3
|
|
13
13
|
Requires-Dist: semantic-version==2.10.0
|
|
14
14
|
Requires-Dist: docker==7.1.0
|
|
15
15
|
Requires-Dist: PyYAML==6.0.3
|
|
16
16
|
Requires-Dist: click-log==0.4.0
|
|
17
17
|
Requires-Dist: transitions==0.9.2
|
|
18
18
|
Requires-Dist: jsonschema==4.25.1
|
|
19
|
-
Requires-Dist: giturlparse<=0.
|
|
19
|
+
Requires-Dist: giturlparse<=0.14.0
|
|
20
20
|
Requires-Dist: jmespath==1.0.1
|
|
21
21
|
Requires-Dist: setuptools==78.1.0
|
|
22
22
|
Dynamic: description
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: conviso-ast
|
|
3
|
-
Version: 3.0.
|
|
3
|
+
Version: 3.0.1
|
|
4
4
|
Maintainer: Conviso
|
|
5
5
|
Maintainer-email: development@convisoappsec.com
|
|
6
6
|
Project-URL: Source, https://github.com/convisoappsec/convisocli/
|
|
7
7
|
Requires-Python: >=3.9
|
|
8
8
|
Description-Content-Type: text/markdown
|
|
9
|
-
Requires-Dist: GitPython==3.1.
|
|
9
|
+
Requires-Dist: GitPython==3.1.46
|
|
10
10
|
Requires-Dist: click==8.1.8
|
|
11
11
|
Requires-Dist: requests==2.32.5
|
|
12
|
-
Requires-Dist: urllib3==2.
|
|
12
|
+
Requires-Dist: urllib3==2.6.3
|
|
13
13
|
Requires-Dist: semantic-version==2.10.0
|
|
14
14
|
Requires-Dist: docker==7.1.0
|
|
15
15
|
Requires-Dist: PyYAML==6.0.3
|
|
16
16
|
Requires-Dist: click-log==0.4.0
|
|
17
17
|
Requires-Dist: transitions==0.9.2
|
|
18
18
|
Requires-Dist: jsonschema==4.25.1
|
|
19
|
-
Requires-Dist: giturlparse<=0.
|
|
19
|
+
Requires-Dist: giturlparse<=0.14.0
|
|
20
20
|
Requires-Dist: jmespath==1.0.1
|
|
21
21
|
Requires-Dist: setuptools==78.1.0
|
|
22
22
|
Dynamic: description
|
|
@@ -49,13 +49,8 @@ convisoappsec/flow/graphql_api/v1/models/project.py
|
|
|
49
49
|
convisoappsec/flow/graphql_api/v1/schemas/__init__.py
|
|
50
50
|
convisoappsec/flow/graphql_api/v1/schemas/mutations/__init__.py
|
|
51
51
|
convisoappsec/flow/graphql_api/v1/schemas/resolvers/__init__.py
|
|
52
|
-
convisoappsec/flow/source_code_scanner/__init__.py
|
|
53
|
-
convisoappsec/flow/source_code_scanner/exceptions.py
|
|
54
|
-
convisoappsec/flow/source_code_scanner/scc.py
|
|
55
|
-
convisoappsec/flow/source_code_scanner/source_code_scanner.py
|
|
56
52
|
convisoappsec/flow/util/__init__.py
|
|
57
53
|
convisoappsec/flow/util/ci_provider.py
|
|
58
|
-
convisoappsec/flow/util/metrics.py
|
|
59
54
|
convisoappsec/flow/util/source_code_compressor.py
|
|
60
55
|
convisoappsec/flow/version_searchers/__init__.py
|
|
61
56
|
convisoappsec/flow/version_searchers/sorted_by_versioning_style.py
|
|
@@ -76,6 +71,7 @@ convisoappsec/flowcli/assets/create.py
|
|
|
76
71
|
convisoappsec/flowcli/assets/entrypoint.py
|
|
77
72
|
convisoappsec/flowcli/assets/ls.py
|
|
78
73
|
convisoappsec/flowcli/ast/__init__.py
|
|
74
|
+
convisoappsec/flowcli/ast/dry_run.py
|
|
79
75
|
convisoappsec/flowcli/ast/entrypoint.py
|
|
80
76
|
convisoappsec/flowcli/companies/__init__.py
|
|
81
77
|
convisoappsec/flowcli/companies/ls.py
|
|
@@ -106,15 +102,18 @@ convisoappsec/flowcli/findings/create/with_/version_tracker.py
|
|
|
106
102
|
convisoappsec/flowcli/findings/import_sarif/__init__.py
|
|
107
103
|
convisoappsec/flowcli/findings/import_sarif/entrypoint.py
|
|
108
104
|
convisoappsec/flowcli/iac/__init__.py
|
|
105
|
+
convisoappsec/flowcli/iac/dry_run.py
|
|
109
106
|
convisoappsec/flowcli/iac/entrypoint.py
|
|
110
107
|
convisoappsec/flowcli/iac/run.py
|
|
111
108
|
convisoappsec/flowcli/sast/__init__.py
|
|
109
|
+
convisoappsec/flowcli/sast/dry_run.py
|
|
112
110
|
convisoappsec/flowcli/sast/entrypoint.py
|
|
113
111
|
convisoappsec/flowcli/sast/run.py
|
|
114
112
|
convisoappsec/flowcli/sbom/__init__.py
|
|
115
113
|
convisoappsec/flowcli/sbom/entrypoint.py
|
|
116
114
|
convisoappsec/flowcli/sbom/generate.py
|
|
117
115
|
convisoappsec/flowcli/sca/__init__.py
|
|
116
|
+
convisoappsec/flowcli/sca/dry_run.py
|
|
118
117
|
convisoappsec/flowcli/sca/entrypoint.py
|
|
119
118
|
convisoappsec/flowcli/sca/run.py
|
|
120
119
|
convisoappsec/flowcli/vulnerability/__init__.py
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
GitPython==3.1.
|
|
1
|
+
GitPython==3.1.46
|
|
2
2
|
click==8.1.8
|
|
3
3
|
requests==2.32.5
|
|
4
|
-
urllib3==2.
|
|
4
|
+
urllib3==2.6.3
|
|
5
5
|
semantic-version==2.10.0
|
|
6
6
|
docker==7.1.0
|
|
7
7
|
PyYAML==6.0.3
|
|
8
8
|
click-log==0.4.0
|
|
9
9
|
transitions==0.9.2
|
|
10
10
|
jsonschema==4.25.1
|
|
11
|
-
giturlparse<=0.
|
|
11
|
+
giturlparse<=0.14.0
|
|
12
12
|
jmespath==1.0.1
|
|
13
13
|
setuptools==78.1.0
|
|
@@ -20,7 +20,7 @@ class RetryHandler:
|
|
|
20
20
|
while retries < self.max_retries:
|
|
21
21
|
try:
|
|
22
22
|
return func(*args, **kwargs)
|
|
23
|
-
except Exception:
|
|
23
|
+
except Exception as log_message:
|
|
24
24
|
retries += 1
|
|
25
25
|
time.sleep(delay)
|
|
26
26
|
delay *= self.backoff_factor
|
|
@@ -28,7 +28,7 @@ class RetryHandler:
|
|
|
28
28
|
if retries == self.max_retries:
|
|
29
29
|
full_trace = traceback.format_exc()
|
|
30
30
|
LOGGER.warning(
|
|
31
|
-
"⚠️ Maximum retries reached. Our technical team has been notified."
|
|
31
|
+
f"⚠️ Maximum retries reached. Our technical team has been notified. Error: {log_message}"
|
|
32
32
|
)
|
|
33
33
|
|
|
34
34
|
try:
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import click
|
|
2
|
+
import json
|
|
3
|
+
import traceback
|
|
4
|
+
import sys
|
|
5
|
+
from convisoappsec.flowcli import help_option
|
|
6
|
+
from convisoappsec.flowcli.context import pass_flow_context
|
|
7
|
+
from convisoappsec.logger import LOGGER
|
|
8
|
+
from convisoappsec.flowcli.common import on_http_error
|
|
9
|
+
from convisoappsec.common.cleaner import Cleaner
|
|
10
|
+
from convisoappsec.sast.sastbox import SASTBox
|
|
11
|
+
from convisoappsec.flowcli.sast.dry_run import execute_dry_run as execute_sast_dry_run
|
|
12
|
+
from convisoappsec.flowcli.sca.dry_run import execute_dry_run as execute_sca_dry_run
|
|
13
|
+
from convisoappsec.flowcli.iac.dry_run import execute_dry_run as execute_iac_dry_run
|
|
14
|
+
|
|
15
|
+
@click.command(name='dry-run')
|
|
16
|
+
@click.option(
|
|
17
|
+
"-s", "--start-commit", required=False,
|
|
18
|
+
help="If no value is set so the empty tree hash commit is used."
|
|
19
|
+
)
|
|
20
|
+
@click.option(
|
|
21
|
+
"-e", "--end-commit", required=False,
|
|
22
|
+
help="If no value is set so the HEAD commit from the current branch is used"
|
|
23
|
+
)
|
|
24
|
+
@click.option(
|
|
25
|
+
"-r", "--repository-dir", default=".", show_default=True,
|
|
26
|
+
type=click.Path(exists=True, resolve_path=True), required=False,
|
|
27
|
+
help="The source code repository directory."
|
|
28
|
+
)
|
|
29
|
+
@click.option(
|
|
30
|
+
"--sastbox-registry", default="", required=False, hidden=True,
|
|
31
|
+
envvar=("CONVISO_SASTBOX_REGISTRY", "FLOW_SASTBOX_REGISTRY"),
|
|
32
|
+
)
|
|
33
|
+
@click.option(
|
|
34
|
+
"--sastbox-repository-name", default="", required=False, hidden=True,
|
|
35
|
+
envvar=("CONVISO_SASTBOX_REPOSITORY_NAME", "FLOW_SASTBOX_REPOSITORY_NAME"),
|
|
36
|
+
)
|
|
37
|
+
@click.option(
|
|
38
|
+
"--sastbox-tag", default=SASTBox.DEFAULT_TAG, required=False, hidden=True,
|
|
39
|
+
envvar=("CONVISO_SASTBOX_TAG", "FLOW_SASTBOX_TAG"),
|
|
40
|
+
)
|
|
41
|
+
@click.option(
|
|
42
|
+
"--sastbox-skip-login/--sastbox-no-skip-login", default=False, required=False, hidden=True,
|
|
43
|
+
envvar=("CONVISO_SASTBOX_SKIP_LOGIN", "FLOW_SASTBOX_SKIP_LOGIN"),
|
|
44
|
+
)
|
|
45
|
+
@click.option(
|
|
46
|
+
"--custom-sca-tags", hidden=True, required=False, multiple=True, type=(str, str),
|
|
47
|
+
help="It should be passed as <repository_name> <image_tag>."
|
|
48
|
+
)
|
|
49
|
+
@click.option(
|
|
50
|
+
"--scanner-timeout", hidden=True, required=False, default=7200, type=int,
|
|
51
|
+
help="Set timeout for each scanner"
|
|
52
|
+
)
|
|
53
|
+
@click.option(
|
|
54
|
+
'--cleanup', default=False, is_flag=True, show_default=True,
|
|
55
|
+
help="Clean up system resources."
|
|
56
|
+
)
|
|
57
|
+
@help_option
|
|
58
|
+
@pass_flow_context
|
|
59
|
+
def dry_run(flow_context, end_commit, start_commit, repository_dir,
|
|
60
|
+
sastbox_registry, sastbox_repository_name, sastbox_tag, sastbox_skip_login,
|
|
61
|
+
custom_sca_tags, scanner_timeout, cleanup):
|
|
62
|
+
"""
|
|
63
|
+
Perform a dry-run AST analysis (SAST, SCA, IaC).
|
|
64
|
+
Checks API Key, runs the scans, and outputs the results in JSON format to stdout.
|
|
65
|
+
Does NOT create assets or deploys on Conviso Platform.
|
|
66
|
+
"""
|
|
67
|
+
try:
|
|
68
|
+
results = {}
|
|
69
|
+
|
|
70
|
+
# Run SAST
|
|
71
|
+
sast_results = execute_sast_dry_run(
|
|
72
|
+
flow_context, end_commit, start_commit, repository_dir,
|
|
73
|
+
sastbox_registry, sastbox_repository_name, sastbox_tag, sastbox_skip_login
|
|
74
|
+
)
|
|
75
|
+
results['sast'] = sast_results
|
|
76
|
+
|
|
77
|
+
# Run SCA
|
|
78
|
+
sca_results = execute_sca_dry_run(
|
|
79
|
+
flow_context, repository_dir, custom_sca_tags, scanner_timeout
|
|
80
|
+
)
|
|
81
|
+
results['sca'] = sca_results
|
|
82
|
+
|
|
83
|
+
# Run IaC
|
|
84
|
+
iac_results = execute_iac_dry_run(
|
|
85
|
+
flow_context, repository_dir, scanner_timeout
|
|
86
|
+
)
|
|
87
|
+
results['iac'] = iac_results
|
|
88
|
+
|
|
89
|
+
print(json.dumps(results, indent=2))
|
|
90
|
+
|
|
91
|
+
if cleanup:
|
|
92
|
+
LOGGER.info("🧹 Cleaning up ...")
|
|
93
|
+
cleaner = Cleaner()
|
|
94
|
+
cleaner.cleanup()
|
|
95
|
+
|
|
96
|
+
except Exception as e:
|
|
97
|
+
traceback.print_exc(file=sys.stderr)
|
|
98
|
+
on_http_error(e)
|
|
99
|
+
sys.exit(1)
|
|
@@ -15,7 +15,7 @@ from convisoappsec.flow import GitAdapter
|
|
|
15
15
|
from convisoappsec.flowcli.context import pass_flow_context
|
|
16
16
|
from convisoappsec.logger import LOGGER, log_and_notify_ast_event
|
|
17
17
|
from convisoappsec.common.cleaner import Cleaner
|
|
18
|
-
|
|
18
|
+
from .dry_run import dry_run
|
|
19
19
|
|
|
20
20
|
def get_default_params_values(cmd_params):
|
|
21
21
|
""" Further information in https://click.palletsprojects.com/en/8.1.x/api/?highlight=params#click.Command.params
|
|
@@ -425,3 +425,4 @@ def ast():
|
|
|
425
425
|
|
|
426
426
|
|
|
427
427
|
ast.add_command(run)
|
|
428
|
+
ast.add_command(dry_run)
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import click
|
|
2
2
|
# TODO: refactoring. all deploy create share some behavior
|
|
3
|
-
from convisoappsec.flow.util import project_metrics
|
|
4
3
|
from convisoappsec.flow.version_searchers import TimeBasedVersionSearcher
|
|
5
4
|
from convisoappsec.flow.version_control_system_adapter import GitAdapter
|
|
6
5
|
from convisoappsec.flowcli.context import pass_flow_context
|
|
@@ -72,7 +71,6 @@ def time_(flow_context, create_context, tag_tracker_context, attach_diff):
|
|
|
72
71
|
previous_version=previous_version,
|
|
73
72
|
diff_content=diff_content,
|
|
74
73
|
metrics=deploy_metrics,
|
|
75
|
-
project_metrics=project_metrics(repository_dir),
|
|
76
74
|
commit_authors=authors_data
|
|
77
75
|
)
|
|
78
76
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import click
|
|
2
2
|
# TODO: refactoring. all deploy create share some behavior
|
|
3
|
-
from convisoappsec.flow.util import project_metrics
|
|
4
3
|
from convisoappsec.flowcli.context import pass_flow_context
|
|
5
4
|
from convisoappsec.flow.version_searchers import SortedByVersioningStyle
|
|
6
5
|
from convisoappsec.flow.version_control_system_adapter import GitAdapter
|
|
@@ -103,7 +102,6 @@ def versioning_style(
|
|
|
103
102
|
previous_version=previous_version,
|
|
104
103
|
diff_content=diff_content,
|
|
105
104
|
metrics=deploy_metrics,
|
|
106
|
-
project_metrics=project_metrics(repository_dir),
|
|
107
105
|
commit_authors=authors_data
|
|
108
106
|
)
|
|
109
107
|
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import click
|
|
2
|
+
import click_log
|
|
3
|
+
import json
|
|
4
|
+
import traceback
|
|
5
|
+
import sys
|
|
6
|
+
from convisoappsec.common.box import ContainerWrapper
|
|
7
|
+
from convisoappsec.flowcli import help_option
|
|
8
|
+
from convisoappsec.flowcli.context import pass_flow_context
|
|
9
|
+
from convisoappsec.logger import LOGGER
|
|
10
|
+
from convisoappsec.flowcli.common import on_http_error
|
|
11
|
+
from convisoappsec.common.cleaner import Cleaner
|
|
12
|
+
|
|
13
|
+
def execute_dry_run(flow_context, repository_dir, scanner_timeout):
|
|
14
|
+
REQUIRED_CODEBASE_PATH = '/code'
|
|
15
|
+
IAC_IMAGE_NAME = 'iac_scanner_checkov'
|
|
16
|
+
IAC_SCAN_FILENAME = '/{}.json'.format(IAC_IMAGE_NAME)
|
|
17
|
+
containers_map = {
|
|
18
|
+
IAC_IMAGE_NAME: {
|
|
19
|
+
'repository_dir': repository_dir,
|
|
20
|
+
'repository_name': IAC_IMAGE_NAME,
|
|
21
|
+
'tag': 'unstable',
|
|
22
|
+
'command': [
|
|
23
|
+
'-c', REQUIRED_CODEBASE_PATH,
|
|
24
|
+
'-o', IAC_SCAN_FILENAME,
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
conviso_rest_api = flow_context.create_conviso_rest_api_client()
|
|
30
|
+
token = conviso_rest_api.docker_registry.get_sast_token()
|
|
31
|
+
|
|
32
|
+
LOGGER.info('💬 Preparing Environment...')
|
|
33
|
+
scanners_wrapper = ContainerWrapper(
|
|
34
|
+
token=token,
|
|
35
|
+
containers_map=containers_map,
|
|
36
|
+
logger=LOGGER,
|
|
37
|
+
timeout=scanner_timeout
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
LOGGER.info('💬 Starting IaC...')
|
|
41
|
+
scanners_wrapper.run()
|
|
42
|
+
|
|
43
|
+
results_list = []
|
|
44
|
+
for r in scanners_wrapper.scanners:
|
|
45
|
+
report_filepath = r.results
|
|
46
|
+
if report_filepath:
|
|
47
|
+
try:
|
|
48
|
+
with open(report_filepath, 'r') as f:
|
|
49
|
+
results_list.append(json.load(f))
|
|
50
|
+
except Exception as e:
|
|
51
|
+
click.echo(f"Error reading result file {report_filepath}: {e}", file=sys.stderr)
|
|
52
|
+
|
|
53
|
+
if len(results_list) == 1:
|
|
54
|
+
return results_list[0]
|
|
55
|
+
return results_list
|
|
56
|
+
|
|
57
|
+
@click.command(name='dry-run')
|
|
58
|
+
@click.option(
|
|
59
|
+
'-r', '--repository-dir', default=".", show_default=True,
|
|
60
|
+
type=click.Path(exists=True, resolve_path=True), required=False,
|
|
61
|
+
help="The source code repository directory."
|
|
62
|
+
)
|
|
63
|
+
@click.option(
|
|
64
|
+
"--scanner-timeout", hidden=True, required=False, default=7200, type=int,
|
|
65
|
+
help="Set timeout for each scanner"
|
|
66
|
+
)
|
|
67
|
+
@click.option(
|
|
68
|
+
'--cleanup', default=False, is_flag=True, show_default=True,
|
|
69
|
+
help="Clean up system resources."
|
|
70
|
+
)
|
|
71
|
+
@help_option
|
|
72
|
+
@pass_flow_context
|
|
73
|
+
def dry_run(flow_context, repository_dir, scanner_timeout, cleanup):
|
|
74
|
+
"""
|
|
75
|
+
Perform a dry-run IAC analysis.
|
|
76
|
+
Checks API Key, runs the scan, and outputs the results in JSON format to stdout.
|
|
77
|
+
Does NOT create assets or deploys on Conviso Platform.
|
|
78
|
+
"""
|
|
79
|
+
try:
|
|
80
|
+
results = execute_dry_run(flow_context, repository_dir, scanner_timeout)
|
|
81
|
+
|
|
82
|
+
if results:
|
|
83
|
+
print(json.dumps(results, indent=2))
|
|
84
|
+
else:
|
|
85
|
+
print(json.dumps({}, indent=2))
|
|
86
|
+
|
|
87
|
+
if cleanup:
|
|
88
|
+
LOGGER.info("🧹 Cleaning up ...")
|
|
89
|
+
cleaner = Cleaner()
|
|
90
|
+
cleaner.cleanup()
|
|
91
|
+
|
|
92
|
+
except Exception as e:
|
|
93
|
+
on_http_error(e)
|
|
94
|
+
sys.exit(1)
|
|
@@ -2,6 +2,7 @@ import click
|
|
|
2
2
|
|
|
3
3
|
from convisoappsec.flowcli import help_option
|
|
4
4
|
from .run import run
|
|
5
|
+
from .dry_run import dry_run
|
|
5
6
|
|
|
6
7
|
|
|
7
8
|
@click.group()
|
|
@@ -11,6 +12,7 @@ def iac():
|
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
iac.add_command(run)
|
|
15
|
+
iac.add_command(dry_run)
|
|
14
16
|
|
|
15
17
|
iac.epilog = '''
|
|
16
18
|
Run flow iac COMMAND --help for more information on a command.
|
|
@@ -142,6 +142,7 @@ def run(context, flow_context, asset_id, company_id, repository_dir, send_to_flo
|
|
|
142
142
|
def deploy_results_to_conviso(
|
|
143
143
|
conviso_api, results_filepaths, asset_id, company_id, flow_context, deploy_id, commit_ref=None, control_sync_status_id=None
|
|
144
144
|
):
|
|
145
|
+
|
|
145
146
|
results_context = click.progressbar(results_filepaths, label="Sending results to the Conviso Platform...")
|
|
146
147
|
|
|
147
148
|
with results_context as reports:
|
|
@@ -150,7 +151,7 @@ def deploy_results_to_conviso(
|
|
|
150
151
|
with open(report_path) as report_file:
|
|
151
152
|
data = parse_data(json.load(report_file))
|
|
152
153
|
except Exception:
|
|
153
|
-
LOGGER.
|
|
154
|
+
LOGGER.warning(f"⚠️ Error processing report file. Our technical team has been notified.")
|
|
154
155
|
full_trace = traceback.format_exc()
|
|
155
156
|
log_and_notify_ast_event(
|
|
156
157
|
flow_context=flow_context, company_id=company_id, asset_id=asset_id,
|
|
@@ -181,6 +182,8 @@ def deploy_results_to_conviso(
|
|
|
181
182
|
except ResponseError as error:
|
|
182
183
|
if error.code == 'RECORD_NOT_UNIQUE':
|
|
183
184
|
continue
|
|
185
|
+
elif error.code == "Record not found" or "Record not found" in str(error):
|
|
186
|
+
continue
|
|
184
187
|
else:
|
|
185
188
|
retry_handler = RetryHandler(
|
|
186
189
|
flow_context=flow_context, company_id=company_id, asset_id=asset_id
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import click
|
|
3
|
+
import traceback
|
|
4
|
+
import json
|
|
5
|
+
from convisoappsec.sast.sastbox import SASTBox
|
|
6
|
+
from docker.errors import APIError
|
|
7
|
+
import time
|
|
8
|
+
from convisoappsec.flow import GitAdapter
|
|
9
|
+
from convisoappsec.flowcli import help_option
|
|
10
|
+
from convisoappsec.flowcli.context import pass_flow_context
|
|
11
|
+
from convisoappsec.logger import LOGGER
|
|
12
|
+
from convisoappsec.common.cleaner import Cleaner
|
|
13
|
+
from convisoappsec.flowcli.common import on_http_error
|
|
14
|
+
|
|
15
|
+
class DryRunSASTBox(SASTBox):
|
|
16
|
+
def recovery_technologies_file(self):
|
|
17
|
+
# Skip technology recovery and update for dry-run
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
def perform_dry_run_sastbox_scan(
|
|
21
|
+
conviso_rest_api, sastbox_registry, sastbox_repository_name, sastbox_tag, sastbox_skip_login, repository_dir, end_commit, start_commit, logger
|
|
22
|
+
):
|
|
23
|
+
max_retries = 5
|
|
24
|
+
retries = 0
|
|
25
|
+
sastbox = DryRunSASTBox(registry=sastbox_registry, repository_name=sastbox_repository_name, tag=sastbox_tag)
|
|
26
|
+
pull_progress_bar = click.progressbar(length=sastbox.size, label="Performing SAST download...")
|
|
27
|
+
|
|
28
|
+
while retries < max_retries:
|
|
29
|
+
try:
|
|
30
|
+
if not sastbox_skip_login:
|
|
31
|
+
logger("Checking SASTBox authorization...")
|
|
32
|
+
token = conviso_rest_api.docker_registry.get_sast_token()
|
|
33
|
+
sastbox.login(token)
|
|
34
|
+
|
|
35
|
+
with pull_progress_bar as progressbar:
|
|
36
|
+
for downloaded_chunk in sastbox.pull():
|
|
37
|
+
progressbar.update(downloaded_chunk)
|
|
38
|
+
break
|
|
39
|
+
except APIError as e:
|
|
40
|
+
retries += 1
|
|
41
|
+
logger(f"Retrying {retries}/{max_retries}...")
|
|
42
|
+
time.sleep(1)
|
|
43
|
+
|
|
44
|
+
if retries == max_retries:
|
|
45
|
+
logger("Max retries reached. Failed to perform SAST download.")
|
|
46
|
+
raise Exception(f"Max retries reached. Could not complete the SAST download. Error: {str(e)}")
|
|
47
|
+
|
|
48
|
+
logger("Starting SAST scan diff...")
|
|
49
|
+
|
|
50
|
+
reports = sastbox.run_scan_diff(repository_dir, end_commit, start_commit, log=logger)
|
|
51
|
+
|
|
52
|
+
logger("SAST scan diff done.")
|
|
53
|
+
|
|
54
|
+
results_filepaths = []
|
|
55
|
+
for r in reports:
|
|
56
|
+
try:
|
|
57
|
+
file_path = str(r)
|
|
58
|
+
results_filepaths.append(file_path)
|
|
59
|
+
except Exception as e:
|
|
60
|
+
click.echo(f"Error decoding file path: {r} with error {e}.", file=sys.stderr)
|
|
61
|
+
|
|
62
|
+
return results_filepaths
|
|
63
|
+
|
|
64
|
+
def log_func(msg, new_line=True):
|
|
65
|
+
click.echo(msg, nl=new_line, err=True)
|
|
66
|
+
|
|
67
|
+
def execute_dry_run(flow_context, end_commit, start_commit, repository_dir,
|
|
68
|
+
sastbox_registry, sastbox_repository_name, sastbox_tag, sastbox_skip_login):
|
|
69
|
+
git_adapter = GitAdapter(repository_dir)
|
|
70
|
+
end_commit = end_commit or git_adapter.head_commit
|
|
71
|
+
start_commit = start_commit or git_adapter.empty_repository_tree_commit
|
|
72
|
+
|
|
73
|
+
if start_commit == end_commit:
|
|
74
|
+
return {}
|
|
75
|
+
|
|
76
|
+
conviso_rest_api = flow_context.create_conviso_rest_api_client()
|
|
77
|
+
|
|
78
|
+
results_filepaths = perform_dry_run_sastbox_scan(
|
|
79
|
+
conviso_rest_api, sastbox_registry, sastbox_repository_name, sastbox_tag,
|
|
80
|
+
sastbox_skip_login, repository_dir, end_commit, start_commit, log_func
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
results_list = []
|
|
84
|
+
for path in results_filepaths:
|
|
85
|
+
try:
|
|
86
|
+
with open(path, 'r') as f:
|
|
87
|
+
results_list.append(json.load(f))
|
|
88
|
+
except Exception as e:
|
|
89
|
+
click.echo(f"Error reading result file {path}: {e}", file=sys.stderr)
|
|
90
|
+
|
|
91
|
+
if len(results_list) == 1:
|
|
92
|
+
return results_list[0]
|
|
93
|
+
return results_list
|
|
94
|
+
|
|
95
|
+
@click.command(name='dry-run')
|
|
96
|
+
@click.option(
|
|
97
|
+
"-s", "--start-commit", required=False,
|
|
98
|
+
help="If no value is set so the empty tree hash commit is used."
|
|
99
|
+
)
|
|
100
|
+
@click.option(
|
|
101
|
+
"-e", "--end-commit", required=False,
|
|
102
|
+
help="If no value is set so the HEAD commit from the current branch is used"
|
|
103
|
+
)
|
|
104
|
+
@click.option(
|
|
105
|
+
"-r", "--repository-dir", default=".", show_default=True,
|
|
106
|
+
type=click.Path(exists=True, resolve_path=True), required=False,
|
|
107
|
+
help="The source code repository directory."
|
|
108
|
+
)
|
|
109
|
+
@click.option(
|
|
110
|
+
"--sastbox-registry", default="", required=False, hidden=True,
|
|
111
|
+
envvar=("CONVISO_SASTBOX_REGISTRY", "FLOW_SASTBOX_REGISTRY"),
|
|
112
|
+
)
|
|
113
|
+
@click.option(
|
|
114
|
+
"--sastbox-repository-name", default="", required=False, hidden=True,
|
|
115
|
+
envvar=("CONVISO_SASTBOX_REPOSITORY_NAME", "FLOW_SASTBOX_REPOSITORY_NAME"),
|
|
116
|
+
)
|
|
117
|
+
@click.option(
|
|
118
|
+
"--sastbox-tag", default=SASTBox.DEFAULT_TAG, required=False, hidden=True,
|
|
119
|
+
envvar=("CONVISO_SASTBOX_TAG", "FLOW_SASTBOX_TAG"),
|
|
120
|
+
)
|
|
121
|
+
@click.option(
|
|
122
|
+
"--sastbox-skip-login/--sastbox-no-skip-login", default=False, required=False, hidden=True,
|
|
123
|
+
envvar=("CONVISO_SASTBOX_SKIP_LOGIN", "FLOW_SASTBOX_SKIP_LOGIN"),
|
|
124
|
+
)
|
|
125
|
+
@click.option(
|
|
126
|
+
'--cleanup', default=False, is_flag=True, show_default=True,
|
|
127
|
+
help="Clean up system resources."
|
|
128
|
+
)
|
|
129
|
+
@click.option(
|
|
130
|
+
"-o", "--output", required=False, help="Output the results to a JSON file."
|
|
131
|
+
)
|
|
132
|
+
@help_option
|
|
133
|
+
@pass_flow_context
|
|
134
|
+
def dry_run(flow_context, end_commit, start_commit, repository_dir,
|
|
135
|
+
sastbox_registry, sastbox_repository_name, sastbox_tag, sastbox_skip_login, cleanup, output):
|
|
136
|
+
try:
|
|
137
|
+
results = execute_dry_run(
|
|
138
|
+
flow_context, end_commit, start_commit, repository_dir,
|
|
139
|
+
sastbox_registry, sastbox_repository_name, sastbox_tag, sastbox_skip_login
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
if output:
|
|
143
|
+
with open(output, "w") as f:
|
|
144
|
+
json.dump(results if results else {}, f, indent=2)
|
|
145
|
+
LOGGER.info(f"Results saved to {output}")
|
|
146
|
+
elif results:
|
|
147
|
+
print(json.dumps(results, indent=2))
|
|
148
|
+
else:
|
|
149
|
+
print(json.dumps({}, indent=2))
|
|
150
|
+
|
|
151
|
+
if cleanup:
|
|
152
|
+
LOGGER.info("🧹 Cleaning up ...")
|
|
153
|
+
cleaner = Cleaner()
|
|
154
|
+
cleaner.cleanup()
|
|
155
|
+
|
|
156
|
+
except Exception as e:
|
|
157
|
+
traceback.print_exc(file=sys.stderr)
|
|
158
|
+
on_http_error(e)
|
|
159
|
+
sys.exit(1)
|
|
@@ -2,6 +2,7 @@ import click
|
|
|
2
2
|
|
|
3
3
|
from convisoappsec.flowcli import help_option
|
|
4
4
|
from .run import run
|
|
5
|
+
from .dry_run import dry_run
|
|
5
6
|
|
|
6
7
|
|
|
7
8
|
@click.group()
|
|
@@ -11,6 +12,7 @@ def sast():
|
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
sast.add_command(run)
|
|
15
|
+
sast.add_command(dry_run)
|
|
14
16
|
|
|
15
17
|
sast.epilog = '''
|
|
16
18
|
Run flow sast COMMAND --help for more information on a command.
|
|
@@ -182,7 +182,7 @@ def generate(context, flow_context, asset_id, company_id, repository_dir, send_t
|
|
|
182
182
|
stderr=subprocess.DEVNULL
|
|
183
183
|
)
|
|
184
184
|
command = [f"./conviso/syft scan {repository_dir} -o cyclonedx-json={file_name} "
|
|
185
|
-
f"--select-catalogers '{','.join(catalogers)}'"]
|
|
185
|
+
f"--select-catalogers '{','.join(catalogers)}' --exclude ./conviso"]
|
|
186
186
|
|
|
187
187
|
subprocess.run(command, shell=True, check=True, capture_output=True)
|
|
188
188
|
|