cartography 0.96.0rc3__tar.gz → 0.96.1__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.96.0rc3 → cartography-0.96.1}/PKG-INFO +1 -1
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/github_repos_cleanup.json +25 -0
- cartography-0.96.1/cartography/intel/aws/ec2/auto_scaling_groups.py +205 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/instances.py +2 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/network_acls.py +2 -1
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/subnets.py +2 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/iam.py +4 -3
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/cve/feed.py +6 -3
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/github/repos.py +209 -27
- cartography-0.96.1/cartography/intel/github/teams.py +331 -0
- cartography-0.96.1/cartography/models/aws/ec2/auto_scaling_groups.py +204 -0
- cartography-0.96.1/cartography/models/aws/ec2/launch_configurations.py +55 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/network_acl_rules.py +1 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/github/teams.py +29 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/util.py +22 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography.egg-info/PKG-INFO +1 -1
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography.egg-info/SOURCES.txt +2 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/setup.py +1 -1
- cartography-0.96.0rc3/cartography/intel/aws/ec2/auto_scaling_groups.py +0 -243
- cartography-0.96.0rc3/cartography/intel/github/teams.py +0 -209
- {cartography-0.96.0rc3 → cartography-0.96.1}/LICENSE +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/README.md +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/__main__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/cli.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/client/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/client/aws/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/client/aws/iam.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/client/core/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/client/core/tx.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/config.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/indexes.cypher +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/aws_ec2_asset_exposure.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/aws_ec2_iaminstance.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/aws_ec2_iaminstanceprofile.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/aws_ec2_keypair_analysis.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/aws_eks_asset_exposure.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/aws_foreign_accounts.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/aws_lambda_ecr.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/aws_s3acl_analysis.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/gcp_compute_asset_inet_exposure.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/gcp_gke_asset_exposure.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/gcp_gke_basic_auth.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/gsuite_human_link.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_account_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_apigateway_details.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_dns_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_account_access_key_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_apigateway_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_config_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_ec2_launch_configurations_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_ec2_security_groupinfo_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_ecr_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_ecs_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_elastic_ip_addresses_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_elasticache_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_es_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_groups_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_groups_membership_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_groups_policy_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_identity_center_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_internet_gateways_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_kms_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_lambda_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_principals_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_rds_clusters_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_rds_instances_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_rds_snapshots_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_redshift_clusters_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_reserved_instances_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_roles_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_roles_policy_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_s3_acl_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_s3_buckets_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_secrets_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_securityhub_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_snapshots_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_sqs_queues_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_tags_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_tgw_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_users_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_vpc_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_vpc_peering_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_ingest_ec2_auto_scaling_groups_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_ingest_load_balancers_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_ingest_load_balancers_v2_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_ingest_subnets_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_kms_details.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_post_ingestion_principals_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_s3_details.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_cosmosdb_cassandra_keyspace_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_cosmosdb_cors_details.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_cosmosdb_mongodb_database_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_cosmosdb_sql_database_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_cosmosdb_table_resources_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_database_account_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_import_disks_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_import_snapshots_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_import_virtual_machines_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_sql_server_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_storage_account_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_subscriptions_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_tenant_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/crowdstrike_import_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/digitalocean_droplet_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/digitalocean_project_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_compute_firewall_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_compute_forwarding_rules_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_compute_instance_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_compute_vpc_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_compute_vpc_subnet_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_crm_folder_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_crm_organization_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_crm_project_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_dns_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_gke_cluster_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_storage_bucket_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/github_org_and_users_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gsuite_ingest_groups_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gsuite_ingest_users_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/jamf_import_computers_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/kubernetes_import_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/oci_import_compartments_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/oci_import_groups_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/oci_import_groups_membership_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/oci_import_policies_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/oci_import_users_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/oci_tenancy_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/okta_groups_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/okta_import_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/pagerduty_import_cleanup.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/scoped_analysis/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/scoped_analysis/semgrep_sca_risk_analysis.json +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/permission_relationships.yaml +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/__main__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/add_shortcut.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/cli.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/config.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/detect_deviations.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/get_states.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/model.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/reporter.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/serializers.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/shortcut.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/storage.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/util.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/graph/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/graph/cleanupbuilder.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/graph/context.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/graph/job.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/graph/querybuilder.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/graph/statement.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/analysis.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/apigateway.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/config.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/dynamodb.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/elastic_ip_addresses.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/images.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/internet_gateways.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/key_pairs.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/launch_templates.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/load_balancer_v2s.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/load_balancers.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/network_interfaces.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/reserved_instances.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/security_groups.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/snapshots.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/tgw.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/util.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/volumes.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/vpc.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/vpc_peerings.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ecr.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ecs.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/eks.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/elasticache.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/elasticsearch.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/emr.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/identitycenter.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/inspector.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/kms.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/lambda_function.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/organizations.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/permission_relationships.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/rds.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/redshift.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/resourcegroupstaggingapi.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/resources.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/route53.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/s3.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/secretsmanager.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/securityhub.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/sqs.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ssm.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/util/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/util/arns.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/util/common.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/azure/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/azure/compute.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/azure/cosmosdb.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/azure/sql.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/azure/storage.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/azure/subscription.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/azure/tenant.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/azure/util/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/azure/util/credentials.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/bigfix/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/bigfix/computers.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/create_indexes.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/crowdstrike/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/crowdstrike/endpoints.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/crowdstrike/spotlight.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/crowdstrike/util.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/cve/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/digitalocean/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/digitalocean/compute.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/digitalocean/management.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/digitalocean/platform.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/dns.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/duo/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/duo/api_host.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/duo/endpoints.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/duo/groups.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/duo/phones.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/duo/tokens.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/duo/users.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/duo/web_authn_credentials.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/gcp/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/gcp/compute.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/gcp/crm.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/gcp/dns.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/gcp/gke.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/gcp/storage.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/github/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/github/users.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/github/util.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/gsuite/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/gsuite/api.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/jamf/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/jamf/computers.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/jamf/util.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/kandji/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/kandji/devices.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/kubernetes/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/kubernetes/namespaces.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/kubernetes/pods.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/kubernetes/secrets.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/kubernetes/services.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/kubernetes/util.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/lastpass/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/lastpass/users.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/oci/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/oci/iam.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/oci/organizations.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/oci/utils.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/applications.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/awssaml.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/factors.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/groups.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/organization.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/origins.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/roles.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/sync_state.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/users.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/utils.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/pagerduty/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/pagerduty/escalation_policies.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/pagerduty/schedules.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/pagerduty/services.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/pagerduty/teams.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/pagerduty/users.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/pagerduty/vendors.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/semgrep/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/semgrep/dependencies.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/semgrep/deployment.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/semgrep/findings.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/snipeit/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/snipeit/asset.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/snipeit/user.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/snipeit/util.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/dynamodb/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/dynamodb/gsi.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/dynamodb/tables.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/images.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/instances.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/keypairs.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/launch_template_versions.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/launch_templates.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/loadbalancerv2.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/network_acls.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/networkinterface_instance.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/networkinterfaces.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/privateip_networkinterface.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/reservations.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/securitygroup_instance.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/securitygroup_networkinterface.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/subnet_instance.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/subnet_networkinterface.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/volumes.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/eks/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/eks/clusters.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/emr.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/identitycenter/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/identitycenter/awsidentitycenter.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/identitycenter/awspermissionset.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/identitycenter/awsssouser.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/inspector/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/inspector/findings.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/inspector/packages.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ssm/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ssm/instance_information.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ssm/instance_patch.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/bigfix/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/bigfix/bigfix_computer.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/bigfix/bigfix_root.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/core/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/core/common.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/core/nodes.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/core/relationships.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/cve/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/cve/cve.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/cve/cve_feed.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/duo/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/duo/api_host.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/duo/endpoint.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/duo/group.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/duo/phone.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/duo/token.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/duo/user.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/duo/web_authn_credential.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/github/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/github/orgs.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/github/users.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/kandji/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/kandji/device.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/kandji/tenant.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/lastpass/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/lastpass/tenant.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/lastpass/user.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/semgrep/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/semgrep/dependencies.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/semgrep/deployment.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/semgrep/findings.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/semgrep/locations.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/snipeit/__init__.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/snipeit/asset.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/snipeit/tenant.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/snipeit/user.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/py.typed +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/stats.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/sync.py +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography.egg-info/dependency_links.txt +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography.egg-info/entry_points.txt +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography.egg-info/requires.txt +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/cartography.egg-info/top_level.txt +0 -0
- {cartography-0.96.0rc3 → cartography-0.96.1}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: cartography
|
|
3
|
-
Version: 0.96.
|
|
3
|
+
Version: 0.96.1
|
|
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
|
{cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/github_repos_cleanup.json
RENAMED
|
@@ -63,6 +63,31 @@
|
|
|
63
63
|
"query": "MATCH (:GitHubUser)-[r:OUTSIDE_COLLAB_WRITE]->(:GitHubRepository) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r)",
|
|
64
64
|
"iterative": true,
|
|
65
65
|
"iterationsize": 100
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"query": "MATCH (:GitHubUser)-[r:DIRECT_COLLAB_ADMIN]->(:GitHubRepository) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r)",
|
|
69
|
+
"iterative": true,
|
|
70
|
+
"iterationsize": 100
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"query": "MATCH (:GitHubUser)-[r:DIRECT_COLLAB_MAINTAIN]->(:GitHubRepository) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r)",
|
|
74
|
+
"iterative": true,
|
|
75
|
+
"iterationsize": 100
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"query": "MATCH (:GitHubUser)-[r:DIRECT_COLLAB_READ]->(:GitHubRepository) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r)",
|
|
79
|
+
"iterative": true,
|
|
80
|
+
"iterationsize": 100
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"query": "MATCH (:GitHubUser)-[r:DIRECT_COLLAB_TRIAGE]->(:GitHubRepository) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r)",
|
|
84
|
+
"iterative": true,
|
|
85
|
+
"iterationsize": 100
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"query": "MATCH (:GitHubUser)-[r:DIRECT_COLLAB_WRITE]->(:GitHubRepository) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r)",
|
|
89
|
+
"iterative": true,
|
|
90
|
+
"iterationsize": 100
|
|
66
91
|
}],
|
|
67
92
|
"name": "cleanup GitHub repos data"
|
|
68
93
|
}
|
|
@@ -0,0 +1,205 @@
|
|
|
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.auto_scaling_groups import AutoScalingGroupSchema
|
|
12
|
+
from cartography.models.aws.ec2.auto_scaling_groups import EC2InstanceAutoScalingGroupSchema
|
|
13
|
+
from cartography.models.aws.ec2.auto_scaling_groups import EC2SubnetAutoScalingGroupSchema
|
|
14
|
+
from cartography.models.aws.ec2.launch_configurations import LaunchConfigurationSchema
|
|
15
|
+
from cartography.util import aws_handle_regions
|
|
16
|
+
from cartography.util import timeit
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
AsgData = namedtuple(
|
|
21
|
+
'AsgData', [
|
|
22
|
+
"group_list",
|
|
23
|
+
"instance_list",
|
|
24
|
+
"subnet_list",
|
|
25
|
+
],
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@timeit
|
|
30
|
+
@aws_handle_regions
|
|
31
|
+
def get_ec2_auto_scaling_groups(boto3_session: boto3.session.Session, region: str) -> list[dict]:
|
|
32
|
+
client = boto3_session.client('autoscaling', region_name=region, config=get_botocore_config())
|
|
33
|
+
paginator = client.get_paginator('describe_auto_scaling_groups')
|
|
34
|
+
asgs: list[dict] = []
|
|
35
|
+
for page in paginator.paginate():
|
|
36
|
+
asgs.extend(page['AutoScalingGroups'])
|
|
37
|
+
return asgs
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@timeit
|
|
41
|
+
@aws_handle_regions
|
|
42
|
+
def get_launch_configurations(boto3_session: boto3.session.Session, region: str) -> list[dict]:
|
|
43
|
+
client = boto3_session.client('autoscaling', region_name=region, config=get_botocore_config())
|
|
44
|
+
paginator = client.get_paginator('describe_launch_configurations')
|
|
45
|
+
lcs: list[dict] = []
|
|
46
|
+
for page in paginator.paginate():
|
|
47
|
+
lcs.extend(page['LaunchConfigurations'])
|
|
48
|
+
return lcs
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def transform_launch_configurations(configurations: list[dict[str, Any]]) -> list[dict[str, Any]]:
|
|
52
|
+
transformed_configurations = []
|
|
53
|
+
for config in configurations:
|
|
54
|
+
transformed_configurations.append({
|
|
55
|
+
'AssociatePublicIpAddress': config.get('AssociatePublicIpAddress'),
|
|
56
|
+
'LaunchConfigurationARN': config.get('LaunchConfigurationARN'),
|
|
57
|
+
'LaunchConfigurationName': config.get('LaunchConfigurationName'),
|
|
58
|
+
'CreatedTime': config.get('CreatedTime'),
|
|
59
|
+
'ImageId': config.get('ImageId'),
|
|
60
|
+
'KeyName': config.get('KeyName'),
|
|
61
|
+
'SecurityGroups': config.get('SecurityGroups'),
|
|
62
|
+
'InstanceType': config.get('InstanceType'),
|
|
63
|
+
'KernelId': config.get('KernelId'),
|
|
64
|
+
'RamdiskId': config.get('RamdiskId'),
|
|
65
|
+
'InstanceMonitoring': config.get('InstanceMonitoring', {}).get('Enabled'),
|
|
66
|
+
'SpotPrice': config.get('SpotPrice'),
|
|
67
|
+
'IamInstanceProfile': config.get('IamInstanceProfile'),
|
|
68
|
+
'EbsOptimized': config.get('EbsOptimized'),
|
|
69
|
+
'PlacementTenancy': config.get('PlacementTenancy'),
|
|
70
|
+
})
|
|
71
|
+
return transformed_configurations
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def transform_auto_scaling_groups(groups: list[dict[str, Any]]) -> AsgData:
|
|
75
|
+
transformed_groups = []
|
|
76
|
+
related_vpcs = []
|
|
77
|
+
related_instances = []
|
|
78
|
+
for group in groups:
|
|
79
|
+
transformed_groups.append({
|
|
80
|
+
'AutoScalingGroupARN': group['AutoScalingGroupARN'],
|
|
81
|
+
'CapacityRebalance': group.get('CapacityRebalance'),
|
|
82
|
+
'CreatedTime': str(group.get('CreatedTime')),
|
|
83
|
+
'DefaultCooldown': group.get('DefaultCooldown'),
|
|
84
|
+
'DesiredCapacity': group.get('DesiredCapacity'),
|
|
85
|
+
'HealthCheckGracePeriod': group.get('HealthCheckGracePeriod'),
|
|
86
|
+
'HealthCheckType': group.get('HealthCheckType'),
|
|
87
|
+
'LaunchConfigurationName': group.get('LaunchConfigurationName'),
|
|
88
|
+
'LaunchTemplateName': group.get('LaunchTemplate', {}).get('LaunchTemplateName'),
|
|
89
|
+
'LaunchTemplateId': group.get('LaunchTemplate', {}).get('LaunchTemplateId'),
|
|
90
|
+
'LaunchTemplateVersion': group.get('LaunchTemplate', {}).get('Version'),
|
|
91
|
+
'MaxInstanceLifetime': group.get('MaxInstanceLifetime'),
|
|
92
|
+
'MaxSize': group.get('MaxSize'),
|
|
93
|
+
'MinSize': group.get('MinSize'),
|
|
94
|
+
'AutoScalingGroupName': group.get('AutoScalingGroupName'),
|
|
95
|
+
'NewInstancesProtectedFromScaleIn': group.get('NewInstancesProtectedFromScaleIn'),
|
|
96
|
+
'Status': group.get('Status'),
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
if group.get('VPCZoneIdentifier', None):
|
|
100
|
+
vpclist = group['VPCZoneIdentifier']
|
|
101
|
+
subnet_ids = vpclist.split(',') if ',' in vpclist else [vpclist]
|
|
102
|
+
subnets = []
|
|
103
|
+
for subnet_id in subnet_ids:
|
|
104
|
+
subnets.append({
|
|
105
|
+
'VPCZoneIdentifier': subnet_id,
|
|
106
|
+
'AutoScalingGroupARN': group['AutoScalingGroupARN'],
|
|
107
|
+
})
|
|
108
|
+
related_vpcs.extend(subnets)
|
|
109
|
+
|
|
110
|
+
for instance_data in group.get('Instances', []):
|
|
111
|
+
related_instances.append({
|
|
112
|
+
'InstanceId': instance_data['InstanceId'],
|
|
113
|
+
'AutoScalingGroupARN': group['AutoScalingGroupARN'],
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
return AsgData(
|
|
117
|
+
group_list=transformed_groups,
|
|
118
|
+
instance_list=related_instances,
|
|
119
|
+
subnet_list=related_vpcs,
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
@timeit
|
|
124
|
+
def load_launch_configurations(
|
|
125
|
+
neo4j_session: neo4j.Session, data: list[dict], region: str, current_aws_account_id: str, update_tag: int,
|
|
126
|
+
) -> None:
|
|
127
|
+
load(
|
|
128
|
+
neo4j_session,
|
|
129
|
+
LaunchConfigurationSchema(),
|
|
130
|
+
data,
|
|
131
|
+
Region=region,
|
|
132
|
+
AWS_ID=current_aws_account_id,
|
|
133
|
+
lastupdated=update_tag,
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def load_groups(
|
|
138
|
+
neo4j_session: neo4j.Session, data: list[dict], region: str, current_aws_account_id: str, update_tag: int,
|
|
139
|
+
) -> None:
|
|
140
|
+
load(
|
|
141
|
+
neo4j_session,
|
|
142
|
+
AutoScalingGroupSchema(),
|
|
143
|
+
data,
|
|
144
|
+
Region=region,
|
|
145
|
+
AWS_ID=current_aws_account_id,
|
|
146
|
+
lastupdated=update_tag,
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def load_asg_subnets(
|
|
151
|
+
neo4j_session: neo4j.Session, data: list[dict], region: str, current_aws_account_id: str, update_tag: int,
|
|
152
|
+
) -> None:
|
|
153
|
+
load(
|
|
154
|
+
neo4j_session,
|
|
155
|
+
EC2SubnetAutoScalingGroupSchema(),
|
|
156
|
+
data,
|
|
157
|
+
Region=region,
|
|
158
|
+
AWS_ID=current_aws_account_id,
|
|
159
|
+
lastupdated=update_tag,
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def load_asg_instances(
|
|
164
|
+
neo4j_session: neo4j.Session, data: list[dict], region: str, current_aws_account_id: str, update_tag: int,
|
|
165
|
+
) -> None:
|
|
166
|
+
load(
|
|
167
|
+
neo4j_session,
|
|
168
|
+
EC2InstanceAutoScalingGroupSchema(),
|
|
169
|
+
data,
|
|
170
|
+
Region=region,
|
|
171
|
+
AWS_ID=current_aws_account_id,
|
|
172
|
+
lastupdated=update_tag,
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
@timeit
|
|
177
|
+
def load_auto_scaling_groups(
|
|
178
|
+
neo4j_session: neo4j.Session, data: AsgData, region: str, current_aws_account_id: str, update_tag: int,
|
|
179
|
+
) -> None:
|
|
180
|
+
load_groups(neo4j_session, data.group_list, region, current_aws_account_id, update_tag)
|
|
181
|
+
load_asg_instances(neo4j_session, data.instance_list, region, current_aws_account_id, update_tag)
|
|
182
|
+
load_asg_subnets(neo4j_session, data.subnet_list, region, current_aws_account_id, update_tag)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
@timeit
|
|
186
|
+
def cleanup(neo4j_session: neo4j.Session, common_job_parameters: dict[str, Any]) -> None:
|
|
187
|
+
logger.debug("Running EC2 instance cleanup")
|
|
188
|
+
GraphJob.from_node_schema(AutoScalingGroupSchema(), common_job_parameters).run(neo4j_session)
|
|
189
|
+
GraphJob.from_node_schema(LaunchConfigurationSchema(), common_job_parameters).run(neo4j_session)
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
@timeit
|
|
193
|
+
def sync_ec2_auto_scaling_groups(
|
|
194
|
+
neo4j_session: neo4j.Session, boto3_session: boto3.session.Session, regions: list[str],
|
|
195
|
+
current_aws_account_id: str, update_tag: int, common_job_parameters: dict,
|
|
196
|
+
) -> None:
|
|
197
|
+
for region in regions:
|
|
198
|
+
logger.debug("Syncing auto scaling groups for region '%s' in account '%s'.", region, current_aws_account_id)
|
|
199
|
+
lc_data = get_launch_configurations(boto3_session, region)
|
|
200
|
+
asg_data = get_ec2_auto_scaling_groups(boto3_session, region)
|
|
201
|
+
lc_transformed = transform_launch_configurations(lc_data)
|
|
202
|
+
asg_transformed = transform_auto_scaling_groups(asg_data)
|
|
203
|
+
load_launch_configurations(neo4j_session, lc_transformed, region, current_aws_account_id, update_tag)
|
|
204
|
+
load_auto_scaling_groups(neo4j_session, asg_transformed, region, current_aws_account_id, update_tag)
|
|
205
|
+
cleanup(neo4j_session, common_job_parameters)
|
|
@@ -11,6 +11,7 @@ import neo4j
|
|
|
11
11
|
from cartography.client.core.tx import load
|
|
12
12
|
from cartography.graph.job import GraphJob
|
|
13
13
|
from cartography.intel.aws.ec2.util import get_botocore_config
|
|
14
|
+
from cartography.models.aws.ec2.auto_scaling_groups import EC2InstanceAutoScalingGroupSchema
|
|
14
15
|
from cartography.models.aws.ec2.instances import EC2InstanceSchema
|
|
15
16
|
from cartography.models.aws.ec2.keypairs import EC2KeyPairSchema
|
|
16
17
|
from cartography.models.aws.ec2.networkinterface_instance import EC2NetworkInterfaceInstanceSchema
|
|
@@ -308,6 +309,7 @@ def cleanup(neo4j_session: neo4j.Session, common_job_parameters: Dict[str, Any])
|
|
|
308
309
|
logger.debug("Running EC2 instance cleanup")
|
|
309
310
|
GraphJob.from_node_schema(EC2ReservationSchema(), common_job_parameters).run(neo4j_session)
|
|
310
311
|
GraphJob.from_node_schema(EC2InstanceSchema(), common_job_parameters).run(neo4j_session)
|
|
312
|
+
GraphJob.from_node_schema(EC2InstanceAutoScalingGroupSchema(), common_job_parameters).run(neo4j_session)
|
|
311
313
|
|
|
312
314
|
|
|
313
315
|
@timeit
|
|
@@ -69,7 +69,8 @@ def transform_network_acl_data(
|
|
|
69
69
|
direction = 'egress' if rule['Egress'] else 'inbound'
|
|
70
70
|
transformed_rule = {
|
|
71
71
|
'Id': f"{network_acl['NetworkAclId']}/{direction}/{rule['RuleNumber']}",
|
|
72
|
-
'CidrBlock': rule
|
|
72
|
+
'CidrBlock': rule.get('CidrBlock'),
|
|
73
|
+
'Ipv6CidrBlock': rule.get('Ipv6CidrBlock'),
|
|
73
74
|
'Egress': rule['Egress'],
|
|
74
75
|
'Protocol': rule['Protocol'],
|
|
75
76
|
'RuleAction': rule['RuleAction'],
|
|
@@ -7,6 +7,7 @@ import neo4j
|
|
|
7
7
|
|
|
8
8
|
from .util import get_botocore_config
|
|
9
9
|
from cartography.graph.job import GraphJob
|
|
10
|
+
from cartography.models.aws.ec2.auto_scaling_groups import EC2SubnetAutoScalingGroupSchema
|
|
10
11
|
from cartography.models.aws.ec2.subnet_instance import EC2SubnetInstanceSchema
|
|
11
12
|
from cartography.util import aws_handle_regions
|
|
12
13
|
from cartography.util import run_cleanup_job
|
|
@@ -79,6 +80,7 @@ def load_subnets(
|
|
|
79
80
|
def cleanup_subnets(neo4j_session: neo4j.Session, common_job_parameters: Dict) -> None:
|
|
80
81
|
run_cleanup_job('aws_ingest_subnets_cleanup.json', neo4j_session, common_job_parameters)
|
|
81
82
|
GraphJob.from_node_schema(EC2SubnetInstanceSchema(), common_job_parameters).run(neo4j_session)
|
|
83
|
+
GraphJob.from_node_schema(EC2SubnetAutoScalingGroupSchema(), common_job_parameters).run(neo4j_session)
|
|
82
84
|
|
|
83
85
|
|
|
84
86
|
@timeit
|
|
@@ -539,11 +539,12 @@ def _transform_policy_statements(statements: Any, policy_id: str) -> List[Dict]:
|
|
|
539
539
|
if not isinstance(statements, list):
|
|
540
540
|
statements = [statements]
|
|
541
541
|
for stmt in statements:
|
|
542
|
-
if "Sid"
|
|
542
|
+
if "Sid" in stmt and stmt["Sid"]:
|
|
543
|
+
statement_id = stmt["Sid"]
|
|
544
|
+
else:
|
|
543
545
|
statement_id = count
|
|
544
546
|
count += 1
|
|
545
|
-
|
|
546
|
-
statement_id = stmt["Sid"]
|
|
547
|
+
|
|
547
548
|
stmt["id"] = f"{policy_id}/statement/{statement_id}"
|
|
548
549
|
if "Resource" in stmt:
|
|
549
550
|
stmt["Resource"] = ensure_list(stmt["Resource"])
|
|
@@ -22,9 +22,9 @@ from cartography.util import timeit
|
|
|
22
22
|
|
|
23
23
|
logger = logging.getLogger(__name__)
|
|
24
24
|
|
|
25
|
-
MAX_RETRIES =
|
|
26
|
-
# Connect and read timeouts of
|
|
27
|
-
CONNECT_AND_READ_TIMEOUT = (
|
|
25
|
+
MAX_RETRIES = 8
|
|
26
|
+
# Connect and read timeouts of 120 seconds each; see https://requests.readthedocs.io/en/master/user/advanced/#timeouts
|
|
27
|
+
CONNECT_AND_READ_TIMEOUT = (30, 120)
|
|
28
28
|
CVE_FEED_ID = "NIST_NVD"
|
|
29
29
|
BATCH_SIZE_DAYS = 120
|
|
30
30
|
RESULTS_PER_PAGE = 2000
|
|
@@ -98,6 +98,9 @@ def _call_cves_api(url: str, api_key: str | None, params: Dict[str, Any]) -> Dic
|
|
|
98
98
|
retries += 1
|
|
99
99
|
if retries >= MAX_RETRIES:
|
|
100
100
|
raise
|
|
101
|
+
# Exponential backoff
|
|
102
|
+
sleep_time *= 2
|
|
103
|
+
time.sleep(sleep_time)
|
|
101
104
|
continue
|
|
102
105
|
data = res.json()
|
|
103
106
|
_map_cve_dict(results, data)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import configparser
|
|
2
2
|
import logging
|
|
3
|
+
from collections import namedtuple
|
|
3
4
|
from string import Template
|
|
4
5
|
from typing import Any
|
|
5
6
|
from typing import Dict
|
|
@@ -12,11 +13,28 @@ from packaging.requirements import Requirement
|
|
|
12
13
|
from packaging.utils import canonicalize_name
|
|
13
14
|
|
|
14
15
|
from cartography.intel.github.util import fetch_all
|
|
16
|
+
from cartography.intel.github.util import PaginatedGraphqlData
|
|
17
|
+
from cartography.util import backoff_handler
|
|
18
|
+
from cartography.util import retries_with_backoff
|
|
15
19
|
from cartography.util import run_cleanup_job
|
|
16
20
|
from cartography.util import timeit
|
|
17
21
|
|
|
18
22
|
logger = logging.getLogger(__name__)
|
|
19
23
|
|
|
24
|
+
|
|
25
|
+
# Representation of a user's permission level and affiliation to a GitHub repo. See:
|
|
26
|
+
# - Permission: https://docs.github.com/en/graphql/reference/enums#repositorypermission
|
|
27
|
+
# - Affiliation: https://docs.github.com/en/graphql/reference/enums#collaboratoraffiliation
|
|
28
|
+
UserAffiliationAndRepoPermission = namedtuple(
|
|
29
|
+
'UserAffiliationAndRepoPermission',
|
|
30
|
+
[
|
|
31
|
+
'user', # Dict
|
|
32
|
+
'permission', # 'WRITE', 'MAINTAIN', 'ADMIN', etc
|
|
33
|
+
'affiliation', # 'OUTSIDE', 'DIRECT'
|
|
34
|
+
],
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
20
38
|
GITHUB_ORG_REPOS_PAGINATED_GRAPHQL = """
|
|
21
39
|
query($login: String!, $cursor: String) {
|
|
22
40
|
organization(login: $login)
|
|
@@ -59,17 +77,11 @@ GITHUB_ORG_REPOS_PAGINATED_GRAPHQL = """
|
|
|
59
77
|
login
|
|
60
78
|
__typename
|
|
61
79
|
}
|
|
62
|
-
collaborators(
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
url
|
|
68
|
-
login
|
|
69
|
-
name
|
|
70
|
-
email
|
|
71
|
-
company
|
|
72
|
-
}
|
|
80
|
+
directCollaborators: collaborators(first: 100, affiliation: DIRECT) {
|
|
81
|
+
totalCount
|
|
82
|
+
}
|
|
83
|
+
outsideCollaborators: collaborators(first: 100, affiliation: OUTSIDE) {
|
|
84
|
+
totalCount
|
|
73
85
|
}
|
|
74
86
|
requirements:object(expression: "HEAD:requirements.txt") {
|
|
75
87
|
... on Blob {
|
|
@@ -89,6 +101,142 @@ GITHUB_ORG_REPOS_PAGINATED_GRAPHQL = """
|
|
|
89
101
|
# Note: In the above query, `HEAD` references the default branch.
|
|
90
102
|
# See https://stackoverflow.com/questions/48935381/github-graphql-api-default-branch-in-repository
|
|
91
103
|
|
|
104
|
+
GITHUB_REPO_COLLABS_PAGINATED_GRAPHQL = """
|
|
105
|
+
query($login: String!, $repo: String!, $affiliation: CollaboratorAffiliation!, $cursor: String) {
|
|
106
|
+
organization(login: $login) {
|
|
107
|
+
url
|
|
108
|
+
login
|
|
109
|
+
repository(name: $repo){
|
|
110
|
+
name
|
|
111
|
+
collaborators(first: 50, affiliation: $affiliation, after: $cursor) {
|
|
112
|
+
edges {
|
|
113
|
+
permission
|
|
114
|
+
}
|
|
115
|
+
nodes {
|
|
116
|
+
url
|
|
117
|
+
login
|
|
118
|
+
name
|
|
119
|
+
email
|
|
120
|
+
company
|
|
121
|
+
}
|
|
122
|
+
pageInfo{
|
|
123
|
+
endCursor
|
|
124
|
+
hasNextPage
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
rateLimit {
|
|
130
|
+
limit
|
|
131
|
+
cost
|
|
132
|
+
remaining
|
|
133
|
+
resetAt
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
"""
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def _get_repo_collaborators_inner_func(
|
|
140
|
+
org: str,
|
|
141
|
+
api_url: str,
|
|
142
|
+
token: str,
|
|
143
|
+
repo_name: str,
|
|
144
|
+
affiliation: str,
|
|
145
|
+
collab_users: list[dict[str, Any]],
|
|
146
|
+
collab_permission: list[str],
|
|
147
|
+
) -> None:
|
|
148
|
+
logger.info(f"Loading {affiliation} collaborators for repo {repo_name}.")
|
|
149
|
+
collaborators = _get_repo_collaborators(token, api_url, org, repo_name, affiliation)
|
|
150
|
+
|
|
151
|
+
# nodes and edges are expected to always be present given that we only call for them if totalCount is > 0
|
|
152
|
+
# however sometimes GitHub returns None, as in issue 1334 and 1404.
|
|
153
|
+
for collab in collaborators.nodes or []:
|
|
154
|
+
collab_users.append(collab)
|
|
155
|
+
|
|
156
|
+
# The `or []` is because `.edges` can be None.
|
|
157
|
+
for perm in collaborators.edges or []:
|
|
158
|
+
collab_permission.append(perm['permission'])
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def _get_repo_collaborators_for_multiple_repos(
|
|
162
|
+
repo_raw_data: list[dict[str, Any]],
|
|
163
|
+
affiliation: str,
|
|
164
|
+
org: str,
|
|
165
|
+
api_url: str,
|
|
166
|
+
token: str,
|
|
167
|
+
) -> dict[str, list[UserAffiliationAndRepoPermission]]:
|
|
168
|
+
"""
|
|
169
|
+
For every repo in the given list, retrieve the collaborators.
|
|
170
|
+
:param repo_raw_data: A list of dicts representing repos. See tests.data.github.repos.GET_REPOS for data shape.
|
|
171
|
+
:param affiliation: The type of affiliation to retrieve collaborators for. Either 'DIRECT' or 'OUTSIDE'.
|
|
172
|
+
See https://docs.github.com/en/graphql/reference/enums#collaboratoraffiliation
|
|
173
|
+
:param org: The name of the target Github organization as string.
|
|
174
|
+
:param api_url: The Github v4 API endpoint as string.
|
|
175
|
+
:param token: The Github API token as string.
|
|
176
|
+
:return: A dictionary of repo URL to list of UserAffiliationAndRepoPermission
|
|
177
|
+
"""
|
|
178
|
+
result: dict[str, list[UserAffiliationAndRepoPermission]] = {}
|
|
179
|
+
for repo in repo_raw_data:
|
|
180
|
+
repo_name = repo['name']
|
|
181
|
+
repo_url = repo['url']
|
|
182
|
+
|
|
183
|
+
if ((affiliation == 'OUTSIDE' and repo['outsideCollaborators']['totalCount'] == 0) or
|
|
184
|
+
(affiliation == 'DIRECT' and repo['directCollaborators']['totalCount'] == 0)):
|
|
185
|
+
# repo has no collabs of the affiliation type we're looking for, so don't waste time making an API call
|
|
186
|
+
result[repo_url] = []
|
|
187
|
+
continue
|
|
188
|
+
|
|
189
|
+
collab_users: List[dict[str, Any]] = []
|
|
190
|
+
collab_permission: List[str] = []
|
|
191
|
+
|
|
192
|
+
retries_with_backoff(
|
|
193
|
+
_get_repo_collaborators_inner_func,
|
|
194
|
+
TypeError,
|
|
195
|
+
5,
|
|
196
|
+
backoff_handler,
|
|
197
|
+
)(
|
|
198
|
+
org=org,
|
|
199
|
+
api_url=api_url,
|
|
200
|
+
token=token,
|
|
201
|
+
repo_name=repo_name,
|
|
202
|
+
affiliation=affiliation,
|
|
203
|
+
collab_users=collab_users,
|
|
204
|
+
collab_permission=collab_permission,
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
result[repo_url] = [
|
|
208
|
+
UserAffiliationAndRepoPermission(user, permission, affiliation)
|
|
209
|
+
for user, permission in zip(collab_users, collab_permission)
|
|
210
|
+
]
|
|
211
|
+
return result
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def _get_repo_collaborators(
|
|
215
|
+
token: str, api_url: str, organization: str, repo: str, affiliation: str,
|
|
216
|
+
) -> PaginatedGraphqlData:
|
|
217
|
+
"""
|
|
218
|
+
Retrieve a list of collaborators for a given repository, as described in
|
|
219
|
+
https://docs.github.com/en/graphql/reference/objects#repositorycollaboratorconnection.
|
|
220
|
+
:param token: The Github API token as string.
|
|
221
|
+
:param api_url: The Github v4 API endpoint as string.
|
|
222
|
+
:param organization: The name of the target Github organization as string.
|
|
223
|
+
:pram repo: The name of the target Github repository as string.
|
|
224
|
+
:param affiliation: The type of affiliation to retrieve collaborators for. Either 'DIRECT' or 'OUTSIDE'.
|
|
225
|
+
See https://docs.github.com/en/graphql/reference/enums#collaboratoraffiliation
|
|
226
|
+
:return: A list of dicts representing repos. See tests.data.github.repos for data shape.
|
|
227
|
+
"""
|
|
228
|
+
collaborators, _ = fetch_all(
|
|
229
|
+
token,
|
|
230
|
+
api_url,
|
|
231
|
+
organization,
|
|
232
|
+
GITHUB_REPO_COLLABS_PAGINATED_GRAPHQL,
|
|
233
|
+
'repository',
|
|
234
|
+
resource_inner_type='collaborators',
|
|
235
|
+
repo=repo,
|
|
236
|
+
affiliation=affiliation,
|
|
237
|
+
)
|
|
238
|
+
return collaborators
|
|
239
|
+
|
|
92
240
|
|
|
93
241
|
@timeit
|
|
94
242
|
def get(token: str, api_url: str, organization: str) -> List[Dict]:
|
|
@@ -111,11 +259,18 @@ def get(token: str, api_url: str, organization: str) -> List[Dict]:
|
|
|
111
259
|
return repos.nodes
|
|
112
260
|
|
|
113
261
|
|
|
114
|
-
def transform(
|
|
262
|
+
def transform(
|
|
263
|
+
repos_json: List[Dict], direct_collaborators: dict[str, List[UserAffiliationAndRepoPermission]],
|
|
264
|
+
outside_collaborators: dict[str, List[UserAffiliationAndRepoPermission]],
|
|
265
|
+
) -> Dict:
|
|
115
266
|
"""
|
|
116
267
|
Parses the JSON returned from GitHub API to create data for graph ingestion
|
|
117
|
-
:param repos_json: the list of individual repository nodes from GitHub.
|
|
118
|
-
|
|
268
|
+
:param repos_json: the list of individual repository nodes from GitHub.
|
|
269
|
+
See tests.data.github.repos.GET_REPOS for data shape.
|
|
270
|
+
:param direct_collaborators: dict of repo URL to list of direct collaborators.
|
|
271
|
+
See tests.data.github.repos.DIRECT_COLLABORATORS for data shape.
|
|
272
|
+
:param outside_collaborators: dict of repo URL to list of outside collaborators.
|
|
273
|
+
See tests.data.github.repos.OUTSIDE_COLLABORATORS for data shape.
|
|
119
274
|
:return: Dict containing the repos, repo->language mapping, owners->repo mapping, outside collaborators->repo
|
|
120
275
|
mapping, and Python requirements files (if any) in a repo.
|
|
121
276
|
"""
|
|
@@ -123,7 +278,10 @@ def transform(repos_json: List[Dict]) -> Dict:
|
|
|
123
278
|
transformed_repo_languages: List[Dict] = []
|
|
124
279
|
transformed_repo_owners: List[Dict] = []
|
|
125
280
|
# See https://docs.github.com/en/graphql/reference/enums#repositorypermission
|
|
126
|
-
|
|
281
|
+
transformed_outside_collaborators: Dict[str, List[Any]] = {
|
|
282
|
+
'ADMIN': [], 'MAINTAIN': [], 'READ': [], 'TRIAGE': [], 'WRITE': [],
|
|
283
|
+
}
|
|
284
|
+
transformed_direct_collaborators: Dict[str, List[Any]] = {
|
|
127
285
|
'ADMIN': [], 'MAINTAIN': [], 'READ': [], 'TRIAGE': [], 'WRITE': [],
|
|
128
286
|
}
|
|
129
287
|
transformed_requirements_files: List[Dict] = []
|
|
@@ -131,14 +289,22 @@ def transform(repos_json: List[Dict]) -> Dict:
|
|
|
131
289
|
_transform_repo_languages(repo_object['url'], repo_object, transformed_repo_languages)
|
|
132
290
|
_transform_repo_objects(repo_object, transformed_repo_list)
|
|
133
291
|
_transform_repo_owners(repo_object['owner']['url'], repo_object, transformed_repo_owners)
|
|
134
|
-
_transform_collaborators(
|
|
292
|
+
_transform_collaborators(
|
|
293
|
+
repo_object['url'], outside_collaborators[repo_object['url']],
|
|
294
|
+
transformed_outside_collaborators,
|
|
295
|
+
)
|
|
296
|
+
_transform_collaborators(
|
|
297
|
+
repo_object['url'], direct_collaborators[repo_object['url']],
|
|
298
|
+
transformed_direct_collaborators,
|
|
299
|
+
)
|
|
135
300
|
_transform_requirements_txt(repo_object['requirements'], repo_object['url'], transformed_requirements_files)
|
|
136
301
|
_transform_setup_cfg_requirements(repo_object['setupCfg'], repo_object['url'], transformed_requirements_files)
|
|
137
302
|
results = {
|
|
138
303
|
'repos': transformed_repo_list,
|
|
139
304
|
'repo_languages': transformed_repo_languages,
|
|
140
305
|
'repo_owners': transformed_repo_owners,
|
|
141
|
-
'
|
|
306
|
+
'repo_outside_collaborators': transformed_outside_collaborators,
|
|
307
|
+
'repo_direct_collaborators': transformed_direct_collaborators,
|
|
142
308
|
'python_requirements': transformed_requirements_files,
|
|
143
309
|
}
|
|
144
310
|
return results
|
|
@@ -229,11 +395,15 @@ def _transform_repo_languages(repo_url: str, repo: Dict, repo_languages: List[Di
|
|
|
229
395
|
})
|
|
230
396
|
|
|
231
397
|
|
|
232
|
-
def _transform_collaborators(
|
|
398
|
+
def _transform_collaborators(
|
|
399
|
+
repo_url: str, collaborators: List[UserAffiliationAndRepoPermission], transformed_collaborators: Dict,
|
|
400
|
+
) -> None:
|
|
233
401
|
"""
|
|
234
|
-
Performs data adjustments for
|
|
402
|
+
Performs data adjustments for collaborators in a GitHub repo.
|
|
235
403
|
Output data shape = [{permission, repo_url, url (the user's URL), login, name}, ...]
|
|
236
|
-
:param collaborators:
|
|
404
|
+
:param collaborators: For data shape, see
|
|
405
|
+
cartography.tests.data.github.repos.DIRECT_COLLABORATORS
|
|
406
|
+
cartography.tests.data.github.repos.OUTSIDE_COLLABORATORS
|
|
237
407
|
:param repo_url: The URL of the GitHub repo.
|
|
238
408
|
:param transformed_collaborators: Output dict. Data shape =
|
|
239
409
|
{'ADMIN': [{ user }, ...], 'MAINTAIN': [{ user }, ...], 'READ': [ ... ], 'TRIAGE': [ ... ], 'WRITE': [ ... ]}
|
|
@@ -241,10 +411,11 @@ def _transform_collaborators(collaborators: Dict, repo_url: str, transformed_col
|
|
|
241
411
|
"""
|
|
242
412
|
# `collaborators` is sometimes None
|
|
243
413
|
if collaborators:
|
|
244
|
-
for
|
|
245
|
-
|
|
414
|
+
for collaborator in collaborators:
|
|
415
|
+
user = collaborator.user
|
|
246
416
|
user['repo_url'] = repo_url
|
|
247
|
-
|
|
417
|
+
user['affiliation'] = collaborator.affiliation
|
|
418
|
+
transformed_collaborators[collaborator.permission].append(user)
|
|
248
419
|
|
|
249
420
|
|
|
250
421
|
def _transform_requirements_txt(
|
|
@@ -482,7 +653,7 @@ def load_github_owners(neo4j_session: neo4j.Session, update_tag: int, repo_owner
|
|
|
482
653
|
|
|
483
654
|
|
|
484
655
|
@timeit
|
|
485
|
-
def load_collaborators(neo4j_session: neo4j.Session, update_tag: int, collaborators: Dict) -> None:
|
|
656
|
+
def load_collaborators(neo4j_session: neo4j.Session, update_tag: int, collaborators: Dict, affiliation: str) -> None:
|
|
486
657
|
query = Template("""
|
|
487
658
|
UNWIND $UserData as user
|
|
488
659
|
|
|
@@ -502,7 +673,7 @@ def load_collaborators(neo4j_session: neo4j.Session, update_tag: int, collaborat
|
|
|
502
673
|
SET o.lastupdated = $UpdateTag
|
|
503
674
|
""")
|
|
504
675
|
for collab_type in collaborators.keys():
|
|
505
|
-
relationship_label = f"
|
|
676
|
+
relationship_label = f"{affiliation}_COLLAB_{collab_type}"
|
|
506
677
|
neo4j_session.run(
|
|
507
678
|
query.safe_substitute(rel_label=relationship_label),
|
|
508
679
|
UserData=collaborators[collab_type],
|
|
@@ -515,7 +686,12 @@ def load(neo4j_session: neo4j.Session, common_job_parameters: Dict, repo_data: D
|
|
|
515
686
|
load_github_repos(neo4j_session, common_job_parameters['UPDATE_TAG'], repo_data['repos'])
|
|
516
687
|
load_github_owners(neo4j_session, common_job_parameters['UPDATE_TAG'], repo_data['repo_owners'])
|
|
517
688
|
load_github_languages(neo4j_session, common_job_parameters['UPDATE_TAG'], repo_data['repo_languages'])
|
|
518
|
-
load_collaborators(
|
|
689
|
+
load_collaborators(
|
|
690
|
+
neo4j_session, common_job_parameters['UPDATE_TAG'], repo_data['repo_direct_collaborators'], 'DIRECT',
|
|
691
|
+
)
|
|
692
|
+
load_collaborators(
|
|
693
|
+
neo4j_session, common_job_parameters['UPDATE_TAG'], repo_data['repo_outside_collaborators'], 'OUTSIDE',
|
|
694
|
+
)
|
|
519
695
|
load_python_requirements(neo4j_session, common_job_parameters['UPDATE_TAG'], repo_data['python_requirements'])
|
|
520
696
|
|
|
521
697
|
|
|
@@ -561,6 +737,12 @@ def sync(
|
|
|
561
737
|
"""
|
|
562
738
|
logger.info("Syncing GitHub repos")
|
|
563
739
|
repos_json = get(github_api_key, github_url, organization)
|
|
564
|
-
|
|
740
|
+
direct_collabs = _get_repo_collaborators_for_multiple_repos(
|
|
741
|
+
repos_json, "DIRECT", organization, github_url, github_api_key,
|
|
742
|
+
)
|
|
743
|
+
outside_collabs = _get_repo_collaborators_for_multiple_repos(
|
|
744
|
+
repos_json, "OUTSIDE", organization, github_url, github_api_key,
|
|
745
|
+
)
|
|
746
|
+
repo_data = transform(repos_json, direct_collabs, outside_collabs)
|
|
565
747
|
load(neo4j_session, common_job_parameters, repo_data)
|
|
566
748
|
run_cleanup_job('github_repos_cleanup.json', neo4j_session, common_job_parameters)
|