regscale-cli 6.16.0.0__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.
Potentially problematic release.
This version of regscale-cli might be problematic. Click here for more details.
- regscale/__init__.py +1 -0
- regscale/airflow/__init__.py +9 -0
- regscale/airflow/azure/__init__.py +9 -0
- regscale/airflow/azure/cli.py +89 -0
- regscale/airflow/azure/upload_dags.py +116 -0
- regscale/airflow/click_dags.py +127 -0
- regscale/airflow/click_mixins.py +82 -0
- regscale/airflow/config.py +25 -0
- regscale/airflow/factories/__init__.py +0 -0
- regscale/airflow/factories/connections.py +58 -0
- regscale/airflow/factories/workflows.py +78 -0
- regscale/airflow/hierarchy.py +88 -0
- regscale/airflow/operators/__init__.py +0 -0
- regscale/airflow/operators/click.py +36 -0
- regscale/airflow/sensors/__init__.py +0 -0
- regscale/airflow/sensors/sql.py +107 -0
- regscale/airflow/sessions/__init__.py +0 -0
- regscale/airflow/sessions/sql/__init__.py +3 -0
- regscale/airflow/sessions/sql/queries.py +64 -0
- regscale/airflow/sessions/sql/sql_server_queries.py +248 -0
- regscale/airflow/tasks/__init__.py +0 -0
- regscale/airflow/tasks/branches.py +22 -0
- regscale/airflow/tasks/cli.py +116 -0
- regscale/airflow/tasks/click.py +73 -0
- regscale/airflow/tasks/debugging.py +9 -0
- regscale/airflow/tasks/groups.py +116 -0
- regscale/airflow/tasks/init.py +60 -0
- regscale/airflow/tasks/states.py +47 -0
- regscale/airflow/tasks/workflows.py +36 -0
- regscale/ansible/__init__.py +9 -0
- regscale/core/__init__.py +0 -0
- regscale/core/app/__init__.py +3 -0
- regscale/core/app/api.py +571 -0
- regscale/core/app/application.py +665 -0
- regscale/core/app/internal/__init__.py +136 -0
- regscale/core/app/internal/admin_actions.py +230 -0
- regscale/core/app/internal/assessments_editor.py +873 -0
- regscale/core/app/internal/catalog.py +316 -0
- regscale/core/app/internal/comparison.py +459 -0
- regscale/core/app/internal/control_editor.py +571 -0
- regscale/core/app/internal/encrypt.py +79 -0
- regscale/core/app/internal/evidence.py +1240 -0
- regscale/core/app/internal/file_uploads.py +151 -0
- regscale/core/app/internal/healthcheck.py +66 -0
- regscale/core/app/internal/login.py +305 -0
- regscale/core/app/internal/migrations.py +240 -0
- regscale/core/app/internal/model_editor.py +1701 -0
- regscale/core/app/internal/poam_editor.py +632 -0
- regscale/core/app/internal/workflow.py +105 -0
- regscale/core/app/logz.py +74 -0
- regscale/core/app/utils/XMLIR.py +258 -0
- regscale/core/app/utils/__init__.py +0 -0
- regscale/core/app/utils/api_handler.py +358 -0
- regscale/core/app/utils/app_utils.py +1110 -0
- regscale/core/app/utils/catalog_utils/__init__.py +0 -0
- regscale/core/app/utils/catalog_utils/common.py +91 -0
- regscale/core/app/utils/catalog_utils/compare_catalog.py +193 -0
- regscale/core/app/utils/catalog_utils/diagnostic_catalog.py +97 -0
- regscale/core/app/utils/catalog_utils/download_catalog.py +103 -0
- regscale/core/app/utils/catalog_utils/update_catalog.py +718 -0
- regscale/core/app/utils/catalog_utils/update_catalog_v2.py +1378 -0
- regscale/core/app/utils/catalog_utils/update_catalog_v3.py +1272 -0
- regscale/core/app/utils/catalog_utils/update_plans.py +334 -0
- regscale/core/app/utils/file_utils.py +238 -0
- regscale/core/app/utils/parser_utils.py +81 -0
- regscale/core/app/utils/pickle_file_handler.py +57 -0
- regscale/core/app/utils/regscale_utils.py +319 -0
- regscale/core/app/utils/report_utils.py +119 -0
- regscale/core/app/utils/variables.py +226 -0
- regscale/core/decorators.py +31 -0
- regscale/core/lazy_group.py +65 -0
- regscale/core/login.py +63 -0
- regscale/core/server/__init__.py +0 -0
- regscale/core/server/flask_api.py +473 -0
- regscale/core/server/helpers.py +373 -0
- regscale/core/server/rest.py +64 -0
- regscale/core/server/static/css/bootstrap.css +6030 -0
- regscale/core/server/static/css/bootstrap.min.css +6 -0
- regscale/core/server/static/css/main.css +176 -0
- regscale/core/server/static/images/regscale-cli.svg +49 -0
- regscale/core/server/static/images/regscale.svg +38 -0
- regscale/core/server/templates/base.html +74 -0
- regscale/core/server/templates/index.html +43 -0
- regscale/core/server/templates/login.html +28 -0
- regscale/core/server/templates/make_base64.html +22 -0
- regscale/core/server/templates/upload_STIG.html +109 -0
- regscale/core/server/templates/upload_STIG_result.html +26 -0
- regscale/core/server/templates/upload_ssp.html +144 -0
- regscale/core/server/templates/upload_ssp_result.html +128 -0
- regscale/core/static/__init__.py +0 -0
- regscale/core/static/regex.py +14 -0
- regscale/core/utils/__init__.py +117 -0
- regscale/core/utils/click_utils.py +13 -0
- regscale/core/utils/date.py +238 -0
- regscale/core/utils/graphql.py +254 -0
- regscale/core/utils/urls.py +23 -0
- regscale/dev/__init__.py +6 -0
- regscale/dev/analysis.py +454 -0
- regscale/dev/cli.py +235 -0
- regscale/dev/code_gen.py +492 -0
- regscale/dev/dirs.py +69 -0
- regscale/dev/docs.py +384 -0
- regscale/dev/monitoring.py +26 -0
- regscale/dev/profiling.py +216 -0
- regscale/exceptions/__init__.py +4 -0
- regscale/exceptions/license_exception.py +7 -0
- regscale/exceptions/validation_exception.py +9 -0
- regscale/integrations/__init__.py +1 -0
- regscale/integrations/commercial/__init__.py +486 -0
- regscale/integrations/commercial/ad.py +433 -0
- regscale/integrations/commercial/amazon/__init__.py +0 -0
- regscale/integrations/commercial/amazon/common.py +106 -0
- regscale/integrations/commercial/aqua/__init__.py +0 -0
- regscale/integrations/commercial/aqua/aqua.py +91 -0
- regscale/integrations/commercial/aws/__init__.py +6 -0
- regscale/integrations/commercial/aws/cli.py +322 -0
- regscale/integrations/commercial/aws/inventory/__init__.py +110 -0
- regscale/integrations/commercial/aws/inventory/base.py +64 -0
- regscale/integrations/commercial/aws/inventory/resources/__init__.py +19 -0
- regscale/integrations/commercial/aws/inventory/resources/compute.py +234 -0
- regscale/integrations/commercial/aws/inventory/resources/containers.py +113 -0
- regscale/integrations/commercial/aws/inventory/resources/database.py +101 -0
- regscale/integrations/commercial/aws/inventory/resources/integration.py +237 -0
- regscale/integrations/commercial/aws/inventory/resources/networking.py +253 -0
- regscale/integrations/commercial/aws/inventory/resources/security.py +240 -0
- regscale/integrations/commercial/aws/inventory/resources/storage.py +91 -0
- regscale/integrations/commercial/aws/scanner.py +823 -0
- regscale/integrations/commercial/azure/__init__.py +0 -0
- regscale/integrations/commercial/azure/common.py +32 -0
- regscale/integrations/commercial/azure/intune.py +488 -0
- regscale/integrations/commercial/azure/scanner.py +49 -0
- regscale/integrations/commercial/burp.py +78 -0
- regscale/integrations/commercial/cpe.py +144 -0
- regscale/integrations/commercial/crowdstrike.py +1117 -0
- regscale/integrations/commercial/defender.py +1511 -0
- regscale/integrations/commercial/dependabot.py +210 -0
- regscale/integrations/commercial/durosuite/__init__.py +0 -0
- regscale/integrations/commercial/durosuite/api.py +1546 -0
- regscale/integrations/commercial/durosuite/process_devices.py +101 -0
- regscale/integrations/commercial/durosuite/scanner.py +637 -0
- regscale/integrations/commercial/durosuite/variables.py +21 -0
- regscale/integrations/commercial/ecr.py +90 -0
- regscale/integrations/commercial/gcp/__init__.py +237 -0
- regscale/integrations/commercial/gcp/auth.py +96 -0
- regscale/integrations/commercial/gcp/control_tests.py +238 -0
- regscale/integrations/commercial/gcp/variables.py +18 -0
- regscale/integrations/commercial/gitlab.py +332 -0
- regscale/integrations/commercial/grype.py +165 -0
- regscale/integrations/commercial/ibm.py +90 -0
- regscale/integrations/commercial/import_all/__init__.py +0 -0
- regscale/integrations/commercial/import_all/import_all_cmd.py +467 -0
- regscale/integrations/commercial/import_all/scan_file_fingerprints.json +27 -0
- regscale/integrations/commercial/jira.py +1046 -0
- regscale/integrations/commercial/mappings/__init__.py +0 -0
- regscale/integrations/commercial/mappings/csf_controls.json +713 -0
- regscale/integrations/commercial/mappings/nist_800_53_r5_controls.json +1516 -0
- regscale/integrations/commercial/nessus/__init__.py +0 -0
- regscale/integrations/commercial/nessus/nessus_utils.py +429 -0
- regscale/integrations/commercial/nessus/scanner.py +416 -0
- regscale/integrations/commercial/nexpose.py +90 -0
- regscale/integrations/commercial/okta.py +798 -0
- regscale/integrations/commercial/opentext/__init__.py +0 -0
- regscale/integrations/commercial/opentext/click.py +99 -0
- regscale/integrations/commercial/opentext/scanner.py +143 -0
- regscale/integrations/commercial/prisma.py +91 -0
- regscale/integrations/commercial/qualys.py +1462 -0
- regscale/integrations/commercial/salesforce.py +980 -0
- regscale/integrations/commercial/sap/__init__.py +0 -0
- regscale/integrations/commercial/sap/click.py +31 -0
- regscale/integrations/commercial/sap/sysdig/__init__.py +0 -0
- regscale/integrations/commercial/sap/sysdig/click.py +57 -0
- regscale/integrations/commercial/sap/sysdig/sysdig_scanner.py +190 -0
- regscale/integrations/commercial/sap/tenable/__init__.py +0 -0
- regscale/integrations/commercial/sap/tenable/click.py +49 -0
- regscale/integrations/commercial/sap/tenable/scanner.py +196 -0
- regscale/integrations/commercial/servicenow.py +1756 -0
- regscale/integrations/commercial/sicura/__init__.py +0 -0
- regscale/integrations/commercial/sicura/api.py +855 -0
- regscale/integrations/commercial/sicura/commands.py +73 -0
- regscale/integrations/commercial/sicura/scanner.py +481 -0
- regscale/integrations/commercial/sicura/variables.py +16 -0
- regscale/integrations/commercial/snyk.py +90 -0
- regscale/integrations/commercial/sonarcloud.py +260 -0
- regscale/integrations/commercial/sqlserver.py +369 -0
- regscale/integrations/commercial/stig_mapper_integration/__init__.py +0 -0
- regscale/integrations/commercial/stig_mapper_integration/click_commands.py +38 -0
- regscale/integrations/commercial/stig_mapper_integration/mapping_engine.py +353 -0
- regscale/integrations/commercial/stigv2/__init__.py +0 -0
- regscale/integrations/commercial/stigv2/ckl_parser.py +349 -0
- regscale/integrations/commercial/stigv2/click_commands.py +95 -0
- regscale/integrations/commercial/stigv2/stig_integration.py +202 -0
- regscale/integrations/commercial/synqly/__init__.py +0 -0
- regscale/integrations/commercial/synqly/assets.py +46 -0
- regscale/integrations/commercial/synqly/ticketing.py +132 -0
- regscale/integrations/commercial/synqly/vulnerabilities.py +223 -0
- regscale/integrations/commercial/synqly_jira.py +840 -0
- regscale/integrations/commercial/tenablev2/__init__.py +0 -0
- regscale/integrations/commercial/tenablev2/authenticate.py +31 -0
- regscale/integrations/commercial/tenablev2/click.py +1584 -0
- regscale/integrations/commercial/tenablev2/scanner.py +504 -0
- regscale/integrations/commercial/tenablev2/stig_parsers.py +140 -0
- regscale/integrations/commercial/tenablev2/utils.py +78 -0
- regscale/integrations/commercial/tenablev2/variables.py +17 -0
- regscale/integrations/commercial/trivy.py +162 -0
- regscale/integrations/commercial/veracode.py +96 -0
- regscale/integrations/commercial/wizv2/WizDataMixin.py +97 -0
- regscale/integrations/commercial/wizv2/__init__.py +0 -0
- regscale/integrations/commercial/wizv2/click.py +429 -0
- regscale/integrations/commercial/wizv2/constants.py +1001 -0
- regscale/integrations/commercial/wizv2/issue.py +361 -0
- regscale/integrations/commercial/wizv2/models.py +112 -0
- regscale/integrations/commercial/wizv2/parsers.py +339 -0
- regscale/integrations/commercial/wizv2/sbom.py +115 -0
- regscale/integrations/commercial/wizv2/scanner.py +416 -0
- regscale/integrations/commercial/wizv2/utils.py +796 -0
- regscale/integrations/commercial/wizv2/variables.py +39 -0
- regscale/integrations/commercial/wizv2/wiz_auth.py +159 -0
- regscale/integrations/commercial/xray.py +91 -0
- regscale/integrations/integration/__init__.py +2 -0
- regscale/integrations/integration/integration.py +26 -0
- regscale/integrations/integration/inventory.py +17 -0
- regscale/integrations/integration/issue.py +100 -0
- regscale/integrations/integration_override.py +149 -0
- regscale/integrations/public/__init__.py +103 -0
- regscale/integrations/public/cisa.py +641 -0
- regscale/integrations/public/criticality_updater.py +70 -0
- regscale/integrations/public/emass.py +411 -0
- regscale/integrations/public/emass_slcm_import.py +697 -0
- regscale/integrations/public/fedramp/__init__.py +0 -0
- regscale/integrations/public/fedramp/appendix_parser.py +548 -0
- regscale/integrations/public/fedramp/click.py +479 -0
- regscale/integrations/public/fedramp/components.py +714 -0
- regscale/integrations/public/fedramp/docx_parser.py +259 -0
- regscale/integrations/public/fedramp/fedramp_cis_crm.py +1124 -0
- regscale/integrations/public/fedramp/fedramp_common.py +3181 -0
- regscale/integrations/public/fedramp/fedramp_docx.py +388 -0
- regscale/integrations/public/fedramp/fedramp_five.py +2343 -0
- regscale/integrations/public/fedramp/fedramp_traversal.py +138 -0
- regscale/integrations/public/fedramp/import_fedramp_r4_ssp.py +279 -0
- regscale/integrations/public/fedramp/import_workbook.py +495 -0
- regscale/integrations/public/fedramp/inventory_items.py +244 -0
- regscale/integrations/public/fedramp/mappings/__init__.py +0 -0
- regscale/integrations/public/fedramp/mappings/fedramp_r4_parts.json +7388 -0
- regscale/integrations/public/fedramp/mappings/fedramp_r5_params.json +8636 -0
- regscale/integrations/public/fedramp/mappings/fedramp_r5_parts.json +9605 -0
- regscale/integrations/public/fedramp/mappings/system_roles.py +34 -0
- regscale/integrations/public/fedramp/mappings/user.py +175 -0
- regscale/integrations/public/fedramp/mappings/values.py +141 -0
- regscale/integrations/public/fedramp/markdown_parser.py +150 -0
- regscale/integrations/public/fedramp/metadata.py +689 -0
- regscale/integrations/public/fedramp/models/__init__.py +59 -0
- regscale/integrations/public/fedramp/models/leveraged_auth_new.py +168 -0
- regscale/integrations/public/fedramp/models/poam_importer.py +522 -0
- regscale/integrations/public/fedramp/parts_mapper.py +107 -0
- regscale/integrations/public/fedramp/poam/__init__.py +0 -0
- regscale/integrations/public/fedramp/poam/scanner.py +851 -0
- regscale/integrations/public/fedramp/properties.py +201 -0
- regscale/integrations/public/fedramp/reporting.py +84 -0
- regscale/integrations/public/fedramp/resources.py +496 -0
- regscale/integrations/public/fedramp/rosetta.py +110 -0
- regscale/integrations/public/fedramp/ssp_logger.py +87 -0
- regscale/integrations/public/fedramp/system_characteristics.py +922 -0
- regscale/integrations/public/fedramp/system_control_implementations.py +582 -0
- regscale/integrations/public/fedramp/system_implementation.py +190 -0
- regscale/integrations/public/fedramp/xml_utils.py +87 -0
- regscale/integrations/public/nist_catalog.py +275 -0
- regscale/integrations/public/oscal.py +1946 -0
- regscale/integrations/public/otx.py +169 -0
- regscale/integrations/scanner_integration.py +2692 -0
- regscale/integrations/variables.py +25 -0
- regscale/models/__init__.py +7 -0
- regscale/models/app_models/__init__.py +5 -0
- regscale/models/app_models/catalog_compare.py +213 -0
- regscale/models/app_models/click.py +252 -0
- regscale/models/app_models/datetime_encoder.py +21 -0
- regscale/models/app_models/import_validater.py +321 -0
- regscale/models/app_models/mapping.py +260 -0
- regscale/models/app_models/pipeline.py +37 -0
- regscale/models/click_models.py +413 -0
- regscale/models/config.py +154 -0
- regscale/models/email_style.css +67 -0
- regscale/models/hierarchy.py +8 -0
- regscale/models/inspect_models.py +79 -0
- regscale/models/integration_models/__init__.py +0 -0
- regscale/models/integration_models/amazon_models/__init__.py +0 -0
- regscale/models/integration_models/amazon_models/inspector.py +262 -0
- regscale/models/integration_models/amazon_models/inspector_scan.py +206 -0
- regscale/models/integration_models/aqua.py +247 -0
- regscale/models/integration_models/azure_alerts.py +255 -0
- regscale/models/integration_models/base64.py +23 -0
- regscale/models/integration_models/burp.py +433 -0
- regscale/models/integration_models/burp_models.py +128 -0
- regscale/models/integration_models/cisa_kev_data.json +19333 -0
- regscale/models/integration_models/defender_data.py +93 -0
- regscale/models/integration_models/defenderimport.py +143 -0
- regscale/models/integration_models/drf.py +443 -0
- regscale/models/integration_models/ecr_models/__init__.py +0 -0
- regscale/models/integration_models/ecr_models/data.py +69 -0
- regscale/models/integration_models/ecr_models/ecr.py +239 -0
- regscale/models/integration_models/flat_file_importer.py +1079 -0
- regscale/models/integration_models/grype_import.py +247 -0
- regscale/models/integration_models/ibm.py +126 -0
- regscale/models/integration_models/implementation_results.py +85 -0
- regscale/models/integration_models/nexpose.py +140 -0
- regscale/models/integration_models/prisma.py +202 -0
- regscale/models/integration_models/qualys.py +720 -0
- regscale/models/integration_models/qualys_scanner.py +160 -0
- regscale/models/integration_models/sbom/__init__.py +0 -0
- regscale/models/integration_models/sbom/cyclone_dx.py +139 -0
- regscale/models/integration_models/send_reminders.py +620 -0
- regscale/models/integration_models/snyk.py +155 -0
- regscale/models/integration_models/synqly_models/__init__.py +0 -0
- regscale/models/integration_models/synqly_models/capabilities.json +1 -0
- regscale/models/integration_models/synqly_models/connector_types.py +22 -0
- regscale/models/integration_models/synqly_models/connectors/__init__.py +7 -0
- regscale/models/integration_models/synqly_models/connectors/assets.py +97 -0
- regscale/models/integration_models/synqly_models/connectors/ticketing.py +583 -0
- regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py +169 -0
- regscale/models/integration_models/synqly_models/ocsf_mapper.py +331 -0
- regscale/models/integration_models/synqly_models/param.py +72 -0
- regscale/models/integration_models/synqly_models/synqly_model.py +733 -0
- regscale/models/integration_models/synqly_models/tenants.py +39 -0
- regscale/models/integration_models/tenable_models/__init__.py +0 -0
- regscale/models/integration_models/tenable_models/integration.py +187 -0
- regscale/models/integration_models/tenable_models/models.py +513 -0
- regscale/models/integration_models/trivy_import.py +231 -0
- regscale/models/integration_models/veracode.py +217 -0
- regscale/models/integration_models/xray.py +135 -0
- regscale/models/locking.py +100 -0
- regscale/models/platform.py +110 -0
- regscale/models/regscale_models/__init__.py +67 -0
- regscale/models/regscale_models/assessment.py +570 -0
- regscale/models/regscale_models/assessment_plan.py +52 -0
- regscale/models/regscale_models/asset.py +567 -0
- regscale/models/regscale_models/asset_mapping.py +190 -0
- regscale/models/regscale_models/case.py +42 -0
- regscale/models/regscale_models/catalog.py +261 -0
- regscale/models/regscale_models/cci.py +46 -0
- regscale/models/regscale_models/change.py +167 -0
- regscale/models/regscale_models/checklist.py +372 -0
- regscale/models/regscale_models/comment.py +49 -0
- regscale/models/regscale_models/compliance_settings.py +112 -0
- regscale/models/regscale_models/component.py +412 -0
- regscale/models/regscale_models/component_mapping.py +65 -0
- regscale/models/regscale_models/control.py +38 -0
- regscale/models/regscale_models/control_implementation.py +1128 -0
- regscale/models/regscale_models/control_objective.py +261 -0
- regscale/models/regscale_models/control_parameter.py +100 -0
- regscale/models/regscale_models/control_test.py +34 -0
- regscale/models/regscale_models/control_test_plan.py +75 -0
- regscale/models/regscale_models/control_test_result.py +52 -0
- regscale/models/regscale_models/custom_field.py +245 -0
- regscale/models/regscale_models/data.py +109 -0
- regscale/models/regscale_models/data_center.py +40 -0
- regscale/models/regscale_models/deviation.py +203 -0
- regscale/models/regscale_models/email.py +97 -0
- regscale/models/regscale_models/evidence.py +47 -0
- regscale/models/regscale_models/evidence_mapping.py +40 -0
- regscale/models/regscale_models/facility.py +59 -0
- regscale/models/regscale_models/file.py +382 -0
- regscale/models/regscale_models/filetag.py +37 -0
- regscale/models/regscale_models/form_field_value.py +94 -0
- regscale/models/regscale_models/group.py +169 -0
- regscale/models/regscale_models/implementation_objective.py +335 -0
- regscale/models/regscale_models/implementation_option.py +275 -0
- regscale/models/regscale_models/implementation_role.py +33 -0
- regscale/models/regscale_models/incident.py +177 -0
- regscale/models/regscale_models/interconnection.py +43 -0
- regscale/models/regscale_models/issue.py +1176 -0
- regscale/models/regscale_models/leveraged_authorization.py +125 -0
- regscale/models/regscale_models/line_of_inquiry.py +52 -0
- regscale/models/regscale_models/link.py +205 -0
- regscale/models/regscale_models/meta_data.py +64 -0
- regscale/models/regscale_models/mixins/__init__.py +0 -0
- regscale/models/regscale_models/mixins/parent_cache.py +124 -0
- regscale/models/regscale_models/module.py +224 -0
- regscale/models/regscale_models/modules.py +191 -0
- regscale/models/regscale_models/objective.py +14 -0
- regscale/models/regscale_models/parameter.py +87 -0
- regscale/models/regscale_models/ports_protocol.py +81 -0
- regscale/models/regscale_models/privacy.py +89 -0
- regscale/models/regscale_models/profile.py +50 -0
- regscale/models/regscale_models/profile_link.py +68 -0
- regscale/models/regscale_models/profile_mapping.py +124 -0
- regscale/models/regscale_models/project.py +63 -0
- regscale/models/regscale_models/property.py +278 -0
- regscale/models/regscale_models/question.py +85 -0
- regscale/models/regscale_models/questionnaire.py +87 -0
- regscale/models/regscale_models/questionnaire_instance.py +177 -0
- regscale/models/regscale_models/rbac.py +132 -0
- regscale/models/regscale_models/reference.py +86 -0
- regscale/models/regscale_models/regscale_model.py +1643 -0
- regscale/models/regscale_models/requirement.py +29 -0
- regscale/models/regscale_models/risk.py +274 -0
- regscale/models/regscale_models/sbom.py +54 -0
- regscale/models/regscale_models/scan_history.py +436 -0
- regscale/models/regscale_models/search.py +53 -0
- regscale/models/regscale_models/security_control.py +132 -0
- regscale/models/regscale_models/security_plan.py +204 -0
- regscale/models/regscale_models/software_inventory.py +159 -0
- regscale/models/regscale_models/stake_holder.py +64 -0
- regscale/models/regscale_models/stig.py +647 -0
- regscale/models/regscale_models/supply_chain.py +152 -0
- regscale/models/regscale_models/system_role.py +188 -0
- regscale/models/regscale_models/system_role_external_assignment.py +40 -0
- regscale/models/regscale_models/tag.py +37 -0
- regscale/models/regscale_models/tag_mapping.py +19 -0
- regscale/models/regscale_models/task.py +133 -0
- regscale/models/regscale_models/threat.py +196 -0
- regscale/models/regscale_models/user.py +175 -0
- regscale/models/regscale_models/user_group.py +55 -0
- regscale/models/regscale_models/vulnerability.py +242 -0
- regscale/models/regscale_models/vulnerability_mapping.py +162 -0
- regscale/models/regscale_models/workflow.py +55 -0
- regscale/models/regscale_models/workflow_action.py +34 -0
- regscale/models/regscale_models/workflow_instance.py +269 -0
- regscale/models/regscale_models/workflow_instance_step.py +114 -0
- regscale/models/regscale_models/workflow_template.py +58 -0
- regscale/models/regscale_models/workflow_template_step.py +45 -0
- regscale/regscale.py +815 -0
- regscale/utils/__init__.py +7 -0
- regscale/utils/b64conversion.py +14 -0
- regscale/utils/click_utils.py +118 -0
- regscale/utils/decorators.py +48 -0
- regscale/utils/dict_utils.py +59 -0
- regscale/utils/files.py +79 -0
- regscale/utils/fxns.py +30 -0
- regscale/utils/graphql_client.py +113 -0
- regscale/utils/lists.py +16 -0
- regscale/utils/numbers.py +12 -0
- regscale/utils/shell.py +148 -0
- regscale/utils/string.py +121 -0
- regscale/utils/synqly_utils.py +165 -0
- regscale/utils/threading/__init__.py +8 -0
- regscale/utils/threading/threadhandler.py +131 -0
- regscale/utils/threading/threadsafe_counter.py +47 -0
- regscale/utils/threading/threadsafe_dict.py +242 -0
- regscale/utils/threading/threadsafe_list.py +83 -0
- regscale/utils/version.py +104 -0
- regscale/validation/__init__.py +0 -0
- regscale/validation/address.py +37 -0
- regscale/validation/record.py +48 -0
- regscale/visualization/__init__.py +5 -0
- regscale/visualization/click.py +34 -0
- regscale_cli-6.16.0.0.dist-info/LICENSE +21 -0
- regscale_cli-6.16.0.0.dist-info/METADATA +659 -0
- regscale_cli-6.16.0.0.dist-info/RECORD +481 -0
- regscale_cli-6.16.0.0.dist-info/WHEEL +5 -0
- regscale_cli-6.16.0.0.dist-info/entry_points.txt +6 -0
- regscale_cli-6.16.0.0.dist-info/top_level.txt +2 -0
- tests/fixtures/__init__.py +2 -0
- tests/fixtures/api.py +87 -0
- tests/fixtures/models.py +91 -0
- tests/fixtures/test_fixture.py +144 -0
- tests/mocks/__init__.py +0 -0
- tests/mocks/objects.py +3 -0
- tests/mocks/response.py +32 -0
- tests/mocks/xml.py +13 -0
- tests/regscale/__init__.py +0 -0
- tests/regscale/core/__init__.py +0 -0
- tests/regscale/core/test_api.py +232 -0
- tests/regscale/core/test_app.py +406 -0
- tests/regscale/core/test_login.py +37 -0
- tests/regscale/core/test_logz.py +66 -0
- tests/regscale/core/test_sbom_generator.py +87 -0
- tests/regscale/core/test_validation_utils.py +163 -0
- tests/regscale/core/test_version.py +78 -0
- tests/regscale/models/__init__.py +0 -0
- tests/regscale/models/test_asset.py +71 -0
- tests/regscale/models/test_config.py +26 -0
- tests/regscale/models/test_control_implementation.py +27 -0
- tests/regscale/models/test_import.py +97 -0
- tests/regscale/models/test_issue.py +36 -0
- tests/regscale/models/test_mapping.py +52 -0
- tests/regscale/models/test_platform.py +31 -0
- tests/regscale/models/test_regscale_model.py +346 -0
- tests/regscale/models/test_report.py +32 -0
- tests/regscale/models/test_tenable_integrations.py +118 -0
- tests/regscale/models/test_user_model.py +121 -0
- tests/regscale/test_about.py +19 -0
- tests/regscale/test_authorization.py +65 -0
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
"""AWS CLI integration module."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import logging
|
|
5
|
+
import os
|
|
6
|
+
from datetime import datetime
|
|
7
|
+
from typing import Optional
|
|
8
|
+
|
|
9
|
+
import click
|
|
10
|
+
|
|
11
|
+
from regscale.models.integration_models.flat_file_importer import FlatFileImporter
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger("regscale")
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@click.group(name="aws")
|
|
17
|
+
def awsv2():
|
|
18
|
+
"""AWS Integrations."""
|
|
19
|
+
pass
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@awsv2.command(name="sync_assets")
|
|
23
|
+
@click.option(
|
|
24
|
+
"--region",
|
|
25
|
+
type=str,
|
|
26
|
+
default=os.environ.get("AWS_REGION", "us-east-1"),
|
|
27
|
+
help="AWS region to collect inventory from",
|
|
28
|
+
)
|
|
29
|
+
@click.option(
|
|
30
|
+
"--regscale_id",
|
|
31
|
+
"--id",
|
|
32
|
+
type=click.INT,
|
|
33
|
+
help="RegScale will create and update assets as children of this record.",
|
|
34
|
+
required=True,
|
|
35
|
+
)
|
|
36
|
+
@click.option(
|
|
37
|
+
"--aws_access_key_id",
|
|
38
|
+
type=str,
|
|
39
|
+
required=False,
|
|
40
|
+
help="AWS access key ID",
|
|
41
|
+
envvar="AWS_ACCESS_KEY_ID",
|
|
42
|
+
)
|
|
43
|
+
@click.option(
|
|
44
|
+
"--aws_secret_access_key",
|
|
45
|
+
type=str,
|
|
46
|
+
required=False,
|
|
47
|
+
help="AWS secret access key",
|
|
48
|
+
default=os.getenv("AWS_SECRET_ACCESS_KEY"),
|
|
49
|
+
)
|
|
50
|
+
@click.option(
|
|
51
|
+
"--aws_session_token",
|
|
52
|
+
type=click.STRING,
|
|
53
|
+
required=False,
|
|
54
|
+
help="AWS Session ID",
|
|
55
|
+
default=os.environ.get("AWS_SESSION_TOKEN"),
|
|
56
|
+
)
|
|
57
|
+
def sync_assets(
|
|
58
|
+
region: str,
|
|
59
|
+
regscale_id: int,
|
|
60
|
+
aws_access_key_id: Optional[str] = None,
|
|
61
|
+
aws_secret_access_key: Optional[str] = None,
|
|
62
|
+
aws_session_token: Optional[str] = None,
|
|
63
|
+
) -> None:
|
|
64
|
+
"""
|
|
65
|
+
Sync AWS resources to RegScale assets.
|
|
66
|
+
|
|
67
|
+
This command collects AWS resources and creates/updates corresponding assets in RegScale:
|
|
68
|
+
- EC2 instances
|
|
69
|
+
- S3 buckets
|
|
70
|
+
- RDS instances
|
|
71
|
+
- Lambda functions
|
|
72
|
+
- DynamoDB tables
|
|
73
|
+
- VPCs and networking resources
|
|
74
|
+
- Container resources
|
|
75
|
+
- And more...
|
|
76
|
+
"""
|
|
77
|
+
try:
|
|
78
|
+
logger.info("Starting AWS asset sync to RegScale...")
|
|
79
|
+
from .scanner import AWSInventoryIntegration
|
|
80
|
+
|
|
81
|
+
scanner = AWSInventoryIntegration(plan_id=regscale_id)
|
|
82
|
+
scanner.sync_assets(
|
|
83
|
+
plan_id=regscale_id,
|
|
84
|
+
region=region,
|
|
85
|
+
aws_access_key_id=aws_access_key_id,
|
|
86
|
+
aws_secret_access_key=aws_secret_access_key,
|
|
87
|
+
aws_session_token=aws_session_token,
|
|
88
|
+
)
|
|
89
|
+
logger.info("AWS asset sync completed successfully.")
|
|
90
|
+
except Exception as e:
|
|
91
|
+
logger.error(f"Error syncing AWS assets: {e}", exc_info=True)
|
|
92
|
+
raise click.ClickException(str(e))
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@awsv2.group()
|
|
96
|
+
def inventory():
|
|
97
|
+
"""AWS resource inventory commands."""
|
|
98
|
+
pass
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
@inventory.command(name="collect")
|
|
102
|
+
@click.option(
|
|
103
|
+
"--region",
|
|
104
|
+
type=str,
|
|
105
|
+
default=os.getenv("AWS_REGION", "us-east-1"),
|
|
106
|
+
help="AWS region to collect inventory from. Default is us-east-1.",
|
|
107
|
+
)
|
|
108
|
+
@click.option(
|
|
109
|
+
"--aws_access_key_id",
|
|
110
|
+
type=str,
|
|
111
|
+
required=False,
|
|
112
|
+
help="AWS access key ID",
|
|
113
|
+
envvar="AWS_ACCESS_KEY_ID",
|
|
114
|
+
)
|
|
115
|
+
@click.option(
|
|
116
|
+
"--aws_secret_access_key",
|
|
117
|
+
type=str,
|
|
118
|
+
required=False,
|
|
119
|
+
help="AWS secret access key",
|
|
120
|
+
envvar="AWS_SECRET_ACCESS_KEY",
|
|
121
|
+
)
|
|
122
|
+
@click.option(
|
|
123
|
+
"--aws_session_token",
|
|
124
|
+
type=click.STRING,
|
|
125
|
+
required=False,
|
|
126
|
+
help="AWS Session ID",
|
|
127
|
+
default=os.environ.get("AWS_SESSION_TOKEN"),
|
|
128
|
+
)
|
|
129
|
+
@click.option(
|
|
130
|
+
"--output",
|
|
131
|
+
type=click.Path(dir_okay=False, writable=True),
|
|
132
|
+
help="Output file path (JSON format)",
|
|
133
|
+
required=False,
|
|
134
|
+
)
|
|
135
|
+
def collect_inventory(
|
|
136
|
+
region: str,
|
|
137
|
+
aws_access_key_id: Optional[str],
|
|
138
|
+
aws_secret_access_key: Optional[str],
|
|
139
|
+
aws_session_token: Optional[str],
|
|
140
|
+
output: Optional[str],
|
|
141
|
+
) -> None:
|
|
142
|
+
"""
|
|
143
|
+
Collect AWS resource inventory.
|
|
144
|
+
|
|
145
|
+
This command collects information about various AWS resources including:
|
|
146
|
+
- EC2 instances
|
|
147
|
+
- S3 buckets
|
|
148
|
+
- RDS instances
|
|
149
|
+
- Lambda functions
|
|
150
|
+
- And more...
|
|
151
|
+
|
|
152
|
+
The inventory can be displayed to stdout or saved to a JSON file.
|
|
153
|
+
"""
|
|
154
|
+
try:
|
|
155
|
+
from .inventory import collect_all_inventory
|
|
156
|
+
from regscale.models import DateTimeEncoder
|
|
157
|
+
|
|
158
|
+
logger.info("Collecting AWS inventory...")
|
|
159
|
+
aws_inventory = collect_all_inventory(
|
|
160
|
+
region=region,
|
|
161
|
+
aws_access_key_id=aws_access_key_id,
|
|
162
|
+
aws_secret_access_key=aws_secret_access_key,
|
|
163
|
+
aws_session_token=aws_session_token,
|
|
164
|
+
)
|
|
165
|
+
logger.info(
|
|
166
|
+
"AWS inventory collected successfully. Received %s resource(s).",
|
|
167
|
+
sum(len(resources) for resources in aws_inventory.values()),
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
if output:
|
|
171
|
+
with open(output, "w") as f:
|
|
172
|
+
json.dump(aws_inventory, f, indent=2, cls=DateTimeEncoder)
|
|
173
|
+
logger.info(f"Inventory saved to {output}")
|
|
174
|
+
else:
|
|
175
|
+
click.echo(json.dumps(aws_inventory, indent=2, cls=DateTimeEncoder))
|
|
176
|
+
|
|
177
|
+
except Exception as e:
|
|
178
|
+
logger.error(f"Error collecting AWS inventory: {e}")
|
|
179
|
+
raise click.ClickException(str(e))
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
@awsv2.group(help="Sync AWS Inspector Scans to RegScale.")
|
|
183
|
+
def inspector():
|
|
184
|
+
"""Sync AWS Inspector scans."""
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
@inspector.command(name="import_scans")
|
|
188
|
+
@FlatFileImporter.common_scanner_options(
|
|
189
|
+
message="File path to the folder containing AWS Inspector files to process to RegScale.",
|
|
190
|
+
prompt="File path for AWS Inspector files (CSV or JSON)",
|
|
191
|
+
import_name="aws_inspector",
|
|
192
|
+
)
|
|
193
|
+
def import_scans(
|
|
194
|
+
folder_path: os.PathLike[str],
|
|
195
|
+
regscale_ssp_id: int,
|
|
196
|
+
scan_date: datetime,
|
|
197
|
+
mappings_path: click.Path,
|
|
198
|
+
disable_mapping: bool,
|
|
199
|
+
s3_bucket: str,
|
|
200
|
+
s3_prefix: str,
|
|
201
|
+
aws_profile: str,
|
|
202
|
+
upload_file: Optional[bool] = True,
|
|
203
|
+
) -> None:
|
|
204
|
+
"""
|
|
205
|
+
Import AWS Inspector scans to a System Security Plan in RegScale as assets and vulnerabilities.
|
|
206
|
+
"""
|
|
207
|
+
import_aws_scans(
|
|
208
|
+
folder_path=folder_path,
|
|
209
|
+
regscale_ssp_id=regscale_ssp_id,
|
|
210
|
+
scan_date=scan_date,
|
|
211
|
+
mappings_path=mappings_path,
|
|
212
|
+
disable_mapping=disable_mapping,
|
|
213
|
+
s3_bucket=s3_bucket,
|
|
214
|
+
s3_prefix=s3_prefix,
|
|
215
|
+
aws_profile=aws_profile,
|
|
216
|
+
upload_file=upload_file,
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def import_aws_scans(
|
|
221
|
+
folder_path: os.PathLike[str],
|
|
222
|
+
regscale_ssp_id: int,
|
|
223
|
+
mappings_path: click.Path,
|
|
224
|
+
scan_date: datetime,
|
|
225
|
+
s3_bucket: str,
|
|
226
|
+
s3_prefix: str,
|
|
227
|
+
aws_profile: str,
|
|
228
|
+
disable_mapping: Optional[bool] = False,
|
|
229
|
+
upload_file: Optional[bool] = True,
|
|
230
|
+
) -> None:
|
|
231
|
+
"""
|
|
232
|
+
Function to import AWS Inspector scans to RegScale as assets and vulnerabilities
|
|
233
|
+
|
|
234
|
+
:param os.PathLike[str] folder_path: Path to the folder containing AWS Inspector files
|
|
235
|
+
:param int regscale_ssp_id: RegScale System Security Plan ID
|
|
236
|
+
:param datetime.date scan_date: Date of the scan
|
|
237
|
+
:param click.Path mappings_path: Path to the header mapping file
|
|
238
|
+
:param str s3_bucket: The S3 bucket to download the files from
|
|
239
|
+
:param str s3_prefix: The S3 prefix to download the files from
|
|
240
|
+
:param str aws_profile: The AWS profile to use for S3 access
|
|
241
|
+
:param bool disable_mapping: Disable header mapping
|
|
242
|
+
:param bool upload_file: Upload the file to RegScale after processing, defaults to True
|
|
243
|
+
:rtype: None
|
|
244
|
+
"""
|
|
245
|
+
from regscale.models.integration_models.amazon_models.inspector_scan import InspectorScan
|
|
246
|
+
|
|
247
|
+
FlatFileImporter.import_files(
|
|
248
|
+
import_type=InspectorScan,
|
|
249
|
+
import_name="AWS Inspector",
|
|
250
|
+
file_types=[".csv", ".json"],
|
|
251
|
+
folder_path=folder_path,
|
|
252
|
+
regscale_ssp_id=regscale_ssp_id,
|
|
253
|
+
scan_date=scan_date,
|
|
254
|
+
mappings_path=mappings_path,
|
|
255
|
+
disable_mapping=disable_mapping,
|
|
256
|
+
s3_bucket=s3_bucket,
|
|
257
|
+
s3_prefix=s3_prefix,
|
|
258
|
+
aws_profile=aws_profile,
|
|
259
|
+
upload_file=upload_file,
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
@awsv2.command(name="sync_findings")
|
|
264
|
+
@click.option(
|
|
265
|
+
"--region",
|
|
266
|
+
type=str,
|
|
267
|
+
default=os.environ.get("AWS_REGION", "us-east-1"),
|
|
268
|
+
help="AWS region to collect inventory from. Default is us-east-1.",
|
|
269
|
+
)
|
|
270
|
+
@click.option(
|
|
271
|
+
"--regscale_id",
|
|
272
|
+
"--id",
|
|
273
|
+
type=click.INT,
|
|
274
|
+
help="RegScale will create and update assets as children of this record.",
|
|
275
|
+
required=True,
|
|
276
|
+
)
|
|
277
|
+
@click.option(
|
|
278
|
+
"--aws_access_key_id",
|
|
279
|
+
type=str,
|
|
280
|
+
required=False,
|
|
281
|
+
help="AWS access key ID",
|
|
282
|
+
envvar="AWS_ACCESS_KEY_ID",
|
|
283
|
+
)
|
|
284
|
+
@click.option(
|
|
285
|
+
"--aws_secret_access_key",
|
|
286
|
+
type=str,
|
|
287
|
+
required=False,
|
|
288
|
+
help="AWS secret access key",
|
|
289
|
+
envvar="AWS_SECRET_ACCESS_KEY",
|
|
290
|
+
)
|
|
291
|
+
@click.option(
|
|
292
|
+
"--aws_session_token",
|
|
293
|
+
type=click.STRING,
|
|
294
|
+
required=False,
|
|
295
|
+
help="AWS Session ID",
|
|
296
|
+
default=os.environ.get("AWS_SESSION_TOKEN"),
|
|
297
|
+
)
|
|
298
|
+
def sync_findings(
|
|
299
|
+
region: str,
|
|
300
|
+
regscale_id: int,
|
|
301
|
+
aws_access_key_id: Optional[str] = None,
|
|
302
|
+
aws_secret_access_key: Optional[str] = None,
|
|
303
|
+
aws_session_token: Optional[str] = None,
|
|
304
|
+
) -> None:
|
|
305
|
+
"""Sync AWS Security Hub Findings."""
|
|
306
|
+
try:
|
|
307
|
+
logger.info("Starting AWS findings sync to RegScale...")
|
|
308
|
+
from .scanner import AWSInventoryIntegration
|
|
309
|
+
|
|
310
|
+
scanner = AWSInventoryIntegration(plan_id=regscale_id)
|
|
311
|
+
scanner.sync_findings(
|
|
312
|
+
plan_id=regscale_id,
|
|
313
|
+
region=region,
|
|
314
|
+
aws_access_key_id=aws_access_key_id,
|
|
315
|
+
aws_secret_access_key=aws_secret_access_key,
|
|
316
|
+
aws_session_token=aws_session_token,
|
|
317
|
+
)
|
|
318
|
+
if not scanner.errors:
|
|
319
|
+
logger.info("AWS finding sync completed successfully.")
|
|
320
|
+
except Exception as e:
|
|
321
|
+
logger.error(f"Error syncing AWS finding(s): {e}", exc_info=True)
|
|
322
|
+
raise click.ClickException(str(e))
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"""AWS resource inventory collection module."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
from typing import Dict, Any, Optional
|
|
5
|
+
|
|
6
|
+
from regscale.integrations.commercial.aws.inventory.base import BaseCollector
|
|
7
|
+
from regscale.integrations.commercial.aws.inventory.resources.compute import ComputeCollector
|
|
8
|
+
from regscale.integrations.commercial.aws.inventory.resources.containers import ContainerCollector
|
|
9
|
+
from regscale.integrations.commercial.aws.inventory.resources.database import DatabaseCollector
|
|
10
|
+
from regscale.integrations.commercial.aws.inventory.resources.integration import IntegrationCollector
|
|
11
|
+
from regscale.integrations.commercial.aws.inventory.resources.networking import NetworkingCollector
|
|
12
|
+
from regscale.integrations.commercial.aws.inventory.resources.security import SecurityCollector
|
|
13
|
+
from regscale.integrations.commercial.aws.inventory.resources.storage import StorageCollector
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class AWSInventoryCollector:
|
|
17
|
+
"""Collects inventory of AWS resources."""
|
|
18
|
+
|
|
19
|
+
def __init__(
|
|
20
|
+
self,
|
|
21
|
+
region: str = os.getenv("AWS_REGION", "us-east-1"),
|
|
22
|
+
aws_access_key_id: Optional[str] = None,
|
|
23
|
+
aws_secret_access_key: Optional[str] = None,
|
|
24
|
+
aws_session_token: Optional[str] = None,
|
|
25
|
+
):
|
|
26
|
+
"""
|
|
27
|
+
Initialize the AWS inventory collector.
|
|
28
|
+
|
|
29
|
+
:param str region: AWS region to collect inventory from
|
|
30
|
+
:param str aws_access_key_id: Optional AWS access key ID
|
|
31
|
+
:param str aws_secret_access_key: Optional AWS secret access key
|
|
32
|
+
:param str aws_session_token: Optional AWS session ID
|
|
33
|
+
"""
|
|
34
|
+
import boto3
|
|
35
|
+
|
|
36
|
+
self.region = region
|
|
37
|
+
self.session = boto3.Session(
|
|
38
|
+
aws_access_key_id=aws_access_key_id,
|
|
39
|
+
aws_secret_access_key=aws_secret_access_key,
|
|
40
|
+
region_name=region,
|
|
41
|
+
aws_session_token=aws_session_token,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
# Initialize collectors
|
|
45
|
+
self.compute = ComputeCollector(self.session, self.region)
|
|
46
|
+
self.storage = StorageCollector(self.session, self.region)
|
|
47
|
+
self.database = DatabaseCollector(self.session, self.region)
|
|
48
|
+
self.networking = NetworkingCollector(self.session, self.region)
|
|
49
|
+
self.security = SecurityCollector(self.session, self.region)
|
|
50
|
+
self.integration = IntegrationCollector(self.session, self.region)
|
|
51
|
+
self.containers = ContainerCollector(self.session, self.region)
|
|
52
|
+
|
|
53
|
+
def collect_all(self) -> Dict[str, Any]:
|
|
54
|
+
"""
|
|
55
|
+
Collect all AWS resources.
|
|
56
|
+
|
|
57
|
+
:return: Dictionary containing all AWS resource information
|
|
58
|
+
:rtype: Dict[str, Any]
|
|
59
|
+
"""
|
|
60
|
+
inventory = {}
|
|
61
|
+
collectors = [
|
|
62
|
+
self.compute,
|
|
63
|
+
self.storage,
|
|
64
|
+
self.database,
|
|
65
|
+
self.networking,
|
|
66
|
+
self.security,
|
|
67
|
+
self.integration,
|
|
68
|
+
self.containers,
|
|
69
|
+
]
|
|
70
|
+
|
|
71
|
+
for collector in collectors:
|
|
72
|
+
try:
|
|
73
|
+
resources = collector.collect()
|
|
74
|
+
inventory.update(resources)
|
|
75
|
+
except Exception as e:
|
|
76
|
+
from regscale.core.app.utils.app_utils import create_logger
|
|
77
|
+
|
|
78
|
+
# Handle or log the exception as needed
|
|
79
|
+
create_logger().error(f"Error collecting resource(s) from {collector.__class__.__name__}: {e}")
|
|
80
|
+
|
|
81
|
+
return inventory
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def collect_all_inventory(
|
|
85
|
+
region: str = os.getenv("AWS_REGION", "us-east-1"),
|
|
86
|
+
aws_access_key_id: Optional[str] = None,
|
|
87
|
+
aws_secret_access_key: Optional[str] = None,
|
|
88
|
+
aws_session_token: Optional[str] = None,
|
|
89
|
+
) -> Dict[str, Any]:
|
|
90
|
+
"""
|
|
91
|
+
Collect inventory of all AWS resources.
|
|
92
|
+
|
|
93
|
+
:param str region: AWS region to collect inventory from
|
|
94
|
+
:param str aws_access_key_id: Optional AWS access key ID
|
|
95
|
+
:param str aws_secret_access_key: Optional AWS secret access key
|
|
96
|
+
:param str aws_session_token: Optional AWS session ID
|
|
97
|
+
:return: Dictionary containing all AWS resource information
|
|
98
|
+
:rtype: Dict[str, Any]
|
|
99
|
+
"""
|
|
100
|
+
collector = AWSInventoryCollector(region, aws_access_key_id, aws_secret_access_key, aws_session_token)
|
|
101
|
+
return collector.collect_all()
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
if __name__ == "__main__":
|
|
105
|
+
collect_all_inventory(
|
|
106
|
+
region="us-east-1",
|
|
107
|
+
aws_access_key_id=os.getenv("AWS_ACCESS_KEY_ID"),
|
|
108
|
+
aws_secret_access_key=os.getenv("AWS_SECRET_ACCESS_KEY"),
|
|
109
|
+
aws_session_token=os.getenv("AWS_SESSION_TOKEN"),
|
|
110
|
+
)
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"""Base classes for AWS resource collection."""
|
|
2
|
+
|
|
3
|
+
import datetime
|
|
4
|
+
import json
|
|
5
|
+
import logging
|
|
6
|
+
from typing import Any, Dict, TYPE_CHECKING
|
|
7
|
+
|
|
8
|
+
from botocore.exceptions import ClientError
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
import boto3
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger("regscale")
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class BaseCollector:
|
|
17
|
+
"""Base class for AWS resource collectors."""
|
|
18
|
+
|
|
19
|
+
def __init__(self, session: "boto3.Session", region: str):
|
|
20
|
+
"""
|
|
21
|
+
Initialize the base collector.
|
|
22
|
+
|
|
23
|
+
:param boto3.Session session: AWS session to use for API calls
|
|
24
|
+
:param str region: AWS region to collect from
|
|
25
|
+
"""
|
|
26
|
+
self.session = session
|
|
27
|
+
self.region = region
|
|
28
|
+
|
|
29
|
+
def _get_client(self, service_name: str) -> Any:
|
|
30
|
+
"""
|
|
31
|
+
Get a boto3 client for the specified service.
|
|
32
|
+
|
|
33
|
+
:param str service_name: Name of the AWS service
|
|
34
|
+
:return: Boto3 client for the service
|
|
35
|
+
:rtype: Any
|
|
36
|
+
"""
|
|
37
|
+
return self.session.client(service_name)
|
|
38
|
+
|
|
39
|
+
def _handle_error(self, error: Exception, resource_type: str) -> None:
|
|
40
|
+
"""
|
|
41
|
+
Handle and log AWS API errors.
|
|
42
|
+
|
|
43
|
+
:param Exception error: The error that occurred
|
|
44
|
+
:param str resource_type: Type of resource being collected
|
|
45
|
+
"""
|
|
46
|
+
if isinstance(error, ClientError):
|
|
47
|
+
if error.response["Error"]["Code"] == "AccessDeniedException":
|
|
48
|
+
logger.warning(f"Access denied to {resource_type} in {self.region}")
|
|
49
|
+
else:
|
|
50
|
+
logger.error(f"Error collecting {resource_type} in {self.region}: {error}")
|
|
51
|
+
logger.debug(error, exc_info=True)
|
|
52
|
+
else:
|
|
53
|
+
logger.error(f"Unexpected error collecting {resource_type} in {self.region}: {error}")
|
|
54
|
+
logger.debug(error, exc_info=True)
|
|
55
|
+
|
|
56
|
+
def collect(self) -> Dict[str, Any]:
|
|
57
|
+
"""
|
|
58
|
+
Collect resources. Must be implemented by subclasses.
|
|
59
|
+
|
|
60
|
+
:return: Dictionary containing resource information
|
|
61
|
+
:rtype: Dict[str, Any]
|
|
62
|
+
:raises NotImplementedError: If not implemented by subclass
|
|
63
|
+
"""
|
|
64
|
+
raise NotImplementedError("Subclasses must implement collect()")
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""AWS resource collectors package."""
|
|
2
|
+
|
|
3
|
+
from .compute import ComputeCollector
|
|
4
|
+
from .storage import StorageCollector
|
|
5
|
+
from .database import DatabaseCollector
|
|
6
|
+
from .networking import NetworkingCollector
|
|
7
|
+
from .security import SecurityCollector
|
|
8
|
+
from .integration import IntegrationCollector
|
|
9
|
+
from .containers import ContainerCollector
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"ComputeCollector",
|
|
13
|
+
"StorageCollector",
|
|
14
|
+
"DatabaseCollector",
|
|
15
|
+
"NetworkingCollector",
|
|
16
|
+
"SecurityCollector",
|
|
17
|
+
"IntegrationCollector",
|
|
18
|
+
"ContainerCollector",
|
|
19
|
+
]
|