From 7edd13d102b0bb552e8095954b50b6af6dc17139 Mon Sep 17 00:00:00 2001 From: mxtuma Date: Tue, 24 Nov 2020 09:25:11 +0100 Subject: [PATCH] Update to pass Mac OS X tests. Mac OS X failed because sed regex uses GNU extension + as a repeater I had tested commited code with --posix prefix for sed to simulate Mac OS X implementation on linux Also Mac OS X can't replace to \n characters, this was resolved by replacing to \t and then translating to new lines using tr --- dnsapi/dns_wedos.sh | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/dnsapi/dns_wedos.sh b/dnsapi/dns_wedos.sh index e7416b65..8c71b607 100644 --- a/dnsapi/dns_wedos.sh +++ b/dnsapi/dns_wedos.sh @@ -225,6 +225,7 @@ _get_root() { fi # In for each cycle, try parse the response to find primary active domains + # - in order to success with MacOSX, always take care if all sed works with --posix when testing the all sed commmands # For cycle description: # 1st tr -d '\011\012\015' = remove all newlines and tab characters - whole XML became single line # 2nd sed "s/^.*[ ]*//g" = remove all the xml data from the beggining of the XML - XML now start with the content of element @@ -233,10 +234,10 @@ _get_root() { # 5th sed "s///g" = remove all domain xml start tags - XML now contains only ......... (next xml domain) # 6th sed "s/[ ]*<\/domain>/\t/g" = replace all "spaces" by tab - now we are preparing to create multiple lines # 7th th '\011' '\n' = replace all tabs from previous sed (Mac OS change) - now we create multiple lines each should contain only ......... - # 8th sed -n "/\([a-zA-Z0-9_\-\.]\+\)<\/name>primary<\/type>active<\/status>/p" = remove all non primary or non active domains lines - # 9th sed "s/\([a-zA-Z0-9_\-\.]\+\)<\/name>primary<\/type>active<\/status>/\1/g" = substitute for domain names only + # 8th sed -n "/\([a-zA-Z0-9_.-][a-zA-Z0-9_.-]*\)<\/name>primary<\/type>active<\/status>/p" = remove all non primary or non active domains lines + # 9th sed "s/\([a-zA-Z0-9_.-][a-zA-Z0-9_.-]*\)<\/name>primary<\/type>active<\/status>/\1/g" = substitute for domain names only - for xml_domain in $(echo "${response}" | tr -d '\011\012\015' | sed "s/^.*[ ]*//g" | sed "s/<\/data>.*$//g" | sed "s/>[ ]*<\([^\/]\)/><\1/g" | sed "s///g" | sed "s/[ ]*<\/domain>/\t/g" | tr '\011' '\n' | sed -n "/\([a-zA-Z0-9_\-\.]\+\)<\/name>primary<\/type>active<\/status>/p" | sed "s/\([a-zA-Z0-9_\-\.]\+\)<\/name>primary<\/type>active<\/status>/\1/g"); do + for xml_domain in $(echo "${response}" | tr -d '\011\012\015' | sed "s/^.*[ ]*//g" | sed "s/<\/data>.*$//g" | sed "s/>[ ]*<\([^\/]\)/><\1/g" | sed "s///g" | sed "s/[ ]*<\/domain>/\t/g" | tr '\011' '\n' | sed -n "/\([a-zA-Z0-9_.-][a-zA-Z0-9_.-]*\)<\/name>primary<\/type>active<\/status>/p" | sed "s/\([a-zA-Z0-9_.-][a-zA-Z0-9_.-]*\)<\/name>primary<\/type>active<\/status>/\1/g"); do _debug "Found primary active domain: ${xml_domain}" if _endswith "${domain}" "${xml_domain}"; then length_difference=$(_math "${#domain} - ${#xml_domain}") @@ -353,6 +354,7 @@ _wapi_find_row() { _debug "Subdomain regex '${sub_domain_regex}'" # In for each cycle loops over the domains rows, description: + # - when testing use sed --posix to test if compatible with MacOSX = avoid replacement to \n and using + as repeater one or more (instead use the same patern without repeater and then the same with *) # 1st tr -d '\011\012\015' = delete all newlines and tab characters - XML became a single line # 2nd sed "s/^.*[ ]*//g" = remove all from the beggining to the start of the content of the data xml element - XML is without unusefull beginning # 3rd sed "s/[ ]*<\/data>.*$//g" = remove the end of the xml starting with xml end tag data - XML contains only the content of data xml element and is trimmed @@ -361,12 +363,12 @@ _wapi_find_row() { # 6th sed "s/[ ]*<\/row>/\t/g" = replace all "spaces" by tab - now we are preparing to create multiple lines # 7th tr '\011' '\n' = replace all tabs with new lines (Mac OS X hint) - we create multiple lines each should contain only single row xml content # 8th sed -n "/${sub_domain_regex}<\/name>.*TXT<\/rdtype>/p" = remove all non TXT and non name matching row lines - now we have only xml lines with TXT rows matching requested values - # 9th sed "s/^\([0-9]\+\)<\/ID>.*\(.*\)<\/rdata>.*$/\1-\2/" = replace the whole lines to ID-value pairs + # 9th sed "s/^\([0-9][0-9]*\)<\/ID>.*\(.*\)<\/rdata>.*$/\1-\2/" = replace the whole lines to ID-value pairs # -- now there are only lines with ID-value but value might contain spaces (BAD FOR FOREACH LOOP) or special characters (BAD FOR REGEX MATCHING) # 10th grep "${value}" = match only a line containg searched value - # 11th sed "s/^\([0-9]\+\).*$/\1/" = get only ID from the row + # 11th sed "s/^\([0-9][0-9]*\).*$/\1/" = get only ID from the row - for xml_row in $(echo "${response}" | tr -d '\011\012\015' | sed "s/^.*[ ]*//g" | sed "s/[ ]*<\/data>.*$//g" | sed "s/>[ ]*<\([^\/]\)/><\1/g" | sed "s///g" | sed "s/[ ]*<\/row>/\t/g" | tr '\011' '\n' | sed -n "/${sub_domain_regex}<\/name>.*TXT<\/rdtype>/p" | sed "s/^\([0-9]\+\)<\/ID>.*\(.*\)<\/rdata>.*$/\1-\2/" | grep "${value}" | sed "s/^\([0-9]\+\).*$/\1/"); do + for xml_row in $(echo "${response}" | tr -d '\011\012\015' | sed "s/^.*[ ]*//g" | sed "s/[ ]*<\/data>.*$//g" | sed "s/>[ ]*<\([^\/]\)/><\1/g" | sed "s///g" | sed "s/[ ]*<\/row>/\t/g" | tr '\011' '\n' | sed -n "/${sub_domain_regex}<\/name>.*TXT<\/rdtype>/p" | sed "s/^\([0-9][0-9]*\)<\/ID>.*\(.*\)<\/rdata>.*$/\1-\2/" | grep "${value}" | sed "s/^\([0-9][0-9]*\).*$/\1/"); do _row_id="${xml_row}" _info "WEDOS API: Found DNS row id ${_row_id} for domain ${domain}" return 0