From b4f6edfd80afc7199470861a85a5bcd4eb1c38bd Mon Sep 17 00:00:00 2001 From: badra001 Date: Tue, 26 Apr 2022 16:08:54 -0400 Subject: [PATCH] change version to test heritage changes --- CHANGELOG.md | 3 ++ code/ddns-lambda.py | 96 ++++++++++++++++++++++--------------------- code/ddns-lambda.zip | Bin 17797 -> 17797 bytes version.tf | 2 +- 4 files changed, 53 insertions(+), 48 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7196ebf..2e4ff26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -101,3 +101,6 @@ 1. MaxItem value changed to string. 1. Fixed def parse_heritage to add more logging and better input validation 1. Fixed def get_heritage_item to check input type and add more logging + +* 0.3.1 - 2022-04-26 + - change version purely to test heritage code handling a version change diff --git a/code/ddns-lambda.py b/code/ddns-lambda.py index e92f886..2a88d42 100755 --- a/code/ddns-lambda.py +++ b/code/ddns-lambda.py @@ -72,7 +72,7 @@ LOGGER = logging.getLogger() ACCOUNT = None REGION = None -VERSION = '0.3.0' +VERSION = '0.3.1' # Read Env variables DEBUG_LOG_LEVEL = os.environ.get('DebugLogLevel', 'INFO') @@ -715,7 +715,7 @@ def lambda_handler( LOGGER.info("instance: %s, no custom tags - use default.", instance_id) final_private_hostname = private_host_name final_hosted_zone_name = private_hosted_zone_name - else: + else: LOGGER.error( "instance: %s, No DHCP Associated for VPC and no custom tags. Exiting Script", instance_id) # nothing to do, exit out script @@ -1618,14 +1618,14 @@ def new_get_resource_record(client, instance_id, zone_id, host_name, hosted_zone while i < MAX_API_RETRY: try: - LOGGER.debug("Getting %s record type for %s", - record_type, host_name + lineno()) + LOGGER.debug("Getting %s record type for %s", + record_type, host_name + lineno()) if host_name[-1] != '.': host_name = host_name + '.' - LOGGER.debug("list_resource_record_sets looking for record %s in zone %s", - str(host_name), str(hosted_zone_name) + lineno()) + LOGGER.debug("list_resource_record_sets looking for record %s in zone %s", + str(host_name), str(hosted_zone_name) + lineno()) response = client.list_resource_record_sets( HostedZoneId=zone_id, @@ -1633,7 +1633,8 @@ def new_get_resource_record(client, instance_id, zone_id, host_name, hosted_zone StartRecordType=record_type, MaxItems='1') - LOGGER.debug("list_resource_record_sets response: %s", json.dumps(response) + lineno()) + LOGGER.debug("list_resource_record_sets response: %s", + json.dumps(response) + lineno()) for rr_set in response['ResourceRecordSets']: rr_name = rr_set['Name'] @@ -1642,11 +1643,11 @@ def new_get_resource_record(client, instance_id, zone_id, host_name, hosted_zone if rr_name == (host_name + hosted_zone_name): value = rr_set['ResourceRecords'][0]['Value'] LOGGER.debug("list_resource_record_sets returned value. %s", - str(value) + lineno()) - else: + str(value) + lineno()) + else: LOGGER.debug("list_resource_record_sets returned different record ignoring. %s", - str(rr_name) + lineno()) - + str(rr_name) + lineno()) + LOGGER.debug( "list_resource_record_sets returned without error. %s", lineno()) break @@ -2392,19 +2393,19 @@ def parse_heritage(info): str(info) + lineno()) # return empty dictionary if non-string passed it - if not (isinstance(info,str)): + if not (isinstance(info, str)): LOGGER.error("heritage parsing error value: non-string value passed in: %s", - str(info) + lineno()) + str(info) + lineno()) return {} - + # check if not empty string and then remove leading and trailing quotes if len(info) > 1: # remove beginning quote - if info[0] == '"': + if info[0] == '"': info = info[1:] # remove ending quote - if info[-1] == '"': + if info[-1] == '"': info = info[:-1] kv_results = {} @@ -2414,13 +2415,13 @@ def parse_heritage(info): if header[0] != 'heritage': LOGGER.debug("heritage analysis: does not contain heritage header, returning: %s", - str(kv_results) + lineno()) + str(kv_results) + lineno()) return kv_results else: appname = header[1] kv_results['application_name'] = appname LOGGER.debug("heritage analysis: assigning application_name: %s", - str(appname) + lineno()) + str(appname) + lineno()) try: for item in kv: @@ -2437,9 +2438,9 @@ def parse_heritage(info): # else: version = 'null' # return initialize_heritage(appname,version,kv_results) - + LOGGER.debug("heritage parsed dictionary: %s", - str(kv_results) + lineno()) + str(kv_results) + lineno()) return kv_results except: return {} @@ -2472,15 +2473,16 @@ def get_heritage_item(data, key): # result = v # return result - if not isinstance(data,dict): + if not isinstance(data, dict): LOGGER.debug("get_heritage_item: not valid dictionary: %s is a class of %s", - str(data), str(type(data)) + lineno()) + str(data), str(type(data)) + lineno()) return None else: result = data.get(key, None) LOGGER.debug("get_heritage_item: getting key %s value %s", - str(key), str(result) + lineno()) - return result + str(key), str(result) + lineno()) + return result + def compare_heritage(data, key, value): """ @@ -2532,9 +2534,9 @@ def publish_to_sns(client, message): else: LOGGER.debug("No SNS Topic specified, ignoring") -def process_delete_records(route53, instance_id, zone_id, - record_name, zone_name, record_type, record_value, heritage_value): +def process_delete_records(route53, instance_id, zone_id, + record_name, zone_name, record_type, record_value, heritage_value): """ Consolidate all of the logic to evaluate the process deletion for A/PTR/AAAA record and associated TXT record. :param route53: @@ -2545,7 +2547,7 @@ def process_delete_records(route53, instance_id, zone_id, :param record_type: :param record_value: :return response: # dictionary of 'delete_success' and 'msg' - """ + """ response = {} response_delete_success = True @@ -2553,7 +2555,7 @@ def process_delete_records(route53, instance_id, zone_id, LOGGER.info("instance: %s, Delete %s Record. Checking TXT record association for %s in zone %s", instance_id, record_type, record_name, zone_name + lineno()) - + # if record type is CNAME, we need to add the TXT RR prefix if record_type == 'CNAME': txt_record_name = TXT_RR_PREFIX + '.' + record_name @@ -2576,10 +2578,12 @@ def process_delete_records(route53, instance_id, zone_id, # check if the TXT record was created by the Lambda as match instance-id if verify_heritage_owner(heritage, HERITAGE_TAG): - LOGGER.debug("TXT record was created by Lambda DDNS %s", HERITAGE_TAG + lineno()) + LOGGER.debug("TXT record was created by Lambda DDNS %s", + HERITAGE_TAG + lineno()) heritage_own = True else: - LOGGER.info("TXT record was not created by Lambda DDNS %s", HERITAGE_TAG + lineno()) + LOGGER.info("TXT record was not created by Lambda DDNS %s", + HERITAGE_TAG + lineno()) heritage_own = False if compare_heritage(heritage, 'instance_id', instance_id): @@ -2637,18 +2641,18 @@ def process_delete_records(route53, instance_id, zone_id, LOGGER.info("instance: %s, Success: %s", instance_id, response_text + lineno()) response_msg.append("Success: " + response_text) - + except BaseException as err: response_delete_success = False LOGGER.error("instance: %s, unexpected error. %s\n", - instance_id, str(err) + lineno()) - + instance_id, str(err) + lineno()) + else: response_delete_success = False - response_msg.append("Failed, the TXT record for the " + record_type + - " record does not match expected value. Will not delete the " + record_type + " record.") + response_msg.append("Failed, the TXT record for the " + record_type + + " record does not match expected value. Will not delete the " + record_type + " record.") LOGGER.error("instance: %s, the TXT record for the %s record does not match expected value. Will not delete the %s record. %s\n", - instance_id, record_type, record_type, lineno()) + instance_id, record_type, record_type, lineno()) if SNS_ENABLE: try: sns_msg = {} @@ -2662,8 +2666,8 @@ def process_delete_records(route53, instance_id, zone_id, sns_heritage['zone_name'] = zone_name sns_heritage['zone_id'] = zone_id sns_heritage['heritage_value'] = heritage_value - - sns_msg['heritage']=sns_heritage + + sns_msg['heritage'] = sns_heritage publish_to_sns(get_sns_client(), json.dumps(sns_msg)) LOGGER.info("instance: %s, sending sns message %s", instance_id, json.dumps(sns_msg) + lineno()) @@ -2671,12 +2675,11 @@ def process_delete_records(route53, instance_id, zone_id, LOGGER.info("instance: %s, error: %s", instance_id, str(sys.exc_info()[0]) + lineno()) - # delete TXT record associated with A/PTR/CNAME/AAAA record if heritage_own and heritage_instance_match: try: LOGGER.info("Deleting heritage TXT resource record %s, in the zone %s, with value of %s", - txt_record_name, zone_name, str(heritage_value) + lineno()) + txt_record_name, zone_name, str(heritage_value) + lineno()) response_text = 'Delete ' + 'TXT' + \ ' record in zone id: ' + zone_id + \ @@ -2721,13 +2724,13 @@ def process_delete_records(route53, instance_id, zone_id, except BaseException as err: response_delete_success = False LOGGER.error("instance: %s, unexpected error. %s\n", - instance_id, str(err) + lineno()) + instance_id, str(err) + lineno()) else: response_delete_success = False - response_msg.append("Failed, the TXT record for " + record_type + + response_msg.append("Failed, the TXT record for " + record_type + " does not match expected value. Will not delete the TXT record.") LOGGER.error("instance: %s, the TXT record for the %s does not match expected value. Will not delete TXT record. %s", - instance_id, record_type, lineno()) + instance_id, record_type, lineno()) if SNS_ENABLE: try: @@ -2735,15 +2738,15 @@ def process_delete_records(route53, instance_id, zone_id, sns_msg['instance_id'] = instance_id sns_msg['account_id'] = get_caller_account_id() sns_msg['message'] = 'TXT record does not match. Will not delete the TXT record.' - + sns_heritage = {} sns_heritage['record_type'] = 'TXT' sns_heritage['record_name'] = txt_record_name sns_heritage['zone_name'] = zone_name sns_heritage['zone_id'] = zone_id sns_heritage['heritage_value'] = heritage_value - - sns_msg['heritage']=sns_heritage + + sns_msg['heritage'] = sns_heritage publish_to_sns(get_sns_client(), json.dumps(sns_msg)) LOGGER.info("instance: %s, sending sns message %s", instance_id, json.dumps(sns_msg) + lineno()) @@ -2752,7 +2755,6 @@ def process_delete_records(route53, instance_id, zone_id, LOGGER.info("instance: %s, error: %s", instance_id, str(sys.exc_info()[0]) + lineno()) - # create a dictionary to return response['delete_success'] = response_delete_success response['msg'] = response_msg diff --git a/code/ddns-lambda.zip b/code/ddns-lambda.zip index d151f81c08016be0aa606ba0033df551440c36be..69090fe588d98f649485e7913e6cff9d560fe8e6 100644 GIT binary patch delta 16639 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 diff --git a/version.tf b/version.tf index 24aa9b2..188c425 100644 --- a/version.tf +++ b/version.tf @@ -1,3 +1,3 @@ locals { - _module_version = "0.3.0" + _module_version = "0.3.1" }