From 892166fd207db1deb9b6d34d51d920015a7d96ff Mon Sep 17 00:00:00 2001 From: badra001 Date: Wed, 26 Apr 2023 20:22:53 -0400 Subject: [PATCH] fix --- code/ddns-lambda.py | 104 +++++++++++++++++++++++-------------------- code/ddns-lambda.zip | Bin 23338 -> 23361 bytes 2 files changed, 56 insertions(+), 48 deletions(-) diff --git a/code/ddns-lambda.py b/code/ddns-lambda.py index 979b44a..8e7827c 100755 --- a/code/ddns-lambda.py +++ b/code/ddns-lambda.py @@ -73,7 +73,7 @@ LOGGER = logging.getLogger() account_id = None region = None -VERSION = '1.2.0b65' +VERSION = '1.2.0b66' # Read Env variables DEBUG_LOG_LEVEL = os.environ.get('DebugLogLevel', 'INFO') @@ -695,19 +695,21 @@ def lambda_handler( return caller_response if tag_data['option_cname'].valid: - LOGGER.info( - f"4.1 instance: {instance_id}, CNAME using tag_option.cname hostname {tag_data['option_cname'].hostname} and tag_option.cname {tag_data['option_cname'].zonename}") - cf_hostname = tag_data['option_cname'].hostname - cf_zonename = tag_data['option_cname'].zonename - elif not tag_data['option_nname'].valid and tag_data['option_name'].hostname and f_zonename: - LOGGER.info(f"4.2 instance: {instance_id}, CNAME using tag_option.cname hostname {tag_data['option_cname'].hostname} and current zone {f_zonename}") - cf_hostname = tag_data['option_cname'].hostname - cf_zonename = f_zonename - else: - LOGGER.info(f"4.3 instance: {instance_id}, CNAME no valid hostname or zone found, skipping CNAME") - cf_hostname = None - cf_zonename = None - cf_fqdn=create_fqdn(cf_hostname, cf_zonename) + LOGGER.info( + f"4.1 instance: {instance_id}, CNAME using tag_option.cname hostname {tag_data['option_cname'].hostname} and tag_option.cname {tag_data['option_cname'].zonename}") + cf_hostname = tag_data['option_cname'].hostname + cf_zonename = tag_data['option_cname'].zonename + elif not tag_data['option_cname'].valid and tag_data['option_name'].hostname and f_zonename: + LOGGER.info( + f"4.2 instance: {instance_id}, CNAME using tag_option.cname hostname {tag_data['option_cname'].hostname} and current zone {f_zonename}") + cf_hostname = tag_data['option_cname'].hostname + cf_zonename = f_zonename + else: + LOGGER.info( + f"4.3 instance: {instance_id}, CNAME no valid hostname or zone found, skipping CNAME") + cf_hostname = None + cf_zonename = None + cf_fqdn = create_fqdn(cf_hostname, cf_zonename) # note this will not continue and set a cname @@ -902,17 +904,17 @@ def lambda_handler( # so using existing tag data will not be valid if state != 'running': - heritage_records = {} - for entry in dns_data: - if entry.rr_type == 'TXT' and "heritage=" in entry.rr_value: - heritage_records[entry.rr_name] = entry.rr_value - for entry in dns_data: - if not (entry.rr_type == 'TXT' and "heritage=" in entry.rr_value): - process_response = new_process_delete_records( - instance_id, entry.zone_id, entry.rr_name, entry.zone_name, entry.rr_type, entry.rr_value, heritage_records.get(entry.rr_name, '')) - delete_records = delete_records and process_response['delete_success'] - caller_response = caller_response + process_response['msg'] - count[f"delete_success.{process_response.get('delete_success')}"] += 1 + heritage_records = {} + for entry in dns_data: + if entry.rr_type == 'TXT' and "heritage=" in entry.rr_value: + heritage_records[entry.rr_name] = entry.rr_value + for entry in dns_data: + if not (entry.rr_type == 'TXT' and "heritage=" in entry.rr_value): + process_response = new_process_delete_records( + instance_id, entry.zone_id, entry.rr_name, entry.zone_name, entry.rr_type, entry.rr_value, heritage_records.get(entry.rr_name, '')) + delete_records = delete_records and process_response['delete_success'] + caller_response = caller_response + process_response['msg'] + count[f"delete_success.{process_response.get('delete_success')}"] += 1 # # Process and delete A record and associated TXT record # process_response = process_delete_records( @@ -925,7 +927,7 @@ def lambda_handler( # private_ip, # heritage_value # ) -# +# # # only true if existing delete_records and the delete_success from the subroutine is true # delete_records = delete_records and process_response['delete_success'] # # append to the lsit @@ -953,7 +955,8 @@ def lambda_handler( # Process the CNAME record only if it has passed the check # if tag_data['option_cname'].valid: if cf_hostname: - LOGGER.debug(f"cname record is valid - creating CNAME record host {cf_hostname} zone {cf_zonename}: {lineno()}") + LOGGER.debug( + f"cname record is valid - creating CNAME record host {cf_hostname} zone {cf_zonename}: {lineno()}") # cname_host_name = tag_data['option_cname'].hostname # cname_domain_suffix = tag_data['option_cname'].zonename # cname_domain_suffix_item = phz_collection_by_vpc[cname_domain_suffix] @@ -966,19 +969,19 @@ def lambda_handler( # create CNAME record in private zone if state == 'running': try: -# LOGGER.debug("cname_host_name:" -# " %s", str(cname_host_name) + lineno()) -# LOGGER.debug("cname_domain_suffix:" -# " %s", str(cname_domain_suffix) + lineno()) -# LOGGER.debug("cname_domain_suffix_id:" -# " %s", str(cname_domain_suffix_id) + lineno()) -# + # LOGGER.debug("cname_host_name:" + # " %s", str(cname_host_name) + lineno()) + # LOGGER.debug("cname_domain_suffix:" + # " %s", str(cname_domain_suffix) + lineno()) + # LOGGER.debug("cname_domain_suffix_id:" + # " %s", str(cname_domain_suffix_id) + lineno()) + # create_response = create_resource_record( route53, instance_id, -# cname_domain_suffix_id, -# cname_host_name, -# cname_domain_suffix, + # cname_domain_suffix_id, + # cname_host_name, + # cname_domain_suffix, cf_zonename_id, cf_hostname, cf_zonename, @@ -991,7 +994,8 @@ def lambda_handler( if create_response == 'success': dns_data.append(dns_data_tuple( cf_zonename_id, cf_hostname, cf_zonename, 'CNAME', cf_fqdn)) - LOGGER.info(f"instance: {instance_id}, Created {append_msg} {lineno()}") + LOGGER.info( + f"instance: {instance_id}, Created {append_msg} {lineno()}") caller_response.append('Created ' + append_msg) else: caller_response.append(create_response) @@ -1004,14 +1008,15 @@ def lambda_handler( try: if not flags['noheritage']: if len(heritage) > 0: - cf_hostname_txt=TXT_RR_PREFIX+'.'+cf_hostname - LOGGER.debug(f"Creating heritage TXT resource records host {cf_hostname_txt} zone {cf_zonename} value {heritage_value} {lineno()}") + cf_hostname_txt = TXT_RR_PREFIX + '.' + cf_hostname + LOGGER.debug( + f"Creating heritage TXT resource records host {cf_hostname_txt} zone {cf_zonename} value {heritage_value} {lineno()}") create_response = create_resource_record( route53, instance_id, -# cname_domain_suffix_id, -# cname_host_name_txt, -# cname_domain_suffix, + # cname_domain_suffix_id, + # cname_host_name_txt, + # cname_domain_suffix, cf_zonename_id, cf_hostname_txt, cf_zonename, @@ -1024,15 +1029,18 @@ def lambda_handler( if create_response == 'success': dns_data.append(dns_data_tuple( cf_zonename_id, cf_hostname_txt, cf_zonename, 'TXT', heritage_value)) - LOGGER.info(f"instance: {instance_id}, Created {append_msg} {lineno()}") + LOGGER.info( + f"instance: {instance_id}, Created {append_msg} {lineno()}") caller_response.append('Created ' + append_msg) else: caller_response.append(create_response) caller_response.append('Failed to create ' + append_msg) - LOGGER.error(f"Failed to create TXT for CNAME record: {create_response}") + LOGGER.error( + f"Failed to create TXT for CNAME record: {create_response}") except BaseException as err: - LOGGER.error(f"instance: {instance_id}, unexpected error: {err} {lineno()}") + LOGGER.error( + f"instance: {instance_id}, unexpected error: {err} {lineno()}") # # not running, so process delete CNAME and associated TXT record # else: @@ -1047,12 +1055,12 @@ def lambda_handler( # final_private_dns_name, # heritage_value # ) -# +# # # only true if existing delete_records and the delete_success from the subroutine is true # delete_records = delete_records and process_response['delete_success'] # # append to the lsit # caller_response = caller_response + process_response['msg'] -# +# # update ddb entry to include dns entries written to be able to delete them properly if state == 'running': try: diff --git a/code/ddns-lambda.zip b/code/ddns-lambda.zip index c34246848d0ea08db28207796a33dfab70b8b617..099955a0128e3dad17324a88b2b7cfc828f01861 100644 GIT binary patch delta 15005 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 delta 14965 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

$H(ExG+dobq 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