regscale-cli 6.21.2.0__py3-none-any.whl → 6.28.2.1__py3-none-any.whl
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.
- regscale/_version.py +1 -1
- regscale/airflow/hierarchy.py +2 -2
- regscale/core/app/api.py +5 -2
- regscale/core/app/application.py +36 -6
- regscale/core/app/internal/control_editor.py +73 -21
- regscale/core/app/internal/evidence.py +727 -204
- regscale/core/app/internal/login.py +4 -2
- regscale/core/app/internal/model_editor.py +219 -64
- regscale/core/app/utils/app_utils.py +86 -12
- regscale/core/app/utils/catalog_utils/common.py +1 -1
- regscale/core/login.py +21 -4
- regscale/core/utils/async_graphql_client.py +363 -0
- regscale/core/utils/date.py +77 -1
- regscale/dev/cli.py +26 -0
- regscale/dev/code_gen.py +109 -24
- regscale/dev/version.py +72 -0
- regscale/integrations/commercial/__init__.py +30 -2
- regscale/integrations/commercial/aws/audit_manager_compliance.py +3908 -0
- regscale/integrations/commercial/aws/cli.py +3107 -54
- regscale/integrations/commercial/aws/cloudtrail_control_mappings.py +333 -0
- regscale/integrations/commercial/aws/cloudtrail_evidence.py +501 -0
- regscale/integrations/commercial/aws/cloudwatch_control_mappings.py +357 -0
- regscale/integrations/commercial/aws/cloudwatch_evidence.py +490 -0
- regscale/integrations/commercial/{amazon → aws}/common.py +71 -19
- regscale/integrations/commercial/aws/config_compliance.py +914 -0
- regscale/integrations/commercial/aws/conformance_pack_mappings.py +198 -0
- regscale/integrations/commercial/aws/control_compliance_analyzer.py +439 -0
- regscale/integrations/commercial/aws/evidence_generator.py +283 -0
- regscale/integrations/commercial/aws/guardduty_control_mappings.py +340 -0
- regscale/integrations/commercial/aws/guardduty_evidence.py +1053 -0
- regscale/integrations/commercial/aws/iam_control_mappings.py +368 -0
- regscale/integrations/commercial/aws/iam_evidence.py +574 -0
- regscale/integrations/commercial/aws/inventory/__init__.py +338 -22
- regscale/integrations/commercial/aws/inventory/base.py +107 -5
- regscale/integrations/commercial/aws/inventory/resources/analytics.py +390 -0
- regscale/integrations/commercial/aws/inventory/resources/applications.py +234 -0
- regscale/integrations/commercial/aws/inventory/resources/audit_manager.py +513 -0
- regscale/integrations/commercial/aws/inventory/resources/cloudtrail.py +315 -0
- regscale/integrations/commercial/aws/inventory/resources/cloudtrail_logs_metadata.py +476 -0
- regscale/integrations/commercial/aws/inventory/resources/cloudwatch.py +191 -0
- regscale/integrations/commercial/aws/inventory/resources/compute.py +328 -9
- regscale/integrations/commercial/aws/inventory/resources/config.py +464 -0
- regscale/integrations/commercial/aws/inventory/resources/containers.py +74 -9
- regscale/integrations/commercial/aws/inventory/resources/database.py +481 -31
- regscale/integrations/commercial/aws/inventory/resources/developer_tools.py +253 -0
- regscale/integrations/commercial/aws/inventory/resources/guardduty.py +286 -0
- regscale/integrations/commercial/aws/inventory/resources/iam.py +470 -0
- regscale/integrations/commercial/aws/inventory/resources/inspector.py +476 -0
- regscale/integrations/commercial/aws/inventory/resources/integration.py +175 -61
- regscale/integrations/commercial/aws/inventory/resources/kms.py +447 -0
- regscale/integrations/commercial/aws/inventory/resources/machine_learning.py +358 -0
- regscale/integrations/commercial/aws/inventory/resources/networking.py +390 -67
- regscale/integrations/commercial/aws/inventory/resources/s3.py +394 -0
- regscale/integrations/commercial/aws/inventory/resources/security.py +268 -72
- regscale/integrations/commercial/aws/inventory/resources/securityhub.py +473 -0
- regscale/integrations/commercial/aws/inventory/resources/storage.py +288 -29
- regscale/integrations/commercial/aws/inventory/resources/systems_manager.py +657 -0
- regscale/integrations/commercial/aws/inventory/resources/vpc.py +655 -0
- regscale/integrations/commercial/aws/kms_control_mappings.py +288 -0
- regscale/integrations/commercial/aws/kms_evidence.py +879 -0
- regscale/integrations/commercial/aws/ocsf/__init__.py +7 -0
- regscale/integrations/commercial/aws/ocsf/constants.py +115 -0
- regscale/integrations/commercial/aws/ocsf/mapper.py +435 -0
- regscale/integrations/commercial/aws/org_control_mappings.py +286 -0
- regscale/integrations/commercial/aws/org_evidence.py +666 -0
- regscale/integrations/commercial/aws/s3_control_mappings.py +356 -0
- regscale/integrations/commercial/aws/s3_evidence.py +632 -0
- regscale/integrations/commercial/aws/scanner.py +1072 -205
- regscale/integrations/commercial/aws/security_hub.py +319 -0
- regscale/integrations/commercial/aws/session_manager.py +282 -0
- regscale/integrations/commercial/aws/ssm_control_mappings.py +291 -0
- regscale/integrations/commercial/aws/ssm_evidence.py +492 -0
- regscale/integrations/commercial/jira.py +489 -153
- regscale/integrations/commercial/microsoft_defender/defender.py +326 -5
- regscale/integrations/commercial/microsoft_defender/defender_api.py +348 -14
- regscale/integrations/commercial/microsoft_defender/defender_constants.py +157 -0
- regscale/integrations/commercial/qualys/__init__.py +167 -68
- regscale/integrations/commercial/qualys/scanner.py +305 -39
- regscale/integrations/commercial/sarif/sairf_importer.py +432 -0
- regscale/integrations/commercial/sarif/sarif_converter.py +67 -0
- regscale/integrations/commercial/sicura/api.py +79 -42
- regscale/integrations/commercial/sicura/commands.py +8 -2
- regscale/integrations/commercial/sicura/scanner.py +83 -44
- regscale/integrations/commercial/stigv2/ckl_parser.py +5 -5
- regscale/integrations/commercial/synqly/assets.py +133 -16
- regscale/integrations/commercial/synqly/edr.py +2 -8
- regscale/integrations/commercial/synqly/query_builder.py +536 -0
- regscale/integrations/commercial/synqly/ticketing.py +27 -0
- regscale/integrations/commercial/synqly/vulnerabilities.py +165 -28
- regscale/integrations/commercial/tenablev2/cis_parsers.py +453 -0
- regscale/integrations/commercial/tenablev2/cis_scanner.py +447 -0
- regscale/integrations/commercial/tenablev2/commands.py +146 -5
- regscale/integrations/commercial/tenablev2/scanner.py +1 -3
- regscale/integrations/commercial/tenablev2/stig_parsers.py +113 -57
- regscale/integrations/commercial/wizv2/WizDataMixin.py +1 -1
- regscale/integrations/commercial/wizv2/click.py +191 -76
- regscale/integrations/commercial/wizv2/compliance/__init__.py +15 -0
- regscale/integrations/commercial/wizv2/{policy_compliance_helpers.py → compliance/helpers.py} +78 -60
- regscale/integrations/commercial/wizv2/compliance_report.py +1592 -0
- regscale/integrations/commercial/wizv2/core/__init__.py +133 -0
- regscale/integrations/commercial/wizv2/{async_client.py → core/client.py} +7 -3
- regscale/integrations/commercial/wizv2/{constants.py → core/constants.py} +92 -89
- regscale/integrations/commercial/wizv2/core/file_operations.py +237 -0
- regscale/integrations/commercial/wizv2/fetchers/__init__.py +11 -0
- regscale/integrations/commercial/wizv2/{data_fetcher.py → fetchers/policy_assessment.py} +66 -9
- regscale/integrations/commercial/wizv2/file_cleanup.py +104 -0
- regscale/integrations/commercial/wizv2/issue.py +776 -28
- regscale/integrations/commercial/wizv2/models/__init__.py +0 -0
- regscale/integrations/commercial/wizv2/parsers/__init__.py +34 -0
- regscale/integrations/commercial/wizv2/{parsers.py → parsers/main.py} +1 -1
- regscale/integrations/commercial/wizv2/processors/__init__.py +11 -0
- regscale/integrations/commercial/wizv2/{finding_processor.py → processors/finding.py} +1 -1
- regscale/integrations/commercial/wizv2/reports.py +243 -0
- regscale/integrations/commercial/wizv2/sbom.py +1 -1
- regscale/integrations/commercial/wizv2/scanner.py +1031 -441
- regscale/integrations/commercial/wizv2/utils/__init__.py +48 -0
- regscale/integrations/commercial/wizv2/{utils.py → utils/main.py} +116 -61
- regscale/integrations/commercial/wizv2/variables.py +89 -3
- regscale/integrations/compliance_integration.py +1036 -151
- regscale/integrations/control_matcher.py +432 -0
- regscale/integrations/due_date_handler.py +333 -0
- regscale/integrations/milestone_manager.py +291 -0
- regscale/integrations/public/__init__.py +14 -0
- regscale/integrations/public/cci_importer.py +834 -0
- regscale/integrations/public/csam/__init__.py +0 -0
- regscale/integrations/public/csam/csam.py +938 -0
- regscale/integrations/public/csam/csam_agency_defined.py +179 -0
- regscale/integrations/public/csam/csam_common.py +154 -0
- regscale/integrations/public/csam/csam_controls.py +432 -0
- regscale/integrations/public/csam/csam_poam.py +124 -0
- regscale/integrations/public/fedramp/click.py +77 -6
- regscale/integrations/public/fedramp/docx_parser.py +10 -1
- regscale/integrations/public/fedramp/fedramp_cis_crm.py +675 -289
- regscale/integrations/public/fedramp/fedramp_five.py +1 -1
- regscale/integrations/public/fedramp/poam/scanner.py +75 -7
- regscale/integrations/public/fedramp/poam_export_v5.py +888 -0
- regscale/integrations/scanner_integration.py +1961 -430
- regscale/models/integration_models/CCI_List.xml +1 -0
- regscale/models/integration_models/aqua.py +2 -2
- regscale/models/integration_models/cisa_kev_data.json +805 -11
- regscale/models/integration_models/flat_file_importer/__init__.py +5 -8
- regscale/models/integration_models/nexpose.py +36 -10
- regscale/models/integration_models/qualys.py +3 -4
- regscale/models/integration_models/synqly_models/capabilities.json +1 -1
- regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py +87 -18
- regscale/models/integration_models/synqly_models/filter_parser.py +332 -0
- regscale/models/integration_models/synqly_models/ocsf_mapper.py +124 -25
- regscale/models/integration_models/synqly_models/synqly_model.py +89 -16
- regscale/models/locking.py +12 -8
- regscale/models/platform.py +4 -2
- regscale/models/regscale_models/__init__.py +7 -0
- regscale/models/regscale_models/assessment.py +2 -1
- regscale/models/regscale_models/catalog.py +1 -1
- regscale/models/regscale_models/compliance_settings.py +251 -1
- regscale/models/regscale_models/component.py +1 -0
- regscale/models/regscale_models/control_implementation.py +236 -41
- regscale/models/regscale_models/control_objective.py +74 -5
- regscale/models/regscale_models/file.py +2 -0
- regscale/models/regscale_models/form_field_value.py +5 -3
- regscale/models/regscale_models/inheritance.py +44 -0
- regscale/models/regscale_models/issue.py +301 -102
- regscale/models/regscale_models/milestone.py +33 -14
- regscale/models/regscale_models/organization.py +3 -0
- regscale/models/regscale_models/regscale_model.py +310 -73
- regscale/models/regscale_models/security_plan.py +4 -2
- regscale/models/regscale_models/vulnerability.py +3 -3
- regscale/regscale.py +25 -4
- regscale/templates/__init__.py +0 -0
- regscale/utils/threading/threadhandler.py +20 -15
- regscale/validation/record.py +23 -1
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/METADATA +17 -33
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/RECORD +310 -111
- tests/core/__init__.py +0 -0
- tests/core/utils/__init__.py +0 -0
- tests/core/utils/test_async_graphql_client.py +472 -0
- tests/fixtures/test_fixture.py +13 -8
- tests/regscale/core/test_login.py +171 -4
- tests/regscale/integrations/commercial/__init__.py +0 -0
- tests/regscale/integrations/commercial/aws/__init__.py +0 -0
- tests/regscale/integrations/commercial/aws/test_audit_manager_compliance.py +1304 -0
- tests/regscale/integrations/commercial/aws/test_audit_manager_evidence_aggregation.py +341 -0
- tests/regscale/integrations/commercial/aws/test_aws_analytics_collector.py +260 -0
- tests/regscale/integrations/commercial/aws/test_aws_applications_collector.py +242 -0
- tests/regscale/integrations/commercial/aws/test_aws_audit_manager_collector.py +1155 -0
- tests/regscale/integrations/commercial/aws/test_aws_cloudtrail_collector.py +534 -0
- tests/regscale/integrations/commercial/aws/test_aws_config_collector.py +400 -0
- tests/regscale/integrations/commercial/aws/test_aws_developer_tools_collector.py +203 -0
- tests/regscale/integrations/commercial/aws/test_aws_guardduty_collector.py +315 -0
- tests/regscale/integrations/commercial/aws/test_aws_iam_collector.py +458 -0
- tests/regscale/integrations/commercial/aws/test_aws_inspector_collector.py +353 -0
- tests/regscale/integrations/commercial/aws/test_aws_inventory_integration.py +530 -0
- tests/regscale/integrations/commercial/aws/test_aws_kms_collector.py +919 -0
- tests/regscale/integrations/commercial/aws/test_aws_machine_learning_collector.py +237 -0
- tests/regscale/integrations/commercial/aws/test_aws_s3_collector.py +722 -0
- tests/regscale/integrations/commercial/aws/test_aws_scanner_integration.py +722 -0
- tests/regscale/integrations/commercial/aws/test_aws_securityhub_collector.py +792 -0
- tests/regscale/integrations/commercial/aws/test_aws_systems_manager_collector.py +918 -0
- tests/regscale/integrations/commercial/aws/test_aws_vpc_collector.py +996 -0
- tests/regscale/integrations/commercial/aws/test_cli_evidence.py +431 -0
- tests/regscale/integrations/commercial/aws/test_cloudtrail_control_mappings.py +452 -0
- tests/regscale/integrations/commercial/aws/test_cloudtrail_evidence.py +788 -0
- tests/regscale/integrations/commercial/aws/test_config_compliance.py +298 -0
- tests/regscale/integrations/commercial/aws/test_conformance_pack_mappings.py +200 -0
- tests/regscale/integrations/commercial/aws/test_control_compliance_analyzer.py +375 -0
- tests/regscale/integrations/commercial/aws/test_datetime_parsing.py +223 -0
- tests/regscale/integrations/commercial/aws/test_evidence_generator.py +386 -0
- tests/regscale/integrations/commercial/aws/test_guardduty_control_mappings.py +564 -0
- tests/regscale/integrations/commercial/aws/test_guardduty_evidence.py +1041 -0
- tests/regscale/integrations/commercial/aws/test_iam_control_mappings.py +718 -0
- tests/regscale/integrations/commercial/aws/test_iam_evidence.py +1375 -0
- tests/regscale/integrations/commercial/aws/test_kms_control_mappings.py +656 -0
- tests/regscale/integrations/commercial/aws/test_kms_evidence.py +1163 -0
- tests/regscale/integrations/commercial/aws/test_ocsf_mapper.py +370 -0
- tests/regscale/integrations/commercial/aws/test_org_control_mappings.py +546 -0
- tests/regscale/integrations/commercial/aws/test_org_evidence.py +1240 -0
- tests/regscale/integrations/commercial/aws/test_s3_control_mappings.py +672 -0
- tests/regscale/integrations/commercial/aws/test_s3_evidence.py +987 -0
- tests/regscale/integrations/commercial/aws/test_scanner_evidence.py +373 -0
- tests/regscale/integrations/commercial/aws/test_security_hub_config_filtering.py +539 -0
- tests/regscale/integrations/commercial/aws/test_session_manager.py +516 -0
- tests/regscale/integrations/commercial/aws/test_ssm_control_mappings.py +588 -0
- tests/regscale/integrations/commercial/aws/test_ssm_evidence.py +735 -0
- tests/regscale/integrations/commercial/conftest.py +28 -0
- tests/regscale/integrations/commercial/microsoft_defender/__init__.py +1 -0
- tests/regscale/integrations/commercial/microsoft_defender/test_defender.py +1517 -0
- tests/regscale/integrations/commercial/microsoft_defender/test_defender_api.py +1748 -0
- tests/regscale/integrations/commercial/microsoft_defender/test_defender_constants.py +327 -0
- tests/regscale/integrations/commercial/microsoft_defender/test_defender_scanner.py +487 -0
- tests/regscale/integrations/commercial/test_aws.py +3742 -0
- tests/regscale/integrations/commercial/test_burp.py +48 -0
- tests/regscale/integrations/commercial/test_crowdstrike.py +49 -0
- tests/regscale/integrations/commercial/test_dependabot.py +341 -0
- tests/regscale/integrations/commercial/test_gcp.py +1543 -0
- tests/regscale/integrations/commercial/test_gitlab.py +549 -0
- tests/regscale/integrations/commercial/test_ip_mac_address_length.py +84 -0
- tests/regscale/integrations/commercial/test_jira.py +2204 -0
- tests/regscale/integrations/commercial/test_npm_audit.py +42 -0
- tests/regscale/integrations/commercial/test_okta.py +1228 -0
- tests/regscale/integrations/commercial/test_sarif_converter.py +251 -0
- tests/regscale/integrations/commercial/test_sicura.py +349 -0
- tests/regscale/integrations/commercial/test_snow.py +423 -0
- tests/regscale/integrations/commercial/test_sonarcloud.py +394 -0
- tests/regscale/integrations/commercial/test_sqlserver.py +186 -0
- tests/regscale/integrations/commercial/test_stig.py +33 -0
- tests/regscale/integrations/commercial/test_stig_mapper.py +153 -0
- tests/regscale/integrations/commercial/test_stigv2.py +406 -0
- tests/regscale/integrations/commercial/test_wiz.py +1365 -0
- tests/regscale/integrations/commercial/test_wiz_inventory.py +256 -0
- tests/regscale/integrations/commercial/wizv2/__init__.py +339 -0
- tests/regscale/integrations/commercial/wizv2/compliance/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/compliance/test_helpers.py +903 -0
- tests/regscale/integrations/commercial/wizv2/core/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/core/test_auth.py +701 -0
- tests/regscale/integrations/commercial/wizv2/core/test_client.py +1037 -0
- tests/regscale/integrations/commercial/wizv2/core/test_file_operations.py +989 -0
- tests/regscale/integrations/commercial/wizv2/fetchers/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/fetchers/test_policy_assessment.py +805 -0
- tests/regscale/integrations/commercial/wizv2/parsers/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/parsers/test_main.py +1153 -0
- tests/regscale/integrations/commercial/wizv2/processors/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/processors/test_finding.py +671 -0
- tests/regscale/integrations/commercial/wizv2/test_WizDataMixin.py +537 -0
- tests/regscale/integrations/commercial/wizv2/test_click_comprehensive.py +851 -0
- tests/regscale/integrations/commercial/wizv2/test_compliance_report_comprehensive.py +910 -0
- tests/regscale/integrations/commercial/wizv2/test_compliance_report_normalization.py +138 -0
- tests/regscale/integrations/commercial/wizv2/test_file_cleanup.py +283 -0
- tests/regscale/integrations/commercial/wizv2/test_file_operations.py +260 -0
- tests/regscale/integrations/commercial/wizv2/test_issue.py +343 -0
- tests/regscale/integrations/commercial/wizv2/test_issue_comprehensive.py +1203 -0
- tests/regscale/integrations/commercial/wizv2/test_reports.py +497 -0
- tests/regscale/integrations/commercial/wizv2/test_sbom.py +643 -0
- tests/regscale/integrations/commercial/wizv2/test_scanner_comprehensive.py +805 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_click_client_id.py +165 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_compliance_report.py +1394 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_compliance_unit.py +341 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_control_normalization.py +138 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_findings_comprehensive.py +364 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_inventory_comprehensive.py +644 -0
- tests/regscale/integrations/commercial/wizv2/test_wiz_status_mapping.py +149 -0
- tests/regscale/integrations/commercial/wizv2/test_wizv2.py +1218 -0
- tests/regscale/integrations/commercial/wizv2/test_wizv2_utils.py +519 -0
- tests/regscale/integrations/commercial/wizv2/utils/__init__.py +1 -0
- tests/regscale/integrations/commercial/wizv2/utils/test_main.py +1523 -0
- tests/regscale/integrations/public/__init__.py +0 -0
- tests/regscale/integrations/public/fedramp/__init__.py +1 -0
- tests/regscale/integrations/public/fedramp/test_gen_asset_list.py +150 -0
- tests/regscale/integrations/public/fedramp/test_poam_export_v5.py +1293 -0
- tests/regscale/integrations/public/test_alienvault.py +220 -0
- tests/regscale/integrations/public/test_cci.py +1053 -0
- tests/regscale/integrations/public/test_cisa.py +1021 -0
- tests/regscale/integrations/public/test_emass.py +518 -0
- tests/regscale/integrations/public/test_fedramp.py +1152 -0
- tests/regscale/integrations/public/test_fedramp_cis_crm.py +3661 -0
- tests/regscale/integrations/public/test_file_uploads.py +506 -0
- tests/regscale/integrations/public/test_oscal.py +453 -0
- tests/regscale/integrations/test_compliance_status_mapping.py +406 -0
- tests/regscale/integrations/test_control_matcher.py +1421 -0
- tests/regscale/integrations/test_control_matching.py +155 -0
- tests/regscale/integrations/test_milestone_manager.py +408 -0
- tests/regscale/models/test_control_implementation.py +118 -3
- tests/regscale/models/test_form_field_value_integration.py +304 -0
- tests/regscale/models/test_issue.py +378 -1
- tests/regscale/models/test_module_integration.py +582 -0
- tests/regscale/models/test_tenable_integrations.py +811 -105
- regscale/integrations/commercial/wizv2/policy_compliance.py +0 -3057
- regscale/integrations/public/fedramp/mappings/fedramp_r4_parts.json +0 -7388
- regscale/integrations/public/fedramp/mappings/fedramp_r5_parts.json +0 -9605
- regscale/integrations/public/fedramp/parts_mapper.py +0 -107
- /regscale/integrations/commercial/{amazon → sarif}/__init__.py +0 -0
- /regscale/integrations/commercial/wizv2/{wiz_auth.py → core/auth.py} +0 -0
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/LICENSE +0 -0
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/WHEEL +0 -0
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/entry_points.txt +0 -0
- {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/top_level.txt +0 -0
|
File without changes
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""Parsers module for Wiz integration - re-exports from main.py for clean imports."""
|
|
4
|
+
|
|
5
|
+
# Import all parser functions from the main parsers module
|
|
6
|
+
from regscale.integrations.commercial.wizv2.parsers.main import (
|
|
7
|
+
collect_components_to_create,
|
|
8
|
+
fetch_wiz_data,
|
|
9
|
+
get_disk_storage,
|
|
10
|
+
get_ip_address,
|
|
11
|
+
get_latest_version,
|
|
12
|
+
get_network_info,
|
|
13
|
+
get_product_ids,
|
|
14
|
+
get_software_name_from_cpe,
|
|
15
|
+
handle_container_image_version,
|
|
16
|
+
handle_provider,
|
|
17
|
+
handle_software_version,
|
|
18
|
+
pull_resource_info_from_props,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
__all__ = [
|
|
22
|
+
"collect_components_to_create",
|
|
23
|
+
"fetch_wiz_data",
|
|
24
|
+
"get_disk_storage",
|
|
25
|
+
"get_ip_address",
|
|
26
|
+
"get_latest_version",
|
|
27
|
+
"get_network_info",
|
|
28
|
+
"get_product_ids",
|
|
29
|
+
"get_software_name_from_cpe",
|
|
30
|
+
"handle_container_image_version",
|
|
31
|
+
"handle_provider",
|
|
32
|
+
"handle_software_version",
|
|
33
|
+
"pull_resource_info_from_props",
|
|
34
|
+
]
|
|
@@ -3,7 +3,7 @@ import logging
|
|
|
3
3
|
from typing import Dict, Optional, Tuple, Union, List, Any
|
|
4
4
|
|
|
5
5
|
from regscale.integrations.commercial.cpe import extract_product_name_and_version
|
|
6
|
-
from regscale.integrations.commercial.wizv2.constants import CONTENT_TYPE
|
|
6
|
+
from regscale.integrations.commercial.wizv2.core.constants import CONTENT_TYPE
|
|
7
7
|
from regscale.integrations.commercial.wizv2.variables import WizVariables
|
|
8
8
|
from regscale.models import regscale_models
|
|
9
9
|
from regscale.utils import PaginatedGraphQLClient
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Processors for Wiz integration - handles business logic and data transformation."""
|
|
2
|
+
|
|
3
|
+
from regscale.integrations.commercial.wizv2.processors.finding import (
|
|
4
|
+
FindingConsolidator,
|
|
5
|
+
FindingToIssueProcessor,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
"FindingConsolidator",
|
|
10
|
+
"FindingToIssueProcessor",
|
|
11
|
+
]
|
|
@@ -7,7 +7,7 @@ from typing import Dict, List, Optional, Iterator, Any, Set, Union
|
|
|
7
7
|
from collections import defaultdict
|
|
8
8
|
|
|
9
9
|
from regscale.integrations.scanner_integration import IntegrationFinding
|
|
10
|
-
from regscale.integrations.commercial.wizv2.
|
|
10
|
+
from regscale.integrations.commercial.wizv2.compliance.helpers import AssetConsolidator
|
|
11
11
|
from regscale.models import regscale_models
|
|
12
12
|
|
|
13
13
|
logger = logging.getLogger("regscale")
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""Wiz Report Management for RegScale CLI."""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import time
|
|
7
|
+
from typing import Dict, Any, Optional
|
|
8
|
+
|
|
9
|
+
import requests
|
|
10
|
+
|
|
11
|
+
from regscale.integrations.commercial.wizv2.core.constants import (
|
|
12
|
+
CREATE_REPORT_QUERY,
|
|
13
|
+
REPORTS_QUERY,
|
|
14
|
+
DOWNLOAD_QUERY,
|
|
15
|
+
RERUN_REPORT_QUERY,
|
|
16
|
+
get_compliance_report_variables,
|
|
17
|
+
CHECK_INTERVAL_FOR_DOWNLOAD_REPORT,
|
|
18
|
+
MAX_RETRIES,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger("regscale")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class WizReportManager:
|
|
25
|
+
"""Manages Wiz report operations including creation, monitoring, and download."""
|
|
26
|
+
|
|
27
|
+
def __init__(self, api_url: str, access_token: str):
|
|
28
|
+
"""
|
|
29
|
+
Initialize the report manager.
|
|
30
|
+
|
|
31
|
+
:param str api_url: The Wiz GraphQL API URL
|
|
32
|
+
:param str access_token: The authentication token
|
|
33
|
+
"""
|
|
34
|
+
self.api_url = api_url
|
|
35
|
+
self.access_token = access_token
|
|
36
|
+
self.headers = {"Content-Type": "application/json", "Authorization": f"Bearer {access_token}"}
|
|
37
|
+
|
|
38
|
+
def create_compliance_report(self, project_id: str, run_starts_at: Optional[str] = None) -> Optional[str]:
|
|
39
|
+
"""
|
|
40
|
+
Create a compliance report for the specified project.
|
|
41
|
+
|
|
42
|
+
:param str project_id: The Wiz project ID
|
|
43
|
+
:param Optional[str] run_starts_at: ISO timestamp for when the report should start
|
|
44
|
+
:return: Report ID if successful, None otherwise
|
|
45
|
+
:rtype: Optional[str]
|
|
46
|
+
"""
|
|
47
|
+
variables = get_compliance_report_variables(project_id, run_starts_at)
|
|
48
|
+
|
|
49
|
+
payload = {"query": CREATE_REPORT_QUERY, "variables": variables}
|
|
50
|
+
|
|
51
|
+
try:
|
|
52
|
+
response = requests.post(self.api_url, headers=self.headers, json=payload, timeout=30)
|
|
53
|
+
response.raise_for_status()
|
|
54
|
+
|
|
55
|
+
data = response.json()
|
|
56
|
+
if "errors" in data:
|
|
57
|
+
logger.error(f"GraphQL errors: {data['errors']}")
|
|
58
|
+
return None
|
|
59
|
+
|
|
60
|
+
report_data = data.get("data", {}).get("createReport", {}).get("report", {})
|
|
61
|
+
report_id = report_data.get("id")
|
|
62
|
+
|
|
63
|
+
if report_id:
|
|
64
|
+
logger.info(f"Successfully created compliance report with ID: {report_id}")
|
|
65
|
+
return report_id
|
|
66
|
+
else:
|
|
67
|
+
logger.error("No report ID returned from create report mutation")
|
|
68
|
+
return None
|
|
69
|
+
|
|
70
|
+
except requests.exceptions.RequestException as e:
|
|
71
|
+
logger.error(f"Error creating compliance report: {e}")
|
|
72
|
+
return None
|
|
73
|
+
except (KeyError, ValueError) as e:
|
|
74
|
+
logger.error(f"Error parsing create report response: {e}")
|
|
75
|
+
return None
|
|
76
|
+
|
|
77
|
+
def get_report_status(self, report_id: str) -> Dict[str, Any]:
|
|
78
|
+
"""
|
|
79
|
+
Get the status and details of a report.
|
|
80
|
+
|
|
81
|
+
:param str report_id: The report ID
|
|
82
|
+
:return: Report status information
|
|
83
|
+
:rtype: Dict[str, Any]
|
|
84
|
+
"""
|
|
85
|
+
variables = {"reportId": report_id}
|
|
86
|
+
|
|
87
|
+
payload = {"query": DOWNLOAD_QUERY, "variables": variables}
|
|
88
|
+
|
|
89
|
+
try:
|
|
90
|
+
response = requests.post(self.api_url, headers=self.headers, json=payload, timeout=30)
|
|
91
|
+
response.raise_for_status()
|
|
92
|
+
|
|
93
|
+
data = response.json()
|
|
94
|
+
if "errors" in data:
|
|
95
|
+
logger.error(f"GraphQL errors: {data['errors']}")
|
|
96
|
+
return {}
|
|
97
|
+
|
|
98
|
+
report_data = data.get("data", {}).get("report", {})
|
|
99
|
+
last_run = report_data.get("lastRun", {})
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
"status": last_run.get("status", "UNKNOWN"),
|
|
103
|
+
"url": last_run.get("url", ""),
|
|
104
|
+
"report_data": report_data,
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
except requests.exceptions.RequestException as e:
|
|
108
|
+
logger.error(f"Error getting report status: {e}")
|
|
109
|
+
return {}
|
|
110
|
+
except (KeyError, ValueError) as e:
|
|
111
|
+
logger.error(f"Error parsing report status response: {e}")
|
|
112
|
+
return {}
|
|
113
|
+
|
|
114
|
+
def wait_for_report_completion(self, report_id: str) -> Optional[str]:
|
|
115
|
+
"""
|
|
116
|
+
Wait for a report to complete and return the download URL.
|
|
117
|
+
|
|
118
|
+
:param str report_id: The report ID
|
|
119
|
+
:return: Download URL if successful, None otherwise
|
|
120
|
+
:rtype: Optional[str]
|
|
121
|
+
"""
|
|
122
|
+
logger.info(f"Waiting for report {report_id} to complete...")
|
|
123
|
+
|
|
124
|
+
for attempt in range(MAX_RETRIES):
|
|
125
|
+
status_info = self.get_report_status(report_id)
|
|
126
|
+
status = status_info.get("status", "UNKNOWN")
|
|
127
|
+
|
|
128
|
+
logger.info(f"Report status (attempt {attempt + 1}/{MAX_RETRIES}): {status}")
|
|
129
|
+
|
|
130
|
+
if status in ["SUCCESS", "COMPLETED"]:
|
|
131
|
+
download_url = status_info.get("url", "")
|
|
132
|
+
if download_url:
|
|
133
|
+
logger.info(f"Report completed successfully. Download URL: {download_url}")
|
|
134
|
+
return download_url
|
|
135
|
+
else:
|
|
136
|
+
logger.warning("Report completed but no download URL available")
|
|
137
|
+
return None
|
|
138
|
+
|
|
139
|
+
elif status in ["FAILED", "CANCELLED", "TIMEOUT"]:
|
|
140
|
+
logger.error(f"Report failed with status: {status}")
|
|
141
|
+
return None
|
|
142
|
+
|
|
143
|
+
elif status in ["PENDING", "RUNNING", "IN_PROGRESS", "UNKNOWN"]:
|
|
144
|
+
logger.info(
|
|
145
|
+
f"Report is still {status.lower()}, waiting {CHECK_INTERVAL_FOR_DOWNLOAD_REPORT} seconds..."
|
|
146
|
+
)
|
|
147
|
+
time.sleep(CHECK_INTERVAL_FOR_DOWNLOAD_REPORT)
|
|
148
|
+
else:
|
|
149
|
+
logger.warning(f"Unknown report status: {status}")
|
|
150
|
+
time.sleep(CHECK_INTERVAL_FOR_DOWNLOAD_REPORT)
|
|
151
|
+
|
|
152
|
+
logger.error(f"Report did not complete after {MAX_RETRIES} attempts")
|
|
153
|
+
return None
|
|
154
|
+
|
|
155
|
+
def download_report(self, download_url: str, output_path: str) -> bool:
|
|
156
|
+
"""
|
|
157
|
+
Download a report from the given URL.
|
|
158
|
+
|
|
159
|
+
:param str download_url: The download URL
|
|
160
|
+
:param str output_path: Path where the report should be saved
|
|
161
|
+
:return: True if successful, False otherwise
|
|
162
|
+
:rtype: bool
|
|
163
|
+
"""
|
|
164
|
+
try:
|
|
165
|
+
logger.info(f"Downloading report to: {output_path}")
|
|
166
|
+
|
|
167
|
+
response = requests.get(download_url, timeout=300)
|
|
168
|
+
response.raise_for_status()
|
|
169
|
+
|
|
170
|
+
with open(output_path, "wb") as f:
|
|
171
|
+
f.write(response.content)
|
|
172
|
+
|
|
173
|
+
logger.info(f"Report downloaded successfully to: {output_path}")
|
|
174
|
+
return True
|
|
175
|
+
|
|
176
|
+
except requests.exceptions.RequestException as e:
|
|
177
|
+
logger.error(f"Error downloading report: {e}")
|
|
178
|
+
return False
|
|
179
|
+
except IOError as e:
|
|
180
|
+
logger.error(f"Error saving report to file: {e}")
|
|
181
|
+
return False
|
|
182
|
+
|
|
183
|
+
def rerun_report(self, report_id: str) -> Optional[str]:
|
|
184
|
+
"""
|
|
185
|
+
Rerun an existing report.
|
|
186
|
+
|
|
187
|
+
:param str report_id: The report ID
|
|
188
|
+
:return: Download URL if successful, None otherwise
|
|
189
|
+
:rtype: Optional[str]
|
|
190
|
+
"""
|
|
191
|
+
variables = {"reportId": report_id}
|
|
192
|
+
|
|
193
|
+
payload = {"query": RERUN_REPORT_QUERY, "variables": variables}
|
|
194
|
+
|
|
195
|
+
try:
|
|
196
|
+
response = requests.post(self.api_url, headers=self.headers, json=payload, timeout=30)
|
|
197
|
+
response.raise_for_status()
|
|
198
|
+
|
|
199
|
+
data = response.json()
|
|
200
|
+
if "errors" in data:
|
|
201
|
+
logger.error(f"GraphQL errors: {data['errors']}")
|
|
202
|
+
return None
|
|
203
|
+
|
|
204
|
+
logger.info(f"Successfully triggered rerun for report {report_id}")
|
|
205
|
+
return self.wait_for_report_completion(report_id)
|
|
206
|
+
|
|
207
|
+
except requests.exceptions.RequestException as e:
|
|
208
|
+
logger.error(f"Error rerunning report: {e}")
|
|
209
|
+
return None
|
|
210
|
+
except (KeyError, ValueError) as e:
|
|
211
|
+
logger.error(f"Error parsing rerun report response: {e}")
|
|
212
|
+
return None
|
|
213
|
+
|
|
214
|
+
def list_reports(self, filter_by: Optional[Dict[str, Any]] = None) -> list:
|
|
215
|
+
"""
|
|
216
|
+
List available reports.
|
|
217
|
+
|
|
218
|
+
:param Optional[Dict[str, Any]] filter_by: Optional filter criteria
|
|
219
|
+
:return: List of reports
|
|
220
|
+
:rtype: list
|
|
221
|
+
"""
|
|
222
|
+
variables = {"first": 50, "filterBy": filter_by or {}}
|
|
223
|
+
|
|
224
|
+
payload = {"query": REPORTS_QUERY, "variables": variables}
|
|
225
|
+
|
|
226
|
+
try:
|
|
227
|
+
response = requests.post(self.api_url, headers=self.headers, json=payload, timeout=30)
|
|
228
|
+
response.raise_for_status()
|
|
229
|
+
|
|
230
|
+
data = response.json()
|
|
231
|
+
if "errors" in data:
|
|
232
|
+
logger.error(f"GraphQL errors: {data['errors']}")
|
|
233
|
+
return []
|
|
234
|
+
|
|
235
|
+
reports = data.get("data", {}).get("reports", {}).get("nodes", [])
|
|
236
|
+
return reports
|
|
237
|
+
|
|
238
|
+
except requests.exceptions.RequestException as e:
|
|
239
|
+
logger.error(f"Error listing reports: {e}")
|
|
240
|
+
return []
|
|
241
|
+
except (KeyError, ValueError) as e:
|
|
242
|
+
logger.error(f"Error parsing list reports response: {e}")
|
|
243
|
+
return []
|
|
@@ -6,7 +6,7 @@ from typing import List, Dict, Optional
|
|
|
6
6
|
from regscale.core.app.utils.app_utils import error_and_exit
|
|
7
7
|
from regscale.integrations.commercial.wizv2.WizDataMixin import WizMixin
|
|
8
8
|
from regscale.models.regscale_models.sbom import Sbom
|
|
9
|
-
from regscale.integrations.commercial.wizv2.constants import SBOM_QUERY, SBOM_FILE_PATH
|
|
9
|
+
from regscale.integrations.commercial.wizv2.core.constants import SBOM_QUERY, SBOM_FILE_PATH
|
|
10
10
|
from regscale.utils import get_value
|
|
11
11
|
|
|
12
12
|
logger = logging.getLogger(__name__)
|