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,242 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module contains the ThreadSafeDict class, which is a thread-safe dictionary.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from threading import RLock
|
|
6
|
+
from typing import Optional, List, Callable, Iterator, TypeVar, Generic, Dict
|
|
7
|
+
|
|
8
|
+
KT = TypeVar("KT") # Key Type
|
|
9
|
+
VT = TypeVar("VT") # Value Type
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ThreadSafeDict(Generic[KT, VT]):
|
|
13
|
+
"""
|
|
14
|
+
ThreadSafeDict class to create a thread-safe dictionary.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def __init__(self):
|
|
18
|
+
self._dict: Dict[KT, VT] = {}
|
|
19
|
+
self._lock = RLock()
|
|
20
|
+
|
|
21
|
+
def __getitem__(self, key: KT) -> VT:
|
|
22
|
+
"""
|
|
23
|
+
Get a value from the thread-safe dictionary
|
|
24
|
+
|
|
25
|
+
:param KT key: Key to get the value for
|
|
26
|
+
:return: The value from the dictionary
|
|
27
|
+
:rtype: VT
|
|
28
|
+
"""
|
|
29
|
+
with self._lock:
|
|
30
|
+
return self._dict[key]
|
|
31
|
+
|
|
32
|
+
def __setitem__(self, key: KT, value: VT) -> None:
|
|
33
|
+
"""
|
|
34
|
+
Set a value in the thread-safe dictionary
|
|
35
|
+
|
|
36
|
+
:param KT key: Key to set the value for
|
|
37
|
+
:param VT value: Value to set
|
|
38
|
+
:rtype: None
|
|
39
|
+
"""
|
|
40
|
+
with self._lock:
|
|
41
|
+
self._dict[key] = value
|
|
42
|
+
|
|
43
|
+
def __delitem__(self, key: KT) -> None:
|
|
44
|
+
"""
|
|
45
|
+
Delete a key from the thread-safe dictionary
|
|
46
|
+
|
|
47
|
+
:param Any key: Key to delete
|
|
48
|
+
:rtype: None
|
|
49
|
+
"""
|
|
50
|
+
with self._lock:
|
|
51
|
+
del self._dict[key]
|
|
52
|
+
|
|
53
|
+
def get(self, key: KT, default: Optional[VT] = None) -> Optional[VT]:
|
|
54
|
+
"""
|
|
55
|
+
Get a value from the thread-safe dictionary
|
|
56
|
+
|
|
57
|
+
:param Any key: Key to get the value for
|
|
58
|
+
:param Optional[Any] default: Default value to return if the key is not in the dictionary, defaults to None
|
|
59
|
+
:return: The value from the dictionary, if found or the default value
|
|
60
|
+
:rtype: Optional[Any]
|
|
61
|
+
"""
|
|
62
|
+
with self._lock:
|
|
63
|
+
return self._dict.get(key, default)
|
|
64
|
+
|
|
65
|
+
def pop(self, key: KT, default: Optional[VT] = None) -> Optional[VT]:
|
|
66
|
+
"""
|
|
67
|
+
Pop a value from the thread-safe dictionary
|
|
68
|
+
|
|
69
|
+
:param Any key: Key to pop the value for
|
|
70
|
+
:param Optional[Any] default: Default value to return if the key is not in the dictionary, defaults to None
|
|
71
|
+
:return: The value from the dictionary, if found or the default value
|
|
72
|
+
:rtype: Optional[Any]
|
|
73
|
+
"""
|
|
74
|
+
with self._lock:
|
|
75
|
+
return self._dict.pop(key, default)
|
|
76
|
+
|
|
77
|
+
def __contains__(self, key: KT) -> bool:
|
|
78
|
+
"""
|
|
79
|
+
Check if a key is in the thread-safe dictionary
|
|
80
|
+
|
|
81
|
+
:param Any key: Key to check in the dictionary
|
|
82
|
+
:return: Whether the key is in the dictionary
|
|
83
|
+
:rtype: bool
|
|
84
|
+
"""
|
|
85
|
+
with self._lock:
|
|
86
|
+
return key in self._dict
|
|
87
|
+
|
|
88
|
+
def keys(self) -> List[KT]:
|
|
89
|
+
"""
|
|
90
|
+
Get a list of keys from the thread-safe dictionary
|
|
91
|
+
|
|
92
|
+
:return: A list of keys
|
|
93
|
+
:rtype: List[Any]
|
|
94
|
+
"""
|
|
95
|
+
with self._lock:
|
|
96
|
+
return list(self._dict.keys())
|
|
97
|
+
|
|
98
|
+
def values(self) -> List[VT]:
|
|
99
|
+
"""
|
|
100
|
+
Get a list of values from the thread-safe dictionary
|
|
101
|
+
|
|
102
|
+
:return: A list of values
|
|
103
|
+
:rtype: List[Any]
|
|
104
|
+
"""
|
|
105
|
+
with self._lock:
|
|
106
|
+
return list(self._dict.values())
|
|
107
|
+
|
|
108
|
+
def items(self) -> List[tuple]:
|
|
109
|
+
"""
|
|
110
|
+
Get a list of items from the thread-safe dictionary
|
|
111
|
+
|
|
112
|
+
:return: A list of items
|
|
113
|
+
:rtype: List[Any]
|
|
114
|
+
"""
|
|
115
|
+
with self._lock:
|
|
116
|
+
return list(self._dict.items())
|
|
117
|
+
|
|
118
|
+
def clear(self) -> None:
|
|
119
|
+
"""
|
|
120
|
+
Clear the thread-safe dictionary
|
|
121
|
+
|
|
122
|
+
:rtype: None
|
|
123
|
+
"""
|
|
124
|
+
with self._lock:
|
|
125
|
+
self._dict.clear()
|
|
126
|
+
|
|
127
|
+
def update(self, other_dict: Dict[KT, VT]) -> None:
|
|
128
|
+
"""
|
|
129
|
+
Update the thread-safe dictionary with another dictionary
|
|
130
|
+
|
|
131
|
+
:param dict other_dict: Dictionary to update the thread-safe dictionary with
|
|
132
|
+
:rtype: None
|
|
133
|
+
"""
|
|
134
|
+
with self._lock:
|
|
135
|
+
self._dict.update(other_dict)
|
|
136
|
+
|
|
137
|
+
def __len__(self) -> int:
|
|
138
|
+
"""
|
|
139
|
+
Get the length of the thread-safe dictionary
|
|
140
|
+
|
|
141
|
+
:return: The length of the dictionary
|
|
142
|
+
:rtype: int
|
|
143
|
+
"""
|
|
144
|
+
with self._lock:
|
|
145
|
+
return len(self._dict)
|
|
146
|
+
|
|
147
|
+
def __iter__(self) -> Iterator[KT]:
|
|
148
|
+
"""
|
|
149
|
+
Return an iterator over the keys of the dictionary.
|
|
150
|
+
|
|
151
|
+
:return: An iterator over the keys of the dictionary
|
|
152
|
+
:rtype: Iterator[Any]
|
|
153
|
+
"""
|
|
154
|
+
with self._lock:
|
|
155
|
+
# Create a copy of the keys to prevent issues during iteration
|
|
156
|
+
return iter(self._dict.copy())
|
|
157
|
+
|
|
158
|
+
def setdefault(self, key: KT, default: VT = None) -> VT:
|
|
159
|
+
with self._lock:
|
|
160
|
+
return self._dict.setdefault(key, default)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
class ThreadSafeDefaultDict(ThreadSafeDict):
|
|
164
|
+
"""
|
|
165
|
+
ThreadSafeDefaultDict class to create a thread-safe defaultdict.
|
|
166
|
+
"""
|
|
167
|
+
|
|
168
|
+
def __init__(self, default_factory: Optional[Callable[[], VT]] = None):
|
|
169
|
+
"""
|
|
170
|
+
Initialize a ThreadSafeDefaultDict.
|
|
171
|
+
|
|
172
|
+
:param Optional[Callable[[], Any]] default_factory: A callable that returns the default value for missing keys
|
|
173
|
+
"""
|
|
174
|
+
super().__init__()
|
|
175
|
+
if default_factory is not None and not callable(default_factory):
|
|
176
|
+
raise TypeError("default_factory must be callable")
|
|
177
|
+
self.default_factory: Optional[Callable[[], VT]] = default_factory
|
|
178
|
+
|
|
179
|
+
def __getitem__(self, key: KT) -> VT:
|
|
180
|
+
"""
|
|
181
|
+
Get an item from the dictionary, using the default_factory if the key is missing.
|
|
182
|
+
|
|
183
|
+
:param Any key: The key to look up
|
|
184
|
+
:return: The value associated with the key or the default value
|
|
185
|
+
:rtype: Any
|
|
186
|
+
"""
|
|
187
|
+
with self._lock:
|
|
188
|
+
try:
|
|
189
|
+
return self._dict[key]
|
|
190
|
+
except KeyError:
|
|
191
|
+
if self.default_factory is None:
|
|
192
|
+
raise
|
|
193
|
+
else:
|
|
194
|
+
value = self.default_factory()
|
|
195
|
+
self._dict[key] = value
|
|
196
|
+
return value
|
|
197
|
+
|
|
198
|
+
def get(self, key: KT, default: Optional[VT] = None) -> Optional[VT]:
|
|
199
|
+
"""
|
|
200
|
+
Get an item from the dictionary, using the default_factory or provided default if the key is missing.
|
|
201
|
+
|
|
202
|
+
:param Any key: The key to look up
|
|
203
|
+
:param Optional[Any] default: The default value to return if the key is not found and default_factory is None
|
|
204
|
+
:return: The value associated with the key or the default value
|
|
205
|
+
:rtype: Optional[Any]
|
|
206
|
+
"""
|
|
207
|
+
with self._lock:
|
|
208
|
+
if key in self._dict:
|
|
209
|
+
return self._dict[key]
|
|
210
|
+
elif self.default_factory is not None:
|
|
211
|
+
value = self.default_factory()
|
|
212
|
+
self._dict[key] = value
|
|
213
|
+
return value
|
|
214
|
+
else:
|
|
215
|
+
return default
|
|
216
|
+
|
|
217
|
+
def setdefault(self, key: KT, default: Optional[VT] = None) -> VT:
|
|
218
|
+
"""
|
|
219
|
+
Insert key with a value of default if key is not in the dictionary.
|
|
220
|
+
|
|
221
|
+
:param Any key: The key to insert if it doesn't exist
|
|
222
|
+
:param Optional[Any] default: The value to set if the key doesn't exist
|
|
223
|
+
:return: The value for key if key is in the dictionary, else default
|
|
224
|
+
:rtype: Any
|
|
225
|
+
"""
|
|
226
|
+
with self._lock:
|
|
227
|
+
if key in self._dict:
|
|
228
|
+
return self._dict[key]
|
|
229
|
+
else:
|
|
230
|
+
if default is None and self.default_factory is not None:
|
|
231
|
+
default = self.default_factory()
|
|
232
|
+
self._dict[key] = default
|
|
233
|
+
return default
|
|
234
|
+
|
|
235
|
+
def __repr__(self) -> str:
|
|
236
|
+
"""
|
|
237
|
+
Return a string representation of the ThreadSafeDefaultDict.
|
|
238
|
+
|
|
239
|
+
:return: A string representation of the object
|
|
240
|
+
:rtype: str
|
|
241
|
+
"""
|
|
242
|
+
return f"{self.__class__.__name__}({self.default_factory}, {self._dict})"
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This module contains the ThreadSafeList class, which is a thread-safe list.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from threading import RLock
|
|
6
|
+
from typing import Generic, List, Optional, TypeVar
|
|
7
|
+
|
|
8
|
+
T = TypeVar("T") # Declare type variable
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ThreadSafeList(Generic[T]):
|
|
12
|
+
"""
|
|
13
|
+
ThreadSafeList class to create a thread-safe list.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
def __init__(self, initial_list: Optional[List[T]] = None):
|
|
17
|
+
"""
|
|
18
|
+
Initialize a new ThreadSafeList
|
|
19
|
+
|
|
20
|
+
:param List[T]|None initial_list: Optional initial list to populate the ThreadSafeList
|
|
21
|
+
"""
|
|
22
|
+
self._list: List[T] = list(initial_list) if initial_list is not None else []
|
|
23
|
+
self._lock = RLock()
|
|
24
|
+
|
|
25
|
+
def append(self, item: T) -> None:
|
|
26
|
+
"""
|
|
27
|
+
Append an item to the list
|
|
28
|
+
|
|
29
|
+
:param T item: Item to append to the list
|
|
30
|
+
:rtype: None
|
|
31
|
+
"""
|
|
32
|
+
with self._lock:
|
|
33
|
+
self._list.append(item)
|
|
34
|
+
|
|
35
|
+
def __getitem__(self, index: int) -> T:
|
|
36
|
+
"""
|
|
37
|
+
Get an item from the list by index
|
|
38
|
+
|
|
39
|
+
:param int index: Index of the item to get
|
|
40
|
+
:return: The item at the specified index
|
|
41
|
+
:rtype: T
|
|
42
|
+
"""
|
|
43
|
+
with self._lock:
|
|
44
|
+
return self._list[index]
|
|
45
|
+
|
|
46
|
+
def __len__(self) -> int:
|
|
47
|
+
"""
|
|
48
|
+
Get the length of the list
|
|
49
|
+
|
|
50
|
+
:return: The length of the list
|
|
51
|
+
:rtype: int
|
|
52
|
+
"""
|
|
53
|
+
with self._lock:
|
|
54
|
+
return len(self._list)
|
|
55
|
+
|
|
56
|
+
def __iter__(self):
|
|
57
|
+
"""
|
|
58
|
+
Return an iterator over the list
|
|
59
|
+
|
|
60
|
+
:return: An iterator over the list
|
|
61
|
+
:rtype: Iterator[T]
|
|
62
|
+
"""
|
|
63
|
+
with self._lock:
|
|
64
|
+
return iter(self._list.copy())
|
|
65
|
+
|
|
66
|
+
def remove(self, item: T) -> None:
|
|
67
|
+
"""
|
|
68
|
+
Remove an item from the list
|
|
69
|
+
|
|
70
|
+
:param T item: Item to remove from the list
|
|
71
|
+
:rtype: None
|
|
72
|
+
"""
|
|
73
|
+
with self._lock:
|
|
74
|
+
self._list.remove(item)
|
|
75
|
+
|
|
76
|
+
def clear(self) -> None:
|
|
77
|
+
"""
|
|
78
|
+
Clear the list
|
|
79
|
+
|
|
80
|
+
:rtype: None
|
|
81
|
+
"""
|
|
82
|
+
with self._lock:
|
|
83
|
+
self._list.clear()
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"""Version utility functions"""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import re
|
|
5
|
+
from typing import Optional
|
|
6
|
+
from functools import lru_cache
|
|
7
|
+
|
|
8
|
+
from packaging.version import Version
|
|
9
|
+
|
|
10
|
+
from regscale.core.app.utils.api_handler import APIHandler
|
|
11
|
+
from regscale.utils.decorators import classproperty
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class RegscaleVersion:
|
|
17
|
+
"""Utility class for managing and comparing Rescale platform versions"""
|
|
18
|
+
|
|
19
|
+
def __init__(self):
|
|
20
|
+
"""Initialize RegscaleVersion with current platform version"""
|
|
21
|
+
self.current_version = self.get_platform_version()
|
|
22
|
+
|
|
23
|
+
@staticmethod
|
|
24
|
+
@lru_cache(maxsize=1)
|
|
25
|
+
def get_platform_version() -> str:
|
|
26
|
+
"""Fetch the current platform version from the API. Result is cached.
|
|
27
|
+
|
|
28
|
+
:return: Platform version string (e.g. "1.2.3") or special version ("dev", "localdev", "Unknown")
|
|
29
|
+
:rtype: str
|
|
30
|
+
"""
|
|
31
|
+
logger.debug("Fetching platform version using API handler")
|
|
32
|
+
try:
|
|
33
|
+
api_handler = APIHandler()
|
|
34
|
+
response = api_handler.get("/assets/json/version.json")
|
|
35
|
+
if response.status_code == 200:
|
|
36
|
+
version_data = response.json()
|
|
37
|
+
return version_data.get("version", "Unknown")
|
|
38
|
+
else:
|
|
39
|
+
logger.error(f"Failed to fetch version. Status code: {response.status_code}")
|
|
40
|
+
return "dev"
|
|
41
|
+
except Exception as e:
|
|
42
|
+
logger.error(f"Error fetching version: {e}", exc_info=True)
|
|
43
|
+
return "dev"
|
|
44
|
+
|
|
45
|
+
@staticmethod
|
|
46
|
+
def is_valid_version(version: str) -> bool:
|
|
47
|
+
"""Check if a version string matches semantic versioning format (X.Y.Z or X.Y.Z.W).
|
|
48
|
+
|
|
49
|
+
:param str version: Version string to validate
|
|
50
|
+
:return: True if version matches semantic versioning format
|
|
51
|
+
:rtype: bool
|
|
52
|
+
|
|
53
|
+
Examples:
|
|
54
|
+
>>> RegscaleVersion.is_valid_version("1.2.3") # Returns True
|
|
55
|
+
>>> RegscaleVersion.is_valid_version("1.2.3.4") # Returns True
|
|
56
|
+
>>> RegscaleVersion.is_valid_version("1.2") # Returns True
|
|
57
|
+
>>> RegscaleVersion.is_valid_version("1.2.3.4.5") # Returns False
|
|
58
|
+
>>> RegscaleVersion.is_valid_version("1.2.a") # Returns False
|
|
59
|
+
"""
|
|
60
|
+
return bool(re.match(r"^\d+\.\d+(\.\d+)?(\.\d+)?$", version))
|
|
61
|
+
|
|
62
|
+
@staticmethod
|
|
63
|
+
def meets_minimum_version(minimum_version: str, dev_is_latest: bool = True) -> bool:
|
|
64
|
+
"""Check if the given platform version meets or exceeds a minimum version requirement.
|
|
65
|
+
|
|
66
|
+
:param str minimum_version: The minimum version required (e.g. "1.2.3")
|
|
67
|
+
:param bool dev_is_latest: When True, dev is treated as newest version. When False, as oldest.
|
|
68
|
+
:return: True if current platform version is new enough
|
|
69
|
+
:rtype: bool
|
|
70
|
+
|
|
71
|
+
Examples:
|
|
72
|
+
>>> RegscaleVersion.meets_minimum_version("1.0.0") # Returns True if platform version >= 1.0.0
|
|
73
|
+
>>> RegscaleVersion.meets_minimum_version("2.0.0", dev_is_latest=False) # Dev version treated as oldest
|
|
74
|
+
"""
|
|
75
|
+
current_version = RegscaleVersion.get_platform_version()
|
|
76
|
+
return RegscaleVersion.compare_versions(current_version, minimum_version, dev_is_latest)
|
|
77
|
+
|
|
78
|
+
@staticmethod
|
|
79
|
+
def compare_versions(version1: str, version2: str, dev_is_latest: bool = True) -> bool:
|
|
80
|
+
"""Compare two version strings.
|
|
81
|
+
|
|
82
|
+
:param str version1: First version to compare
|
|
83
|
+
:param str version2: Second version to compare
|
|
84
|
+
:param bool dev_is_latest: When True, dev is treated as newest version. When False, as oldest.
|
|
85
|
+
:return: True if version1 >= version2
|
|
86
|
+
:rtype: bool
|
|
87
|
+
"""
|
|
88
|
+
special_value = "9999.9999.9999.9999" if dev_is_latest else "0.0.0.0"
|
|
89
|
+
special_versions = dict.fromkeys(["dev", "localdev", "Unknown"], special_value)
|
|
90
|
+
|
|
91
|
+
# This handles if it is an epic/dev versions as they are normally in the format `BUILDNUMBER-YYYY-MM-DD`
|
|
92
|
+
if "-" in version1:
|
|
93
|
+
version1 = version1.split("-")[0]
|
|
94
|
+
if "-" in version2:
|
|
95
|
+
version2 = version2.split("-")[0]
|
|
96
|
+
|
|
97
|
+
v1 = special_versions.get(version1, version1)
|
|
98
|
+
v2 = special_versions.get(version2, version2)
|
|
99
|
+
|
|
100
|
+
if not RegscaleVersion.is_valid_version(v2):
|
|
101
|
+
logger.info(f"Invalid version {v2}, assuming dev")
|
|
102
|
+
return True
|
|
103
|
+
|
|
104
|
+
return Version(v1) >= Version(v2)
|
|
File without changes
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import ipaddress
|
|
2
|
+
import re
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def validate_ip_address(ip_str: str) -> bool:
|
|
6
|
+
"""Validate IPv4 or IPv6 address
|
|
7
|
+
|
|
8
|
+
:param str ip_str: String to validate
|
|
9
|
+
:return: bool
|
|
10
|
+
:rtype: bool
|
|
11
|
+
"""
|
|
12
|
+
try:
|
|
13
|
+
ipaddress.IPv4Address(ip_str)
|
|
14
|
+
return True
|
|
15
|
+
except ipaddress.AddressValueError:
|
|
16
|
+
try:
|
|
17
|
+
ipaddress.IPv6Address(ip_str)
|
|
18
|
+
return True
|
|
19
|
+
except ipaddress.AddressValueError:
|
|
20
|
+
return False
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def validate_mac_address(mac_address: str) -> bool:
|
|
24
|
+
"""
|
|
25
|
+
Simple validation of a mac address input
|
|
26
|
+
:param str mac_address: mac address
|
|
27
|
+
:return: Whether mac address is valid or not
|
|
28
|
+
:rtype: bool
|
|
29
|
+
"""
|
|
30
|
+
if not mac_address:
|
|
31
|
+
return False
|
|
32
|
+
return bool(
|
|
33
|
+
re.match(
|
|
34
|
+
"[0-9a-f]{2}(:?)[0-9a-f]{2}(\\1[0-9a-f]{2}){4}$",
|
|
35
|
+
mac_address.lower(),
|
|
36
|
+
)
|
|
37
|
+
)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""Rich Logging"""
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
from regscale.core.app.api import Api
|
|
7
|
+
|
|
8
|
+
# standard python imports
|
|
9
|
+
from regscale.core.utils.graphql import GraphQLQuery
|
|
10
|
+
from regscale.models.regscale_models.modules import Modules
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def validate_regscale_object(parent_id: int, parent_module: str) -> bool:
|
|
14
|
+
"""
|
|
15
|
+
Query regscale to confirm the object in question exists.
|
|
16
|
+
|
|
17
|
+
:param int parent_id: The RegScale id to query
|
|
18
|
+
:param str parent_module: The RegScale module to query
|
|
19
|
+
:return: Whether the object exists or not
|
|
20
|
+
:rtype: bool
|
|
21
|
+
"""
|
|
22
|
+
import inflect # Optimize import performance
|
|
23
|
+
|
|
24
|
+
api = Api()
|
|
25
|
+
query = GraphQLQuery()
|
|
26
|
+
query.start_query()
|
|
27
|
+
result = False
|
|
28
|
+
mods = Modules()
|
|
29
|
+
p = inflect.engine()
|
|
30
|
+
for (
|
|
31
|
+
key,
|
|
32
|
+
val,
|
|
33
|
+
) in mods.dict().items(): # for name, age in dictionary.iteritems(): (for Python 2.x)
|
|
34
|
+
if val.lower() == parent_module.lower():
|
|
35
|
+
mod_lookup = p.plural(key)
|
|
36
|
+
query.add_query(
|
|
37
|
+
entity=mod_lookup,
|
|
38
|
+
items=[
|
|
39
|
+
"id",
|
|
40
|
+
],
|
|
41
|
+
where={"id": {"eq": parent_id}},
|
|
42
|
+
)
|
|
43
|
+
query.end_query()
|
|
44
|
+
|
|
45
|
+
dat = api.graph(query=query.build())
|
|
46
|
+
if mod_lookup.lower() in [k.lower() for k in dat.keys()] and dat[list(dat.keys())[0]]["totalCount"] > 0:
|
|
47
|
+
result = True
|
|
48
|
+
return result
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""Generate a click group object."""
|
|
2
|
+
|
|
3
|
+
import matplotlib.pyplot as plt
|
|
4
|
+
import networkx as nx
|
|
5
|
+
|
|
6
|
+
from regscale.models.click_models import ClickGroup, ClickCommand
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def plot_click_group(group: ClickGroup):
|
|
10
|
+
G = nx.DiGraph()
|
|
11
|
+
|
|
12
|
+
def add_node(cmd, parent=None):
|
|
13
|
+
G.add_node(cmd.name)
|
|
14
|
+
if parent is not None:
|
|
15
|
+
G.add_edge(parent.name, cmd.name)
|
|
16
|
+
if isinstance(cmd, ClickCommand):
|
|
17
|
+
for param in cmd.params:
|
|
18
|
+
G.add_node(param.name)
|
|
19
|
+
G.add_edge(cmd.name, param.name)
|
|
20
|
+
elif isinstance(cmd, ClickGroup):
|
|
21
|
+
for subcmd in cmd.commands:
|
|
22
|
+
add_node(subcmd, cmd)
|
|
23
|
+
|
|
24
|
+
add_node(group)
|
|
25
|
+
nx.draw(G, with_labels=True)
|
|
26
|
+
plt.show()
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
if __name__ == "__main__":
|
|
30
|
+
from regscale.regscale import cli
|
|
31
|
+
|
|
32
|
+
click_group = ClickGroup.from_group(cli, include_callback=True)
|
|
33
|
+
print(click_group.json())
|
|
34
|
+
plot_click_group(click_group)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2021 RegScale Corporation
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|