cartography 0.90.0rc2__tar.gz → 0.92.0__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.

Files changed (349) hide show
  1. {cartography-0.90.0rc2/cartography.egg-info → cartography-0.92.0}/PKG-INFO +1 -1
  2. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/cli.py +44 -0
  3. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/config.py +12 -0
  4. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/indexes.cypher +0 -6
  5. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ec2/images.py +10 -9
  6. cartography-0.92.0/cartography/intel/aws/ec2/launch_templates.py +147 -0
  7. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ec2/snapshots.py +4 -2
  8. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/iam.py +1 -0
  9. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/github/teams.py +6 -3
  10. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/github/util.py +26 -8
  11. cartography-0.92.0/cartography/intel/kandji/__init__.py +39 -0
  12. cartography-0.92.0/cartography/intel/kandji/devices.py +84 -0
  13. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/okta/__init__.py +1 -1
  14. cartography-0.92.0/cartography/intel/okta/awssaml.py +237 -0
  15. cartography-0.92.0/cartography/models/aws/ec2/launch_template_versions.py +81 -0
  16. cartography-0.92.0/cartography/models/aws/ec2/launch_templates.py +46 -0
  17. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/ec2/subnet_instance.py +1 -1
  18. cartography-0.92.0/cartography/models/kandji/device.py +48 -0
  19. cartography-0.92.0/cartography/models/kandji/tenant.py +17 -0
  20. cartography-0.92.0/cartography/py.typed +0 -0
  21. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/sync.py +2 -0
  22. {cartography-0.90.0rc2 → cartography-0.92.0/cartography.egg-info}/PKG-INFO +1 -1
  23. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography.egg-info/SOURCES.txt +7 -1
  24. {cartography-0.90.0rc2 → cartography-0.92.0}/setup.cfg +5 -0
  25. {cartography-0.90.0rc2 → cartography-0.92.0}/setup.py +1 -1
  26. cartography-0.90.0rc2/cartography/data/jobs/cleanup/aws_import_ec2_launch_templates_cleanup.json +0 -13
  27. cartography-0.90.0rc2/cartography/intel/aws/ec2/launch_templates.py +0 -115
  28. cartography-0.90.0rc2/cartography/intel/okta/awssaml.py +0 -129
  29. {cartography-0.90.0rc2 → cartography-0.92.0}/LICENSE +0 -0
  30. {cartography-0.90.0rc2 → cartography-0.92.0}/NOTICE +0 -0
  31. {cartography-0.90.0rc2 → cartography-0.92.0}/README.md +0 -0
  32. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/__init__.py +0 -0
  33. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/__main__.py +0 -0
  34. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/client/__init__.py +0 -0
  35. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/client/aws/__init__.py +0 -0
  36. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/client/aws/iam.py +0 -0
  37. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/client/core/__init__.py +0 -0
  38. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/client/core/tx.py +0 -0
  39. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/__init__.py +0 -0
  40. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/__init__.py +0 -0
  41. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/analysis/__init__.py +0 -0
  42. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/analysis/aws_ec2_asset_exposure.json +0 -0
  43. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/analysis/aws_ec2_iaminstance.json +0 -0
  44. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/analysis/aws_ec2_iaminstanceprofile.json +0 -0
  45. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/analysis/aws_ec2_keypair_analysis.json +0 -0
  46. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/analysis/aws_eks_asset_exposure.json +0 -0
  47. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/analysis/aws_foreign_accounts.json +0 -0
  48. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/analysis/aws_lambda_ecr.json +0 -0
  49. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/analysis/aws_s3acl_analysis.json +0 -0
  50. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/analysis/gcp_compute_asset_inet_exposure.json +0 -0
  51. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/analysis/gcp_gke_asset_exposure.json +0 -0
  52. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/analysis/gcp_gke_basic_auth.json +0 -0
  53. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/analysis/gsuite_human_link.json +0 -0
  54. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/__init__.py +0 -0
  55. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_account_cleanup.json +0 -0
  56. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_apigateway_details.json +0 -0
  57. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_dns_cleanup.json +0 -0
  58. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_account_access_key_cleanup.json +0 -0
  59. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_apigateway_cleanup.json +0 -0
  60. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_config_cleanup.json +0 -0
  61. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_ec2_launch_configurations_cleanup.json +0 -0
  62. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_ec2_security_groupinfo_cleanup.json +0 -0
  63. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_ecr_cleanup.json +0 -0
  64. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_ecs_cleanup.json +0 -0
  65. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_elastic_ip_addresses_cleanup.json +0 -0
  66. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_elasticache_cleanup.json +0 -0
  67. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_es_cleanup.json +0 -0
  68. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_groups_cleanup.json +0 -0
  69. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_groups_membership_cleanup.json +0 -0
  70. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_groups_policy_cleanup.json +0 -0
  71. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_internet_gateways_cleanup.json +0 -0
  72. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_kms_cleanup.json +0 -0
  73. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_lambda_cleanup.json +0 -0
  74. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_principals_cleanup.json +0 -0
  75. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_rds_clusters_cleanup.json +0 -0
  76. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_rds_instances_cleanup.json +0 -0
  77. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_rds_snapshots_cleanup.json +0 -0
  78. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_redshift_clusters_cleanup.json +0 -0
  79. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_reserved_instances_cleanup.json +0 -0
  80. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_roles_cleanup.json +0 -0
  81. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_roles_policy_cleanup.json +0 -0
  82. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_s3_acl_cleanup.json +0 -0
  83. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_s3_buckets_cleanup.json +0 -0
  84. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_secrets_cleanup.json +0 -0
  85. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_securityhub_cleanup.json +0 -0
  86. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_snapshots_cleanup.json +0 -0
  87. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_sqs_queues_cleanup.json +0 -0
  88. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_tags_cleanup.json +0 -0
  89. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_tgw_cleanup.json +0 -0
  90. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_users_cleanup.json +0 -0
  91. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_vpc_cleanup.json +0 -0
  92. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_import_vpc_peering_cleanup.json +0 -0
  93. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_ingest_ec2_auto_scaling_groups_cleanup.json +0 -0
  94. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_ingest_load_balancers_cleanup.json +0 -0
  95. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_ingest_load_balancers_v2_cleanup.json +0 -0
  96. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_ingest_subnets_cleanup.json +0 -0
  97. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_kms_details.json +0 -0
  98. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_post_ingestion_principals_cleanup.json +0 -0
  99. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/aws_s3_details.json +0 -0
  100. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/azure_cosmosdb_cassandra_keyspace_cleanup.json +0 -0
  101. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/azure_cosmosdb_cors_details.json +0 -0
  102. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/azure_cosmosdb_mongodb_database_cleanup.json +0 -0
  103. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/azure_cosmosdb_sql_database_cleanup.json +0 -0
  104. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/azure_cosmosdb_table_resources_cleanup.json +0 -0
  105. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/azure_database_account_cleanup.json +0 -0
  106. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/azure_import_disks_cleanup.json +0 -0
  107. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/azure_import_snapshots_cleanup.json +0 -0
  108. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/azure_import_virtual_machines_cleanup.json +0 -0
  109. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/azure_sql_server_cleanup.json +0 -0
  110. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/azure_storage_account_cleanup.json +0 -0
  111. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/azure_subscriptions_cleanup.json +0 -0
  112. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/azure_tenant_cleanup.json +0 -0
  113. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/crowdstrike_import_cleanup.json +0 -0
  114. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/crxcavator_import_cleanup.json +0 -0
  115. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/digitalocean_droplet_cleanup.json +0 -0
  116. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/digitalocean_project_cleanup.json +0 -0
  117. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/gcp_compute_firewall_cleanup.json +0 -0
  118. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/gcp_compute_forwarding_rules_cleanup.json +0 -0
  119. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/gcp_compute_instance_cleanup.json +0 -0
  120. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/gcp_compute_vpc_cleanup.json +0 -0
  121. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/gcp_compute_vpc_subnet_cleanup.json +0 -0
  122. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/gcp_crm_folder_cleanup.json +0 -0
  123. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/gcp_crm_organization_cleanup.json +0 -0
  124. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/gcp_crm_project_cleanup.json +0 -0
  125. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/gcp_dns_cleanup.json +0 -0
  126. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/gcp_gke_cluster_cleanup.json +0 -0
  127. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/gcp_storage_bucket_cleanup.json +0 -0
  128. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/github_repos_cleanup.json +0 -0
  129. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/github_users_cleanup.json +0 -0
  130. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/gsuite_ingest_groups_cleanup.json +0 -0
  131. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/gsuite_ingest_users_cleanup.json +0 -0
  132. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/jamf_import_computers_cleanup.json +0 -0
  133. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/kubernetes_import_cleanup.json +0 -0
  134. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/oci_import_compartments_cleanup.json +0 -0
  135. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/oci_import_groups_cleanup.json +0 -0
  136. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/oci_import_groups_membership_cleanup.json +0 -0
  137. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/oci_import_policies_cleanup.json +0 -0
  138. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/oci_import_users_cleanup.json +0 -0
  139. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/oci_tenancy_cleanup.json +0 -0
  140. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/okta_groups_cleanup.json +0 -0
  141. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/okta_import_cleanup.json +0 -0
  142. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/cleanup/pagerduty_import_cleanup.json +0 -0
  143. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/scoped_analysis/__init__.py +0 -0
  144. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/jobs/scoped_analysis/semgrep_sca_risk_analysis.json +0 -0
  145. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/data/permission_relationships.yaml +0 -0
  146. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/driftdetect/__init__.py +0 -0
  147. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/driftdetect/__main__.py +0 -0
  148. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/driftdetect/add_shortcut.py +0 -0
  149. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/driftdetect/cli.py +0 -0
  150. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/driftdetect/config.py +0 -0
  151. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/driftdetect/detect_deviations.py +0 -0
  152. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/driftdetect/get_states.py +0 -0
  153. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/driftdetect/model.py +0 -0
  154. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/driftdetect/reporter.py +0 -0
  155. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/driftdetect/serializers.py +0 -0
  156. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/driftdetect/shortcut.py +0 -0
  157. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/driftdetect/storage.py +0 -0
  158. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/driftdetect/util.py +0 -0
  159. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/graph/__init__.py +0 -0
  160. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/graph/cleanupbuilder.py +0 -0
  161. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/graph/context.py +0 -0
  162. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/graph/job.py +0 -0
  163. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/graph/querybuilder.py +0 -0
  164. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/graph/statement.py +0 -0
  165. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/__init__.py +0 -0
  166. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/analysis.py +0 -0
  167. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/__init__.py +0 -0
  168. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/apigateway.py +0 -0
  169. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/config.py +0 -0
  170. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/dynamodb.py +0 -0
  171. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ec2/__init__.py +0 -0
  172. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ec2/auto_scaling_groups.py +0 -0
  173. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ec2/elastic_ip_addresses.py +0 -0
  174. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ec2/instances.py +0 -0
  175. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ec2/internet_gateways.py +0 -0
  176. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ec2/key_pairs.py +0 -0
  177. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ec2/load_balancer_v2s.py +0 -0
  178. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ec2/load_balancers.py +0 -0
  179. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ec2/network_interfaces.py +0 -0
  180. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ec2/reserved_instances.py +0 -0
  181. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ec2/security_groups.py +0 -0
  182. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ec2/subnets.py +0 -0
  183. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ec2/tgw.py +0 -0
  184. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ec2/util.py +0 -0
  185. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ec2/volumes.py +0 -0
  186. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ec2/vpc.py +0 -0
  187. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ec2/vpc_peerings.py +0 -0
  188. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ecr.py +0 -0
  189. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ecs.py +0 -0
  190. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/eks.py +0 -0
  191. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/elasticache.py +0 -0
  192. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/elasticsearch.py +0 -0
  193. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/emr.py +0 -0
  194. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/inspector.py +0 -0
  195. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/kms.py +0 -0
  196. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/lambda_function.py +0 -0
  197. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/organizations.py +0 -0
  198. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/permission_relationships.py +0 -0
  199. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/rds.py +0 -0
  200. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/redshift.py +0 -0
  201. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/resourcegroupstaggingapi.py +0 -0
  202. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/resources.py +0 -0
  203. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/route53.py +0 -0
  204. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/s3.py +0 -0
  205. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/secretsmanager.py +0 -0
  206. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/securityhub.py +0 -0
  207. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/sqs.py +0 -0
  208. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/ssm.py +0 -0
  209. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/util/__init__.py +0 -0
  210. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/util/arns.py +0 -0
  211. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/aws/util/common.py +0 -0
  212. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/azure/__init__.py +0 -0
  213. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/azure/compute.py +0 -0
  214. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/azure/cosmosdb.py +0 -0
  215. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/azure/sql.py +0 -0
  216. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/azure/storage.py +0 -0
  217. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/azure/subscription.py +0 -0
  218. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/azure/tenant.py +0 -0
  219. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/azure/util/__init__.py +0 -0
  220. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/azure/util/credentials.py +0 -0
  221. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/bigfix/__init__.py +0 -0
  222. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/bigfix/computers.py +0 -0
  223. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/create_indexes.py +0 -0
  224. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/crowdstrike/__init__.py +0 -0
  225. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/crowdstrike/endpoints.py +0 -0
  226. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/crowdstrike/spotlight.py +0 -0
  227. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/crowdstrike/util.py +0 -0
  228. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/crxcavator/__init__.py +0 -0
  229. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/crxcavator/crxcavator.py +0 -0
  230. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/cve/__init__.py +0 -0
  231. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/cve/feed.py +0 -0
  232. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/digitalocean/__init__.py +0 -0
  233. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/digitalocean/compute.py +0 -0
  234. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/digitalocean/management.py +0 -0
  235. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/digitalocean/platform.py +0 -0
  236. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/dns.py +0 -0
  237. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/duo/__init__.py +0 -0
  238. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/duo/api_host.py +0 -0
  239. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/duo/endpoints.py +0 -0
  240. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/duo/groups.py +0 -0
  241. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/duo/phones.py +0 -0
  242. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/duo/tokens.py +0 -0
  243. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/duo/users.py +0 -0
  244. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/duo/web_authn_credentials.py +0 -0
  245. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/gcp/__init__.py +0 -0
  246. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/gcp/compute.py +0 -0
  247. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/gcp/crm.py +0 -0
  248. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/gcp/dns.py +0 -0
  249. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/gcp/gke.py +0 -0
  250. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/gcp/storage.py +0 -0
  251. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/github/__init__.py +0 -0
  252. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/github/repos.py +0 -0
  253. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/github/users.py +0 -0
  254. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/gsuite/__init__.py +0 -0
  255. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/gsuite/api.py +0 -0
  256. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/jamf/__init__.py +0 -0
  257. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/jamf/computers.py +0 -0
  258. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/jamf/util.py +0 -0
  259. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/kubernetes/__init__.py +0 -0
  260. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/kubernetes/namespaces.py +0 -0
  261. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/kubernetes/pods.py +0 -0
  262. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/kubernetes/secrets.py +0 -0
  263. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/kubernetes/services.py +0 -0
  264. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/kubernetes/util.py +0 -0
  265. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/lastpass/__init__.py +0 -0
  266. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/lastpass/users.py +0 -0
  267. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/oci/__init__.py +0 -0
  268. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/oci/iam.py +0 -0
  269. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/oci/organizations.py +0 -0
  270. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/oci/utils.py +0 -0
  271. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/okta/applications.py +0 -0
  272. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/okta/factors.py +0 -0
  273. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/okta/groups.py +0 -0
  274. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/okta/organization.py +0 -0
  275. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/okta/origins.py +0 -0
  276. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/okta/roles.py +0 -0
  277. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/okta/sync_state.py +0 -0
  278. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/okta/users.py +0 -0
  279. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/okta/utils.py +0 -0
  280. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/pagerduty/__init__.py +0 -0
  281. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/pagerduty/escalation_policies.py +0 -0
  282. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/pagerduty/schedules.py +0 -0
  283. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/pagerduty/services.py +0 -0
  284. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/pagerduty/teams.py +0 -0
  285. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/pagerduty/users.py +0 -0
  286. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/pagerduty/vendors.py +0 -0
  287. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/semgrep/__init__.py +0 -0
  288. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/intel/semgrep/findings.py +0 -0
  289. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/__init__.py +0 -0
  290. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/__init__.py +0 -0
  291. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/dynamodb/__init__.py +0 -0
  292. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/dynamodb/gsi.py +0 -0
  293. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/dynamodb/tables.py +0 -0
  294. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/ec2/__init__.py +0 -0
  295. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/ec2/images.py +0 -0
  296. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/ec2/instances.py +0 -0
  297. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/ec2/keypairs.py +0 -0
  298. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/ec2/loadbalancerv2.py +0 -0
  299. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/ec2/networkinterface_instance.py +0 -0
  300. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/ec2/networkinterfaces.py +0 -0
  301. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/ec2/privateip_networkinterface.py +0 -0
  302. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/ec2/reservations.py +0 -0
  303. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/ec2/securitygroup_instance.py +0 -0
  304. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/ec2/securitygroup_networkinterface.py +0 -0
  305. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/ec2/subnet_networkinterface.py +0 -0
  306. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/ec2/volumes.py +0 -0
  307. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/eks/__init__.py +0 -0
  308. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/eks/clusters.py +0 -0
  309. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/emr.py +0 -0
  310. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/inspector/__init__.py +0 -0
  311. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/inspector/findings.py +0 -0
  312. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/inspector/packages.py +0 -0
  313. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/ssm/__init__.py +0 -0
  314. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/ssm/instance_information.py +0 -0
  315. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/aws/ssm/instance_patch.py +0 -0
  316. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/bigfix/__init__.py +0 -0
  317. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/bigfix/bigfix_computer.py +0 -0
  318. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/bigfix/bigfix_root.py +0 -0
  319. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/core/__init__.py +0 -0
  320. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/core/common.py +0 -0
  321. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/core/nodes.py +0 -0
  322. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/core/relationships.py +0 -0
  323. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/cve/__init__.py +0 -0
  324. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/cve/cve.py +0 -0
  325. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/cve/cve_feed.py +0 -0
  326. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/duo/__init__.py +0 -0
  327. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/duo/api_host.py +0 -0
  328. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/duo/endpoint.py +0 -0
  329. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/duo/group.py +0 -0
  330. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/duo/phone.py +0 -0
  331. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/duo/token.py +0 -0
  332. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/duo/user.py +0 -0
  333. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/duo/web_authn_credential.py +0 -0
  334. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/github/__init__.py +0 -0
  335. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/github/teams.py +0 -0
  336. {cartography-0.90.0rc2/cartography/models/lastpass → cartography-0.92.0/cartography/models/kandji}/__init__.py +0 -0
  337. {cartography-0.90.0rc2/cartography/models/semgrep → cartography-0.92.0/cartography/models/lastpass}/__init__.py +0 -0
  338. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/lastpass/tenant.py +0 -0
  339. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/lastpass/user.py +0 -0
  340. /cartography-0.90.0rc2/cartography/py.typed → /cartography-0.92.0/cartography/models/semgrep/__init__.py +0 -0
  341. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/semgrep/deployment.py +0 -0
  342. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/semgrep/findings.py +0 -0
  343. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/models/semgrep/locations.py +0 -0
  344. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/stats.py +0 -0
  345. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography/util.py +0 -0
  346. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography.egg-info/dependency_links.txt +0 -0
  347. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography.egg-info/entry_points.txt +0 -0
  348. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography.egg-info/requires.txt +0 -0
  349. {cartography-0.90.0rc2 → cartography-0.92.0}/cartography.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cartography
3
- Version: 0.90.0rc2
3
+ Version: 0.92.0
4
4
  Summary: Explore assets and their relationships across your technical infrastructure.
5
5
  Home-page: https://www.github.com/lyft/cartography
6
6
  Maintainer: Lyft
@@ -325,6 +325,30 @@ class CLI:
325
325
  default=None,
326
326
  help='The name of an environment variable containing a password with which to authenticate to Jamf.',
327
327
  )
328
+ parser.add_argument(
329
+ '--kandji-base-uri',
330
+ type=str,
331
+ default=None,
332
+ help=(
333
+ 'Your Kandji base URI, e.g. https://company.api.kandji.io.'
334
+ 'Required if you are using the Kandji intel module. Ignored otherwise.'
335
+ ),
336
+ )
337
+ parser.add_argument(
338
+ '--kandji-tenant-id',
339
+ type=str,
340
+ default=None,
341
+ help=(
342
+ 'Your Kandji tenant id e.g. company.'
343
+ 'Required using the Kandji intel module. Ignored otherwise.'
344
+ ),
345
+ )
346
+ parser.add_argument(
347
+ '--kandji-token-env-var',
348
+ type=str,
349
+ default=None,
350
+ help='The name of an environment variable containing token with which to authenticate to Kandji.',
351
+ )
328
352
  parser.add_argument(
329
353
  '--k8s-kubeconfig',
330
354
  default=None,
@@ -620,6 +644,26 @@ class CLI:
620
644
  config.jamf_user = None
621
645
  config.jamf_password = None
622
646
 
647
+ # Kandji config
648
+ if config.kandji_base_uri:
649
+ if config.kandji_token_env_var:
650
+ logger.debug(
651
+ "Reading Kandji API token from environment variable '%s'.",
652
+ config.kandji_token_env_var,
653
+ )
654
+ config.kandji_token = os.environ.get(config.kandji_token_env_var)
655
+ elif os.environ.get('KANDJI_TOKEN'):
656
+ logger.debug(
657
+ "Reading Kandji API token from environment variable 'KANDJI_TOKEN'.",
658
+ )
659
+ config.kandji_token = os.environ.get('KANDJI_TOKEN')
660
+ else:
661
+ logger.warning("A Kandji base URI was provided but a token was not.")
662
+ config.kandji_token = None
663
+ else:
664
+ logger.warning("A Kandji base URI was not provided.")
665
+ config.kandji_base_uri = None
666
+
623
667
  if config.statsd_enabled:
624
668
  logger.debug(
625
669
  f'statsd enabled. Sending metrics to server {config.statsd_host}:{config.statsd_port}. '
@@ -69,6 +69,12 @@ class Config:
69
69
  :param jamf_user: User name used to authenticate to the Jamf data provider. Optional.
70
70
  :type jamf_password: string
71
71
  :param jamf_password: Password used to authenticate to the Jamf data provider. Optional.
72
+ :type kandji_base_uri: string
73
+ :param kandji_base_uri: Kandji data provider base URI, e.g. https://company.api.kandji.io. Optional.
74
+ :type kandji_tenant_id: string
75
+ :param kandji_tenant_id: Kandji tenant id. e.g. company Optional.
76
+ :type kandji_token: string
77
+ :param kandji_token: Token used to authenticate to the Kandji data provider. Optional.
72
78
  :type statsd_enabled: bool
73
79
  :param statsd_enabled: Whether to collect statsd metrics such as sync execution times. Optional.
74
80
  :type statsd_host: str
@@ -137,6 +143,9 @@ class Config:
137
143
  jamf_base_uri=None,
138
144
  jamf_user=None,
139
145
  jamf_password=None,
146
+ kandji_base_uri=None,
147
+ kandji_tenant_id=None,
148
+ kandji_token=None,
140
149
  k8s_kubeconfig=None,
141
150
  statsd_enabled=False,
142
151
  statsd_prefix=None,
@@ -190,6 +199,9 @@ class Config:
190
199
  self.jamf_base_uri = jamf_base_uri
191
200
  self.jamf_user = jamf_user
192
201
  self.jamf_password = jamf_password
202
+ self.kandji_base_uri = kandji_base_uri
203
+ self.kandji_tenant_id = kandji_tenant_id
204
+ self.kandji_token = kandji_token
193
205
  self.k8s_kubeconfig = k8s_kubeconfig
194
206
  self.statsd_enabled = statsd_enabled
195
207
  self.statsd_prefix = statsd_prefix
@@ -200,12 +200,6 @@ CREATE INDEX IF NOT EXISTS FOR (n:KMSGrant) ON (n.lastupdated);
200
200
  CREATE INDEX IF NOT EXISTS FOR (n:LaunchConfiguration) ON (n.id);
201
201
  CREATE INDEX IF NOT EXISTS FOR (n:LaunchConfiguration) ON (n.name);
202
202
  CREATE INDEX IF NOT EXISTS FOR (n:LaunchConfiguration) ON (n.lastupdated);
203
- CREATE INDEX IF NOT EXISTS FOR (n:LaunchTemplate) ON (n.id);
204
- CREATE INDEX IF NOT EXISTS FOR (n:LaunchTemplate) ON (n.name);
205
- CREATE INDEX IF NOT EXISTS FOR (n:LaunchTemplate) ON (n.lastupdated);
206
- CREATE INDEX IF NOT EXISTS FOR (n:LaunchTemplateVersion) ON (n.id);
207
- CREATE INDEX IF NOT EXISTS FOR (n:LaunchTemplateVersion) ON (n.name);
208
- CREATE INDEX IF NOT EXISTS FOR (n:LaunchTemplateVersion) ON (n.lastupdated);
209
203
  CREATE INDEX IF NOT EXISTS FOR (n:LoadBalancer) ON (n.dnsname);
210
204
  CREATE INDEX IF NOT EXISTS FOR (n:LoadBalancer) ON (n.id);
211
205
  CREATE INDEX IF NOT EXISTS FOR (n:LoadBalancer) ON (n.lastupdated);
@@ -19,23 +19,23 @@ logger = logging.getLogger(__name__)
19
19
 
20
20
  @timeit
21
21
  def get_images_in_use(neo4j_session: neo4j.Session, region: str, current_aws_account_id: str) -> List[str]:
22
- # We use OPTIONAL here to allow query chaining with queries that may not match.
23
22
  get_images_query = """
24
- OPTIONAL MATCH (:AWSAccount{id: $AWS_ACCOUNT_ID})-[:RESOURCE]->(i:EC2Instance)
23
+ MATCH (:AWSAccount{id: $AWS_ACCOUNT_ID})-[:RESOURCE]->(i:EC2Instance)
25
24
  WHERE i.region = $Region
26
- WITH collect(DISTINCT i.imageid) AS images
27
- OPTIONAL MATCH (:AWSAccount{id: $AWS_ACCOUNT_ID})-[:RESOURCE]->(lc:LaunchConfiguration)
25
+ RETURN DISTINCT(i.imageid) as image
26
+ UNION
27
+ MATCH (:AWSAccount{id: $AWS_ACCOUNT_ID})-[:RESOURCE]->(lc:LaunchConfiguration)
28
28
  WHERE lc.region = $Region
29
- WITH collect(DISTINCT lc.image_id)+images AS images
30
- OPTIONAL MATCH (:AWSAccount{id: $AWS_ACCOUNT_ID})-[:RESOURCE]->(ltv:LaunchTemplateVersion)
29
+ RETURN DISTINCT(lc.image_id) as image
30
+ UNION
31
+ MATCH (:AWSAccount{id: $AWS_ACCOUNT_ID})-[:RESOURCE]->(ltv:LaunchTemplateVersion)
31
32
  WHERE ltv.region = $Region
32
- WITH collect(DISTINCT ltv.image_id)+images AS images
33
- RETURN images
33
+ RETURN DISTINCT(ltv.image_id) as image
34
34
  """
35
35
  results = neo4j_session.run(get_images_query, AWS_ACCOUNT_ID=current_aws_account_id, Region=region)
36
36
  images = []
37
37
  for r in results:
38
- images.extend(r['images'])
38
+ images.append(r['image'])
39
39
  return images
40
40
 
41
41
 
@@ -51,6 +51,7 @@ def get_images(boto3_session: boto3.session.Session, region: str, image_ids: Lis
51
51
  logger.warning(f"Failed retrieve images for region - {region}. Error - {e}")
52
52
  try:
53
53
  if image_ids:
54
+ image_ids = [image_id for image_id in image_ids if image_id is not None]
54
55
  images_in_use = client.describe_images(ImageIds=image_ids)['Images']
55
56
  # Ensure we're not adding duplicates
56
57
  _ids = [image["ImageId"] for image in images]
@@ -0,0 +1,147 @@
1
+ import logging
2
+ from typing import Any
3
+
4
+ import boto3
5
+ import neo4j
6
+
7
+ from .util import get_botocore_config
8
+ from cartography.client.core.tx import load
9
+ from cartography.graph.job import GraphJob
10
+ from cartography.models.aws.ec2.launch_template_versions import LaunchTemplateVersionSchema
11
+ from cartography.models.aws.ec2.launch_templates import LaunchTemplateSchema
12
+ from cartography.util import aws_handle_regions
13
+ from cartography.util import timeit
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ @timeit
19
+ @aws_handle_regions
20
+ def get_launch_templates(boto3_session: boto3.session.Session, region: str) -> list[dict[str, Any]]:
21
+ client = boto3_session.client('ec2', region_name=region, config=get_botocore_config())
22
+ paginator = client.get_paginator('describe_launch_templates')
23
+ templates: list[dict[str, Any]] = []
24
+ for page in paginator.paginate():
25
+ templates.extend(page['LaunchTemplates'])
26
+ return templates
27
+
28
+
29
+ def transform_launch_templates(templates: list[dict[str, Any]]) -> list[dict[str, Any]]:
30
+ result: list[dict[str, Any]] = []
31
+ for template in templates:
32
+ current = template.copy()
33
+ current['CreateTime'] = str(int(current['CreateTime'].timestamp()))
34
+ result.append(current)
35
+ return result
36
+
37
+
38
+ @timeit
39
+ def load_launch_templates(
40
+ neo4j_session: neo4j.Session,
41
+ data: list[dict[str, Any]],
42
+ region: str,
43
+ current_aws_account_id: str,
44
+ update_tag: int,
45
+ ) -> None:
46
+ load(
47
+ neo4j_session,
48
+ LaunchTemplateSchema(),
49
+ data,
50
+ Region=region,
51
+ AWS_ID=current_aws_account_id,
52
+ lastupdated=update_tag,
53
+ )
54
+
55
+
56
+ @timeit
57
+ @aws_handle_regions
58
+ def get_launch_template_versions(
59
+ boto3_session: boto3.session.Session,
60
+ templates: list[dict[str, Any]],
61
+ region: str,
62
+ ) -> list[dict[str, Any]]:
63
+ client = boto3_session.client('ec2', region_name=region, config=get_botocore_config())
64
+ v_paginator = client.get_paginator('describe_launch_template_versions')
65
+ template_versions = []
66
+ for template in templates:
67
+ for versions in v_paginator.paginate(LaunchTemplateId=template['LaunchTemplateId']):
68
+ template_versions.extend(versions['LaunchTemplateVersions'])
69
+ return template_versions
70
+
71
+
72
+ def transform_launch_template_versions(versions: list[dict[str, Any]]) -> list[dict[str, Any]]:
73
+ result: list[dict[str, Any]] = []
74
+ for version in versions:
75
+ current = version.copy()
76
+
77
+ # Reformat some fields
78
+ current['Id'] = f"{version['LaunchTemplateId']}-{version['VersionNumber']}"
79
+ current['CreateTime'] = str(int(version['CreateTime'].timestamp()))
80
+
81
+ # Handle the nested object returned from boto
82
+ ltd = version['LaunchTemplateData']
83
+ current['KernelId'] = ltd.get('KernelId')
84
+ current['EbsOptimized'] = ltd.get('EbsOptimized')
85
+ current['IamInstanceProfileArn'] = ltd.get('IamInstanceProfileArn')
86
+ current['IamInstanceProfileName'] = ltd.get('IamInstanceProfileName')
87
+ current['ImageId'] = ltd.get('ImageId')
88
+ current['InstanceType'] = ltd.get('InstanceType')
89
+ current['KeyName'] = ltd.get('KeyName')
90
+ current['MonitoringEnabled'] = ltd.get('MonitoringEnabled')
91
+ current['RamdiskId'] = ltd.get('RamdiskId')
92
+ current['DisableApiTermination'] = ltd.get('DisableApiTermination')
93
+ current['InstanceInitiatedShutDownBehavior'] = ltd.get('InstanceInitiatedShutDownBehavior')
94
+ current['SecurityGroupIds'] = ltd.get('SecurityGroupIds')
95
+ current['SecurityGroups'] = ltd.get('SecurityGroups')
96
+ result.append(current)
97
+ return result
98
+
99
+
100
+ @timeit
101
+ def load_launch_template_versions(
102
+ neo4j_session: neo4j.Session,
103
+ data: list[dict[str, Any]],
104
+ region: str,
105
+ current_aws_account_id: str,
106
+ update_tag: int,
107
+ ) -> None:
108
+ load(
109
+ neo4j_session,
110
+ LaunchTemplateVersionSchema(),
111
+ data,
112
+ Region=region,
113
+ AWS_ID=current_aws_account_id,
114
+ lastupdated=update_tag,
115
+ )
116
+
117
+
118
+ @timeit
119
+ def cleanup(neo4j_session: neo4j.Session, common_job_parameters: dict[str, Any]) -> None:
120
+ logger.info("Running launch template cleanup job.")
121
+ cleanup_job = GraphJob.from_node_schema(LaunchTemplateSchema(), common_job_parameters)
122
+ cleanup_job.run(neo4j_session)
123
+
124
+ cleanup_job = GraphJob.from_node_schema(LaunchTemplateVersionSchema(), common_job_parameters)
125
+ cleanup_job.run(neo4j_session)
126
+
127
+
128
+ @timeit
129
+ def sync_ec2_launch_templates(
130
+ neo4j_session: neo4j.Session,
131
+ boto3_session: boto3.session.Session,
132
+ regions: list[str],
133
+ current_aws_account_id: str,
134
+ update_tag: int,
135
+ common_job_parameters: dict[str, Any],
136
+ ) -> None:
137
+ for region in regions:
138
+ logger.info(f"Syncing launch templates for region '{region}' in account '{current_aws_account_id}'.")
139
+ templates = get_launch_templates(boto3_session, region)
140
+ templates = transform_launch_templates(templates)
141
+ load_launch_templates(neo4j_session, templates, region, current_aws_account_id, update_tag)
142
+
143
+ versions = get_launch_template_versions(boto3_session, templates, region)
144
+ versions = transform_launch_template_versions(versions)
145
+ load_launch_template_versions(neo4j_session, versions, region, current_aws_account_id, update_tag)
146
+
147
+ cleanup(neo4j_session, common_job_parameters)
@@ -42,8 +42,10 @@ def get_snapshots(boto3_session: boto3.session.Session, region: str, in_use_snap
42
42
  snapshots.extend(page['Snapshots'])
43
43
  except ClientError as e:
44
44
  if e.response['Error']['Code'] == 'InvalidSnapshot.NotFound':
45
- logger.warning(f"Failed to retrieve page of in-use, \
46
- not owned snapshots. Continuing anyway. Error - {e}")
45
+ logger.warning(
46
+ f"Failed to retrieve page of in-use, \
47
+ not owned snapshots. Continuing anyway. Error - {e}",
48
+ )
47
49
  else:
48
50
  raise
49
51
 
@@ -227,6 +227,7 @@ def get_account_access_key_data(boto3_session: boto3.session.Session, username:
227
227
  logger.warning(
228
228
  f"Could not get access key for user {username} due to NoSuchEntityException; skipping.",
229
229
  )
230
+ return access_keys
230
231
  for access_key in access_keys['AccessKeyMetadata']:
231
232
  access_key_id = access_key['AccessKeyId']
232
233
  last_used_info = client.get_access_key_last_used(
@@ -57,10 +57,13 @@ def _get_team_repos_for_multiple_teams(
57
57
 
58
58
  team_repos = _get_team_repos(org, api_url, token, team_name) if repo_count > 0 else None
59
59
 
60
- # Shape = [(repo_url, 'WRITE'), ...]]
61
- repo_urls = [t['url'] for t in team_repos.nodes] if team_repos else []
62
- repo_permissions = [t['permission'] for t in team_repos.edges] if team_repos else []
60
+ repo_urls = []
61
+ repo_permissions = []
62
+ if team_repos:
63
+ repo_urls = [t['url'] for t in team_repos.nodes] if team_repos.nodes else []
64
+ repo_permissions = [t['permission'] for t in team_repos.edges] if team_repos.edges else []
63
65
 
66
+ # Shape = [(repo_url, 'WRITE'), ...]]
64
67
  result[team_name] = list(zip(repo_urls, repo_permissions))
65
68
  return result
66
69
 
@@ -81,12 +81,12 @@ def call_github_api(query: str, variables: str, token: str, api_url: str) -> Dic
81
81
 
82
82
 
83
83
  def fetch_page(
84
- token: str,
85
- api_url: str,
86
- organization: str,
87
- query: str,
88
- cursor: Optional[str] = None,
89
- **kwargs: Any,
84
+ token: str,
85
+ api_url: str,
86
+ organization: str,
87
+ query: str,
88
+ cursor: Optional[str] = None,
89
+ **kwargs: Any,
90
90
  ) -> Dict[str, Any]:
91
91
  """
92
92
  Return a single page of max size 100 elements from the Github api_url using the given `query` and `cursor` params.
@@ -139,6 +139,7 @@ def fetch_all(
139
139
  """
140
140
  cursor = None
141
141
  has_next_page = True
142
+ org_data: Dict[str, Any] = {}
142
143
  data: PaginatedGraphqlData = PaginatedGraphqlData(nodes=[], edges=[])
143
144
  retry = 0
144
145
 
@@ -170,6 +171,15 @@ def fetch_all(
170
171
  time.sleep(2 ** retry)
171
172
  continue
172
173
 
174
+ if 'data' not in resp:
175
+ logger.warning(
176
+ f'Got no "data" attribute in response: {resp}. '
177
+ f'Stopping requests for organization: {organization} and '
178
+ f'resource_type: {resource_type}',
179
+ )
180
+ has_next_page = False
181
+ continue
182
+
173
183
  resource = resp['data']['organization'][resource_type]
174
184
  if resource_inner_type:
175
185
  resource = resp['data']['organization'][resource_type][resource_inner_type]
@@ -180,6 +190,14 @@ def fetch_all(
180
190
 
181
191
  cursor = resource['pageInfo']['endCursor']
182
192
  has_next_page = resource['pageInfo']['hasNextPage']
183
-
184
- org_data = {'url': resp['data']['organization']['url'], 'login': resp['data']['organization']['login']}
193
+ if not org_data:
194
+ org_data = {
195
+ 'url': resp['data']['organization']['url'],
196
+ 'login': resp['data']['organization']['login'],
197
+ }
198
+
199
+ if not org_data:
200
+ raise ValueError(
201
+ f"Didn't get any organization data for organization: {organization} and resource_type: {resource_type}",
202
+ )
185
203
  return data, org_data
@@ -0,0 +1,39 @@
1
+ import logging
2
+
3
+ import neo4j
4
+
5
+ import cartography.intel.kandji.devices
6
+ from cartography.config import Config
7
+ from cartography.util import timeit
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ @timeit
13
+ def start_kandji_ingestion(neo4j_session: neo4j.Session, config: Config) -> None:
14
+ """
15
+ If this module is configured, perform ingestion of Kandji devices. Otherwise warn and exit
16
+
17
+ :param neo4j_session: Neo4J session for database interface
18
+ :param config: A cartography.config object
19
+
20
+ :return: None
21
+ """
22
+ if config.kandji_base_uri is None or config.kandji_token is None or config.kandji_tenant_id is None:
23
+ logger.warning(
24
+ 'Required parameter(s) missing. Skipping sync.',
25
+ 'See docs to configure.',
26
+ )
27
+ return
28
+
29
+ common_job_parameters = {
30
+ "UPDATE_TAG": config.update_tag,
31
+ "TENANT_ID": config.kandji_tenant_id,
32
+ }
33
+
34
+ cartography.intel.kandji.devices.sync(
35
+ neo4j_session,
36
+ config.kandji_base_uri,
37
+ config.kandji_token,
38
+ common_job_parameters=common_job_parameters,
39
+ )
@@ -0,0 +1,84 @@
1
+ import logging
2
+ from typing import Any
3
+ from typing import Dict
4
+ from typing import List
5
+
6
+ import neo4j
7
+ from requests import Session
8
+
9
+ from cartography.client.core.tx import load
10
+ from cartography.graph.job import GraphJob
11
+ from cartography.models.kandji.device import KandjiDeviceSchema
12
+ from cartography.models.kandji.tenant import KandjiTenantSchema
13
+ from cartography.util import timeit
14
+
15
+
16
+ logger = logging.getLogger(__name__)
17
+ _TIMEOUT = (60, 60)
18
+
19
+
20
+ @timeit
21
+ def get(kandji_base_uri: str, kandji_token: str) -> List[Dict[str, Any]]:
22
+ api_endpoint = f"{kandji_base_uri}/api/v1/devices"
23
+ headers = {
24
+ 'Accept': 'application/json',
25
+ 'Authorization': f'Bearer {kandji_token}',
26
+ }
27
+
28
+ session = Session()
29
+ req = session.get(api_endpoint, headers=headers, timeout=_TIMEOUT)
30
+ req.raise_for_status()
31
+ return req.json()
32
+
33
+
34
+ @timeit
35
+ def transform(api_result: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
36
+ result: List[Dict[str, Any]] = []
37
+ for device in api_result:
38
+ n_device = device
39
+ n_device['id'] = device['device_id']
40
+ result.append(n_device)
41
+ return result
42
+
43
+
44
+ @timeit
45
+ def load_devices(
46
+ neo4j_session: neo4j.Session,
47
+ common_job_parameters: Dict[str, Any],
48
+ data: List[Dict[str, Any]],
49
+ ) -> None:
50
+
51
+ tenant_id = common_job_parameters["TENANT_ID"]
52
+ update_tag = common_job_parameters["UPDATE_TAG"]
53
+
54
+ load(
55
+ neo4j_session,
56
+ KandjiTenantSchema(),
57
+ [{'id': tenant_id}],
58
+ lastupdated=update_tag,
59
+ )
60
+
61
+ load(
62
+ neo4j_session,
63
+ KandjiDeviceSchema(),
64
+ data,
65
+ lastupdated=update_tag,
66
+ TENANT_ID=tenant_id,
67
+ )
68
+
69
+
70
+ def cleanup(neo4j_session: neo4j.Session, common_job_parameters: Dict[str, Any]) -> None:
71
+ GraphJob.from_node_schema(KandjiDeviceSchema(), common_job_parameters).run(neo4j_session)
72
+
73
+
74
+ @timeit
75
+ def sync(
76
+ neo4j_session: neo4j.Session,
77
+ kandji_base_uri: str,
78
+ kandji_token: str,
79
+ common_job_parameters: Dict[str, Any],
80
+ ) -> None:
81
+ devices = get(kandji_base_uri=kandji_base_uri, kandji_token=kandji_token)
82
+ formatted_devices = transform(devices)
83
+ load_devices(neo4j_session, common_job_parameters, formatted_devices)
84
+ cleanup(neo4j_session, common_job_parameters)
@@ -68,7 +68,7 @@ def start_okta_ingestion(neo4j_session: neo4j.Session, config: Config) -> None:
68
68
  applications.sync_okta_applications(neo4j_session, config.okta_org_id, config.update_tag, config.okta_api_key)
69
69
  factors.sync_users_factors(neo4j_session, config.okta_org_id, config.update_tag, config.okta_api_key, state)
70
70
  origins.sync_trusted_origins(neo4j_session, config.okta_org_id, config.update_tag, config.okta_api_key)
71
- awssaml.sync_okta_aws_saml(neo4j_session, config.okta_saml_role_regex, config.update_tag)
71
+ awssaml.sync_okta_aws_saml(neo4j_session, config.okta_saml_role_regex, config.update_tag, config.okta_org_id)
72
72
 
73
73
  # need creds with permission
74
74
  # soft fail as some won't be able to get such high priv token