cartography 0.92.0rc1__py3-none-any.whl → 0.93.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of cartography might be problematic. Click here for more details.

@@ -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);
@@ -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]
@@ -1,13 +1,16 @@
1
1
  import logging
2
- from typing import Dict
3
- from typing import List
2
+ from typing import Any
4
3
 
5
4
  import boto3
6
5
  import neo4j
6
+ from botocore.exceptions import ClientError
7
7
 
8
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.launch_template_versions import LaunchTemplateVersionSchema
12
+ from cartography.models.aws.ec2.launch_templates import LaunchTemplateSchema
9
13
  from cartography.util import aws_handle_regions
10
- from cartography.util import run_cleanup_job
11
14
  from cartography.util import timeit
12
15
 
13
16
  logger = logging.getLogger(__name__)
@@ -15,101 +18,145 @@ logger = logging.getLogger(__name__)
15
18
 
16
19
  @timeit
17
20
  @aws_handle_regions
18
- def get_launch_templates(boto3_session: boto3.session.Session, region: str) -> List[Dict]:
21
+ def get_launch_templates(
22
+ boto3_session: boto3.session.Session,
23
+ region: str,
24
+ ) -> tuple[list[dict[str, Any]], list[dict[str, Any]]]:
19
25
  client = boto3_session.client('ec2', region_name=region, config=get_botocore_config())
20
26
  paginator = client.get_paginator('describe_launch_templates')
21
- templates: List[Dict] = []
27
+ templates: list[dict[str, Any]] = []
28
+ template_versions: list[dict[str, Any]] = []
22
29
  for page in paginator.paginate():
23
- templates.extend(page['LaunchTemplates'])
30
+ paginated_templates = page['LaunchTemplates']
31
+ for template in paginated_templates:
32
+ template_id = template['LaunchTemplateId']
33
+ try:
34
+ versions = get_launch_template_versions_by_template(boto3_session, template_id, region)
35
+ except ClientError as e:
36
+ logger.warning(
37
+ f"Failed to get launch template versions for {template_id}: {e}",
38
+ exc_info=True,
39
+ )
40
+ versions = []
41
+ # Using a key not defined in latest boto3 documentation
42
+ template_versions.extend(versions)
43
+ templates.extend(paginated_templates)
44
+ return templates, template_versions
45
+
46
+
47
+ def transform_launch_templates(templates: list[dict[str, Any]]) -> list[dict[str, Any]]:
48
+ result: list[dict[str, Any]] = []
24
49
  for template in templates:
25
- template_versions: List[Dict] = []
26
- v_paginator = client.get_paginator('describe_launch_template_versions')
27
- for versions in v_paginator.paginate(LaunchTemplateId=template['LaunchTemplateId']):
28
- template_versions.extend(versions["LaunchTemplateVersions"])
29
- template["_template_versions"] = template_versions
30
- return templates
50
+ current = template.copy()
51
+ current['CreateTime'] = str(int(current['CreateTime'].timestamp()))
52
+ result.append(current)
53
+ return result
31
54
 
32
55
 
33
56
  @timeit
34
57
  def load_launch_templates(
35
- neo4j_session: neo4j.Session, data: List[Dict], region: str, current_aws_account_id: str, update_tag: int,
58
+ neo4j_session: neo4j.Session,
59
+ data: list[dict[str, Any]],
60
+ region: str,
61
+ current_aws_account_id: str,
62
+ update_tag: int,
36
63
  ) -> None:
37
- ingest_lt = """
38
- UNWIND $launch_templates as lt
39
- MERGE (template:LaunchTemplate{id: lt.LaunchTemplateId})
40
- ON CREATE SET template.firstseen = timestamp(),
41
- template.name = lt.LaunchTemplateName,
42
- template.create_time = lt.CreateTime,
43
- template.created_by = lt.CreatedBy
44
- SET template.default_version_number = lt.DefaultVersionNumber,
45
- template.latest_version_number = lt.LatestVersionNumber,
46
- template.lastupdated = $update_tag,
47
- template.region=$Region
48
- WITH template, lt._template_versions as versions
49
- MATCH (aa:AWSAccount{id: $AWS_ACCOUNT_ID})
50
- MERGE (aa)-[r:RESOURCE]->(template)
51
- ON CREATE SET r.firstseen = timestamp()
52
- SET r.lastupdated = $update_tag
53
- WITH template, versions
54
- UNWIND versions as tv
55
- MERGE (version:LaunchTemplateVersion{id: tv.LaunchTemplateId + '-' + tv.VersionNumber})
56
- ON CREATE SET version.firstseen = timestamp(),
57
- version.name = tv.LaunchTemplateName,
58
- version.create_time = tv.CreateTime,
59
- version.created_by = tv.CreatedBy,
60
- version.default_version = tv.DefaultVersion,
61
- version.version_number = tv.VersionNumber,
62
- version.version_description = tv.VersionDescription,
63
- version.kernel_id = tv.LaunchTemplateData.KernelId,
64
- version.ebs_optimized = tv.LaunchTemplateData.EbsOptimized,
65
- version.iam_instance_profile_arn = tv.LaunchTemplateData.IamInstanceProfile.Arn,
66
- version.iam_instance_profile_name = tv.LaunchTemplateData.IamInstanceProfile.Name,
67
- version.image_id = tv.LaunchTemplateData.ImageId,
68
- version.instance_type = tv.LaunchTemplateData.InstanceType,
69
- version.key_name = tv.LaunchTemplateData.KeyName,
70
- version.monitoring_enabled = tv.LaunchTemplateData.Monitoring.Enabled,
71
- version.ramdisk_id = tv.LaunchTemplateData.RamdiskId,
72
- version.disable_api_termination = tv.LaunchTemplateData.DisableApiTermination,
73
- version.instance_initiated_shutdown_behavior = tv.LaunchTemplateData.InstanceInitiatedShutdownBehavior,
74
- version.security_group_ids = tv.LaunchTemplateData.SecurityGroupIds,
75
- version.security_groups = tv.LaunchTemplateData.SecurityGroups
76
- SET version.lastupdated = $update_tag,
77
- version.region=$Region
78
- WITH template, version
79
- MERGE (template)-[r:VERSION]->(version)
80
- ON CREATE SET r.firstseen = timestamp()
81
- SET r.lastupdated = $update_tag
82
- """
83
- for lt in data:
84
- lt['CreateTime'] = str(int(lt['CreateTime'].timestamp()))
85
- for tv in lt["_template_versions"]:
86
- tv['CreateTime'] = str(int(tv['CreateTime'].timestamp()))
87
-
88
- neo4j_session.run(
89
- ingest_lt,
90
- launch_templates=data,
91
- AWS_ACCOUNT_ID=current_aws_account_id,
64
+ load(
65
+ neo4j_session,
66
+ LaunchTemplateSchema(),
67
+ data,
92
68
  Region=region,
93
- update_tag=update_tag,
69
+ AWS_ID=current_aws_account_id,
70
+ lastupdated=update_tag,
94
71
  )
95
72
 
96
73
 
97
74
  @timeit
98
- def cleanup_ec2_launch_templates(neo4j_session: neo4j.Session, common_job_parameters: Dict) -> None:
99
- run_cleanup_job(
100
- 'aws_import_ec2_launch_templates_cleanup.json',
75
+ @aws_handle_regions
76
+ def get_launch_template_versions_by_template(
77
+ boto3_session: boto3.session.Session,
78
+ template: str,
79
+ region: str,
80
+ ) -> list[dict[str, Any]]:
81
+ client = boto3_session.client('ec2', region_name=region, config=get_botocore_config())
82
+ v_paginator = client.get_paginator('describe_launch_template_versions')
83
+ template_versions = []
84
+ for versions in v_paginator.paginate(LaunchTemplateId=template):
85
+ template_versions.extend(versions['LaunchTemplateVersions'])
86
+ return template_versions
87
+
88
+
89
+ def transform_launch_template_versions(versions: list[dict[str, Any]]) -> list[dict[str, Any]]:
90
+ result: list[dict[str, Any]] = []
91
+ for version in versions:
92
+ current = version.copy()
93
+
94
+ # Reformat some fields
95
+ current['Id'] = f"{version['LaunchTemplateId']}-{version['VersionNumber']}"
96
+ current['CreateTime'] = str(int(version['CreateTime'].timestamp()))
97
+
98
+ # Handle the nested object returned from boto
99
+ ltd = version['LaunchTemplateData']
100
+ current['KernelId'] = ltd.get('KernelId')
101
+ current['EbsOptimized'] = ltd.get('EbsOptimized')
102
+ current['IamInstanceProfileArn'] = ltd.get('IamInstanceProfileArn')
103
+ current['IamInstanceProfileName'] = ltd.get('IamInstanceProfileName')
104
+ current['ImageId'] = ltd.get('ImageId')
105
+ current['InstanceType'] = ltd.get('InstanceType')
106
+ current['KeyName'] = ltd.get('KeyName')
107
+ current['MonitoringEnabled'] = ltd.get('MonitoringEnabled')
108
+ current['RamdiskId'] = ltd.get('RamdiskId')
109
+ current['DisableApiTermination'] = ltd.get('DisableApiTermination')
110
+ current['InstanceInitiatedShutDownBehavior'] = ltd.get('InstanceInitiatedShutDownBehavior')
111
+ current['SecurityGroupIds'] = ltd.get('SecurityGroupIds')
112
+ current['SecurityGroups'] = ltd.get('SecurityGroups')
113
+ result.append(current)
114
+ return result
115
+
116
+
117
+ @timeit
118
+ def load_launch_template_versions(
119
+ neo4j_session: neo4j.Session,
120
+ data: list[dict[str, Any]],
121
+ region: str,
122
+ current_aws_account_id: str,
123
+ update_tag: int,
124
+ ) -> None:
125
+ load(
101
126
  neo4j_session,
102
- common_job_parameters,
127
+ LaunchTemplateVersionSchema(),
128
+ data,
129
+ Region=region,
130
+ AWS_ID=current_aws_account_id,
131
+ lastupdated=update_tag,
103
132
  )
104
133
 
105
134
 
135
+ @timeit
136
+ def cleanup(neo4j_session: neo4j.Session, common_job_parameters: dict[str, Any]) -> None:
137
+ logger.info("Running launch template cleanup job.")
138
+ cleanup_job = GraphJob.from_node_schema(LaunchTemplateSchema(), common_job_parameters)
139
+ cleanup_job.run(neo4j_session)
140
+
141
+ cleanup_job = GraphJob.from_node_schema(LaunchTemplateVersionSchema(), common_job_parameters)
142
+ cleanup_job.run(neo4j_session)
143
+
144
+
106
145
  @timeit
107
146
  def sync_ec2_launch_templates(
108
- neo4j_session: neo4j.Session, boto3_session: boto3.session.Session, regions: List[str],
109
- current_aws_account_id: str, update_tag: int, common_job_parameters: Dict,
147
+ neo4j_session: neo4j.Session,
148
+ boto3_session: boto3.session.Session,
149
+ regions: list[str],
150
+ current_aws_account_id: str,
151
+ update_tag: int,
152
+ common_job_parameters: dict[str, Any],
110
153
  ) -> None:
111
154
  for region in regions:
112
- logger.debug("Syncing launch templates for region '%s' in account '%s'.", region, current_aws_account_id)
113
- data = get_launch_templates(boto3_session, region)
114
- load_launch_templates(neo4j_session, data, region, current_aws_account_id, update_tag)
115
- cleanup_ec2_launch_templates(neo4j_session, common_job_parameters)
155
+ logger.info(f"Syncing launch templates for region '{region}' in account '{current_aws_account_id}'.")
156
+ templates, versions = get_launch_templates(boto3_session, region)
157
+ templates = transform_launch_templates(templates)
158
+ load_launch_templates(neo4j_session, templates, region, current_aws_account_id, update_tag)
159
+ versions = transform_launch_template_versions(versions)
160
+ load_launch_template_versions(neo4j_session, versions, region, current_aws_account_id, update_tag)
161
+
162
+ cleanup(neo4j_session, common_job_parameters)
@@ -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(
@@ -43,7 +43,7 @@ def load_vms(neo4j_session: neo4j.Session, subscription_id: str, vm_list: List[D
43
43
  v.resourcegroup = vm.resource_group
44
44
  SET v.lastupdated = $update_tag, v.name = vm.name,
45
45
  v.plan = vm.plan.product, v.size = vm.hardware_profile.vm_size,
46
- v.license_type=vm.license_type, v.computer_name=vm.os_profile.computer_ame,
46
+ v.license_type=vm.license_type, v.computer_name=vm.os_profile.computer_name,
47
47
  v.identity_type=vm.identity.type, v.zones=vm.zones,
48
48
  v.ultra_ssd_enabled=vm.additional_capabilities.ultra_ssd_enabled,
49
49
  v.priority=vm.priority, v.eviction_policy=vm.eviction_policy
@@ -76,9 +76,9 @@ def load_host_data(
76
76
  )
77
77
 
78
78
 
79
- def get_host_ids(client: Hosts) -> List[List[str]]:
79
+ def get_host_ids(client: Hosts, crowdstrikeapi_filter: str = '', crowdstrikeapi_limit: int = 5000) -> List[List[str]]:
80
80
  ids = []
81
- parameters = {"filter": 'service_provider:"AWS_EC2"', "limit": 400}
81
+ parameters = {"filter": crowdstrikeapi_filter, "limit": crowdstrikeapi_limit}
82
82
  response = client.QueryDevicesByFilter(parameters=parameters)
83
83
  body = response.get("body", {})
84
84
  resources = body.get("resources", [])
@@ -23,7 +23,8 @@ from cartography.util import timeit
23
23
  logger = logging.getLogger(__name__)
24
24
 
25
25
  MAX_RETRIES = 3
26
- REQUEST_TIMEOUT = 10
26
+ # Connect and read timeouts of 60 seconds each; see https://requests.readthedocs.io/en/master/user/advanced/#timeouts
27
+ CONNECT_AND_READ_TIMEOUT = (60, 60)
27
28
  CVE_FEED_ID = "NIST_NVD"
28
29
  BATCH_SIZE_DAYS = 120
29
30
  RESULTS_PER_PAGE = 2000
@@ -87,7 +88,7 @@ def _call_cves_api(url: str, api_key: str, params: Dict[str, Any]) -> Dict[Any,
87
88
  while params["resultsPerPage"] > 0 or params["startIndex"] < totalResults:
88
89
  try:
89
90
  res = requests.get(
90
- url, params=params, headers=headers, timeout=REQUEST_TIMEOUT,
91
+ url, params=params, headers=headers, timeout=CONNECT_AND_READ_TIMEOUT,
91
92
  )
92
93
  res.raise_for_status()
93
94
  except requests.exceptions.HTTPError:
@@ -0,0 +1,81 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+ from cartography.models.core.relationships import CartographyRelProperties
7
+ from cartography.models.core.relationships import CartographyRelSchema
8
+ from cartography.models.core.relationships import LinkDirection
9
+ from cartography.models.core.relationships import make_target_node_matcher
10
+ from cartography.models.core.relationships import OtherRelationships
11
+ from cartography.models.core.relationships import TargetNodeMatcher
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class LaunchTemplateVersionNodeProperties(CartographyNodeProperties):
16
+ id: PropertyRef = PropertyRef('Id')
17
+ name: PropertyRef = PropertyRef('LaunchTemplateName')
18
+ create_time: PropertyRef = PropertyRef('CreateTime')
19
+ created_by: PropertyRef = PropertyRef('CreatedBy')
20
+ default_version: PropertyRef = PropertyRef('DefaultVersion')
21
+ version_number: PropertyRef = PropertyRef('VersionNumber')
22
+ version_description: PropertyRef = PropertyRef('VersionDescription')
23
+ kernel_id: PropertyRef = PropertyRef('KernelId')
24
+ ebs_optimized: PropertyRef = PropertyRef('EbsOptimized')
25
+ iam_instance_profile_arn: PropertyRef = PropertyRef('IamInstanceProfileArn')
26
+ iam_instance_profile_name: PropertyRef = PropertyRef('IamInstanceProfileName')
27
+ image_id: PropertyRef = PropertyRef('ImageId')
28
+ instance_type: PropertyRef = PropertyRef('InstanceType')
29
+ key_name: PropertyRef = PropertyRef('KeyName')
30
+ monitoring_enabled: PropertyRef = PropertyRef('MonitoringEnabled')
31
+ ramdisk_id: PropertyRef = PropertyRef('RamdiskId')
32
+ disable_api_termination: PropertyRef = PropertyRef('DisableApiTermination')
33
+ instance_initiated_shutdown_behavior: PropertyRef = PropertyRef('InstanceInitiatedShutdownBehavior')
34
+ security_group_ids: PropertyRef = PropertyRef('SecurityGroupIds')
35
+ security_groups: PropertyRef = PropertyRef('SecurityGroups')
36
+ region: PropertyRef = PropertyRef('Region', set_in_kwargs=True)
37
+ lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
38
+
39
+
40
+ @dataclass(frozen=True)
41
+ class LaunchTemplateVersionToAwsAccountRelProperties(CartographyRelProperties):
42
+ lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
43
+
44
+
45
+ @dataclass(frozen=True)
46
+ class LaunchTemplateVersionToAWSAccount(CartographyRelSchema):
47
+ target_node_label: str = 'AWSAccount'
48
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
49
+ {'id': PropertyRef('AWS_ID', set_in_kwargs=True)},
50
+ )
51
+ direction: LinkDirection = LinkDirection.INWARD
52
+ rel_label: str = "RESOURCE"
53
+ properties: LaunchTemplateVersionToAwsAccountRelProperties = LaunchTemplateVersionToAwsAccountRelProperties()
54
+
55
+
56
+ @dataclass(frozen=True)
57
+ class LaunchTemplateVersionToLTRelProperties(CartographyRelProperties):
58
+ lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
59
+
60
+
61
+ @dataclass(frozen=True)
62
+ class LaunchTemplateVersionToLT(CartographyRelSchema):
63
+ target_node_label: str = 'LaunchTemplate'
64
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
65
+ {'id': PropertyRef('LaunchTemplateId')},
66
+ )
67
+ direction: LinkDirection = LinkDirection.INWARD
68
+ rel_label: str = "VERSION"
69
+ properties: LaunchTemplateVersionToLTRelProperties = LaunchTemplateVersionToLTRelProperties()
70
+
71
+
72
+ @dataclass(frozen=True)
73
+ class LaunchTemplateVersionSchema(CartographyNodeSchema):
74
+ label: str = 'LaunchTemplateVersion'
75
+ properties: LaunchTemplateVersionNodeProperties = LaunchTemplateVersionNodeProperties()
76
+ sub_resource_relationship: LaunchTemplateVersionToAWSAccount = LaunchTemplateVersionToAWSAccount()
77
+ other_relationships: OtherRelationships = OtherRelationships(
78
+ [
79
+ LaunchTemplateVersionToLT(),
80
+ ],
81
+ )
@@ -0,0 +1,46 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+ from cartography.models.core.relationships import CartographyRelProperties
7
+ from cartography.models.core.relationships import CartographyRelSchema
8
+ from cartography.models.core.relationships import LinkDirection
9
+ from cartography.models.core.relationships import make_target_node_matcher
10
+ from cartography.models.core.relationships import TargetNodeMatcher
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class LaunchTemplateNodeProperties(CartographyNodeProperties):
15
+ id: PropertyRef = PropertyRef('LaunchTemplateId')
16
+ launch_template_id: PropertyRef = PropertyRef('LaunchTemplateId')
17
+ name: PropertyRef = PropertyRef('LaunchTemplateName')
18
+ create_time: PropertyRef = PropertyRef('CreateTime')
19
+ created_by: PropertyRef = PropertyRef('CreatedBy')
20
+ default_version_number: PropertyRef = PropertyRef('DefaultVersionNumber')
21
+ latest_version_number: PropertyRef = PropertyRef('LatestVersionNumber')
22
+ region: PropertyRef = PropertyRef('Region', set_in_kwargs=True)
23
+ lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
24
+
25
+
26
+ @dataclass(frozen=True)
27
+ class LaunchTemplateToAwsAccountRelProperties(CartographyRelProperties):
28
+ lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
29
+
30
+
31
+ @dataclass(frozen=True)
32
+ class LaunchTemplateToAWSAccount(CartographyRelSchema):
33
+ target_node_label: str = 'AWSAccount'
34
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
35
+ {'id': PropertyRef('AWS_ID', set_in_kwargs=True)},
36
+ )
37
+ direction: LinkDirection = LinkDirection.INWARD
38
+ rel_label: str = "RESOURCE"
39
+ properties: LaunchTemplateToAwsAccountRelProperties = LaunchTemplateToAwsAccountRelProperties()
40
+
41
+
42
+ @dataclass(frozen=True)
43
+ class LaunchTemplateSchema(CartographyNodeSchema):
44
+ label: str = 'LaunchTemplate'
45
+ properties: LaunchTemplateNodeProperties = LaunchTemplateNodeProperties()
46
+ sub_resource_relationship: LaunchTemplateToAWSAccount = LaunchTemplateToAWSAccount()
@@ -15,7 +15,7 @@ from cartography.models.core.relationships import TargetNodeMatcher
15
15
  class EC2SubnetInstanceNodeProperties(CartographyNodeProperties):
16
16
  # arn: PropertyRef = PropertyRef('Arn', extra_index=True) TODO use arn; issue #1024
17
17
  id: PropertyRef = PropertyRef('SubnetId')
18
- subnet_id: PropertyRef = PropertyRef('SubnetId', extra_index=True)
18
+ subnetid: PropertyRef = PropertyRef('SubnetId', extra_index=True)
19
19
  region: PropertyRef = PropertyRef('Region', set_in_kwargs=True)
20
20
  lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
21
21
 
cartography/util.py CHANGED
@@ -225,7 +225,7 @@ If not, then the AWS datatype somehow does not have this key.''',
225
225
  return items
226
226
 
227
227
 
228
- AWSGetFunc = TypeVar('AWSGetFunc', bound=Callable[..., List])
228
+ AWSGetFunc = TypeVar('AWSGetFunc', bound=Callable[..., Iterable])
229
229
 
230
230
  # fix for AWS TooManyRequestsException
231
231
  # https://github.com/lyft/cartography/issues/297
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cartography
3
- Version: 0.92.0rc1
3
+ Version: 0.93.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
@@ -5,14 +5,14 @@ cartography/config.py,sha256=rL1zgxZO47_R7S6E9e0CwxmhzRSN0X_q93NtcPR1G00,11368
5
5
  cartography/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  cartography/stats.py,sha256=dbybb9V2FuvSuHjjNwz6Vjwnd1hap2C7h960rLoKcl8,4406
7
7
  cartography/sync.py,sha256=a80r_IzrZcWGSmRDRrxkesNYPiOuLte5YHvDQT3L-Lw,9730
8
- cartography/util.py,sha256=F3FPMJl1KDW0x_5cvt2ZGI0Dv1LVrHU7Az4OleAANBI,14474
8
+ cartography/util.py,sha256=umfnjX8jVLu0rpYA75X-WvRpYzHQxns9qZiPwfyAlwQ,14478
9
9
  cartography/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  cartography/client/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  cartography/client/aws/iam.py,sha256=dYsGikc36DEsSeR2XVOVFFUDwuU9yWj_EVkpgVYCFgM,1293
12
12
  cartography/client/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  cartography/client/core/tx.py,sha256=4_kTBxrtlwsOM-e8Xtjf7wmmzwZ-DGRJL0rPFp0Xj0Q,10805
14
14
  cartography/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- cartography/data/indexes.cypher,sha256=2OP2V7hsN794IssfeaAYYwPxUt5QghXnrgBAEKHWag8,27804
15
+ cartography/data/indexes.cypher,sha256=PTQEUbC_Kmjj_wM-j6NJqLvETRIORreeqF6WlKmnHKg,27395
16
16
  cartography/data/permission_relationships.yaml,sha256=RuKGGc_3ZUQ7ag0MssB8k_zaonCkVM5E8I_svBWTmGc,969
17
17
  cartography/data/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
18
  cartography/data/jobs/analysis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -36,7 +36,6 @@ cartography/data/jobs/cleanup/aws_import_account_access_key_cleanup.json,sha256=
36
36
  cartography/data/jobs/cleanup/aws_import_apigateway_cleanup.json,sha256=wCV95ydo3dmlhK7VrDrxCqrP6dbhCCMTzcz_qaJQ4Jo,2189
37
37
  cartography/data/jobs/cleanup/aws_import_config_cleanup.json,sha256=VCAJjEnFcQUR16VxKdpsOkBJEnhMuLk-7Kgm_p9k1NM,754
38
38
  cartography/data/jobs/cleanup/aws_import_ec2_launch_configurations_cleanup.json,sha256=x9IIzb9Sr1353ygkA-qqUUbZS9XO2v3GzUHe-0J4Pw8,281
39
- cartography/data/jobs/cleanup/aws_import_ec2_launch_templates_cleanup.json,sha256=tuJzb1wmKSPUiShX8zgNTz7Il_XhXZ7_uQE4_6iUjFI,524
40
39
  cartography/data/jobs/cleanup/aws_import_ec2_security_groupinfo_cleanup.json,sha256=CackEgSs1PN15pTg8oIdS0amB-n-PsKODLAaqC3gf_A,1183
41
40
  cartography/data/jobs/cleanup/aws_import_ecr_cleanup.json,sha256=7Sga9WlbhHe-VyoFaF0LrlhbAFvSSOjVKiRf_VW8To8,1355
42
41
  cartography/data/jobs/cleanup/aws_import_ecs_cleanup.json,sha256=6HtmZy7gNC0ZxLU7I6C2KKcqpZhYRFyaJZCDA50DzAs,2126
@@ -153,7 +152,7 @@ cartography/intel/aws/eks.py,sha256=OerAX7qT2uGPbqliPvuy8JZUIgle_KMlnkkHxk8O5fk,
153
152
  cartography/intel/aws/elasticache.py,sha256=fCI47aDFmIDyE26GiReKYb6XIZUwrzcvsXBQ4ruFhuI,4427
154
153
  cartography/intel/aws/elasticsearch.py,sha256=ZL7MkXF_bXRSoXuDSI1dwGckRLG2zDB8LuAD07vSLnE,8374
155
154
  cartography/intel/aws/emr.py,sha256=xhWBVZngxJRFjMEDxwq3G6SgytRGLq0v2a_CeDvByR0,3372
156
- cartography/intel/aws/iam.py,sha256=fEn0XCQhBKxoEQJT5OCEzTbP58VXtfzF11GUK-Fnqog,32347
155
+ cartography/intel/aws/iam.py,sha256=eLw0NkBGKzCI_tQ3wmrx3aUibQerrsxKJd3d0RCKcKQ,32374
157
156
  cartography/intel/aws/inspector.py,sha256=6enCu2USefuGT3FqA0Vto6i-z4BrL2HC_clbiXSLIlo,8654
158
157
  cartography/intel/aws/kms.py,sha256=bZUzMxAH_DsAcGTJBs08gg2tLKYu-QWjvMvV9C-6v50,11731
159
158
  cartography/intel/aws/lambda_function.py,sha256=KKTyn53xpaMI9WvIqxmsOASFwflHt-2_5ow-zUFc2wg,9890
@@ -172,11 +171,11 @@ cartography/intel/aws/ssm.py,sha256=IDOYa8v2FgziU8nBOZ7wyDG4o_nFYshbB-si9Ut_9Zc,
172
171
  cartography/intel/aws/ec2/__init__.py,sha256=IDK2Yap7mllK_ab6yVMLXatJ94znIkn-szv5RJP5fbo,346
173
172
  cartography/intel/aws/ec2/auto_scaling_groups.py,sha256=4erjP31KSVW-Pp2ASmDox_VLp_AQUAin4KYxfZKZcSM,9223
174
173
  cartography/intel/aws/ec2/elastic_ip_addresses.py,sha256=0k4NwS73VyWbEj5jXvSkaq2RNvmAlBlrN-UKa_Bj0uk,3957
175
- cartography/intel/aws/ec2/images.py,sha256=DcGHJwZf8_K5iRCDJ2QOdP837TTJTwST02IRswfk9Mc,3697
174
+ cartography/intel/aws/ec2/images.py,sha256=heElwHJGqVD3iUJjxwA_Sdc3CmE4HPs00CTMHuQ1wkc,3782
176
175
  cartography/intel/aws/ec2/instances.py,sha256=mnTjdBY-4D-TGhH29UrSaLUW0Uft0JApDIJkkLz4zPc,12170
177
176
  cartography/intel/aws/ec2/internet_gateways.py,sha256=dI-4-85_3DGGZZBcY_DN6XqESx9P26S6jKok314lcnQ,2883
178
177
  cartography/intel/aws/ec2/key_pairs.py,sha256=SvRgd56vE4eouvTSNoFK8PP8HYoECO91goxc36oq_FY,2508
179
- cartography/intel/aws/ec2/launch_templates.py,sha256=UXqINdxBzpgPTJVjSZ9DXhO-Lo598aHswJapuo4QNXA,5099
178
+ cartography/intel/aws/ec2/launch_templates.py,sha256=aeqaL8On38ET8nM8bISsIXLy6PkZoV-tqSWG38YXgkI,6010
180
179
  cartography/intel/aws/ec2/load_balancer_v2s.py,sha256=95FfQQn740gexINIHDJizOM4OKzRtQT_y2XQMipQ5Dg,8661
181
180
  cartography/intel/aws/ec2/load_balancers.py,sha256=1GwErzGqi3BKCARqfGJcD_r_D84rFKVy5kNMas9jAok,6756
182
181
  cartography/intel/aws/ec2/network_interfaces.py,sha256=CzF8PooCYUQ2pk8DR8JDAhkWRUQSBj_27OsIfkL_-Cs,9199
@@ -193,7 +192,7 @@ cartography/intel/aws/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
193
192
  cartography/intel/aws/util/arns.py,sha256=TEjrQEDbJM8Zwy6Eizh-vAFd9kMr5AKsdOsHYQHUSbk,573
194
193
  cartography/intel/aws/util/common.py,sha256=j_K9_Iy42dgCSvbGLdtJW8bRs_qTiJu4wkz54OId7w8,886
195
194
  cartography/intel/azure/__init__.py,sha256=RxbDGfsfDBM1eGtS-FPULB5mBBl3yYl7fIZ5P3RD9RE,3696
196
- cartography/intel/azure/compute.py,sha256=WbdsYI-mKgNENrWRtV_lwEKPLQsbw-Pk1yDLTHyNLNk,8678
195
+ cartography/intel/azure/compute.py,sha256=SIjvhmGp2tSpBpzNubIM1pgr_MrVHHuJsJxGpnFWDRw,8679
197
196
  cartography/intel/azure/cosmosdb.py,sha256=8ZtQntjkMUVsQUcjGgJw6geDjYqothPkssyNQALhJ0o,41275
198
197
  cartography/intel/azure/sql.py,sha256=Z-C-7BRjD5y-enNKg0sfWgv1-GIENCf2y0Z3bZiasdc,32865
199
198
  cartography/intel/azure/storage.py,sha256=56QyHafWTNproCOjITyAaWsmsqKhyFwJQlVEfwawBNg,27393
@@ -204,13 +203,13 @@ cartography/intel/azure/util/credentials.py,sha256=99PjTs0vZ2iu0tHD7TohN1VJYjuXY
204
203
  cartography/intel/bigfix/__init__.py,sha256=3LoDCm01VNNaDRGsRiykJm1GJgUQ8zI1HO6NodLFVIA,1058
205
204
  cartography/intel/bigfix/computers.py,sha256=HAwA-muDBLu2xkFFL2Ae-xjCH1gxKKwxGMZM4BE_Qdo,5909
206
205
  cartography/intel/crowdstrike/__init__.py,sha256=dAtgI-0vZAQZ3cTFQhMEzzt7aqiNSNuiIYiw0qbut-I,1896
207
- cartography/intel/crowdstrike/endpoints.py,sha256=o45309ZDNdlYdG0YicIiBain-nkr3bQahBaRx3N9Mow,3738
206
+ cartography/intel/crowdstrike/endpoints.py,sha256=tdqokMDW3p4fK3dHKKb2T1DTogvOJBCpwyrxdQlbUhw,3815
208
207
  cartography/intel/crowdstrike/spotlight.py,sha256=yNhj44-RYF6ubck-hHMKhKiNU0fCfhQf4Oagopc31EM,4754
209
208
  cartography/intel/crowdstrike/util.py,sha256=gfJ6Ptr6YdbBS9Qj9a_-Jc-IJroADDRcXqjh5TW0qXE,277
210
209
  cartography/intel/crxcavator/__init__.py,sha256=VM6N_7dMagzuQQjUeFgqrt2_d2Is9ugDMTrgKke2c0g,1606
211
210
  cartography/intel/crxcavator/crxcavator.py,sha256=tnx6bq8Oz020mhMDmx8gKZ_ro_0UvUGeWrshmFr7bBw,13797
212
211
  cartography/intel/cve/__init__.py,sha256=A7XjKQSanmwMSIXSum1qJSegtYcQCuz_713RU-bFQz8,2504
213
- cartography/intel/cve/feed.py,sha256=i3EuRFhotu93MNMkhwBQp-zvK6itLgdAdRFOlZy5iLc,9878
212
+ cartography/intel/cve/feed.py,sha256=JkfRV18JoydOuncKR1y3s8esuN2Xk4gIB6viKNXU_X0,10020
214
213
  cartography/intel/digitalocean/__init__.py,sha256=SMYB7LGIQOj_EgGSGVjWZk7SJNbP43hQuOfgOu6xYm4,1526
215
214
  cartography/intel/digitalocean/compute.py,sha256=9XctwMjq9h5dExFgExvawoqyiEwSoocNgaMm3Fgl5GM,4911
216
215
  cartography/intel/digitalocean/management.py,sha256=YWRnBLLL_bAP1vefIAQgm_-QzefGH0sZKmyU_EokHfA,3764
@@ -283,6 +282,8 @@ cartography/models/aws/ec2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
283
282
  cartography/models/aws/ec2/images.py,sha256=uGhXS7Xb6sKUdwwkS0O0dWP4sIREjusUaV_unODv9gE,3012
284
283
  cartography/models/aws/ec2/instances.py,sha256=cNMHngdGNRhxoyID6AmG2F7CQGC1fYani8DV8lSKvsI,3902
285
284
  cartography/models/aws/ec2/keypairs.py,sha256=scKC3SdExHAWkPNmb6tT9LK-9q4sweqS2ejFzMec10M,2630
285
+ cartography/models/aws/ec2/launch_template_versions.py,sha256=RitfnAuAj0XpFsCXkRbtUhHMAi8Vsvmtury231eKvGU,3897
286
+ cartography/models/aws/ec2/launch_templates.py,sha256=GqiwFuMp72LNSt2eQlp2WfdU_vHsom-xKV5AaUewSHQ,2157
286
287
  cartography/models/aws/ec2/loadbalancerv2.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
287
288
  cartography/models/aws/ec2/networkinterface_instance.py,sha256=t3oqcQ4GjYf7dwqPUGCiXd70ie4ibYLilOXiE5_Ad8g,4707
288
289
  cartography/models/aws/ec2/networkinterfaces.py,sha256=z1-Dl6I79-TCxXKG8QBpSKga93lPCPaLR1XqKJZK3ME,4127
@@ -290,7 +291,7 @@ cartography/models/aws/ec2/privateip_networkinterface.py,sha256=j8MyiZsiUCuzuGUH
290
291
  cartography/models/aws/ec2/reservations.py,sha256=dE9uSB3Em-ca1dDbetbu79JXr4ZWHC3r5gA1S3mjhVU,1930
291
292
  cartography/models/aws/ec2/securitygroup_instance.py,sha256=RZS9TzHHatTOESQgcs5_YHmF9sM7pRkUq2VPjk9FJlU,2876
292
293
  cartography/models/aws/ec2/securitygroup_networkinterface.py,sha256=PiaA8J82kybZyZ1wDsa-ACIDa88vt4NoA3smGNiwl14,2399
293
- cartography/models/aws/ec2/subnet_instance.py,sha256=kPELT07l6AXIy-NYnXfkhM_RWUG20D33K1V1CJQdHyw,2753
294
+ cartography/models/aws/ec2/subnet_instance.py,sha256=ct_ibXiPN2C5ld06TczwSTXtsnlov5VCW6elphtbvPs,2752
294
295
  cartography/models/aws/ec2/subnet_networkinterface.py,sha256=JHlxfBojBw7LfJS4a5LpVGM28MUu451PUrrwbbOPGuQ,3614
295
296
  cartography/models/aws/ec2/volumes.py,sha256=WSP7YNZeJE3s4wnY9QrIAbcJN3OathqNgEBX0cVahDg,4470
296
297
  cartography/models/aws/eks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -331,10 +332,10 @@ cartography/models/semgrep/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
331
332
  cartography/models/semgrep/deployment.py,sha256=or5qZDuR51MXzINpH15jZrqmSUvXQevCNYWJ7D6v-JI,745
332
333
  cartography/models/semgrep/findings.py,sha256=xrn8sgXpNMrNJbKQagaAVxaCG9bVjTATSRR2XRBR4rg,5386
333
334
  cartography/models/semgrep/locations.py,sha256=kSk7Nn5Mn4Ob84MVZOo2GR0YFi-9Okq9pgA3FfC6_bk,3061
334
- cartography-0.92.0rc1.dist-info/LICENSE,sha256=489ZXeW9G90up6ep-D1n-lJgk9ciNT2yxXpFgRSidtk,11341
335
- cartography-0.92.0rc1.dist-info/METADATA,sha256=Ascw5OW3AX47QCK7O2ftYRY4BRVycgrTVfIZqMe0O6g,1991
336
- cartography-0.92.0rc1.dist-info/NOTICE,sha256=YOGAsjFtbyKj5tslYIg6V5jEYRuEvnSsIuDOUKj0Qj4,97
337
- cartography-0.92.0rc1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
338
- cartography-0.92.0rc1.dist-info/entry_points.txt,sha256=GVIAWD0o0_K077qMA_k1oZU4v-M0a8GLKGJR8tZ-qH8,112
339
- cartography-0.92.0rc1.dist-info/top_level.txt,sha256=BHqsNJQiI6Q72DeypC1IINQJE59SLhU4nllbQjgJi9g,12
340
- cartography-0.92.0rc1.dist-info/RECORD,,
335
+ cartography-0.93.0.dist-info/LICENSE,sha256=489ZXeW9G90up6ep-D1n-lJgk9ciNT2yxXpFgRSidtk,11341
336
+ cartography-0.93.0.dist-info/METADATA,sha256=bZcpA3W4BYf5mQXLdALJ0KEf3_n_PqMI4TiPSda3Bv8,1988
337
+ cartography-0.93.0.dist-info/NOTICE,sha256=YOGAsjFtbyKj5tslYIg6V5jEYRuEvnSsIuDOUKj0Qj4,97
338
+ cartography-0.93.0.dist-info/WHEEL,sha256=pd56usn78UTvq1xeX_ZwFhoK6jE5u5wzu4TTBIG5cQ0,91
339
+ cartography-0.93.0.dist-info/entry_points.txt,sha256=GVIAWD0o0_K077qMA_k1oZU4v-M0a8GLKGJR8tZ-qH8,112
340
+ cartography-0.93.0.dist-info/top_level.txt,sha256=BHqsNJQiI6Q72DeypC1IINQJE59SLhU4nllbQjgJi9g,12
341
+ cartography-0.93.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.43.0)
2
+ Generator: setuptools (71.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,13 +0,0 @@
1
- {
2
- "statements": [{
3
- "query": "MATCH (n:LaunchTemplateVersion)<-[:VERSION]-(:LaunchTemplate)<-[:RESOURCE]-(:AWSAccount{id: $AWS_ID}) WHERE n.lastupdated <> $UPDATE_TAG WITH n LIMIT $LIMIT_SIZE DETACH DELETE (n)",
4
- "iterative": true,
5
- "iterationsize": 100
6
- },
7
- {
8
- "query": "MATCH (n:LaunchTemplate)<-[:RESOURCE]-(:AWSAccount{id: $AWS_ID}) WHERE n.lastupdated <> $UPDATE_TAG WITH n LIMIT $LIMIT_SIZE DETACH DELETE (n)",
9
- "iterative": true,
10
- "iterationsize": 100
11
- }],
12
- "name": "cleanup LaunchTemplate"
13
- }