cartography 0.102.0rc2__py3-none-any.whl → 0.103.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.
Potentially problematic release.
This version of cartography might be problematic. Click here for more details.
- cartography/__main__.py +1 -2
- cartography/_version.py +2 -2
- cartography/cli.py +302 -253
- cartography/client/core/tx.py +39 -18
- cartography/config.py +4 -0
- cartography/driftdetect/__main__.py +1 -2
- cartography/driftdetect/add_shortcut.py +10 -2
- cartography/driftdetect/cli.py +71 -75
- cartography/driftdetect/detect_deviations.py +7 -3
- cartography/driftdetect/get_states.py +20 -8
- cartography/driftdetect/model.py +5 -5
- cartography/driftdetect/serializers.py +8 -6
- cartography/driftdetect/storage.py +2 -2
- cartography/graph/cleanupbuilder.py +35 -15
- cartography/graph/job.py +46 -17
- cartography/graph/querybuilder.py +165 -80
- cartography/graph/statement.py +35 -26
- cartography/intel/analysis.py +4 -1
- cartography/intel/aws/__init__.py +114 -55
- cartography/intel/aws/apigateway.py +134 -63
- cartography/intel/aws/cloudtrail.py +127 -0
- cartography/intel/aws/config.py +56 -20
- cartography/intel/aws/dynamodb.py +108 -40
- cartography/intel/aws/ec2/__init__.py +2 -2
- cartography/intel/aws/ec2/auto_scaling_groups.py +181 -78
- cartography/intel/aws/ec2/elastic_ip_addresses.py +41 -13
- cartography/intel/aws/ec2/images.py +49 -20
- cartography/intel/aws/ec2/instances.py +234 -136
- cartography/intel/aws/ec2/internet_gateways.py +40 -11
- cartography/intel/aws/ec2/key_pairs.py +44 -20
- cartography/intel/aws/ec2/launch_templates.py +101 -59
- cartography/intel/aws/ec2/load_balancer_v2s.py +104 -39
- cartography/intel/aws/ec2/load_balancers.py +82 -42
- cartography/intel/aws/ec2/network_acls.py +89 -65
- cartography/intel/aws/ec2/network_interfaces.py +146 -87
- cartography/intel/aws/ec2/reserved_instances.py +45 -16
- cartography/intel/aws/ec2/route_tables.py +138 -98
- cartography/intel/aws/ec2/security_groups.py +71 -21
- cartography/intel/aws/ec2/snapshots.py +61 -22
- cartography/intel/aws/ec2/subnets.py +54 -18
- cartography/intel/aws/ec2/tgw.py +100 -34
- cartography/intel/aws/ec2/util.py +1 -1
- cartography/intel/aws/ec2/volumes.py +69 -41
- cartography/intel/aws/ec2/vpc.py +37 -12
- cartography/intel/aws/ec2/vpc_peerings.py +83 -24
- cartography/intel/aws/ecr.py +88 -32
- cartography/intel/aws/ecs.py +83 -47
- cartography/intel/aws/eks.py +55 -29
- cartography/intel/aws/elasticache.py +42 -18
- cartography/intel/aws/elasticsearch.py +57 -20
- cartography/intel/aws/emr.py +61 -23
- cartography/intel/aws/iam.py +401 -145
- cartography/intel/aws/iam_instance_profiles.py +22 -22
- cartography/intel/aws/identitycenter.py +71 -37
- cartography/intel/aws/inspector.py +159 -89
- cartography/intel/aws/kms.py +92 -38
- cartography/intel/aws/lambda_function.py +103 -34
- cartography/intel/aws/organizations.py +30 -10
- cartography/intel/aws/permission_relationships.py +133 -51
- cartography/intel/aws/rds.py +249 -85
- cartography/intel/aws/redshift.py +107 -46
- cartography/intel/aws/resourcegroupstaggingapi.py +120 -66
- cartography/intel/aws/resources.py +53 -46
- cartography/intel/aws/route53.py +108 -61
- cartography/intel/aws/s3.py +168 -83
- cartography/intel/aws/s3accountpublicaccessblock.py +157 -0
- cartography/intel/aws/secretsmanager.py +24 -12
- cartography/intel/aws/securityhub.py +20 -9
- cartography/intel/aws/sns.py +166 -0
- cartography/intel/aws/sqs.py +60 -28
- cartography/intel/aws/ssm.py +70 -30
- cartography/intel/aws/util/arns.py +7 -7
- cartography/intel/aws/util/common.py +31 -4
- cartography/intel/azure/__init__.py +78 -19
- cartography/intel/azure/compute.py +101 -27
- cartography/intel/azure/cosmosdb.py +496 -170
- cartography/intel/azure/sql.py +296 -105
- cartography/intel/azure/storage.py +322 -113
- cartography/intel/azure/subscription.py +39 -23
- cartography/intel/azure/tenant.py +13 -4
- cartography/intel/azure/util/credentials.py +95 -55
- cartography/intel/bigfix/__init__.py +2 -2
- cartography/intel/bigfix/computers.py +93 -65
- cartography/intel/create_indexes.py +3 -2
- cartography/intel/crowdstrike/__init__.py +11 -9
- cartography/intel/crowdstrike/endpoints.py +5 -1
- cartography/intel/crowdstrike/spotlight.py +8 -3
- cartography/intel/cve/__init__.py +46 -13
- cartography/intel/cve/feed.py +48 -12
- cartography/intel/digitalocean/__init__.py +22 -13
- cartography/intel/digitalocean/compute.py +75 -108
- cartography/intel/digitalocean/management.py +44 -80
- cartography/intel/digitalocean/platform.py +48 -43
- cartography/intel/dns.py +36 -10
- cartography/intel/duo/__init__.py +21 -16
- cartography/intel/duo/api_host.py +14 -9
- cartography/intel/duo/endpoints.py +50 -45
- cartography/intel/duo/groups.py +18 -14
- cartography/intel/duo/phones.py +37 -34
- cartography/intel/duo/tokens.py +26 -23
- cartography/intel/duo/users.py +54 -50
- cartography/intel/duo/web_authn_credentials.py +30 -25
- cartography/intel/entra/__init__.py +25 -7
- cartography/intel/entra/ou.py +112 -0
- cartography/intel/entra/users.py +69 -63
- cartography/intel/gcp/__init__.py +185 -49
- cartography/intel/gcp/compute.py +418 -231
- cartography/intel/gcp/crm.py +96 -43
- cartography/intel/gcp/dns.py +60 -19
- cartography/intel/gcp/gke.py +72 -38
- cartography/intel/gcp/iam.py +61 -41
- cartography/intel/gcp/storage.py +84 -55
- cartography/intel/github/__init__.py +13 -11
- cartography/intel/github/repos.py +270 -137
- cartography/intel/github/teams.py +170 -88
- cartography/intel/github/users.py +70 -39
- cartography/intel/github/util.py +36 -34
- cartography/intel/gsuite/__init__.py +47 -26
- cartography/intel/gsuite/api.py +73 -30
- cartography/intel/jamf/__init__.py +19 -1
- cartography/intel/jamf/computers.py +30 -7
- cartography/intel/jamf/util.py +7 -2
- cartography/intel/kandji/__init__.py +6 -3
- cartography/intel/kandji/devices.py +14 -8
- cartography/intel/kubernetes/namespaces.py +7 -4
- cartography/intel/kubernetes/pods.py +7 -4
- cartography/intel/kubernetes/services.py +8 -4
- cartography/intel/lastpass/__init__.py +2 -2
- cartography/intel/lastpass/users.py +23 -12
- cartography/intel/oci/__init__.py +44 -11
- cartography/intel/oci/iam.py +134 -38
- cartography/intel/oci/organizations.py +13 -6
- cartography/intel/oci/utils.py +43 -20
- cartography/intel/okta/__init__.py +66 -15
- cartography/intel/okta/applications.py +42 -20
- cartography/intel/okta/awssaml.py +93 -33
- cartography/intel/okta/factors.py +16 -4
- cartography/intel/okta/groups.py +56 -29
- cartography/intel/okta/organization.py +5 -1
- cartography/intel/okta/origins.py +6 -2
- cartography/intel/okta/roles.py +15 -5
- cartography/intel/okta/users.py +20 -8
- cartography/intel/okta/utils.py +6 -4
- cartography/intel/pagerduty/__init__.py +8 -7
- cartography/intel/pagerduty/escalation_policies.py +18 -6
- cartography/intel/pagerduty/schedules.py +12 -4
- cartography/intel/pagerduty/services.py +11 -4
- cartography/intel/pagerduty/teams.py +8 -3
- cartography/intel/pagerduty/users.py +3 -1
- cartography/intel/pagerduty/vendors.py +3 -1
- cartography/intel/semgrep/__init__.py +24 -6
- cartography/intel/semgrep/dependencies.py +50 -28
- cartography/intel/semgrep/deployment.py +3 -1
- cartography/intel/semgrep/findings.py +42 -18
- cartography/intel/snipeit/__init__.py +17 -3
- cartography/intel/snipeit/asset.py +12 -6
- cartography/intel/snipeit/user.py +8 -5
- cartography/intel/snipeit/util.py +9 -4
- cartography/models/aws/apigateway.py +21 -17
- cartography/models/aws/apigatewaycertificate.py +28 -22
- cartography/models/aws/apigatewayresource.py +28 -20
- cartography/models/aws/apigatewaystage.py +33 -25
- cartography/models/aws/cloudtrail/__init__.py +0 -0
- cartography/models/aws/cloudtrail/trail.py +61 -0
- cartography/models/aws/dynamodb/gsi.py +30 -22
- cartography/models/aws/dynamodb/tables.py +25 -17
- cartography/models/aws/ec2/auto_scaling_groups.py +102 -82
- cartography/models/aws/ec2/images.py +36 -34
- cartography/models/aws/ec2/instances.py +51 -45
- cartography/models/aws/ec2/keypair.py +21 -16
- cartography/models/aws/ec2/keypair_instance.py +28 -21
- cartography/models/aws/ec2/launch_configurations.py +30 -26
- cartography/models/aws/ec2/launch_template_versions.py +48 -38
- cartography/models/aws/ec2/launch_templates.py +21 -17
- cartography/models/aws/ec2/load_balancer_listeners.py +27 -23
- cartography/models/aws/ec2/load_balancers.py +47 -37
- cartography/models/aws/ec2/network_acl_rules.py +38 -30
- cartography/models/aws/ec2/network_acls.py +38 -29
- cartography/models/aws/ec2/networkinterface_instance.py +52 -39
- cartography/models/aws/ec2/networkinterfaces.py +53 -37
- cartography/models/aws/ec2/privateip_networkinterface.py +32 -22
- cartography/models/aws/ec2/reservations.py +18 -14
- cartography/models/aws/ec2/route_table_associations.py +44 -34
- cartography/models/aws/ec2/route_tables.py +50 -43
- cartography/models/aws/ec2/routes.py +45 -37
- cartography/models/aws/ec2/securitygroup_instance.py +29 -20
- cartography/models/aws/ec2/securitygroup_networkinterface.py +24 -15
- cartography/models/aws/ec2/subnet_instance.py +24 -19
- cartography/models/aws/ec2/subnet_networkinterface.py +40 -31
- cartography/models/aws/ec2/volumes.py +47 -40
- cartography/models/aws/eks/clusters.py +23 -21
- cartography/models/aws/emr.py +32 -30
- cartography/models/aws/iam/instanceprofile.py +33 -24
- cartography/models/aws/identitycenter/awsidentitycenter.py +18 -14
- cartography/models/aws/identitycenter/awspermissionset.py +37 -29
- cartography/models/aws/identitycenter/awsssouser.py +23 -21
- cartography/models/aws/inspector/findings.py +77 -65
- cartography/models/aws/inspector/packages.py +35 -29
- cartography/models/aws/s3/__init__.py +0 -0
- cartography/models/aws/s3/account_public_access_block.py +51 -0
- cartography/models/aws/sns/__init__.py +0 -0
- cartography/models/aws/sns/topic.py +50 -0
- cartography/models/aws/ssm/instance_information.py +51 -39
- cartography/models/aws/ssm/instance_patch.py +32 -26
- cartography/models/bigfix/bigfix_computer.py +42 -38
- cartography/models/bigfix/bigfix_root.py +3 -3
- cartography/models/core/common.py +12 -10
- cartography/models/core/nodes.py +5 -2
- cartography/models/core/relationships.py +14 -6
- cartography/models/crowdstrike/hosts.py +37 -35
- cartography/models/cve/cve.py +34 -32
- cartography/models/cve/cve_feed.py +6 -6
- cartography/models/digitalocean/__init__.py +0 -0
- cartography/models/digitalocean/account.py +21 -0
- cartography/models/digitalocean/droplet.py +56 -0
- cartography/models/digitalocean/project.py +48 -0
- cartography/models/duo/api_host.py +3 -3
- cartography/models/duo/endpoint.py +43 -41
- cartography/models/duo/group.py +14 -14
- cartography/models/duo/phone.py +27 -27
- cartography/models/duo/token.py +16 -16
- cartography/models/duo/user.py +46 -44
- cartography/models/duo/web_authn_credential.py +27 -19
- cartography/models/entra/ou.py +48 -0
- cartography/models/entra/tenant.py +24 -18
- cartography/models/entra/user.py +64 -48
- cartography/models/gcp/iam.py +23 -23
- cartography/models/github/orgs.py +5 -4
- cartography/models/github/teams.py +37 -31
- cartography/models/github/users.py +34 -23
- cartography/models/kandji/device.py +22 -16
- cartography/models/kandji/tenant.py +6 -4
- cartography/models/lastpass/tenant.py +3 -3
- cartography/models/lastpass/user.py +32 -28
- cartography/models/semgrep/dependencies.py +36 -24
- cartography/models/semgrep/deployment.py +5 -5
- cartography/models/semgrep/findings.py +58 -42
- cartography/models/semgrep/locations.py +27 -21
- cartography/models/snipeit/asset.py +30 -21
- cartography/models/snipeit/tenant.py +6 -4
- cartography/models/snipeit/user.py +19 -12
- cartography/stats.py +3 -3
- cartography/sync.py +107 -31
- cartography/util.py +84 -62
- {cartography-0.102.0rc2.dist-info → cartography-0.103.0rc1.dist-info}/METADATA +3 -14
- cartography-0.103.0rc1.dist-info/RECORD +396 -0
- {cartography-0.102.0rc2.dist-info → cartography-0.103.0rc1.dist-info}/WHEEL +1 -1
- cartography-0.102.0rc2.dist-info/RECORD +0 -381
- {cartography-0.102.0rc2.dist-info → cartography-0.103.0rc1.dist-info}/entry_points.txt +0 -0
- {cartography-0.102.0rc2.dist-info → cartography-0.103.0rc1.dist-info}/licenses/LICENSE +0 -0
- {cartography-0.102.0rc2.dist-info → cartography-0.103.0rc1.dist-info}/top_level.txt +0 -0
cartography/intel/aws/route53.py
CHANGED
|
@@ -55,7 +55,11 @@ def link_aws_resources(neo4j_session: neo4j.Session, update_tag: int) -> None:
|
|
|
55
55
|
|
|
56
56
|
|
|
57
57
|
@timeit
|
|
58
|
-
def load_a_records(
|
|
58
|
+
def load_a_records(
|
|
59
|
+
neo4j_session: neo4j.Session,
|
|
60
|
+
records: List[Dict],
|
|
61
|
+
update_tag: int,
|
|
62
|
+
) -> None:
|
|
59
63
|
ingest_records = """
|
|
60
64
|
UNWIND $records as record
|
|
61
65
|
MERGE (a:DNSRecord:AWSDNSRecord{id: record.id})
|
|
@@ -80,7 +84,11 @@ def load_a_records(neo4j_session: neo4j.Session, records: List[Dict], update_tag
|
|
|
80
84
|
|
|
81
85
|
|
|
82
86
|
@timeit
|
|
83
|
-
def load_alias_records(
|
|
87
|
+
def load_alias_records(
|
|
88
|
+
neo4j_session: neo4j.Session,
|
|
89
|
+
records: List[Dict],
|
|
90
|
+
update_tag: int,
|
|
91
|
+
) -> None:
|
|
84
92
|
# create the DNSRecord nodes and link them to matching DNSZone and S3Bucket nodes
|
|
85
93
|
ingest_records = """
|
|
86
94
|
UNWIND $records as record
|
|
@@ -106,7 +114,11 @@ def load_alias_records(neo4j_session: neo4j.Session, records: List[Dict], update
|
|
|
106
114
|
|
|
107
115
|
|
|
108
116
|
@timeit
|
|
109
|
-
def load_cname_records(
|
|
117
|
+
def load_cname_records(
|
|
118
|
+
neo4j_session: neo4j.Session,
|
|
119
|
+
records: List[Dict],
|
|
120
|
+
update_tag: int,
|
|
121
|
+
) -> None:
|
|
110
122
|
ingest_records = """
|
|
111
123
|
UNWIND $records as record
|
|
112
124
|
MERGE (a:DNSRecord:AWSDNSRecord{id: record.id})
|
|
@@ -131,7 +143,12 @@ def load_cname_records(neo4j_session: neo4j.Session, records: List[Dict], update
|
|
|
131
143
|
|
|
132
144
|
|
|
133
145
|
@timeit
|
|
134
|
-
def load_zone(
|
|
146
|
+
def load_zone(
|
|
147
|
+
neo4j_session: neo4j.Session,
|
|
148
|
+
zone: Dict,
|
|
149
|
+
current_aws_id: str,
|
|
150
|
+
update_tag: int,
|
|
151
|
+
) -> None:
|
|
135
152
|
ingest_z = """
|
|
136
153
|
MERGE (zone:DNSZone:AWSDNSZone{zoneid:$ZoneId})
|
|
137
154
|
ON CREATE SET
|
|
@@ -149,17 +166,22 @@ def load_zone(neo4j_session: neo4j.Session, zone: Dict, current_aws_id: str, upd
|
|
|
149
166
|
"""
|
|
150
167
|
neo4j_session.run(
|
|
151
168
|
ingest_z,
|
|
152
|
-
ZoneName=zone[
|
|
153
|
-
ZoneId=zone[
|
|
154
|
-
Comment=zone[
|
|
155
|
-
PrivateZone=zone[
|
|
169
|
+
ZoneName=zone["name"][:-1],
|
|
170
|
+
ZoneId=zone["zoneid"],
|
|
171
|
+
Comment=zone["comment"],
|
|
172
|
+
PrivateZone=zone["privatezone"],
|
|
156
173
|
AWS_ACCOUNT_ID=current_aws_id,
|
|
157
174
|
update_tag=update_tag,
|
|
158
175
|
)
|
|
159
176
|
|
|
160
177
|
|
|
161
178
|
@timeit
|
|
162
|
-
def load_ns_records(
|
|
179
|
+
def load_ns_records(
|
|
180
|
+
neo4j_session: neo4j.Session,
|
|
181
|
+
records: List[Dict],
|
|
182
|
+
zone_name: str,
|
|
183
|
+
update_tag: int,
|
|
184
|
+
) -> None:
|
|
163
185
|
ingest_records = """
|
|
164
186
|
UNWIND $records as record
|
|
165
187
|
MERGE (a:DNSRecord:AWSDNSRecord{id: record.id})
|
|
@@ -233,58 +255,58 @@ def link_sub_zones(neo4j_session: neo4j.Session, update_tag: int) -> None:
|
|
|
233
255
|
@timeit
|
|
234
256
|
def transform_record_set(record_set: Dict, zone_id: str, name: str) -> Optional[Dict]:
|
|
235
257
|
# process CNAME, ALIAS and A records
|
|
236
|
-
if record_set[
|
|
237
|
-
if
|
|
258
|
+
if record_set["Type"] == "CNAME":
|
|
259
|
+
if "AliasTarget" in record_set:
|
|
238
260
|
# this is a weighted CNAME record
|
|
239
|
-
value = record_set[
|
|
240
|
-
if value.endswith(
|
|
261
|
+
value = record_set["AliasTarget"]["DNSName"]
|
|
262
|
+
if value.endswith("."):
|
|
241
263
|
value = value[:-1]
|
|
242
264
|
return {
|
|
243
265
|
"name": name,
|
|
244
|
-
"type":
|
|
266
|
+
"type": "CNAME",
|
|
245
267
|
"zoneid": zone_id,
|
|
246
268
|
"value": value,
|
|
247
|
-
"id": _create_dns_record_id(zone_id, name,
|
|
269
|
+
"id": _create_dns_record_id(zone_id, name, "WEIGHTED_CNAME"),
|
|
248
270
|
}
|
|
249
271
|
else:
|
|
250
272
|
# This is a normal CNAME record
|
|
251
|
-
value = record_set[
|
|
252
|
-
if value.endswith(
|
|
273
|
+
value = record_set["ResourceRecords"][0]["Value"]
|
|
274
|
+
if value.endswith("."):
|
|
253
275
|
value = value[:-1]
|
|
254
276
|
return {
|
|
255
277
|
"name": name,
|
|
256
|
-
"type":
|
|
278
|
+
"type": "CNAME",
|
|
257
279
|
"zoneid": zone_id,
|
|
258
280
|
"value": value,
|
|
259
|
-
"id": _create_dns_record_id(zone_id, name,
|
|
281
|
+
"id": _create_dns_record_id(zone_id, name, "CNAME"),
|
|
260
282
|
}
|
|
261
283
|
|
|
262
|
-
elif record_set[
|
|
263
|
-
if
|
|
284
|
+
elif record_set["Type"] == "A":
|
|
285
|
+
if "AliasTarget" in record_set:
|
|
264
286
|
# this is an ALIAS record
|
|
265
287
|
# ALIAS records are a special AWS-only type of A record
|
|
266
288
|
return {
|
|
267
289
|
"name": name,
|
|
268
|
-
"type":
|
|
290
|
+
"type": "ALIAS",
|
|
269
291
|
"zoneid": zone_id,
|
|
270
|
-
"value": record_set[
|
|
271
|
-
"id": _create_dns_record_id(zone_id, name,
|
|
292
|
+
"value": record_set["AliasTarget"]["DNSName"][:-1],
|
|
293
|
+
"id": _create_dns_record_id(zone_id, name, "ALIAS"),
|
|
272
294
|
}
|
|
273
295
|
else:
|
|
274
296
|
# this is a real A record
|
|
275
297
|
# loop and add each value (IP address) to a comma separated string
|
|
276
298
|
# don't forget to trim that trailing comma!
|
|
277
299
|
# TODO can this be replaced with a string join?
|
|
278
|
-
value =
|
|
279
|
-
for a_value in record_set[
|
|
280
|
-
value = value + a_value[
|
|
300
|
+
value = ""
|
|
301
|
+
for a_value in record_set["ResourceRecords"]:
|
|
302
|
+
value = value + a_value["Value"] + ","
|
|
281
303
|
|
|
282
304
|
return {
|
|
283
305
|
"name": name,
|
|
284
|
-
"type":
|
|
306
|
+
"type": "A",
|
|
285
307
|
"zoneid": zone_id,
|
|
286
308
|
"value": value[:-1],
|
|
287
|
-
"id": _create_dns_record_id(zone_id, name,
|
|
309
|
+
"id": _create_dns_record_id(zone_id, name, "A"),
|
|
288
310
|
}
|
|
289
311
|
|
|
290
312
|
else:
|
|
@@ -296,14 +318,17 @@ def transform_ns_record_set(record_set: Dict, zone_id: str) -> Optional[Dict]:
|
|
|
296
318
|
|
|
297
319
|
if "ResourceRecords" in record_set:
|
|
298
320
|
# Sometimes the value records have a trailing period, sometimes they dont.
|
|
299
|
-
servers = [
|
|
321
|
+
servers = [
|
|
322
|
+
_normalize_dns_address(record["Value"])
|
|
323
|
+
for record in record_set["ResourceRecords"]
|
|
324
|
+
]
|
|
300
325
|
return {
|
|
301
326
|
"zoneid": zone_id,
|
|
302
327
|
"type": "NS",
|
|
303
328
|
# looks like "name.some.fqdn.net.", so this removes the trailing comma.
|
|
304
329
|
"name": _normalize_dns_address(record_set["Name"]),
|
|
305
330
|
"servers": servers,
|
|
306
|
-
"id": _create_dns_record_id(zone_id, record_set[
|
|
331
|
+
"id": _create_dns_record_id(zone_id, record_set["Name"][:-1], "NS"),
|
|
307
332
|
}
|
|
308
333
|
else:
|
|
309
334
|
return None
|
|
@@ -312,23 +337,25 @@ def transform_ns_record_set(record_set: Dict, zone_id: str) -> Optional[Dict]:
|
|
|
312
337
|
@timeit
|
|
313
338
|
def transform_zone(zone: Dict) -> Dict:
|
|
314
339
|
# TODO simplify this
|
|
315
|
-
if
|
|
316
|
-
comment = zone[
|
|
340
|
+
if "Comment" in zone["Config"]:
|
|
341
|
+
comment = zone["Config"]["Comment"]
|
|
317
342
|
else:
|
|
318
|
-
comment =
|
|
343
|
+
comment = ""
|
|
319
344
|
|
|
320
345
|
return {
|
|
321
|
-
"zoneid": zone[
|
|
322
|
-
"name": zone[
|
|
323
|
-
"privatezone": zone[
|
|
346
|
+
"zoneid": zone["Id"],
|
|
347
|
+
"name": zone["Name"],
|
|
348
|
+
"privatezone": zone["Config"]["PrivateZone"],
|
|
324
349
|
"comment": comment,
|
|
325
|
-
"count": zone[
|
|
350
|
+
"count": zone["ResourceRecordSetCount"],
|
|
326
351
|
}
|
|
327
352
|
|
|
328
353
|
|
|
329
354
|
@timeit
|
|
330
355
|
def load_dns_details(
|
|
331
|
-
neo4j_session: neo4j.Session,
|
|
356
|
+
neo4j_session: neo4j.Session,
|
|
357
|
+
dns_details: List[Tuple[Dict, List[Dict]]],
|
|
358
|
+
current_aws_id: str,
|
|
332
359
|
update_tag: int,
|
|
333
360
|
) -> None:
|
|
334
361
|
"""
|
|
@@ -348,18 +375,22 @@ def load_dns_details(
|
|
|
348
375
|
load_zone(neo4j_session, parsed_zone, current_aws_id, update_tag)
|
|
349
376
|
|
|
350
377
|
for record_set in zone_record_sets:
|
|
351
|
-
if record_set[
|
|
352
|
-
record = transform_record_set(
|
|
353
|
-
|
|
354
|
-
|
|
378
|
+
if record_set["Type"] == "A" or record_set["Type"] == "CNAME":
|
|
379
|
+
record = transform_record_set(
|
|
380
|
+
record_set,
|
|
381
|
+
zone["Id"],
|
|
382
|
+
record_set["Name"][:-1],
|
|
383
|
+
)
|
|
384
|
+
|
|
385
|
+
if record["type"] == "A":
|
|
355
386
|
zone_a_records.append(record)
|
|
356
|
-
elif record[
|
|
387
|
+
elif record["type"] == "ALIAS":
|
|
357
388
|
zone_alias_records.append(record)
|
|
358
|
-
elif record[
|
|
389
|
+
elif record["type"] == "CNAME":
|
|
359
390
|
zone_cname_records.append(record)
|
|
360
391
|
|
|
361
|
-
if record_set[
|
|
362
|
-
record = transform_ns_record_set(record_set, zone[
|
|
392
|
+
if record_set["Type"] == "NS":
|
|
393
|
+
record = transform_ns_record_set(record_set, zone["Id"])
|
|
363
394
|
zone_ns_records.append(record)
|
|
364
395
|
if zone_a_records:
|
|
365
396
|
load_a_records(neo4j_session, zone_a_records, update_tag)
|
|
@@ -370,30 +401,38 @@ def load_dns_details(
|
|
|
370
401
|
if zone_cname_records:
|
|
371
402
|
load_cname_records(neo4j_session, zone_cname_records, update_tag)
|
|
372
403
|
if zone_ns_records:
|
|
373
|
-
load_ns_records(
|
|
404
|
+
load_ns_records(
|
|
405
|
+
neo4j_session,
|
|
406
|
+
zone_ns_records,
|
|
407
|
+
parsed_zone["name"][:-1],
|
|
408
|
+
update_tag,
|
|
409
|
+
)
|
|
374
410
|
link_aws_resources(neo4j_session, update_tag)
|
|
375
411
|
|
|
376
412
|
|
|
377
413
|
@timeit
|
|
378
|
-
def get_zone_record_sets(
|
|
414
|
+
def get_zone_record_sets(
|
|
415
|
+
client: botocore.client.BaseClient,
|
|
416
|
+
zone_id: str,
|
|
417
|
+
) -> List[Dict]:
|
|
379
418
|
resource_record_sets: List[Dict] = []
|
|
380
|
-
paginator = client.get_paginator(
|
|
419
|
+
paginator = client.get_paginator("list_resource_record_sets")
|
|
381
420
|
pages = paginator.paginate(HostedZoneId=zone_id)
|
|
382
421
|
for page in pages:
|
|
383
|
-
resource_record_sets.extend(page[
|
|
422
|
+
resource_record_sets.extend(page["ResourceRecordSets"])
|
|
384
423
|
return resource_record_sets
|
|
385
424
|
|
|
386
425
|
|
|
387
426
|
@timeit
|
|
388
427
|
def get_zones(client: botocore.client.BaseClient) -> List[Tuple[Dict, List[Dict]]]:
|
|
389
|
-
paginator = client.get_paginator(
|
|
428
|
+
paginator = client.get_paginator("list_hosted_zones")
|
|
390
429
|
hosted_zones: List[Dict] = []
|
|
391
430
|
for page in paginator.paginate():
|
|
392
|
-
hosted_zones.extend(page[
|
|
431
|
+
hosted_zones.extend(page["HostedZones"])
|
|
393
432
|
|
|
394
433
|
results: List[Tuple[Dict, List[Dict]]] = []
|
|
395
434
|
for hosted_zone in hosted_zones:
|
|
396
|
-
record_sets = get_zone_record_sets(client, hosted_zone[
|
|
435
|
+
record_sets = get_zone_record_sets(client, hosted_zone["Id"])
|
|
397
436
|
results.append((hosted_zone, record_sets))
|
|
398
437
|
return results
|
|
399
438
|
|
|
@@ -403,25 +442,33 @@ def _create_dns_record_id(zoneid: str, name: str, record_type: str) -> str:
|
|
|
403
442
|
|
|
404
443
|
|
|
405
444
|
def _normalize_dns_address(address: str) -> str:
|
|
406
|
-
return address.rstrip(
|
|
445
|
+
return address.rstrip(".")
|
|
407
446
|
|
|
408
447
|
|
|
409
448
|
@timeit
|
|
410
|
-
def cleanup_route53(
|
|
449
|
+
def cleanup_route53(
|
|
450
|
+
neo4j_session: neo4j.Session,
|
|
451
|
+
current_aws_id: str,
|
|
452
|
+
update_tag: int,
|
|
453
|
+
) -> None:
|
|
411
454
|
run_cleanup_job(
|
|
412
|
-
|
|
455
|
+
"aws_dns_cleanup.json",
|
|
413
456
|
neo4j_session,
|
|
414
|
-
{
|
|
457
|
+
{"UPDATE_TAG": update_tag, "AWS_ID": current_aws_id},
|
|
415
458
|
)
|
|
416
459
|
|
|
417
460
|
|
|
418
461
|
@timeit
|
|
419
462
|
def sync(
|
|
420
|
-
neo4j_session: neo4j.Session,
|
|
421
|
-
|
|
463
|
+
neo4j_session: neo4j.Session,
|
|
464
|
+
boto3_session: boto3.session.Session,
|
|
465
|
+
regions: List[str],
|
|
466
|
+
current_aws_account_id: str,
|
|
467
|
+
update_tag: int,
|
|
468
|
+
common_job_parameters: Dict,
|
|
422
469
|
) -> None:
|
|
423
470
|
logger.info("Syncing Route53 for account '%s'.", current_aws_account_id)
|
|
424
|
-
client = boto3_session.client(
|
|
471
|
+
client = boto3_session.client("route53")
|
|
425
472
|
zones = get_zones(client)
|
|
426
473
|
load_dns_details(neo4j_session, zones, current_aws_account_id, update_tag)
|
|
427
474
|
link_sub_zones(neo4j_session, update_tag)
|