cartography 0.95.0rc1__tar.gz → 0.96.0rc1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cartography might be problematic. Click here for more details.
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/PKG-INFO +1 -1
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/README.md +1 -2
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/graph/querybuilder.py +4 -0
- cartography-0.96.0rc1/cartography/intel/aws/ec2/network_acls.py +208 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/resources.py +2 -0
- cartography-0.96.0rc1/cartography/intel/semgrep/__init__.py +30 -0
- cartography-0.96.0rc1/cartography/intel/semgrep/dependencies.py +201 -0
- cartography-0.96.0rc1/cartography/intel/semgrep/deployment.py +67 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/semgrep/findings.py +22 -53
- cartography-0.96.0rc1/cartography/models/aws/ec2/network_acl_rules.py +97 -0
- cartography-0.96.0rc1/cartography/models/aws/ec2/network_acls.py +86 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/core/common.py +18 -1
- cartography-0.96.0rc1/cartography/models/semgrep/dependencies.py +77 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography.egg-info/PKG-INFO +1 -1
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography.egg-info/SOURCES.txt +6 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/setup.py +1 -1
- cartography-0.95.0rc1/cartography/intel/semgrep/__init__.py +0 -23
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/LICENSE +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/__main__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/cli.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/client/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/client/aws/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/client/aws/iam.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/client/core/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/client/core/tx.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/config.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/indexes.cypher +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/analysis/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/analysis/aws_ec2_asset_exposure.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/analysis/aws_ec2_iaminstance.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/analysis/aws_ec2_iaminstanceprofile.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/analysis/aws_ec2_keypair_analysis.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/analysis/aws_eks_asset_exposure.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/analysis/aws_foreign_accounts.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/analysis/aws_lambda_ecr.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/analysis/aws_s3acl_analysis.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/analysis/gcp_compute_asset_inet_exposure.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/analysis/gcp_gke_asset_exposure.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/analysis/gcp_gke_basic_auth.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/analysis/gsuite_human_link.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_account_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_apigateway_details.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_dns_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_account_access_key_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_apigateway_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_config_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_ec2_launch_configurations_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_ec2_security_groupinfo_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_ecr_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_ecs_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_elastic_ip_addresses_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_elasticache_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_es_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_groups_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_groups_membership_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_groups_policy_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_internet_gateways_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_kms_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_lambda_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_principals_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_rds_clusters_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_rds_instances_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_rds_snapshots_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_redshift_clusters_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_reserved_instances_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_roles_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_roles_policy_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_s3_acl_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_s3_buckets_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_secrets_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_securityhub_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_snapshots_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_sqs_queues_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_tags_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_tgw_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_users_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_vpc_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_import_vpc_peering_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_ingest_ec2_auto_scaling_groups_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_ingest_load_balancers_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_ingest_load_balancers_v2_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_ingest_subnets_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_kms_details.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_post_ingestion_principals_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/aws_s3_details.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/azure_cosmosdb_cassandra_keyspace_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/azure_cosmosdb_cors_details.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/azure_cosmosdb_mongodb_database_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/azure_cosmosdb_sql_database_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/azure_cosmosdb_table_resources_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/azure_database_account_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/azure_import_disks_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/azure_import_snapshots_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/azure_import_virtual_machines_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/azure_sql_server_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/azure_storage_account_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/azure_subscriptions_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/azure_tenant_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/crowdstrike_import_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/digitalocean_droplet_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/digitalocean_project_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/gcp_compute_firewall_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/gcp_compute_forwarding_rules_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/gcp_compute_instance_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/gcp_compute_vpc_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/gcp_compute_vpc_subnet_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/gcp_crm_folder_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/gcp_crm_organization_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/gcp_crm_project_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/gcp_dns_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/gcp_gke_cluster_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/gcp_storage_bucket_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/github_repos_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/github_users_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/gsuite_ingest_groups_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/gsuite_ingest_users_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/jamf_import_computers_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/kubernetes_import_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/oci_import_compartments_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/oci_import_groups_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/oci_import_groups_membership_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/oci_import_policies_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/oci_import_users_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/oci_tenancy_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/okta_groups_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/okta_import_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/cleanup/pagerduty_import_cleanup.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/scoped_analysis/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/jobs/scoped_analysis/semgrep_sca_risk_analysis.json +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/data/permission_relationships.yaml +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/driftdetect/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/driftdetect/__main__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/driftdetect/add_shortcut.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/driftdetect/cli.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/driftdetect/config.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/driftdetect/detect_deviations.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/driftdetect/get_states.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/driftdetect/model.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/driftdetect/reporter.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/driftdetect/serializers.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/driftdetect/shortcut.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/driftdetect/storage.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/driftdetect/util.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/graph/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/graph/cleanupbuilder.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/graph/context.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/graph/job.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/graph/statement.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/analysis.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/apigateway.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/config.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/dynamodb.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ec2/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ec2/auto_scaling_groups.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ec2/elastic_ip_addresses.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ec2/images.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ec2/instances.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ec2/internet_gateways.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ec2/key_pairs.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ec2/launch_templates.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ec2/load_balancer_v2s.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ec2/load_balancers.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ec2/network_interfaces.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ec2/reserved_instances.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ec2/security_groups.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ec2/snapshots.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ec2/subnets.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ec2/tgw.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ec2/util.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ec2/volumes.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ec2/vpc.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ec2/vpc_peerings.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ecr.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ecs.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/eks.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/elasticache.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/elasticsearch.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/emr.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/iam.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/inspector.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/kms.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/lambda_function.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/organizations.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/permission_relationships.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/rds.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/redshift.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/resourcegroupstaggingapi.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/route53.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/s3.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/secretsmanager.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/securityhub.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/sqs.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/ssm.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/util/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/util/arns.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/aws/util/common.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/azure/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/azure/compute.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/azure/cosmosdb.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/azure/sql.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/azure/storage.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/azure/subscription.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/azure/tenant.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/azure/util/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/azure/util/credentials.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/bigfix/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/bigfix/computers.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/create_indexes.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/crowdstrike/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/crowdstrike/endpoints.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/crowdstrike/spotlight.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/crowdstrike/util.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/cve/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/cve/feed.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/digitalocean/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/digitalocean/compute.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/digitalocean/management.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/digitalocean/platform.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/dns.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/duo/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/duo/api_host.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/duo/endpoints.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/duo/groups.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/duo/phones.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/duo/tokens.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/duo/users.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/duo/web_authn_credentials.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/gcp/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/gcp/compute.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/gcp/crm.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/gcp/dns.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/gcp/gke.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/gcp/storage.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/github/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/github/repos.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/github/teams.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/github/users.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/github/util.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/gsuite/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/gsuite/api.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/jamf/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/jamf/computers.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/jamf/util.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/kandji/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/kandji/devices.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/kubernetes/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/kubernetes/namespaces.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/kubernetes/pods.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/kubernetes/secrets.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/kubernetes/services.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/kubernetes/util.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/lastpass/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/lastpass/users.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/oci/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/oci/iam.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/oci/organizations.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/oci/utils.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/okta/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/okta/applications.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/okta/awssaml.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/okta/factors.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/okta/groups.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/okta/organization.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/okta/origins.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/okta/roles.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/okta/sync_state.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/okta/users.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/okta/utils.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/pagerduty/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/pagerduty/escalation_policies.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/pagerduty/schedules.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/pagerduty/services.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/pagerduty/teams.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/pagerduty/users.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/pagerduty/vendors.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/snipeit/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/snipeit/asset.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/snipeit/user.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/intel/snipeit/util.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/dynamodb/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/dynamodb/gsi.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/dynamodb/tables.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/ec2/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/ec2/images.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/ec2/instances.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/ec2/keypairs.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/ec2/launch_template_versions.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/ec2/launch_templates.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/ec2/loadbalancerv2.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/ec2/networkinterface_instance.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/ec2/networkinterfaces.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/ec2/privateip_networkinterface.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/ec2/reservations.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/ec2/securitygroup_instance.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/ec2/securitygroup_networkinterface.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/ec2/subnet_instance.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/ec2/subnet_networkinterface.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/ec2/volumes.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/eks/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/eks/clusters.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/emr.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/inspector/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/inspector/findings.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/inspector/packages.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/ssm/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/ssm/instance_information.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/aws/ssm/instance_patch.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/bigfix/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/bigfix/bigfix_computer.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/bigfix/bigfix_root.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/core/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/core/nodes.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/core/relationships.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/cve/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/cve/cve.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/cve/cve_feed.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/duo/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/duo/api_host.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/duo/endpoint.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/duo/group.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/duo/phone.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/duo/token.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/duo/user.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/duo/web_authn_credential.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/github/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/github/teams.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/kandji/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/kandji/device.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/kandji/tenant.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/lastpass/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/lastpass/tenant.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/lastpass/user.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/semgrep/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/semgrep/deployment.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/semgrep/findings.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/semgrep/locations.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/snipeit/__init__.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/snipeit/asset.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/snipeit/tenant.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/models/snipeit/user.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/py.typed +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/stats.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/sync.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography/util.py +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography.egg-info/dependency_links.txt +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography.egg-info/entry_points.txt +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography.egg-info/requires.txt +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/cartography.egg-info/top_level.txt +0 -0
- {cartography-0.95.0rc1 → cartography-0.96.0rc1}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: cartography
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.96.0rc1
|
|
4
4
|
Summary: Explore assets and their relationships across your technical infrastructure.
|
|
5
5
|
Home-page: https://www.github.com/cartography-cncf/cartography
|
|
6
6
|
Maintainer: Cartography Contributors
|
|
@@ -80,11 +80,10 @@ Directly querying Neo4j is already very useful as a sort of "swiss army knife" f
|
|
|
80
80
|
|
|
81
81
|
## Community
|
|
82
82
|
|
|
83
|
-
-
|
|
83
|
+
- Hang out with us on Slack: Join the CNCF Slack workspace [here](https://communityinviter.com/apps/cloud-native/cncf), and then join the `#cartography` channel.
|
|
84
84
|
- Talk to us and see what we're working on at our [monthly community meeting](https://calendar.google.com/calendar/embed?src=lyft.com_p10o6ceuiieq9sqcn1ef61v1io%40group.calendar.google.com&ctz=America%2FLos_Angeles).
|
|
85
85
|
- Meeting minutes are [here](https://docs.google.com/document/d/1VyRKmB0dpX185I15BmNJZpfAJ_Ooobwz0U1WIhjDxvw).
|
|
86
86
|
- Recorded videos are posted [here](https://www.youtube.com/playlist?list=PLMga2YJvAGzidUWJB_fnG7EHI4wsDDsE1).
|
|
87
|
-
- Our current project roadmap is [here](https://github.com/orgs/lyft/projects/26/views/1).
|
|
88
87
|
|
|
89
88
|
## License
|
|
90
89
|
|
|
@@ -118,6 +118,7 @@ def _build_where_clause_for_rel_match(node_var: str, matcher: TargetNodeMatcher)
|
|
|
118
118
|
"""
|
|
119
119
|
match = Template("$node_var.$key = $prop_ref")
|
|
120
120
|
case_insensitive_match = Template("toLower($node_var.$key) = toLower($prop_ref)")
|
|
121
|
+
fuzzy_and_ignorecase_match = Template("toLower($node_var.$key) CONTAINS toLower($prop_ref)")
|
|
121
122
|
|
|
122
123
|
matcher_asdict = asdict(matcher)
|
|
123
124
|
|
|
@@ -125,7 +126,10 @@ def _build_where_clause_for_rel_match(node_var: str, matcher: TargetNodeMatcher)
|
|
|
125
126
|
for key, prop_ref in matcher_asdict.items():
|
|
126
127
|
if prop_ref.ignore_case:
|
|
127
128
|
prop_line = case_insensitive_match.safe_substitute(node_var=node_var, key=key, prop_ref=prop_ref)
|
|
129
|
+
elif prop_ref.fuzzy_and_ignore_case:
|
|
130
|
+
prop_line = fuzzy_and_ignorecase_match.safe_substitute(node_var=node_var, key=key, prop_ref=prop_ref)
|
|
128
131
|
else:
|
|
132
|
+
# Exact match (default; most efficient)
|
|
129
133
|
prop_line = match.safe_substitute(node_var=node_var, key=key, prop_ref=prop_ref)
|
|
130
134
|
result.append(prop_line)
|
|
131
135
|
return ' AND\n'.join(result)
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from collections import namedtuple
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
import boto3
|
|
6
|
+
import neo4j
|
|
7
|
+
|
|
8
|
+
from .util import get_botocore_config
|
|
9
|
+
from cartography.client.core.tx import load
|
|
10
|
+
from cartography.graph.job import GraphJob
|
|
11
|
+
from cartography.models.aws.ec2.network_acl_rules import EC2NetworkAclEgressRuleSchema
|
|
12
|
+
from cartography.models.aws.ec2.network_acl_rules import EC2NetworkAclInboundRuleSchema
|
|
13
|
+
from cartography.models.aws.ec2.network_acls import EC2NetworkAclSchema
|
|
14
|
+
from cartography.util import aws_handle_regions
|
|
15
|
+
from cartography.util import timeit
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
Ec2AclObjects = namedtuple(
|
|
20
|
+
"Ec2AclObjects", [
|
|
21
|
+
'network_acls',
|
|
22
|
+
'inbound_rules',
|
|
23
|
+
'outbound_rules',
|
|
24
|
+
],
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@timeit
|
|
29
|
+
@aws_handle_regions
|
|
30
|
+
def get_network_acl_data(boto3_session: boto3.session.Session, region: str) -> list[dict[str, Any]]:
|
|
31
|
+
client = boto3_session.client('ec2', region_name=region, config=get_botocore_config())
|
|
32
|
+
paginator = client.get_paginator('describe_network_acls')
|
|
33
|
+
acls = []
|
|
34
|
+
for page in paginator.paginate():
|
|
35
|
+
acls.extend(page['NetworkAcls'])
|
|
36
|
+
return acls
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def transform_network_acl_data(
|
|
40
|
+
data_list: list[dict[str, Any]],
|
|
41
|
+
region: str,
|
|
42
|
+
current_aws_account_id: str,
|
|
43
|
+
) -> Ec2AclObjects:
|
|
44
|
+
network_acls = []
|
|
45
|
+
inbound_rules = []
|
|
46
|
+
outbound_rules = []
|
|
47
|
+
|
|
48
|
+
for network_acl in data_list:
|
|
49
|
+
network_acl_id = network_acl['NetworkAclId']
|
|
50
|
+
base_network_acl = {
|
|
51
|
+
'Id': network_acl_id,
|
|
52
|
+
'Arn': f'arn:aws:ec2:{region}:{current_aws_account_id}:network-acl/{network_acl_id}',
|
|
53
|
+
'IsDefault': network_acl['IsDefault'],
|
|
54
|
+
'VpcId': network_acl['VpcId'],
|
|
55
|
+
'OwnerId': network_acl['OwnerId'],
|
|
56
|
+
}
|
|
57
|
+
if network_acl.get('Associations') and network_acl['Associations']:
|
|
58
|
+
# Include subnet associations in the data object if they exist
|
|
59
|
+
for association in network_acl['Associations']:
|
|
60
|
+
base_network_acl['NetworkAclAssociationId'] = association['NetworkAclAssociationId']
|
|
61
|
+
base_network_acl['SubnetId'] = association['SubnetId']
|
|
62
|
+
network_acls.append(base_network_acl)
|
|
63
|
+
else:
|
|
64
|
+
# Otherwise if there's no associations then don't include that in the data object
|
|
65
|
+
network_acls.append(base_network_acl)
|
|
66
|
+
|
|
67
|
+
if network_acl.get("Entries"):
|
|
68
|
+
for rule in network_acl["Entries"]:
|
|
69
|
+
direction = 'egress' if rule['Egress'] else 'inbound'
|
|
70
|
+
transformed_rule = {
|
|
71
|
+
'Id': f"{network_acl['NetworkAclId']}/{direction}/{rule['RuleNumber']}",
|
|
72
|
+
'CidrBlock': rule['CidrBlock'],
|
|
73
|
+
'Egress': rule['Egress'],
|
|
74
|
+
'Protocol': rule['Protocol'],
|
|
75
|
+
'RuleAction': rule['RuleAction'],
|
|
76
|
+
'RuleNumber': rule['RuleNumber'],
|
|
77
|
+
# Add pointer back to the nacl to create an edge
|
|
78
|
+
'NetworkAclId': network_acl_id,
|
|
79
|
+
'FromPort': rule.get('PortRange', {}).get('FromPort'),
|
|
80
|
+
'ToPort': rule.get('PortRange', {}).get('ToPort'),
|
|
81
|
+
}
|
|
82
|
+
if transformed_rule['Egress']:
|
|
83
|
+
outbound_rules.append(transformed_rule)
|
|
84
|
+
else:
|
|
85
|
+
inbound_rules.append(transformed_rule)
|
|
86
|
+
return Ec2AclObjects(
|
|
87
|
+
network_acls=network_acls,
|
|
88
|
+
inbound_rules=inbound_rules,
|
|
89
|
+
outbound_rules=outbound_rules,
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
@timeit
|
|
94
|
+
def load_all_nacl_data(
|
|
95
|
+
neo4j_session: neo4j.Session,
|
|
96
|
+
ec2_acl_objects: Ec2AclObjects,
|
|
97
|
+
region: str,
|
|
98
|
+
aws_account_id: str,
|
|
99
|
+
update_tag: int,
|
|
100
|
+
) -> None:
|
|
101
|
+
load_network_acls(
|
|
102
|
+
neo4j_session,
|
|
103
|
+
ec2_acl_objects.network_acls,
|
|
104
|
+
region,
|
|
105
|
+
aws_account_id,
|
|
106
|
+
update_tag,
|
|
107
|
+
)
|
|
108
|
+
load_network_acl_inbound_rules(
|
|
109
|
+
neo4j_session,
|
|
110
|
+
ec2_acl_objects.inbound_rules,
|
|
111
|
+
region,
|
|
112
|
+
aws_account_id,
|
|
113
|
+
update_tag,
|
|
114
|
+
)
|
|
115
|
+
load_network_acl_egress_rules(
|
|
116
|
+
neo4j_session,
|
|
117
|
+
ec2_acl_objects.outbound_rules,
|
|
118
|
+
region,
|
|
119
|
+
aws_account_id,
|
|
120
|
+
update_tag,
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
@timeit
|
|
125
|
+
def load_network_acls(
|
|
126
|
+
neo4j_session: neo4j.Session,
|
|
127
|
+
data: list[dict[str, Any]],
|
|
128
|
+
region: str,
|
|
129
|
+
aws_account_id: str,
|
|
130
|
+
update_tag: int,
|
|
131
|
+
) -> None:
|
|
132
|
+
logger.info(f"Loading {len(data)} network acls in {region}.")
|
|
133
|
+
load(
|
|
134
|
+
neo4j_session,
|
|
135
|
+
EC2NetworkAclSchema(),
|
|
136
|
+
data,
|
|
137
|
+
Region=region,
|
|
138
|
+
AWS_ID=aws_account_id,
|
|
139
|
+
lastupdated=update_tag,
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
@timeit
|
|
144
|
+
def load_network_acl_inbound_rules(
|
|
145
|
+
neo4j_session: neo4j.Session,
|
|
146
|
+
data: list[dict[str, Any]],
|
|
147
|
+
region: str,
|
|
148
|
+
aws_account_id: str,
|
|
149
|
+
update_tag: int,
|
|
150
|
+
) -> None:
|
|
151
|
+
logger.info(f"Loading {len(data)} network acl inbound rules in {region}.")
|
|
152
|
+
load(
|
|
153
|
+
neo4j_session,
|
|
154
|
+
EC2NetworkAclInboundRuleSchema(),
|
|
155
|
+
data,
|
|
156
|
+
Region=region,
|
|
157
|
+
AWS_ID=aws_account_id,
|
|
158
|
+
lastupdated=update_tag,
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
@timeit
|
|
163
|
+
def load_network_acl_egress_rules(
|
|
164
|
+
neo4j_session: neo4j.Session,
|
|
165
|
+
data: list[dict[str, Any]],
|
|
166
|
+
region: str,
|
|
167
|
+
aws_account_id: str,
|
|
168
|
+
update_tag: int,
|
|
169
|
+
) -> None:
|
|
170
|
+
logger.info(f"Loading {len(data)} network acl egress rules in {region}.")
|
|
171
|
+
load(
|
|
172
|
+
neo4j_session,
|
|
173
|
+
EC2NetworkAclEgressRuleSchema(),
|
|
174
|
+
data,
|
|
175
|
+
Region=region,
|
|
176
|
+
AWS_ID=aws_account_id,
|
|
177
|
+
lastupdated=update_tag,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
@timeit
|
|
182
|
+
def cleanup_network_acls(neo4j_session: neo4j.Session, common_job_parameters: dict[str, Any]) -> None:
|
|
183
|
+
GraphJob.from_node_schema(EC2NetworkAclSchema(), common_job_parameters).run(neo4j_session)
|
|
184
|
+
GraphJob.from_node_schema(EC2NetworkAclInboundRuleSchema(), common_job_parameters).run(neo4j_session)
|
|
185
|
+
GraphJob.from_node_schema(EC2NetworkAclEgressRuleSchema(), common_job_parameters).run(neo4j_session)
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
@timeit
|
|
189
|
+
def sync_network_acls(
|
|
190
|
+
neo4j_session: neo4j.Session,
|
|
191
|
+
boto3_session: boto3.session.Session,
|
|
192
|
+
regions: list[str],
|
|
193
|
+
current_aws_account_id: str,
|
|
194
|
+
update_tag: int,
|
|
195
|
+
common_job_parameters: dict[str, Any],
|
|
196
|
+
) -> None:
|
|
197
|
+
for region in regions:
|
|
198
|
+
logger.info(f"Syncing EC2 network ACLs for region '{region}' in account '{current_aws_account_id}'.")
|
|
199
|
+
data = get_network_acl_data(boto3_session, region)
|
|
200
|
+
ec2_acl_data = transform_network_acl_data(data, region, current_aws_account_id)
|
|
201
|
+
load_all_nacl_data(
|
|
202
|
+
neo4j_session,
|
|
203
|
+
ec2_acl_data,
|
|
204
|
+
region,
|
|
205
|
+
current_aws_account_id,
|
|
206
|
+
update_tag,
|
|
207
|
+
)
|
|
208
|
+
cleanup_network_acls(neo4j_session, common_job_parameters)
|
|
@@ -32,6 +32,7 @@ from .ec2.key_pairs import sync_ec2_key_pairs
|
|
|
32
32
|
from .ec2.launch_templates import sync_ec2_launch_templates
|
|
33
33
|
from .ec2.load_balancer_v2s import sync_load_balancer_v2s
|
|
34
34
|
from .ec2.load_balancers import sync_load_balancers
|
|
35
|
+
from .ec2.network_acls import sync_network_acls
|
|
35
36
|
from .ec2.network_interfaces import sync_network_interfaces
|
|
36
37
|
from .ec2.reserved_instances import sync_ec2_reserved_instances
|
|
37
38
|
from .ec2.security_groups import sync_ec2_security_groupinfo
|
|
@@ -55,6 +56,7 @@ RESOURCE_FUNCTIONS: Dict = {
|
|
|
55
56
|
'ec2:keypair': sync_ec2_key_pairs,
|
|
56
57
|
'ec2:load_balancer': sync_load_balancers,
|
|
57
58
|
'ec2:load_balancer_v2': sync_load_balancer_v2s,
|
|
59
|
+
'ec2:network_acls': sync_network_acls,
|
|
58
60
|
'ec2:network_interface': sync_network_interfaces,
|
|
59
61
|
'ec2:security_group': sync_ec2_security_groupinfo,
|
|
60
62
|
'ec2:subnet': sync_subnets,
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
import neo4j
|
|
4
|
+
|
|
5
|
+
from cartography.config import Config
|
|
6
|
+
from cartography.intel.semgrep.dependencies import sync_dependencies
|
|
7
|
+
from cartography.intel.semgrep.deployment import sync_deployment
|
|
8
|
+
from cartography.intel.semgrep.findings import sync_findings
|
|
9
|
+
from cartography.util import timeit
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@timeit
|
|
16
|
+
def start_semgrep_ingestion(
|
|
17
|
+
neo4j_session: neo4j.Session, config: Config,
|
|
18
|
+
) -> None:
|
|
19
|
+
common_job_parameters = {
|
|
20
|
+
"UPDATE_TAG": config.update_tag,
|
|
21
|
+
}
|
|
22
|
+
if not config.semgrep_app_token:
|
|
23
|
+
logger.info('Semgrep import is not configured - skipping this module. See docs to configure.')
|
|
24
|
+
return
|
|
25
|
+
|
|
26
|
+
# sync_deployment must be called first since it populates common_job_parameters
|
|
27
|
+
# with the deployment ID and slug, which are required by the other sync functions
|
|
28
|
+
sync_deployment(neo4j_session, config.semgrep_app_token, config.update_tag, common_job_parameters)
|
|
29
|
+
sync_dependencies(neo4j_session, config.semgrep_app_token, config.update_tag, common_job_parameters)
|
|
30
|
+
sync_findings(neo4j_session, config.semgrep_app_token, config.update_tag, common_job_parameters)
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Any
|
|
3
|
+
from typing import Callable
|
|
4
|
+
from typing import Dict
|
|
5
|
+
from typing import List
|
|
6
|
+
|
|
7
|
+
import neo4j
|
|
8
|
+
import requests
|
|
9
|
+
from requests.exceptions import HTTPError
|
|
10
|
+
from requests.exceptions import ReadTimeout
|
|
11
|
+
|
|
12
|
+
from cartography.client.core.tx import load
|
|
13
|
+
from cartography.graph.job import GraphJob
|
|
14
|
+
from cartography.models.semgrep.dependencies import SemgrepGoLibrarySchema
|
|
15
|
+
from cartography.stats import get_stats_client
|
|
16
|
+
from cartography.util import merge_module_sync_metadata
|
|
17
|
+
from cartography.util import timeit
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
stat_handler = get_stats_client(__name__)
|
|
21
|
+
_PAGE_SIZE = 10000
|
|
22
|
+
_TIMEOUT = (60, 60)
|
|
23
|
+
_MAX_RETRIES = 3
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@timeit
|
|
27
|
+
def get_dependencies(semgrep_app_token: str, deployment_id: str, ecosystems: List[str]) -> List[Dict[str, Any]]:
|
|
28
|
+
"""
|
|
29
|
+
Gets all dependencies for the given ecosystems within the given Semgrep deployment ID.
|
|
30
|
+
param: semgrep_app_token: The Semgrep App token to use for authentication.
|
|
31
|
+
param: deployment_id: The Semgrep deployment ID to use for retrieving dependencies.
|
|
32
|
+
param: ecosystems: One or more ecosystems to import dependencies from, e.g. "gomod" or "pypi".
|
|
33
|
+
The list of supported ecosystems is defined here:
|
|
34
|
+
https://semgrep.dev/api/v1/docs/#tag/SupplyChainService/operation/semgrep_app.products.sca.handlers.dependency.list_dependencies_conexxion
|
|
35
|
+
"""
|
|
36
|
+
all_deps = []
|
|
37
|
+
deps_url = f"https://semgrep.dev/api/v1/deployments/{deployment_id}/dependencies"
|
|
38
|
+
has_more = True
|
|
39
|
+
page = 0
|
|
40
|
+
retries = 0
|
|
41
|
+
headers = {
|
|
42
|
+
"Content-Type": "application/json",
|
|
43
|
+
"Authorization": f"Bearer {semgrep_app_token}",
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
request_data: dict[str, Any] = {
|
|
47
|
+
"pageSize": _PAGE_SIZE,
|
|
48
|
+
"dependencyFilter": {
|
|
49
|
+
"ecosystem": ecosystems,
|
|
50
|
+
},
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
logger.info(f"Retrieving Semgrep dependencies for deployment '{deployment_id}'.")
|
|
54
|
+
while has_more:
|
|
55
|
+
try:
|
|
56
|
+
response = requests.post(deps_url, json=request_data, headers=headers, timeout=_TIMEOUT)
|
|
57
|
+
response.raise_for_status()
|
|
58
|
+
data = response.json()
|
|
59
|
+
except (ReadTimeout, HTTPError):
|
|
60
|
+
logger.warning(f"Failed to retrieve Semgrep dependencies for page {page}. Retrying...")
|
|
61
|
+
retries += 1
|
|
62
|
+
if retries >= _MAX_RETRIES:
|
|
63
|
+
raise
|
|
64
|
+
continue
|
|
65
|
+
deps = data.get("dependencies", [])
|
|
66
|
+
has_more = data.get("hasMore", False)
|
|
67
|
+
logger.info(f"Processed page {page} of Semgrep dependencies.")
|
|
68
|
+
all_deps.extend(deps)
|
|
69
|
+
retries = 0
|
|
70
|
+
page += 1
|
|
71
|
+
request_data["cursor"] = data.get("cursor")
|
|
72
|
+
|
|
73
|
+
logger.info(f"Retrieved {len(all_deps)} Semgrep dependencies in {page} pages.")
|
|
74
|
+
return all_deps
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def transform_dependencies(raw_deps: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
|
|
78
|
+
"""
|
|
79
|
+
Transforms the raw dependencies response from Semgrep API into a list of dicts
|
|
80
|
+
that can be used to create the Dependency nodes.
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
"""
|
|
84
|
+
sample raw_dep as of November 2024:
|
|
85
|
+
{
|
|
86
|
+
"repositoryId": "123456",
|
|
87
|
+
"definedAt": {
|
|
88
|
+
"path": "go.mod",
|
|
89
|
+
"startLine": "6",
|
|
90
|
+
"endLine": "6",
|
|
91
|
+
"url": "https://github.com/org/repo-name/blob/00000000000000000000000000000000/go.mod#L6",
|
|
92
|
+
"committedAt": "1970-01-01T00:00:00Z",
|
|
93
|
+
"startCol": "0",
|
|
94
|
+
"endCol": "0"
|
|
95
|
+
},
|
|
96
|
+
"transitivity": "DIRECT",
|
|
97
|
+
"package": {
|
|
98
|
+
"name": "github.com/foo/bar",
|
|
99
|
+
"versionSpecifier": "1.2.3"
|
|
100
|
+
},
|
|
101
|
+
"ecosystem": "gomod",
|
|
102
|
+
"licenses": [],
|
|
103
|
+
"pathToTransitivity": []
|
|
104
|
+
},
|
|
105
|
+
"""
|
|
106
|
+
deps = []
|
|
107
|
+
for raw_dep in raw_deps:
|
|
108
|
+
|
|
109
|
+
# We could call a different endpoint to get all repo IDs and store a mapping of repo ID to URL,
|
|
110
|
+
# but it's much simpler to just extract the URL from the definedAt field.
|
|
111
|
+
repo_url = raw_dep["definedAt"]["url"].split("/blob/", 1)[0]
|
|
112
|
+
|
|
113
|
+
name = raw_dep["package"]["name"]
|
|
114
|
+
version = raw_dep["package"]["versionSpecifier"]
|
|
115
|
+
id = f"{name}|{version}"
|
|
116
|
+
|
|
117
|
+
# As of November 2024, Semgrep does not import dependencies with version specifiers such as >, <, etc.
|
|
118
|
+
# For now, hardcode the specifier to ==<version> to align with GitHub-sourced Python dependencies.
|
|
119
|
+
# If Semgrep eventually supports version specifiers, update this line accordingly.
|
|
120
|
+
specifier = f"=={version}"
|
|
121
|
+
|
|
122
|
+
deps.append({
|
|
123
|
+
# existing dependency properties:
|
|
124
|
+
"id": id,
|
|
125
|
+
"name": name,
|
|
126
|
+
"specifier": specifier,
|
|
127
|
+
"version": version,
|
|
128
|
+
"repo_url": repo_url,
|
|
129
|
+
|
|
130
|
+
# Semgrep-specific properties:
|
|
131
|
+
"ecosystem": raw_dep["ecosystem"],
|
|
132
|
+
"transitivity": raw_dep["transitivity"].lower(),
|
|
133
|
+
"url": raw_dep["definedAt"]["url"],
|
|
134
|
+
})
|
|
135
|
+
|
|
136
|
+
return deps
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
@timeit
|
|
140
|
+
def load_dependencies(
|
|
141
|
+
neo4j_session: neo4j.Session,
|
|
142
|
+
dependency_schema: Callable,
|
|
143
|
+
dependencies: List[Dict],
|
|
144
|
+
deployment_id: str,
|
|
145
|
+
update_tag: int,
|
|
146
|
+
) -> None:
|
|
147
|
+
logger.info(f"Loading {len(dependencies)} {dependency_schema().label} objects into the graph.")
|
|
148
|
+
load(
|
|
149
|
+
neo4j_session,
|
|
150
|
+
dependency_schema(),
|
|
151
|
+
dependencies,
|
|
152
|
+
lastupdated=update_tag,
|
|
153
|
+
DEPLOYMENT_ID=deployment_id,
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
@timeit
|
|
158
|
+
def cleanup(
|
|
159
|
+
neo4j_session: neo4j.Session,
|
|
160
|
+
common_job_parameters: Dict[str, Any],
|
|
161
|
+
) -> None:
|
|
162
|
+
logger.info("Running Semgrep Go Library cleanup job.")
|
|
163
|
+
go_libraries_cleanup_job = GraphJob.from_node_schema(
|
|
164
|
+
SemgrepGoLibrarySchema(), common_job_parameters,
|
|
165
|
+
)
|
|
166
|
+
go_libraries_cleanup_job.run(neo4j_session)
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
@timeit
|
|
170
|
+
def sync_dependencies(
|
|
171
|
+
neo4j_session: neo4j.Session,
|
|
172
|
+
semgrep_app_token: str,
|
|
173
|
+
update_tag: int,
|
|
174
|
+
common_job_parameters: Dict[str, Any],
|
|
175
|
+
) -> None:
|
|
176
|
+
|
|
177
|
+
deployment_id = common_job_parameters.get("DEPLOYMENT_ID")
|
|
178
|
+
if not deployment_id:
|
|
179
|
+
logger.warning(
|
|
180
|
+
"Missing Semgrep deployment ID, ensure that sync_deployment() has been called."
|
|
181
|
+
"Skipping Semgrep dependencies sync job.",
|
|
182
|
+
)
|
|
183
|
+
return
|
|
184
|
+
|
|
185
|
+
logger.info("Running Semgrep dependencies sync job.")
|
|
186
|
+
|
|
187
|
+
# fetch and load dependencies for the Go ecosystem
|
|
188
|
+
raw_go_deps = get_dependencies(semgrep_app_token, deployment_id, ecosystems=["gomod"])
|
|
189
|
+
go_deps = transform_dependencies(raw_go_deps)
|
|
190
|
+
load_dependencies(neo4j_session, SemgrepGoLibrarySchema, go_deps, deployment_id, update_tag)
|
|
191
|
+
|
|
192
|
+
cleanup(neo4j_session, common_job_parameters)
|
|
193
|
+
|
|
194
|
+
merge_module_sync_metadata(
|
|
195
|
+
neo4j_session=neo4j_session,
|
|
196
|
+
group_type='Semgrep',
|
|
197
|
+
group_id=deployment_id,
|
|
198
|
+
synced_type='SemgrepDependency',
|
|
199
|
+
update_tag=update_tag,
|
|
200
|
+
stat_handler=stat_handler,
|
|
201
|
+
)
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Any
|
|
3
|
+
from typing import Dict
|
|
4
|
+
|
|
5
|
+
import neo4j
|
|
6
|
+
import requests
|
|
7
|
+
|
|
8
|
+
from cartography.client.core.tx import load
|
|
9
|
+
from cartography.models.semgrep.deployment import SemgrepDeploymentSchema
|
|
10
|
+
from cartography.stats import get_stats_client
|
|
11
|
+
from cartography.util import timeit
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
stat_handler = get_stats_client(__name__)
|
|
15
|
+
_TIMEOUT = (60, 60)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@timeit
|
|
19
|
+
def get_deployment(semgrep_app_token: str) -> Dict[str, Any]:
|
|
20
|
+
"""
|
|
21
|
+
Gets the deployment associated with the passed Semgrep App token.
|
|
22
|
+
param: semgrep_app_token: The Semgrep App token to use for authentication.
|
|
23
|
+
"""
|
|
24
|
+
deployment = {}
|
|
25
|
+
deployment_url = "https://semgrep.dev/api/v1/deployments"
|
|
26
|
+
headers = {
|
|
27
|
+
"Content-Type": "application/json",
|
|
28
|
+
"Authorization": f"Bearer {semgrep_app_token}",
|
|
29
|
+
}
|
|
30
|
+
response = requests.get(deployment_url, headers=headers, timeout=_TIMEOUT)
|
|
31
|
+
response.raise_for_status()
|
|
32
|
+
|
|
33
|
+
data = response.json()
|
|
34
|
+
deployment["id"] = data["deployments"][0]["id"]
|
|
35
|
+
deployment["name"] = data["deployments"][0]["name"]
|
|
36
|
+
deployment["slug"] = data["deployments"][0]["slug"]
|
|
37
|
+
|
|
38
|
+
return deployment
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@timeit
|
|
42
|
+
def load_semgrep_deployment(
|
|
43
|
+
neo4j_session: neo4j.Session, deployment: Dict[str, Any], update_tag: int,
|
|
44
|
+
) -> None:
|
|
45
|
+
logger.info(f"Loading SemgrepDeployment {deployment} into the graph.")
|
|
46
|
+
load(
|
|
47
|
+
neo4j_session,
|
|
48
|
+
SemgrepDeploymentSchema(),
|
|
49
|
+
[deployment],
|
|
50
|
+
lastupdated=update_tag,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@timeit
|
|
55
|
+
def sync_deployment(
|
|
56
|
+
neo4j_session: neo4j.Session,
|
|
57
|
+
semgrep_app_token: str,
|
|
58
|
+
update_tag: int,
|
|
59
|
+
common_job_parameters: Dict[str, Any],
|
|
60
|
+
) -> None:
|
|
61
|
+
|
|
62
|
+
semgrep_deployment = get_deployment(semgrep_app_token)
|
|
63
|
+
deployment_id = semgrep_deployment["id"]
|
|
64
|
+
deployment_slug = semgrep_deployment["slug"]
|
|
65
|
+
load_semgrep_deployment(neo4j_session, semgrep_deployment, update_tag)
|
|
66
|
+
common_job_parameters["DEPLOYMENT_ID"] = deployment_id
|
|
67
|
+
common_job_parameters["DEPLOYMENT_SLUG"] = deployment_slug
|