cartography 0.92.0rc1__py3-none-any.whl → 0.93.0rc1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cartography/data/indexes.cypher +0 -6
- cartography/intel/aws/ec2/images.py +1 -0
- cartography/intel/aws/ec2/launch_templates.py +110 -78
- cartography/intel/aws/iam.py +1 -0
- cartography/intel/azure/compute.py +1 -1
- cartography/intel/crowdstrike/endpoints.py +2 -2
- cartography/intel/cve/feed.py +3 -2
- cartography/models/aws/ec2/launch_template_versions.py +81 -0
- cartography/models/aws/ec2/launch_templates.py +46 -0
- cartography/models/aws/ec2/subnet_instance.py +1 -1
- {cartography-0.92.0rc1.dist-info → cartography-0.93.0rc1.dist-info}/METADATA +1 -1
- {cartography-0.92.0rc1.dist-info → cartography-0.93.0rc1.dist-info}/RECORD +17 -16
- {cartography-0.92.0rc1.dist-info → cartography-0.93.0rc1.dist-info}/WHEEL +1 -1
- cartography/data/jobs/cleanup/aws_import_ec2_launch_templates_cleanup.json +0 -13
- {cartography-0.92.0rc1.dist-info → cartography-0.93.0rc1.dist-info}/LICENSE +0 -0
- {cartography-0.92.0rc1.dist-info → cartography-0.93.0rc1.dist-info}/NOTICE +0 -0
- {cartography-0.92.0rc1.dist-info → cartography-0.93.0rc1.dist-info}/entry_points.txt +0 -0
- {cartography-0.92.0rc1.dist-info → cartography-0.93.0rc1.dist-info}/top_level.txt +0 -0
cartography/data/indexes.cypher
CHANGED
|
@@ -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,15 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from typing import
|
|
3
|
-
from typing import List
|
|
2
|
+
from typing import Any
|
|
4
3
|
|
|
5
4
|
import boto3
|
|
6
5
|
import neo4j
|
|
7
6
|
|
|
8
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
|
|
9
12
|
from cartography.util import aws_handle_regions
|
|
10
|
-
from cartography.util import run_cleanup_job
|
|
11
13
|
from cartography.util import timeit
|
|
12
14
|
|
|
13
15
|
logger = logging.getLogger(__name__)
|
|
@@ -15,101 +17,131 @@ logger = logging.getLogger(__name__)
|
|
|
15
17
|
|
|
16
18
|
@timeit
|
|
17
19
|
@aws_handle_regions
|
|
18
|
-
def get_launch_templates(boto3_session: boto3.session.Session, region: str) ->
|
|
20
|
+
def get_launch_templates(boto3_session: boto3.session.Session, region: str) -> list[dict[str, Any]]:
|
|
19
21
|
client = boto3_session.client('ec2', region_name=region, config=get_botocore_config())
|
|
20
22
|
paginator = client.get_paginator('describe_launch_templates')
|
|
21
|
-
templates:
|
|
23
|
+
templates: list[dict[str, Any]] = []
|
|
22
24
|
for page in paginator.paginate():
|
|
23
25
|
templates.extend(page['LaunchTemplates'])
|
|
24
|
-
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
26
|
return templates
|
|
31
27
|
|
|
32
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
|
+
|
|
33
38
|
@timeit
|
|
34
39
|
def load_launch_templates(
|
|
35
|
-
neo4j_session: neo4j.Session,
|
|
40
|
+
neo4j_session: neo4j.Session,
|
|
41
|
+
data: list[dict[str, Any]],
|
|
42
|
+
region: str,
|
|
43
|
+
current_aws_account_id: str,
|
|
44
|
+
update_tag: int,
|
|
36
45
|
) -> None:
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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,
|
|
46
|
+
load(
|
|
47
|
+
neo4j_session,
|
|
48
|
+
LaunchTemplateSchema(),
|
|
49
|
+
data,
|
|
92
50
|
Region=region,
|
|
93
|
-
|
|
51
|
+
AWS_ID=current_aws_account_id,
|
|
52
|
+
lastupdated=update_tag,
|
|
94
53
|
)
|
|
95
54
|
|
|
96
55
|
|
|
97
56
|
@timeit
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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(
|
|
101
109
|
neo4j_session,
|
|
102
|
-
|
|
110
|
+
LaunchTemplateVersionSchema(),
|
|
111
|
+
data,
|
|
112
|
+
Region=region,
|
|
113
|
+
AWS_ID=current_aws_account_id,
|
|
114
|
+
lastupdated=update_tag,
|
|
103
115
|
)
|
|
104
116
|
|
|
105
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
|
+
|
|
106
128
|
@timeit
|
|
107
129
|
def sync_ec2_launch_templates(
|
|
108
|
-
neo4j_session: neo4j.Session,
|
|
109
|
-
|
|
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],
|
|
110
136
|
) -> None:
|
|
111
137
|
for region in regions:
|
|
112
|
-
logger.
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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)
|
cartography/intel/aws/iam.py
CHANGED
|
@@ -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.
|
|
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":
|
|
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", [])
|
cartography/intel/cve/feed.py
CHANGED
|
@@ -23,7 +23,8 @@ from cartography.util import timeit
|
|
|
23
23
|
logger = logging.getLogger(__name__)
|
|
24
24
|
|
|
25
25
|
MAX_RETRIES = 3
|
|
26
|
-
|
|
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=
|
|
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
|
-
|
|
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
|
|
|
@@ -12,7 +12,7 @@ cartography/client/aws/iam.py,sha256=dYsGikc36DEsSeR2XVOVFFUDwuU9yWj_EVkpgVYCFgM
|
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
178
|
+
cartography/intel/aws/ec2/launch_templates.py,sha256=YhLh_O2cZbeoKXA6MXmwkxJJi0ubZb5FyouTYykuq1k,5372
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
335
|
-
cartography-0.
|
|
336
|
-
cartography-0.
|
|
337
|
-
cartography-0.
|
|
338
|
-
cartography-0.
|
|
339
|
-
cartography-0.
|
|
340
|
-
cartography-0.
|
|
335
|
+
cartography-0.93.0rc1.dist-info/LICENSE,sha256=489ZXeW9G90up6ep-D1n-lJgk9ciNT2yxXpFgRSidtk,11341
|
|
336
|
+
cartography-0.93.0rc1.dist-info/METADATA,sha256=1r_kEpkQWTPR77ToFbTkU78iBSTCM9JuQdleKFo3dJE,1991
|
|
337
|
+
cartography-0.93.0rc1.dist-info/NOTICE,sha256=YOGAsjFtbyKj5tslYIg6V5jEYRuEvnSsIuDOUKj0Qj4,97
|
|
338
|
+
cartography-0.93.0rc1.dist-info/WHEEL,sha256=Z4pYXqR_rTB7OWNDYFOm1qRk0RX6GFP2o8LgvP453Hk,91
|
|
339
|
+
cartography-0.93.0rc1.dist-info/entry_points.txt,sha256=GVIAWD0o0_K077qMA_k1oZU4v-M0a8GLKGJR8tZ-qH8,112
|
|
340
|
+
cartography-0.93.0rc1.dist-info/top_level.txt,sha256=BHqsNJQiI6Q72DeypC1IINQJE59SLhU4nllbQjgJi9g,12
|
|
341
|
+
cartography-0.93.0rc1.dist-info/RECORD,,
|
|
@@ -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
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|