cartography 0.93.0rc1__py3-none-any.whl → 0.123.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.
- cartography/__main__.py +1 -2
- cartography/_version.py +34 -0
- cartography/cli.py +903 -225
- cartography/client/aws/__init__.py +19 -0
- cartography/client/aws/ecr.py +51 -0
- cartography/client/core/tx.py +400 -27
- cartography/config.py +215 -10
- cartography/data/azure_permission_relationships.yaml +20 -0
- cartography/data/gcp_permission_relationships.yaml +21 -0
- cartography/data/indexes.cypher +1 -200
- cartography/data/jobs/analysis/aws_ec2_asset_exposure.json +17 -2
- cartography/data/jobs/analysis/aws_ec2_keypair_analysis.json +2 -2
- cartography/data/jobs/analysis/gcp_compute_asset_inet_exposure.json +1 -1
- cartography/data/jobs/analysis/keycloak_inheritance.json +30 -0
- cartography/data/jobs/cleanup/crowdstrike_import_cleanup.json +0 -5
- cartography/data/jobs/cleanup/gcp_compute_vpc_cleanup.json +0 -12
- cartography/data/jobs/cleanup/github_repos_cleanup.json +27 -0
- cartography/data/jobs/scoped_analysis/aws_ec2_iaminstanceprofile.json +15 -0
- cartography/data/jobs/scoped_analysis/semgrep_sca_risk_analysis.json +13 -13
- cartography/driftdetect/__main__.py +1 -2
- cartography/driftdetect/add_shortcut.py +10 -2
- cartography/driftdetect/cli.py +72 -75
- cartography/driftdetect/detect_deviations.py +7 -3
- cartography/driftdetect/get_states.py +20 -8
- cartography/driftdetect/model.py +5 -5
- cartography/driftdetect/serializers.py +8 -6
- cartography/driftdetect/storage.py +2 -2
- cartography/graph/cleanupbuilder.py +255 -35
- cartography/graph/job.py +104 -20
- cartography/graph/querybuilder.py +689 -91
- cartography/graph/statement.py +49 -36
- cartography/intel/airbyte/__init__.py +105 -0
- cartography/intel/airbyte/connections.py +120 -0
- cartography/intel/airbyte/destinations.py +81 -0
- cartography/intel/airbyte/organizations.py +59 -0
- cartography/intel/airbyte/sources.py +78 -0
- cartography/intel/airbyte/tags.py +64 -0
- cartography/intel/airbyte/users.py +106 -0
- cartography/intel/airbyte/util.py +122 -0
- cartography/intel/airbyte/workspaces.py +63 -0
- cartography/intel/analysis.py +4 -1
- cartography/intel/anthropic/__init__.py +62 -0
- cartography/intel/anthropic/apikeys.py +72 -0
- cartography/intel/anthropic/users.py +75 -0
- cartography/intel/anthropic/util.py +51 -0
- cartography/intel/anthropic/workspaces.py +95 -0
- cartography/intel/aws/__init__.py +137 -59
- cartography/intel/aws/acm.py +124 -0
- cartography/intel/aws/apigateway.py +482 -217
- cartography/intel/aws/apigatewayv2.py +116 -0
- cartography/intel/aws/cloudtrail.py +105 -0
- cartography/intel/aws/cloudtrail_management_events.py +962 -0
- cartography/intel/aws/cloudwatch.py +239 -0
- cartography/intel/aws/codebuild.py +132 -0
- cartography/intel/aws/cognito.py +201 -0
- cartography/intel/aws/config.py +63 -23
- cartography/intel/aws/dynamodb.py +108 -40
- cartography/intel/aws/ec2/__init__.py +2 -2
- cartography/intel/aws/ec2/auto_scaling_groups.py +254 -189
- cartography/intel/aws/ec2/elastic_ip_addresses.py +44 -14
- cartography/intel/aws/ec2/images.py +74 -39
- cartography/intel/aws/ec2/instances.py +262 -137
- cartography/intel/aws/ec2/internet_gateways.py +44 -13
- cartography/intel/aws/ec2/key_pairs.py +72 -39
- cartography/intel/aws/ec2/launch_templates.py +143 -66
- cartography/intel/aws/ec2/load_balancer_v2s.py +119 -45
- cartography/intel/aws/ec2/load_balancers.py +165 -147
- cartography/intel/aws/ec2/network_acls.py +233 -0
- cartography/intel/aws/ec2/network_interfaces.py +150 -87
- cartography/intel/aws/ec2/reserved_instances.py +48 -17
- cartography/intel/aws/ec2/route_tables.py +327 -0
- cartography/intel/aws/ec2/security_groups.py +189 -121
- cartography/intel/aws/ec2/snapshots.py +93 -91
- cartography/intel/aws/ec2/subnets.py +70 -58
- cartography/intel/aws/ec2/tgw.py +111 -39
- cartography/intel/aws/ec2/util.py +1 -1
- cartography/intel/aws/ec2/volumes.py +69 -41
- cartography/intel/aws/ec2/vpc.py +157 -116
- cartography/intel/aws/ec2/vpc_peerings.py +317 -121
- cartography/intel/aws/ecr.py +336 -93
- cartography/intel/aws/ecr_image_layers.py +923 -0
- cartography/intel/aws/ecs.py +310 -403
- cartography/intel/aws/efs.py +261 -0
- cartography/intel/aws/eks.py +55 -29
- cartography/intel/aws/elasticache.py +130 -83
- cartography/intel/aws/elasticsearch.py +70 -24
- cartography/intel/aws/emr.py +61 -23
- cartography/intel/aws/eventbridge.py +164 -0
- cartography/intel/aws/glue.py +181 -0
- cartography/intel/aws/guardduty.py +443 -0
- cartography/intel/aws/iam.py +978 -464
- cartography/intel/aws/iam_instance_profiles.py +73 -0
- cartography/intel/aws/identitycenter.py +847 -0
- cartography/intel/aws/inspector.py +330 -133
- cartography/intel/aws/kms.py +235 -209
- cartography/intel/aws/lambda_function.py +328 -176
- cartography/intel/aws/organizations.py +40 -19
- cartography/intel/aws/permission_relationships.py +144 -68
- cartography/intel/aws/rds.py +467 -412
- cartography/intel/aws/redshift.py +116 -50
- cartography/intel/aws/resourcegroupstaggingapi.py +198 -82
- cartography/intel/aws/resources.py +80 -42
- cartography/intel/aws/route53.py +419 -318
- cartography/intel/aws/s3.py +489 -96
- cartography/intel/aws/s3accountpublicaccessblock.py +157 -0
- cartography/intel/aws/secretsmanager.py +217 -40
- cartography/intel/aws/securityhub.py +23 -10
- cartography/intel/aws/sns.py +226 -0
- cartography/intel/aws/sqs.py +74 -96
- cartography/intel/aws/ssm.py +142 -33
- cartography/intel/aws/util/arns.py +7 -7
- cartography/intel/aws/util/common.py +31 -4
- cartography/intel/azure/__init__.py +259 -46
- cartography/intel/azure/aks.py +175 -0
- cartography/intel/azure/app_service.py +105 -0
- cartography/intel/azure/compute.py +141 -120
- cartography/intel/azure/container_instances.py +95 -0
- cartography/intel/azure/cosmosdb.py +706 -519
- cartography/intel/azure/data_factory.py +85 -0
- cartography/intel/azure/data_factory_dataset.py +128 -0
- cartography/intel/azure/data_factory_linked_service.py +119 -0
- cartography/intel/azure/data_factory_pipeline.py +142 -0
- cartography/intel/azure/data_lake.py +124 -0
- cartography/intel/azure/event_grid.py +94 -0
- cartography/intel/azure/functions.py +124 -0
- cartography/intel/azure/load_balancers.py +263 -0
- cartography/intel/azure/logic_apps.py +101 -0
- cartography/intel/azure/monitor.py +105 -0
- cartography/intel/azure/network.py +467 -0
- cartography/intel/azure/permission_relationships.py +466 -0
- cartography/intel/azure/rbac.py +309 -0
- cartography/intel/azure/resource_groups.py +82 -0
- cartography/intel/azure/security_center.py +106 -0
- cartography/intel/azure/sql.py +436 -392
- cartography/intel/azure/storage.py +467 -335
- cartography/intel/azure/subscription.py +49 -55
- cartography/intel/azure/tenant.py +46 -28
- cartography/intel/azure/util/common.py +13 -0
- cartography/intel/azure/util/credentials.py +58 -143
- cartography/intel/azure/util/tag.py +41 -0
- cartography/intel/bigfix/__init__.py +2 -2
- cartography/intel/bigfix/computers.py +93 -65
- cartography/intel/cloudflare/__init__.py +74 -0
- cartography/intel/cloudflare/accounts.py +57 -0
- cartography/intel/cloudflare/dnsrecords.py +64 -0
- cartography/intel/cloudflare/members.py +75 -0
- cartography/intel/cloudflare/roles.py +65 -0
- cartography/intel/cloudflare/zones.py +64 -0
- cartography/intel/create_indexes.py +5 -3
- cartography/intel/crowdstrike/__init__.py +26 -12
- cartography/intel/crowdstrike/endpoints.py +17 -45
- cartography/intel/crowdstrike/spotlight.py +13 -5
- cartography/intel/cve/__init__.py +91 -26
- cartography/intel/cve/feed.py +77 -56
- cartography/intel/digitalocean/__init__.py +22 -13
- cartography/intel/digitalocean/compute.py +75 -108
- cartography/intel/digitalocean/management.py +44 -80
- cartography/intel/digitalocean/platform.py +48 -43
- cartography/intel/dns.py +41 -12
- cartography/intel/duo/__init__.py +21 -16
- cartography/intel/duo/api_host.py +14 -9
- cartography/intel/duo/endpoints.py +50 -45
- cartography/intel/duo/groups.py +18 -14
- cartography/intel/duo/phones.py +37 -34
- cartography/intel/duo/tokens.py +26 -23
- cartography/intel/duo/users.py +54 -50
- cartography/intel/duo/web_authn_credentials.py +30 -25
- cartography/intel/entra/__init__.py +160 -0
- cartography/intel/entra/app_role_assignments.py +284 -0
- cartography/intel/entra/applications.py +182 -0
- cartography/intel/entra/federation/__init__.py +0 -0
- cartography/intel/entra/federation/aws_identity_center.py +77 -0
- cartography/intel/entra/groups.py +198 -0
- cartography/intel/entra/ou.py +136 -0
- cartography/intel/entra/service_principals.py +217 -0
- cartography/intel/entra/users.py +259 -0
- cartography/intel/gcp/__init__.py +381 -175
- cartography/intel/gcp/bigtable_app_profile.py +101 -0
- cartography/intel/gcp/bigtable_backup.py +91 -0
- cartography/intel/gcp/bigtable_cluster.py +93 -0
- cartography/intel/gcp/bigtable_instance.py +86 -0
- cartography/intel/gcp/bigtable_table.py +87 -0
- cartography/intel/gcp/cai.py +292 -0
- cartography/intel/gcp/clients.py +112 -0
- cartography/intel/gcp/compute.py +521 -325
- cartography/intel/gcp/crm/__init__.py +0 -0
- cartography/intel/gcp/crm/folders.py +114 -0
- cartography/intel/gcp/crm/orgs.py +70 -0
- cartography/intel/gcp/crm/projects.py +120 -0
- cartography/intel/gcp/dns.py +134 -179
- cartography/intel/gcp/gke.py +100 -107
- cartography/intel/gcp/iam.py +262 -0
- cartography/intel/gcp/permission_relationships.py +394 -0
- cartography/intel/gcp/policy_bindings.py +225 -0
- cartography/intel/gcp/storage.py +103 -158
- cartography/intel/github/__init__.py +66 -27
- cartography/intel/github/commits.py +423 -0
- cartography/intel/github/repos.py +871 -160
- cartography/intel/github/teams.py +386 -53
- cartography/intel/github/users.py +214 -49
- cartography/intel/github/util.py +50 -35
- cartography/intel/googleworkspace/__init__.py +193 -0
- cartography/intel/googleworkspace/devices.py +254 -0
- cartography/intel/googleworkspace/groups.py +568 -0
- cartography/intel/googleworkspace/oauth_apps.py +259 -0
- cartography/intel/googleworkspace/tenant.py +85 -0
- cartography/intel/googleworkspace/users.py +138 -0
- cartography/intel/gsuite/__init__.py +101 -42
- cartography/intel/gsuite/groups.py +291 -0
- cartography/intel/gsuite/users.py +142 -0
- cartography/intel/jamf/__init__.py +19 -1
- cartography/intel/jamf/computers.py +37 -8
- cartography/intel/jamf/util.py +7 -2
- cartography/intel/kandji/__init__.py +6 -3
- cartography/intel/kandji/devices.py +40 -10
- cartography/intel/keycloak/__init__.py +153 -0
- cartography/intel/keycloak/authenticationexecutions.py +322 -0
- cartography/intel/keycloak/authenticationflows.py +77 -0
- cartography/intel/keycloak/clients.py +187 -0
- cartography/intel/keycloak/groups.py +126 -0
- cartography/intel/keycloak/identityproviders.py +94 -0
- cartography/intel/keycloak/organizations.py +163 -0
- cartography/intel/keycloak/realms.py +61 -0
- cartography/intel/keycloak/roles.py +202 -0
- cartography/intel/keycloak/scopes.py +73 -0
- cartography/intel/keycloak/users.py +70 -0
- cartography/intel/keycloak/util.py +47 -0
- cartography/intel/kubernetes/__init__.py +60 -14
- cartography/intel/kubernetes/clusters.py +86 -0
- cartography/intel/kubernetes/eks.py +402 -0
- cartography/intel/kubernetes/namespaces.py +60 -55
- cartography/intel/kubernetes/pods.py +171 -75
- cartography/intel/kubernetes/rbac.py +597 -0
- cartography/intel/kubernetes/secrets.py +95 -45
- cartography/intel/kubernetes/services.py +131 -63
- cartography/intel/kubernetes/util.py +142 -14
- cartography/intel/lastpass/__init__.py +2 -2
- cartography/intel/lastpass/users.py +23 -12
- cartography/intel/oci/__init__.py +44 -11
- cartography/intel/oci/iam.py +157 -47
- cartography/intel/oci/organizations.py +16 -7
- cartography/intel/oci/utils.py +71 -25
- cartography/intel/okta/__init__.py +66 -15
- cartography/intel/okta/applications.py +57 -25
- cartography/intel/okta/awssaml.py +105 -41
- cartography/intel/okta/factors.py +19 -5
- cartography/intel/okta/groups.py +61 -31
- cartography/intel/okta/organization.py +8 -2
- cartography/intel/okta/origins.py +9 -3
- cartography/intel/okta/roles.py +20 -7
- cartography/intel/okta/users.py +31 -10
- cartography/intel/okta/utils.py +6 -4
- cartography/intel/ontology/__init__.py +44 -0
- cartography/intel/ontology/devices.py +54 -0
- cartography/intel/ontology/users.py +54 -0
- cartography/intel/ontology/utils.py +176 -0
- cartography/intel/openai/__init__.py +86 -0
- cartography/intel/openai/adminapikeys.py +89 -0
- cartography/intel/openai/apikeys.py +96 -0
- cartography/intel/openai/projects.py +97 -0
- cartography/intel/openai/serviceaccounts.py +82 -0
- cartography/intel/openai/users.py +75 -0
- cartography/intel/openai/util.py +45 -0
- cartography/intel/pagerduty/__init__.py +8 -7
- cartography/intel/pagerduty/escalation_policies.py +31 -12
- cartography/intel/pagerduty/schedules.py +21 -8
- cartography/intel/pagerduty/services.py +18 -7
- cartography/intel/pagerduty/teams.py +13 -5
- cartography/intel/pagerduty/users.py +6 -2
- cartography/intel/pagerduty/vendors.py +6 -2
- cartography/intel/scaleway/__init__.py +127 -0
- cartography/intel/scaleway/iam/__init__.py +0 -0
- cartography/intel/scaleway/iam/apikeys.py +71 -0
- cartography/intel/scaleway/iam/applications.py +71 -0
- cartography/intel/scaleway/iam/groups.py +71 -0
- cartography/intel/scaleway/iam/users.py +71 -0
- cartography/intel/scaleway/instances/__init__.py +0 -0
- cartography/intel/scaleway/instances/flexibleips.py +86 -0
- cartography/intel/scaleway/instances/instances.py +92 -0
- cartography/intel/scaleway/projects.py +79 -0
- cartography/intel/scaleway/storage/__init__.py +0 -0
- cartography/intel/scaleway/storage/snapshots.py +86 -0
- cartography/intel/scaleway/storage/volumes.py +84 -0
- cartography/intel/scaleway/utils.py +37 -0
- cartography/intel/semgrep/__init__.py +30 -5
- cartography/intel/semgrep/dependencies.py +255 -0
- cartography/intel/semgrep/deployment.py +69 -0
- cartography/intel/semgrep/findings.py +157 -117
- cartography/intel/sentinelone/__init__.py +75 -0
- cartography/intel/sentinelone/account.py +140 -0
- cartography/intel/sentinelone/agent.py +139 -0
- cartography/intel/sentinelone/api.py +124 -0
- cartography/intel/sentinelone/application.py +248 -0
- cartography/intel/sentinelone/cve.py +119 -0
- cartography/intel/sentinelone/utils.py +28 -0
- cartography/intel/slack/__init__.py +78 -0
- cartography/intel/slack/channels.py +80 -0
- cartography/intel/slack/groups.py +90 -0
- cartography/intel/slack/teams.py +65 -0
- cartography/intel/slack/users.py +57 -0
- cartography/intel/slack/utils.py +29 -0
- cartography/intel/snipeit/__init__.py +44 -0
- cartography/intel/snipeit/asset.py +80 -0
- cartography/intel/snipeit/user.py +78 -0
- cartography/intel/snipeit/util.py +40 -0
- cartography/intel/spacelift/__init__.py +161 -0
- cartography/intel/spacelift/account.py +73 -0
- cartography/intel/spacelift/ec2_ownership.py +280 -0
- cartography/intel/spacelift/runs.py +463 -0
- cartography/intel/spacelift/spaces.py +112 -0
- cartography/intel/spacelift/stacks.py +119 -0
- cartography/intel/spacelift/util.py +122 -0
- cartography/intel/spacelift/workerpools.py +131 -0
- cartography/intel/spacelift/workers.py +128 -0
- cartography/intel/tailscale/__init__.py +77 -0
- cartography/intel/tailscale/acls.py +146 -0
- cartography/intel/tailscale/devices.py +127 -0
- cartography/intel/tailscale/postureintegrations.py +81 -0
- cartography/intel/tailscale/tailnets.py +76 -0
- cartography/intel/tailscale/users.py +80 -0
- cartography/intel/tailscale/utils.py +132 -0
- cartography/intel/trivy/__init__.py +272 -0
- cartography/intel/trivy/scanner.py +386 -0
- cartography/models/airbyte/__init__.py +0 -0
- cartography/models/airbyte/connection.py +138 -0
- cartography/models/airbyte/destination.py +75 -0
- cartography/models/airbyte/organization.py +19 -0
- cartography/models/airbyte/source.py +75 -0
- cartography/models/airbyte/stream.py +74 -0
- cartography/models/airbyte/tag.py +69 -0
- cartography/models/airbyte/user.py +115 -0
- cartography/models/airbyte/workspace.py +46 -0
- cartography/models/anthropic/__init__.py +0 -0
- cartography/models/anthropic/apikey.py +94 -0
- cartography/models/anthropic/organization.py +19 -0
- cartography/models/anthropic/user.py +52 -0
- cartography/models/anthropic/workspace.py +90 -0
- cartography/models/aws/acm/__init__.py +0 -0
- cartography/models/aws/acm/certificate.py +75 -0
- cartography/models/aws/apigateway/__init__.py +0 -0
- cartography/models/aws/apigateway/apigateway.py +51 -0
- cartography/models/aws/apigateway/apigatewaycertificate.py +72 -0
- cartography/models/aws/apigateway/apigatewaydeployment.py +74 -0
- cartography/models/aws/apigateway/apigatewayintegration.py +79 -0
- cartography/models/aws/apigateway/apigatewaymethod.py +74 -0
- cartography/models/aws/apigateway/apigatewayresource.py +70 -0
- cartography/models/aws/apigateway/apigatewaystage.py +75 -0
- cartography/models/aws/apigatewayv2/__init__.py +0 -0
- cartography/models/aws/apigatewayv2/apigatewayv2.py +53 -0
- cartography/models/aws/cloudtrail/__init__.py +0 -0
- cartography/models/aws/cloudtrail/management_events.py +153 -0
- cartography/models/aws/cloudtrail/trail.py +106 -0
- cartography/models/aws/cloudwatch/__init__.py +0 -0
- cartography/models/aws/cloudwatch/log_metric_filter.py +79 -0
- cartography/models/aws/cloudwatch/loggroup.py +52 -0
- cartography/models/aws/cloudwatch/metric_alarm.py +53 -0
- cartography/models/aws/codebuild/__init__.py +0 -0
- cartography/models/aws/codebuild/project.py +49 -0
- cartography/models/aws/cognito/__init__.py +0 -0
- cartography/models/aws/cognito/identity_pool.py +70 -0
- cartography/models/aws/cognito/user_pool.py +47 -0
- cartography/models/aws/dynamodb/gsi.py +30 -22
- cartography/models/aws/dynamodb/tables.py +27 -17
- cartography/models/aws/ec2/auto_scaling_groups.py +224 -0
- cartography/models/aws/ec2/images.py +36 -34
- cartography/models/aws/ec2/instances.py +85 -38
- cartography/models/aws/ec2/keypair.py +59 -0
- cartography/models/aws/ec2/keypair_instance.py +76 -0
- cartography/models/aws/ec2/launch_configurations.py +59 -0
- cartography/models/aws/ec2/launch_template_versions.py +48 -38
- cartography/models/aws/ec2/launch_templates.py +21 -17
- cartography/models/aws/ec2/load_balancer_listeners.py +72 -0
- cartography/models/aws/ec2/load_balancers.py +112 -0
- cartography/models/aws/ec2/network_acl_rules.py +106 -0
- cartography/models/aws/ec2/network_acls.py +95 -0
- cartography/models/aws/ec2/networkinterface_instance.py +52 -39
- cartography/models/aws/ec2/networkinterfaces.py +57 -37
- cartography/models/aws/ec2/privateip_networkinterface.py +32 -22
- cartography/models/aws/ec2/reservations.py +18 -14
- cartography/models/aws/ec2/route_table_associations.py +97 -0
- cartography/models/aws/ec2/route_tables.py +128 -0
- cartography/models/aws/ec2/routes.py +85 -0
- cartography/models/aws/ec2/security_group_rules.py +109 -0
- cartography/models/aws/ec2/security_groups.py +90 -0
- cartography/models/aws/ec2/securitygroup_instance.py +29 -20
- cartography/models/aws/ec2/securitygroup_networkinterface.py +24 -15
- cartography/models/aws/ec2/snapshots.py +58 -0
- cartography/models/aws/ec2/subnet_instance.py +26 -19
- cartography/models/aws/ec2/subnet_networkinterface.py +42 -31
- cartography/models/aws/ec2/subnets.py +65 -0
- cartography/models/aws/ec2/volumes.py +67 -40
- cartography/models/aws/ec2/vpc.py +46 -0
- cartography/models/aws/ec2/vpc_cidr.py +102 -0
- cartography/models/aws/ec2/vpc_peering.py +157 -0
- cartography/models/aws/ecr/__init__.py +0 -0
- cartography/models/aws/ecr/image.py +146 -0
- cartography/models/aws/ecr/image_layer.py +107 -0
- cartography/models/aws/ecr/repository.py +72 -0
- cartography/models/aws/ecr/repository_image.py +95 -0
- cartography/models/aws/ecs/__init__.py +0 -0
- cartography/models/aws/ecs/clusters.py +64 -0
- cartography/models/aws/ecs/container_definitions.py +93 -0
- cartography/models/aws/ecs/container_instances.py +84 -0
- cartography/models/aws/ecs/containers.py +101 -0
- cartography/models/aws/ecs/services.py +134 -0
- cartography/models/aws/ecs/task_definitions.py +135 -0
- cartography/models/aws/ecs/tasks.py +134 -0
- cartography/models/aws/efs/__init__.py +0 -0
- cartography/models/aws/efs/access_point.py +77 -0
- cartography/models/aws/efs/file_system.py +60 -0
- cartography/models/aws/efs/mount_target.py +79 -0
- cartography/models/aws/eks/clusters.py +23 -21
- cartography/models/aws/elasticache/__init__.py +0 -0
- cartography/models/aws/elasticache/cluster.py +65 -0
- cartography/models/aws/elasticache/topic.py +67 -0
- cartography/models/aws/emr.py +32 -30
- cartography/models/aws/eventbridge/__init__.py +0 -0
- cartography/models/aws/eventbridge/rule.py +77 -0
- cartography/models/aws/eventbridge/target.py +71 -0
- cartography/models/aws/glue/__init__.py +0 -0
- cartography/models/aws/glue/connection.py +51 -0
- cartography/models/aws/glue/job.py +69 -0
- cartography/models/aws/guardduty/__init__.py +1 -0
- cartography/models/aws/guardduty/detectors.py +50 -0
- cartography/models/aws/guardduty/findings.py +121 -0
- cartography/models/aws/iam/__init__.py +0 -0
- cartography/models/aws/iam/access_key.py +103 -0
- cartography/models/aws/iam/account_role.py +24 -0
- cartography/models/aws/iam/federated_principal.py +60 -0
- cartography/models/aws/iam/group.py +60 -0
- cartography/models/aws/iam/group_membership.py +27 -0
- cartography/models/aws/iam/inline_policy.py +78 -0
- cartography/models/aws/iam/instanceprofile.py +76 -0
- cartography/models/aws/iam/managed_policy.py +51 -0
- cartography/models/aws/iam/policy_statement.py +57 -0
- cartography/models/aws/iam/role.py +83 -0
- cartography/models/aws/iam/root_principal.py +52 -0
- cartography/models/aws/iam/service_principal.py +30 -0
- cartography/models/aws/iam/sts_assumerole_allow.py +38 -0
- cartography/models/aws/iam/user.py +59 -0
- cartography/models/aws/identitycenter/__init__.py +0 -0
- cartography/models/aws/identitycenter/awsidentitycenter.py +49 -0
- cartography/models/aws/identitycenter/awspermissionset.py +162 -0
- cartography/models/aws/identitycenter/awssogroup.py +70 -0
- cartography/models/aws/identitycenter/awsssouser.py +110 -0
- cartography/models/aws/inspector/findings.py +124 -58
- cartography/models/aws/inspector/packages.py +18 -42
- cartography/models/aws/kms/__init__.py +0 -0
- cartography/models/aws/kms/aliases.py +86 -0
- cartography/models/aws/kms/grants.py +65 -0
- cartography/models/aws/kms/keys.py +88 -0
- cartography/models/aws/lambda_function/__init__.py +0 -0
- cartography/models/aws/lambda_function/alias.py +74 -0
- cartography/models/aws/lambda_function/event_source_mapping.py +88 -0
- cartography/models/aws/lambda_function/lambda_function.py +91 -0
- cartography/models/aws/lambda_function/layer.py +72 -0
- cartography/models/aws/rds/__init__.py +0 -0
- cartography/models/aws/rds/cluster.py +91 -0
- cartography/models/aws/rds/event_subscription.py +146 -0
- cartography/models/aws/rds/instance.py +156 -0
- cartography/models/aws/rds/snapshot.py +108 -0
- cartography/models/aws/rds/subnet_group.py +101 -0
- cartography/models/aws/route53/__init__.py +0 -0
- cartography/models/aws/route53/dnsrecord.py +235 -0
- cartography/models/aws/route53/nameserver.py +63 -0
- cartography/models/aws/route53/subzone.py +40 -0
- cartography/models/aws/route53/zone.py +47 -0
- cartography/models/aws/s3/__init__.py +0 -0
- cartography/models/aws/s3/account_public_access_block.py +51 -0
- cartography/models/aws/s3/notification.py +24 -0
- cartography/models/aws/secretsmanager/__init__.py +0 -0
- cartography/models/aws/secretsmanager/secret.py +106 -0
- cartography/models/aws/secretsmanager/secret_version.py +114 -0
- cartography/models/aws/sns/__init__.py +0 -0
- cartography/models/aws/sns/topic.py +50 -0
- cartography/models/aws/sns/topic_subscription.py +74 -0
- cartography/models/aws/sqs/__init__.py +0 -0
- cartography/models/aws/sqs/queue.py +89 -0
- cartography/models/aws/ssm/instance_information.py +51 -39
- cartography/models/aws/ssm/instance_patch.py +32 -26
- cartography/models/aws/ssm/parameters.py +84 -0
- cartography/models/azure/__init__.py +0 -0
- cartography/models/azure/aks_cluster.py +54 -0
- cartography/models/azure/aks_nodepool.py +54 -0
- cartography/models/azure/app_service.py +59 -0
- cartography/models/azure/container_instance.py +57 -0
- cartography/models/azure/cosmosdb/__init__.py +0 -0
- cartography/models/azure/cosmosdb/account.py +77 -0
- cartography/models/azure/cosmosdb/accountfailoverpolicy.py +77 -0
- cartography/models/azure/cosmosdb/cassandrakeyspace.py +82 -0
- cartography/models/azure/cosmosdb/cassandratable.py +81 -0
- cartography/models/azure/cosmosdb/corspolicy.py +74 -0
- cartography/models/azure/cosmosdb/dblocation.py +120 -0
- cartography/models/azure/cosmosdb/mongodbcollection.py +82 -0
- cartography/models/azure/cosmosdb/mongodbdatabase.py +78 -0
- cartography/models/azure/cosmosdb/privateendpointconnection.py +81 -0
- cartography/models/azure/cosmosdb/sqlcontainer.py +88 -0
- cartography/models/azure/cosmosdb/sqldatabase.py +78 -0
- cartography/models/azure/cosmosdb/tableresource.py +76 -0
- cartography/models/azure/cosmosdb/virtualnetworkrule.py +78 -0
- cartography/models/azure/data_factory/__init__.py +0 -0
- cartography/models/azure/data_factory/data_factory.py +51 -0
- cartography/models/azure/data_factory/data_factory_dataset.py +94 -0
- cartography/models/azure/data_factory/data_factory_linked_service.py +78 -0
- cartography/models/azure/data_factory/data_factory_pipeline.py +93 -0
- cartography/models/azure/data_lake_filesystem.py +51 -0
- cartography/models/azure/event_grid_topic.py +57 -0
- cartography/models/azure/function_app.py +59 -0
- cartography/models/azure/load_balancer/__init__.py +0 -0
- cartography/models/azure/load_balancer/load_balancer.py +49 -0
- cartography/models/azure/load_balancer/load_balancer_backend_pool.py +73 -0
- cartography/models/azure/load_balancer/load_balancer_frontend_ip.py +75 -0
- cartography/models/azure/load_balancer/load_balancer_inbound_nat_rule.py +78 -0
- cartography/models/azure/load_balancer/load_balancer_rule.py +108 -0
- cartography/models/azure/logic_apps.py +56 -0
- cartography/models/azure/monitor.py +54 -0
- cartography/models/azure/network_interface.py +112 -0
- cartography/models/azure/network_security_group.py +50 -0
- cartography/models/azure/permission_relationships.py +60 -0
- cartography/models/azure/principal.py +41 -0
- cartography/models/azure/public_ip_address.py +50 -0
- cartography/models/azure/rbac.py +268 -0
- cartography/models/azure/resource_groups.py +52 -0
- cartography/models/azure/security_center.py +50 -0
- cartography/models/azure/sql/__init__.py +0 -0
- cartography/models/azure/sql/databasethreatdetectionpolicy.py +85 -0
- cartography/models/azure/sql/elasticpool.py +77 -0
- cartography/models/azure/sql/failovergroup.py +73 -0
- cartography/models/azure/sql/recoverabledatabase.py +75 -0
- cartography/models/azure/sql/replicationlink.py +81 -0
- cartography/models/azure/sql/restorabledroppeddatabase.py +82 -0
- cartography/models/azure/sql/restorepoint.py +74 -0
- cartography/models/azure/sql/serveradadministrator.py +74 -0
- cartography/models/azure/sql/serverdnsalias.py +71 -0
- cartography/models/azure/sql/sqldatabase.py +85 -0
- cartography/models/azure/sql/sqlserver.py +50 -0
- cartography/models/azure/sql/transparentdataencryption.py +76 -0
- cartography/models/azure/storage/__init__.py +0 -0
- cartography/models/azure/storage/account.py +59 -0
- cartography/models/azure/storage/blobcontainer.py +85 -0
- cartography/models/azure/storage/blobservice.py +71 -0
- cartography/models/azure/storage/fileservice.py +71 -0
- cartography/models/azure/storage/fileshare.py +82 -0
- cartography/models/azure/storage/queue.py +71 -0
- cartography/models/azure/storage/queueservice.py +73 -0
- cartography/models/azure/storage/table.py +72 -0
- cartography/models/azure/storage/tableservice.py +73 -0
- cartography/models/azure/subnet.py +101 -0
- cartography/models/azure/subscription.py +47 -0
- cartography/models/azure/tags/__init__.py +0 -0
- cartography/models/azure/tags/storage_tag.py +40 -0
- cartography/models/azure/tags/tag.py +37 -0
- cartography/models/azure/tenant.py +17 -0
- cartography/models/azure/virtual_network.py +49 -0
- cartography/models/azure/vm/__init__.py +0 -0
- cartography/models/azure/vm/datadisk.py +80 -0
- cartography/models/azure/vm/disk.py +55 -0
- cartography/models/azure/vm/snapshot.py +56 -0
- cartography/models/azure/vm/virtualmachine.py +59 -0
- cartography/models/bigfix/bigfix_computer.py +42 -38
- cartography/models/bigfix/bigfix_root.py +3 -3
- cartography/models/cloudflare/__init__.py +0 -0
- cartography/models/cloudflare/account.py +25 -0
- cartography/models/cloudflare/dnsrecord.py +55 -0
- cartography/models/cloudflare/member.py +86 -0
- cartography/models/cloudflare/role.py +44 -0
- cartography/models/cloudflare/zone.py +59 -0
- cartography/models/core/common.py +53 -2
- cartography/models/core/nodes.py +20 -4
- cartography/models/core/relationships.py +58 -6
- cartography/models/crowdstrike/__init__.py +0 -0
- cartography/models/crowdstrike/hosts.py +51 -0
- cartography/models/cve/cve.py +34 -32
- cartography/models/cve/cve_feed.py +6 -6
- cartography/models/digitalocean/__init__.py +0 -0
- cartography/models/digitalocean/account.py +21 -0
- cartography/models/digitalocean/droplet.py +58 -0
- cartography/models/digitalocean/project.py +48 -0
- cartography/models/duo/api_host.py +3 -3
- cartography/models/duo/endpoint.py +43 -41
- cartography/models/duo/group.py +14 -14
- cartography/models/duo/phone.py +27 -27
- cartography/models/duo/token.py +16 -16
- cartography/models/duo/user.py +50 -44
- cartography/models/duo/web_authn_credential.py +27 -19
- cartography/models/entra/__init__.py +0 -0
- cartography/models/entra/app_role_assignment.py +115 -0
- cartography/models/entra/application.py +49 -0
- cartography/models/entra/entra_user_to_aws_sso.py +41 -0
- cartography/models/entra/group.py +117 -0
- cartography/models/entra/ou.py +48 -0
- cartography/models/entra/service_principal.py +104 -0
- cartography/models/entra/tenant.py +39 -0
- cartography/models/entra/user.py +90 -0
- cartography/models/gcp/__init__.py +0 -0
- cartography/models/gcp/bigtable/__init__.py +0 -0
- cartography/models/gcp/bigtable/app_profile.py +94 -0
- cartography/models/gcp/bigtable/backup.py +91 -0
- cartography/models/gcp/bigtable/cluster.py +73 -0
- cartography/models/gcp/bigtable/instance.py +52 -0
- cartography/models/gcp/bigtable/table.py +69 -0
- cartography/models/gcp/compute/__init__.py +0 -0
- cartography/models/gcp/compute/subnet.py +74 -0
- cartography/models/gcp/compute/vpc.py +50 -0
- cartography/models/gcp/crm/__init__.py +0 -0
- cartography/models/gcp/crm/folders.py +98 -0
- cartography/models/gcp/crm/organizations.py +21 -0
- cartography/models/gcp/crm/projects.py +100 -0
- cartography/models/gcp/dns.py +109 -0
- cartography/models/gcp/gke.py +69 -0
- cartography/models/gcp/iam.py +73 -0
- cartography/models/gcp/permission_relationships.py +61 -0
- cartography/models/gcp/policy_bindings.py +93 -0
- cartography/models/gcp/storage/__init__.py +0 -0
- cartography/models/gcp/storage/bucket.py +119 -0
- cartography/models/github/commits.py +63 -0
- cartography/models/github/dependencies.py +73 -0
- cartography/models/github/manifests.py +49 -0
- cartography/models/github/orgs.py +27 -0
- cartography/models/github/teams.py +74 -22
- cartography/models/github/users.py +149 -0
- cartography/models/googleworkspace/__init__.py +0 -0
- cartography/models/googleworkspace/device.py +132 -0
- cartography/models/googleworkspace/group.py +382 -0
- cartography/models/googleworkspace/oauth_app.py +124 -0
- cartography/models/googleworkspace/tenant.py +30 -0
- cartography/models/googleworkspace/user.py +113 -0
- cartography/models/gsuite/__init__.py +0 -0
- cartography/models/gsuite/group.py +218 -0
- cartography/models/gsuite/tenant.py +29 -0
- cartography/models/gsuite/user.py +107 -0
- cartography/models/kandji/device.py +22 -17
- cartography/models/kandji/tenant.py +6 -4
- cartography/models/keycloak/__init__.py +0 -0
- cartography/models/keycloak/authenticationexecution.py +160 -0
- cartography/models/keycloak/authenticationflow.py +54 -0
- cartography/models/keycloak/client.py +179 -0
- cartography/models/keycloak/group.py +101 -0
- cartography/models/keycloak/identityprovider.py +89 -0
- cartography/models/keycloak/organization.py +116 -0
- cartography/models/keycloak/organizationdomain.py +73 -0
- cartography/models/keycloak/realm.py +173 -0
- cartography/models/keycloak/role.py +126 -0
- cartography/models/keycloak/scope.py +73 -0
- cartography/models/keycloak/user.py +55 -0
- cartography/models/kubernetes/__init__.py +0 -0
- cartography/models/kubernetes/clusterrolebindings.py +138 -0
- cartography/models/kubernetes/clusterroles.py +52 -0
- cartography/models/kubernetes/clusters.py +26 -0
- cartography/models/kubernetes/containers.py +133 -0
- cartography/models/kubernetes/groups.py +107 -0
- cartography/models/kubernetes/namespaces.py +51 -0
- cartography/models/kubernetes/oidc.py +51 -0
- cartography/models/kubernetes/pods.py +80 -0
- cartography/models/kubernetes/rolebindings.py +159 -0
- cartography/models/kubernetes/roles.py +76 -0
- cartography/models/kubernetes/secrets.py +79 -0
- cartography/models/kubernetes/serviceaccounts.py +77 -0
- cartography/models/kubernetes/services.py +108 -0
- cartography/models/kubernetes/users.py +105 -0
- cartography/models/lastpass/tenant.py +3 -3
- cartography/models/lastpass/user.py +36 -28
- cartography/models/ontology/__init__.py +0 -0
- cartography/models/ontology/device.py +137 -0
- cartography/models/ontology/mapping/__init__.py +76 -0
- cartography/models/ontology/mapping/data/__init__.py +0 -0
- cartography/models/ontology/mapping/data/apikeys.py +93 -0
- cartography/models/ontology/mapping/data/computeinstance.py +95 -0
- cartography/models/ontology/mapping/data/containers.py +88 -0
- cartography/models/ontology/mapping/data/databases.py +182 -0
- cartography/models/ontology/mapping/data/devices.py +194 -0
- cartography/models/ontology/mapping/data/thirdpartyapps.py +140 -0
- cartography/models/ontology/mapping/data/useraccounts.py +416 -0
- cartography/models/ontology/mapping/data/users.py +63 -0
- cartography/models/ontology/mapping/specs.py +85 -0
- cartography/models/ontology/user.py +51 -0
- cartography/models/openai/__init__.py +0 -0
- cartography/models/openai/adminapikey.py +94 -0
- cartography/models/openai/apikey.py +88 -0
- cartography/models/openai/organization.py +17 -0
- cartography/models/openai/project.py +89 -0
- cartography/models/openai/serviceaccount.py +50 -0
- cartography/models/openai/user.py +53 -0
- cartography/models/scaleway/__init__.py +0 -0
- cartography/models/scaleway/iam/__init__.py +0 -0
- cartography/models/scaleway/iam/apikey.py +100 -0
- cartography/models/scaleway/iam/application.py +52 -0
- cartography/models/scaleway/iam/group.py +95 -0
- cartography/models/scaleway/iam/user.py +64 -0
- cartography/models/scaleway/instance/__init__.py +0 -0
- cartography/models/scaleway/instance/flexibleip.py +52 -0
- cartography/models/scaleway/instance/instance.py +120 -0
- cartography/models/scaleway/organization.py +19 -0
- cartography/models/scaleway/project.py +48 -0
- cartography/models/scaleway/storage/__init__.py +0 -0
- cartography/models/scaleway/storage/snapshot.py +78 -0
- cartography/models/scaleway/storage/volume.py +51 -0
- cartography/models/semgrep/dependencies.py +102 -0
- cartography/models/semgrep/deployment.py +5 -5
- cartography/models/semgrep/findings.py +58 -40
- cartography/models/semgrep/locations.py +27 -21
- cartography/models/sentinelone/__init__.py +1 -0
- cartography/models/sentinelone/account.py +40 -0
- cartography/models/sentinelone/agent.py +50 -0
- cartography/models/sentinelone/application.py +44 -0
- cartography/models/sentinelone/application_version.py +96 -0
- cartography/models/sentinelone/cve.py +73 -0
- cartography/models/slack/__init__.py +0 -0
- cartography/models/slack/channels.py +92 -0
- cartography/models/slack/group.py +129 -0
- cartography/models/slack/team.py +22 -0
- cartography/models/slack/user.py +62 -0
- cartography/models/snipeit/__init__.py +0 -0
- cartography/models/snipeit/asset.py +92 -0
- cartography/models/snipeit/tenant.py +19 -0
- cartography/models/snipeit/user.py +60 -0
- cartography/models/spacelift/__init__.py +0 -0
- cartography/models/spacelift/cloudtrailevent.py +120 -0
- cartography/models/spacelift/run.py +162 -0
- cartography/models/spacelift/space.py +131 -0
- cartography/models/spacelift/spaceliftaccount.py +31 -0
- cartography/models/spacelift/spaceliftgitcommit.py +157 -0
- cartography/models/spacelift/stack.py +96 -0
- cartography/models/spacelift/user.py +63 -0
- cartography/models/spacelift/worker.py +97 -0
- cartography/models/spacelift/workerpool.py +90 -0
- cartography/models/tailscale/__init__.py +0 -0
- cartography/models/tailscale/device.py +96 -0
- cartography/models/tailscale/group.py +86 -0
- cartography/models/tailscale/postureintegration.py +58 -0
- cartography/models/tailscale/tag.py +102 -0
- cartography/models/tailscale/tailnet.py +29 -0
- cartography/models/tailscale/user.py +57 -0
- cartography/models/trivy/__init__.py +0 -0
- cartography/models/trivy/findings.py +66 -0
- cartography/models/trivy/fix.py +66 -0
- cartography/models/trivy/package.py +71 -0
- cartography/rules/README.md +1 -0
- cartography/rules/__init__.py +0 -0
- cartography/rules/cli.py +261 -0
- cartography/rules/data/__init__.py +0 -0
- cartography/rules/data/rules/__init__.py +46 -0
- cartography/rules/data/rules/cloud_security_product_deactivated.py +49 -0
- cartography/rules/data/rules/compute_instance_exposed.py +51 -0
- cartography/rules/data/rules/database_instance_exposed.py +53 -0
- cartography/rules/data/rules/delegation_boundary_modifiable.py +90 -0
- cartography/rules/data/rules/identity_administration_privileges.py +100 -0
- cartography/rules/data/rules/inactive_user_active_accounts.py +48 -0
- cartography/rules/data/rules/malicious_npm_dependencies_shai_hulud.py +2222 -0
- cartography/rules/data/rules/mfa_missing.py +46 -0
- cartography/rules/data/rules/object_storage_public.py +100 -0
- cartography/rules/data/rules/policy_administration_privileges.py +104 -0
- cartography/rules/data/rules/unmanaged_accounts.py +43 -0
- cartography/rules/data/rules/workload_identity_admin_capabilities.py +193 -0
- cartography/rules/formatters.py +108 -0
- cartography/rules/runners.py +216 -0
- cartography/rules/spec/__init__.py +0 -0
- cartography/rules/spec/model.py +267 -0
- cartography/rules/spec/result.py +38 -0
- cartography/stats.py +4 -4
- cartography/sync.py +137 -31
- cartography/util.py +187 -77
- cartography-0.123.0.dist-info/METADATA +230 -0
- cartography-0.123.0.dist-info/RECORD +856 -0
- {cartography-0.93.0rc1.dist-info → cartography-0.123.0.dist-info}/WHEEL +1 -1
- {cartography-0.93.0rc1.dist-info → cartography-0.123.0.dist-info}/entry_points.txt +1 -0
- {cartography-0.93.0rc1.dist-info → cartography-0.123.0.dist-info/licenses}/LICENSE +1 -1
- cartography/data/jobs/analysis/aws_ec2_iaminstance.json +0 -10
- cartography/data/jobs/analysis/aws_ec2_iaminstanceprofile.json +0 -10
- cartography/data/jobs/cleanup/aws_apigateway_details.json +0 -10
- cartography/data/jobs/cleanup/aws_dns_cleanup.json +0 -65
- cartography/data/jobs/cleanup/aws_import_account_access_key_cleanup.json +0 -17
- cartography/data/jobs/cleanup/aws_import_apigateway_cleanup.json +0 -45
- cartography/data/jobs/cleanup/aws_import_ec2_security_groupinfo_cleanup.json +0 -24
- cartography/data/jobs/cleanup/aws_import_groups_cleanup.json +0 -13
- cartography/data/jobs/cleanup/aws_import_lambda_cleanup.json +0 -50
- cartography/data/jobs/cleanup/aws_import_principals_cleanup.json +0 -30
- cartography/data/jobs/cleanup/aws_import_rds_clusters_cleanup.json +0 -23
- cartography/data/jobs/cleanup/aws_import_rds_instances_cleanup.json +0 -47
- cartography/data/jobs/cleanup/aws_import_rds_snapshots_cleanup.json +0 -23
- cartography/data/jobs/cleanup/aws_import_roles_cleanup.json +0 -13
- cartography/data/jobs/cleanup/aws_import_secrets_cleanup.json +0 -8
- cartography/data/jobs/cleanup/aws_import_snapshots_cleanup.json +0 -30
- cartography/data/jobs/cleanup/aws_import_users_cleanup.json +0 -8
- cartography/data/jobs/cleanup/aws_import_vpc_cleanup.json +0 -23
- cartography/data/jobs/cleanup/aws_import_vpc_peering_cleanup.json +0 -45
- cartography/data/jobs/cleanup/aws_kms_details.json +0 -10
- cartography/data/jobs/cleanup/azure_cosmosdb_cassandra_keyspace_cleanup.json +0 -25
- cartography/data/jobs/cleanup/azure_cosmosdb_cors_details.json +0 -15
- cartography/data/jobs/cleanup/azure_cosmosdb_mongodb_database_cleanup.json +0 -25
- cartography/data/jobs/cleanup/azure_cosmosdb_sql_database_cleanup.json +0 -25
- cartography/data/jobs/cleanup/azure_cosmosdb_table_resources_cleanup.json +0 -15
- cartography/data/jobs/cleanup/azure_database_account_cleanup.json +0 -85
- cartography/data/jobs/cleanup/azure_import_disks_cleanup.json +0 -15
- cartography/data/jobs/cleanup/azure_import_snapshots_cleanup.json +0 -15
- cartography/data/jobs/cleanup/azure_import_virtual_machines_cleanup.json +0 -25
- cartography/data/jobs/cleanup/azure_sql_server_cleanup.json +0 -125
- cartography/data/jobs/cleanup/azure_storage_account_cleanup.json +0 -95
- cartography/data/jobs/cleanup/azure_subscriptions_cleanup.json +0 -14
- cartography/data/jobs/cleanup/azure_tenant_cleanup.json +0 -9
- cartography/data/jobs/cleanup/crxcavator_import_cleanup.json +0 -18
- cartography/data/jobs/cleanup/gcp_compute_vpc_subnet_cleanup.json +0 -35
- cartography/data/jobs/cleanup/gcp_crm_folder_cleanup.json +0 -23
- cartography/data/jobs/cleanup/gcp_crm_organization_cleanup.json +0 -17
- cartography/data/jobs/cleanup/gcp_crm_project_cleanup.json +0 -23
- cartography/data/jobs/cleanup/gcp_dns_cleanup.json +0 -29
- cartography/data/jobs/cleanup/gcp_gke_cluster_cleanup.json +0 -17
- cartography/data/jobs/cleanup/gcp_storage_bucket_cleanup.json +0 -29
- cartography/data/jobs/cleanup/github_users_cleanup.json +0 -23
- cartography/data/jobs/cleanup/gsuite_ingest_groups_cleanup.json +0 -23
- cartography/data/jobs/cleanup/gsuite_ingest_users_cleanup.json +0 -11
- cartography/data/jobs/cleanup/kubernetes_import_cleanup.json +0 -70
- cartography/intel/crxcavator/__init__.py +0 -44
- cartography/intel/crxcavator/crxcavator.py +0 -329
- cartography/intel/gcp/crm.py +0 -302
- cartography/intel/gsuite/api.py +0 -284
- cartography/models/aws/ec2/keypairs.py +0 -64
- cartography-0.93.0rc1.dist-info/METADATA +0 -55
- cartography-0.93.0rc1.dist-info/NOTICE +0 -4
- cartography-0.93.0rc1.dist-info/RECORD +0 -341
- /cartography/data/jobs/{analysis → scoped_analysis}/aws_s3acl_analysis.json +0 -0
- {cartography-0.93.0rc1.dist-info → cartography-0.123.0.dist-info}/top_level.txt +0 -0
cartography/util.py
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import logging
|
|
3
3
|
import re
|
|
4
|
-
import sys
|
|
5
4
|
from functools import partial
|
|
6
5
|
from functools import wraps
|
|
6
|
+
from importlib.resources import open_binary
|
|
7
|
+
from importlib.resources import read_text
|
|
8
|
+
from itertools import islice
|
|
7
9
|
from string import Template
|
|
8
10
|
from typing import Any
|
|
9
11
|
from typing import Awaitable
|
|
@@ -15,6 +17,7 @@ from typing import Iterable
|
|
|
15
17
|
from typing import List
|
|
16
18
|
from typing import Optional
|
|
17
19
|
from typing import Set
|
|
20
|
+
from typing import Type
|
|
18
21
|
from typing import TypeVar
|
|
19
22
|
from typing import Union
|
|
20
23
|
|
|
@@ -22,32 +25,45 @@ import backoff
|
|
|
22
25
|
import boto3
|
|
23
26
|
import botocore
|
|
24
27
|
import neo4j
|
|
28
|
+
from botocore.exceptions import EndpointConnectionError
|
|
29
|
+
from botocore.parsers import ResponseParserError
|
|
25
30
|
|
|
26
31
|
from cartography.graph.job import GraphJob
|
|
27
32
|
from cartography.graph.statement import get_job_shortname
|
|
28
33
|
from cartography.stats import get_stats_client
|
|
29
34
|
from cartography.stats import ScopedStatsClient
|
|
30
35
|
|
|
36
|
+
logger = logging.getLogger(__name__)
|
|
31
37
|
|
|
32
|
-
if sys.version_info >= (3, 7):
|
|
33
|
-
from importlib.resources import open_binary, read_text
|
|
34
|
-
else:
|
|
35
|
-
from importlib_resources import open_binary, read_text
|
|
36
38
|
|
|
37
|
-
|
|
39
|
+
def is_service_control_policy_explicit_deny(
|
|
40
|
+
error: botocore.exceptions.ClientError,
|
|
41
|
+
) -> bool:
|
|
42
|
+
"""Return True if the ClientError was caused by an explicit service control policy deny."""
|
|
43
|
+
error_code = error.response.get("Error", {}).get("Code")
|
|
44
|
+
if error_code not in {"AccessDenied", "AccessDeniedException"}:
|
|
45
|
+
return False
|
|
46
|
+
|
|
47
|
+
message = error.response.get("Error", {}).get("Message")
|
|
48
|
+
if not message:
|
|
49
|
+
return False
|
|
50
|
+
|
|
51
|
+
lowered = message.lower()
|
|
52
|
+
return "explicit deny" in lowered and "service control policy" in lowered
|
|
38
53
|
|
|
39
54
|
|
|
40
55
|
STATUS_SUCCESS = 0
|
|
41
56
|
STATUS_FAILURE = 1
|
|
42
57
|
STATUS_KEYBOARD_INTERRUPT = 130
|
|
43
58
|
DEFAULT_BATCH_SIZE = 1000
|
|
59
|
+
DEFAULT_MAX_PAGES = 10000
|
|
44
60
|
|
|
45
61
|
|
|
46
62
|
def run_analysis_job(
|
|
47
63
|
filename: str,
|
|
48
64
|
neo4j_session: neo4j.Session,
|
|
49
65
|
common_job_parameters: Dict,
|
|
50
|
-
package: str =
|
|
66
|
+
package: str = "cartography.data.jobs.analysis",
|
|
51
67
|
) -> None:
|
|
52
68
|
"""
|
|
53
69
|
Enriches existing graph data with analysis jobs. This is designed for use with the sync stage
|
|
@@ -69,11 +85,11 @@ def run_analysis_job(
|
|
|
69
85
|
|
|
70
86
|
|
|
71
87
|
def run_analysis_and_ensure_deps(
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
88
|
+
analysis_job_name: str,
|
|
89
|
+
resource_dependencies: Set[str],
|
|
90
|
+
requested_syncs: Set[str],
|
|
91
|
+
common_job_parameters: Dict[str, Any],
|
|
92
|
+
neo4j_session: neo4j.Session,
|
|
77
93
|
) -> None:
|
|
78
94
|
"""
|
|
79
95
|
Runs analysis job only if the given set of resource dependencies was included in the requested_syncs.
|
|
@@ -103,7 +119,7 @@ def run_scoped_analysis_job(
|
|
|
103
119
|
filename: str,
|
|
104
120
|
neo4j_session: neo4j.Session,
|
|
105
121
|
common_job_parameters: Dict,
|
|
106
|
-
package: str =
|
|
122
|
+
package: str = "cartography.data.jobs.scoped_analysis",
|
|
107
123
|
) -> None:
|
|
108
124
|
"""
|
|
109
125
|
Enriches existing graph data scoped to a given sub resource - e.g. the current AWS account.
|
|
@@ -119,8 +135,10 @@ def run_scoped_analysis_job(
|
|
|
119
135
|
|
|
120
136
|
|
|
121
137
|
def run_cleanup_job(
|
|
122
|
-
filename: str,
|
|
123
|
-
|
|
138
|
+
filename: str,
|
|
139
|
+
neo4j_session: neo4j.Session,
|
|
140
|
+
common_job_parameters: Dict,
|
|
141
|
+
package: str = "cartography.data.jobs.cleanup",
|
|
124
142
|
) -> None:
|
|
125
143
|
GraphJob.run_from_json(
|
|
126
144
|
neo4j_session,
|
|
@@ -141,7 +159,7 @@ def merge_module_sync_metadata(
|
|
|
141
159
|
update_tag: int,
|
|
142
160
|
stat_handler: ScopedStatsClient,
|
|
143
161
|
) -> None:
|
|
144
|
-
|
|
162
|
+
"""
|
|
145
163
|
This creates `ModuleSyncMetadata` nodes when called from each of the individual modules or sub-modules.
|
|
146
164
|
The 'types' used here should be actual node labels. For example, if we did sync a particular AWSAccount's S3Buckets,
|
|
147
165
|
the `grouptype` is 'AWSAccount', the `groupid` is the particular account's `id`, and the `syncedtype` is 'S3Bucket'.
|
|
@@ -151,8 +169,12 @@ def merge_module_sync_metadata(
|
|
|
151
169
|
:param group_id: The parent module's id
|
|
152
170
|
:param synced_type: The sub-module's type
|
|
153
171
|
:param update_tag: Timestamp used to determine data freshness
|
|
154
|
-
|
|
155
|
-
|
|
172
|
+
"""
|
|
173
|
+
# Import here to avoid circular import with cartography.client.core.tx
|
|
174
|
+
from cartography.client.core.tx import run_write_query
|
|
175
|
+
|
|
176
|
+
template = Template(
|
|
177
|
+
"""
|
|
156
178
|
MERGE (n:ModuleSyncMetadata{id:'${group_type}_${group_id}_${synced_type}'})
|
|
157
179
|
ON CREATE SET
|
|
158
180
|
n:SyncMetadata, n.firstseen=timestamp()
|
|
@@ -160,20 +182,26 @@ def merge_module_sync_metadata(
|
|
|
160
182
|
n.grouptype='${group_type}',
|
|
161
183
|
n.groupid='${group_id}',
|
|
162
184
|
n.lastupdated=$UPDATE_TAG
|
|
163
|
-
"""
|
|
164
|
-
|
|
165
|
-
|
|
185
|
+
""",
|
|
186
|
+
)
|
|
187
|
+
run_write_query(
|
|
188
|
+
neo4j_session,
|
|
189
|
+
template.safe_substitute(
|
|
190
|
+
group_type=group_type,
|
|
191
|
+
group_id=group_id,
|
|
192
|
+
synced_type=synced_type,
|
|
193
|
+
),
|
|
166
194
|
UPDATE_TAG=update_tag,
|
|
167
195
|
)
|
|
168
|
-
stat_handler.incr(f
|
|
196
|
+
stat_handler.incr(f"{group_type}_{group_id}_{synced_type}_lastupdated", update_tag)
|
|
169
197
|
|
|
170
198
|
|
|
171
199
|
def load_resource_binary(package: str, resource_name: str) -> BinaryIO:
|
|
172
200
|
return open_binary(package, resource_name)
|
|
173
201
|
|
|
174
202
|
|
|
175
|
-
R = TypeVar(
|
|
176
|
-
F = TypeVar(
|
|
203
|
+
R = TypeVar("R")
|
|
204
|
+
F = TypeVar("F", bound=Callable[..., Any])
|
|
177
205
|
|
|
178
206
|
|
|
179
207
|
def timeit(method: F) -> F:
|
|
@@ -182,6 +210,7 @@ def timeit(method: F) -> F:
|
|
|
182
210
|
This is only active if config.statsd_enabled is True.
|
|
183
211
|
:param method: The function to measure execution
|
|
184
212
|
"""
|
|
213
|
+
|
|
185
214
|
# Allow access via `inspect` to the wrapped function. This is used in integration tests to standardize param names.
|
|
186
215
|
@wraps(method)
|
|
187
216
|
def timed(*args, **kwargs): # type: ignore
|
|
@@ -203,42 +232,79 @@ def aws_paginate(
|
|
|
203
232
|
client: boto3.client,
|
|
204
233
|
method_name: str,
|
|
205
234
|
object_name: str,
|
|
235
|
+
max_pages: int | None = DEFAULT_MAX_PAGES,
|
|
206
236
|
**kwargs: Any,
|
|
207
|
-
) ->
|
|
208
|
-
|
|
237
|
+
) -> Iterable[Dict]:
|
|
238
|
+
"""
|
|
209
239
|
Helper method for boilerplate boto3 pagination
|
|
210
240
|
The **kwargs will be forwarded to the paginator
|
|
211
|
-
|
|
241
|
+
"""
|
|
212
242
|
paginator = client.get_paginator(method_name)
|
|
213
|
-
items = []
|
|
214
|
-
i = 0
|
|
215
243
|
for i, page in enumerate(paginator.paginate(**kwargs), start=1):
|
|
216
244
|
if i % 100 == 0:
|
|
217
|
-
logger.info(f
|
|
245
|
+
logger.info(f"fetching page number {i}")
|
|
218
246
|
if object_name in page:
|
|
219
|
-
items
|
|
247
|
+
items = page[object_name]
|
|
248
|
+
yield from items
|
|
220
249
|
else:
|
|
221
250
|
logger.warning(
|
|
222
|
-
f
|
|
223
|
-
If not, then the AWS datatype somehow does not have this key.
|
|
251
|
+
f"""aws_paginate: Key "{object_name}" is not present, check if this is a typo.
|
|
252
|
+
If not, then the AWS datatype somehow does not have this key.""",
|
|
224
253
|
)
|
|
225
|
-
|
|
254
|
+
if max_pages is not None and i >= max_pages:
|
|
255
|
+
logger.warning(f"Reached max batch size of {max_pages} pages")
|
|
256
|
+
break
|
|
226
257
|
|
|
227
258
|
|
|
228
|
-
AWSGetFunc = TypeVar(
|
|
259
|
+
AWSGetFunc = TypeVar("AWSGetFunc", bound=Callable[..., Iterable])
|
|
229
260
|
|
|
230
261
|
# fix for AWS TooManyRequestsException
|
|
231
|
-
# https://github.com/
|
|
232
|
-
# https://github.com/
|
|
233
|
-
# https://github.com/
|
|
234
|
-
# https://github.com/
|
|
262
|
+
# https://github.com/cartography-cncf/cartography/issues/297
|
|
263
|
+
# https://github.com/cartography-cncf/cartography/issues/243
|
|
264
|
+
# https://github.com/cartography-cncf/cartography/issues/65
|
|
265
|
+
# https://github.com/cartography-cncf/cartography/issues/25
|
|
235
266
|
|
|
236
267
|
|
|
237
268
|
def backoff_handler(details: Dict) -> None:
|
|
238
269
|
"""
|
|
239
|
-
Handler that will be executed on exception by backoff mechanism
|
|
270
|
+
Handler that will be executed on exception by backoff mechanism.
|
|
271
|
+
|
|
272
|
+
The backoff library may provide partial details (e.g. ``wait`` can be ``None`` when a
|
|
273
|
+
retry is triggered immediately). Format the message defensively so logging never raises.
|
|
240
274
|
"""
|
|
241
|
-
|
|
275
|
+
wait = details.get("wait")
|
|
276
|
+
if isinstance(wait, (int, float)):
|
|
277
|
+
wait_display = f"{wait:0.1f}"
|
|
278
|
+
elif wait is None:
|
|
279
|
+
wait_display = "unknown"
|
|
280
|
+
else:
|
|
281
|
+
wait_display = str(wait)
|
|
282
|
+
|
|
283
|
+
tries = details.get("tries")
|
|
284
|
+
tries_display = str(tries) if tries is not None else "unknown"
|
|
285
|
+
|
|
286
|
+
target = details.get("target", "<unknown>")
|
|
287
|
+
|
|
288
|
+
logger.warning(
|
|
289
|
+
"Backing off %s seconds after %s tries. Calling function %s",
|
|
290
|
+
wait_display,
|
|
291
|
+
tries_display,
|
|
292
|
+
target,
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
# Error codes that indicate a service is unavailable in a region or blocked by policies
|
|
297
|
+
AWS_REGION_ACCESS_DENIED_ERROR_CODES = [
|
|
298
|
+
"AccessDenied",
|
|
299
|
+
"AccessDeniedException",
|
|
300
|
+
"AuthFailure",
|
|
301
|
+
"AuthorizationError",
|
|
302
|
+
"AuthorizationErrorException",
|
|
303
|
+
"InvalidClientTokenId",
|
|
304
|
+
"UnauthorizedOperation",
|
|
305
|
+
"UnrecognizedClientException",
|
|
306
|
+
"InternalServerErrorException",
|
|
307
|
+
]
|
|
242
308
|
|
|
243
309
|
|
|
244
310
|
# TODO Move this to cartography.intel.aws.util.common
|
|
@@ -252,25 +318,16 @@ def aws_handle_regions(func: AWSGetFunc) -> AWSGetFunc:
|
|
|
252
318
|
|
|
253
319
|
This should be used on `get_` functions that normally return a list of items.
|
|
254
320
|
"""
|
|
255
|
-
ERROR_CODES = [
|
|
256
|
-
'AccessDenied',
|
|
257
|
-
'AccessDeniedException',
|
|
258
|
-
'AuthFailure',
|
|
259
|
-
'InvalidClientTokenId',
|
|
260
|
-
'UnauthorizedOperation',
|
|
261
|
-
'UnrecognizedClientException',
|
|
262
|
-
'InternalServerErrorException',
|
|
263
|
-
]
|
|
264
321
|
|
|
265
322
|
@wraps(func)
|
|
266
323
|
# fix for AWS TooManyRequestsException
|
|
267
|
-
# https://github.com/
|
|
268
|
-
# https://github.com/
|
|
269
|
-
# https://github.com/
|
|
270
|
-
# https://github.com/
|
|
324
|
+
# https://github.com/cartography-cncf/cartography/issues/297
|
|
325
|
+
# https://github.com/cartography-cncf/cartography/issues/243
|
|
326
|
+
# https://github.com/cartography-cncf/cartography/issues/65
|
|
327
|
+
# https://github.com/cartography-cncf/cartography/issues/25
|
|
271
328
|
@backoff.on_exception(
|
|
272
329
|
backoff.expo,
|
|
273
|
-
botocore.exceptions.ClientError,
|
|
330
|
+
(botocore.exceptions.ClientError, ResponseParserError),
|
|
274
331
|
max_time=600,
|
|
275
332
|
on_backoff=backoff_handler,
|
|
276
333
|
)
|
|
@@ -278,16 +335,65 @@ def aws_handle_regions(func: AWSGetFunc) -> AWSGetFunc:
|
|
|
278
335
|
try:
|
|
279
336
|
return func(*args, **kwargs)
|
|
280
337
|
except botocore.exceptions.ClientError as e:
|
|
338
|
+
error_code = e.response.get("Error", {}).get("Code")
|
|
339
|
+
if error_code == "InvalidToken":
|
|
340
|
+
raise RuntimeError(
|
|
341
|
+
"AWS returned an InvalidToken error. Configure regional STS endpoints by "
|
|
342
|
+
"setting environment variable AWS_STS_REGIONAL_ENDPOINTS=regional or adding "
|
|
343
|
+
"'sts_regional_endpoints = regional' to your AWS config file."
|
|
344
|
+
) from e
|
|
281
345
|
# The account is not authorized to use this service in this region
|
|
282
346
|
# so we can continue without raising an exception
|
|
283
|
-
if
|
|
284
|
-
|
|
347
|
+
if error_code in AWS_REGION_ACCESS_DENIED_ERROR_CODES:
|
|
348
|
+
error_message = e.response.get("Error", {}).get("Message")
|
|
349
|
+
if is_service_control_policy_explicit_deny(e):
|
|
350
|
+
logger.warning(
|
|
351
|
+
"Service control policy denied access while calling %s: %s",
|
|
352
|
+
func.__name__,
|
|
353
|
+
error_message,
|
|
354
|
+
)
|
|
355
|
+
else:
|
|
356
|
+
logger.warning(
|
|
357
|
+
"{} in this region. Skipping...".format(
|
|
358
|
+
error_message,
|
|
359
|
+
),
|
|
360
|
+
)
|
|
285
361
|
return []
|
|
286
362
|
else:
|
|
287
363
|
raise
|
|
364
|
+
except EndpointConnectionError:
|
|
365
|
+
logger.warning(
|
|
366
|
+
"Encountered an EndpointConnectionError. This means that the AWS "
|
|
367
|
+
"resource is not available in this region. Skipping.",
|
|
368
|
+
)
|
|
369
|
+
return []
|
|
370
|
+
|
|
288
371
|
return cast(AWSGetFunc, inner_function)
|
|
289
372
|
|
|
290
373
|
|
|
374
|
+
def retries_with_backoff(
|
|
375
|
+
func: Callable,
|
|
376
|
+
exception_type: Type[Exception],
|
|
377
|
+
max_tries: int,
|
|
378
|
+
on_backoff: Callable,
|
|
379
|
+
) -> Callable:
|
|
380
|
+
"""
|
|
381
|
+
Adds retry with backoff to the given function. (Could expand the possible input parameters as needed.)
|
|
382
|
+
"""
|
|
383
|
+
|
|
384
|
+
@wraps(func)
|
|
385
|
+
@backoff.on_exception(
|
|
386
|
+
backoff.expo,
|
|
387
|
+
exception_type,
|
|
388
|
+
max_tries=max_tries,
|
|
389
|
+
on_backoff=on_backoff,
|
|
390
|
+
)
|
|
391
|
+
def inner_function(*args, **kwargs): # type: ignore
|
|
392
|
+
return func(*args, **kwargs)
|
|
393
|
+
|
|
394
|
+
return cast(Callable, inner_function)
|
|
395
|
+
|
|
396
|
+
|
|
291
397
|
def dict_value_to_str(obj: Dict, key: str) -> Optional[str]:
|
|
292
398
|
"""
|
|
293
399
|
Convert the value referenced by the key in the dict to a string, if it exists, and return it. If it doesn't exist,
|
|
@@ -313,32 +419,30 @@ def dict_date_to_epoch(obj: Dict, key: str) -> Optional[int]:
|
|
|
313
419
|
|
|
314
420
|
|
|
315
421
|
def camel_to_snake(name: str) -> str:
|
|
316
|
-
return re.sub(r
|
|
422
|
+
return re.sub(r"(?<!^)(?=[A-Z])", "_", name).lower()
|
|
317
423
|
|
|
318
424
|
|
|
319
|
-
def batch(items: Iterable, size: int = DEFAULT_BATCH_SIZE) -> List[
|
|
320
|
-
|
|
321
|
-
Takes an Iterable of items and returns a
|
|
425
|
+
def batch(items: Iterable, size: int = DEFAULT_BATCH_SIZE) -> Iterable[List[Any]]:
|
|
426
|
+
"""
|
|
427
|
+
Takes an Iterable of items and returns a Generator of lists of the same items,
|
|
322
428
|
batched into chunks of the provided `size`.
|
|
323
429
|
|
|
324
430
|
Use:
|
|
325
431
|
x = [1,2,3,4,5,6,7,8]
|
|
326
|
-
batch(x, size=3) -> [
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
for i in range(0, len(items), size)
|
|
332
|
-
]
|
|
432
|
+
batch(x, size=3) -> Iterator yielding [1, 2, 3], [4, 5, 6], [7, 8]
|
|
433
|
+
"""
|
|
434
|
+
it = iter(items)
|
|
435
|
+
while chunk := list(islice(it, size)):
|
|
436
|
+
yield chunk
|
|
333
437
|
|
|
334
438
|
|
|
335
439
|
def is_throttling_exception(exc: Exception) -> bool:
|
|
336
|
-
|
|
440
|
+
"""
|
|
337
441
|
Returns True if the exception is caused by a client libraries throttling mechanism
|
|
338
|
-
|
|
442
|
+
"""
|
|
339
443
|
# https://boto3.amazonaws.com/v1/documentation/api/1.19.9/guide/error-handling.html
|
|
340
444
|
if isinstance(exc, botocore.exceptions.ClientError):
|
|
341
|
-
if exc.response[
|
|
445
|
+
if exc.response["Error"]["Code"] in ["LimitExceededException", "Throttling"]:
|
|
342
446
|
return True
|
|
343
447
|
# add other exceptions here, if needed, like:
|
|
344
448
|
# https://cloud.google.com/python/docs/reference/storage/1.39.0/retry_timeout#configuring-retries
|
|
@@ -348,7 +452,7 @@ def is_throttling_exception(exc: Exception) -> bool:
|
|
|
348
452
|
|
|
349
453
|
|
|
350
454
|
def to_asynchronous(func: Callable[..., R], *args: Any, **kwargs: Any) -> Awaitable[R]:
|
|
351
|
-
|
|
455
|
+
"""
|
|
352
456
|
Returns a Future that will run a function and its arguments in the default threadpool.
|
|
353
457
|
Helper until we start using python 3.9's asyncio.to_thread
|
|
354
458
|
|
|
@@ -378,8 +482,12 @@ def to_asynchronous(func: Callable[..., R], *args: Any, **kwargs: Any) -> Awaita
|
|
|
378
482
|
NOTE: to use this in a Jupyter notebook, you need to do:
|
|
379
483
|
# import nest_asyncio
|
|
380
484
|
# nest_asyncio.apply()
|
|
381
|
-
|
|
382
|
-
CartographyThrottlingException = type(
|
|
485
|
+
"""
|
|
486
|
+
CartographyThrottlingException = type(
|
|
487
|
+
"CartographyThrottlingException",
|
|
488
|
+
(Exception,),
|
|
489
|
+
{},
|
|
490
|
+
)
|
|
383
491
|
|
|
384
492
|
@wraps(func)
|
|
385
493
|
def wrapper(*args: Any, **kwargs: Any) -> R:
|
|
@@ -391,13 +499,15 @@ def to_asynchronous(func: Callable[..., R], *args: Any, **kwargs: Any) -> Awaita
|
|
|
391
499
|
raise
|
|
392
500
|
|
|
393
501
|
# don't use @backoff as decorator, to preserve typing
|
|
394
|
-
wrapped = backoff.on_exception(backoff.expo, CartographyThrottlingException)(
|
|
502
|
+
wrapped = backoff.on_exception(backoff.expo, CartographyThrottlingException)(
|
|
503
|
+
wrapper,
|
|
504
|
+
)
|
|
395
505
|
call = partial(wrapped, *args, **kwargs)
|
|
396
506
|
return asyncio.get_event_loop().run_in_executor(None, call)
|
|
397
507
|
|
|
398
508
|
|
|
399
509
|
def to_synchronous(*awaitables: Awaitable[Any]) -> List[Any]:
|
|
400
|
-
|
|
510
|
+
"""
|
|
401
511
|
Synchronously waits for the Awaitable(s) to complete and returns their result(s).
|
|
402
512
|
See https://docs.python.org/3.8/library/asyncio-task.html#asyncio-awaitables
|
|
403
513
|
|
|
@@ -419,5 +529,5 @@ def to_synchronous(*awaitables: Awaitable[Any]) -> List[Any]:
|
|
|
419
529
|
future_2 = another_async_func(2)
|
|
420
530
|
|
|
421
531
|
results = to_synchronous(future_1, future_2)
|
|
422
|
-
|
|
532
|
+
"""
|
|
423
533
|
return asyncio.get_event_loop().run_until_complete(asyncio.gather(*awaitables))
|