# Requires GANDI API KEY set in GANDI_LIVEDNS_KEY set as environment variable
#
#Author: Frédéric Crozat <fcrozat@suse.com>
+# Dominik Röttsches <drott@google.com>
#Report Bugs here: https://github.com/fcrozat/acme.sh
#
######## Public functions #####################
_debug domain "$_domain"
_debug sub_domain "$_sub_domain"
- _gandi_livedns_rest PUT "domains/$_domain/records/$_sub_domain/TXT" "{\"rrset_ttl\": 300, \"rrset_values\":[\"$txtvalue\"]}" \
- && _contains "$response" '{"message": "DNS Record Created"}' \
- && _info "Add $(__green "success")"
+ _dns_gandi_append_record "$_domain" "$_sub_domain" "$txtvalue"
}
#Usage: fulldomain txtvalue
_debug fulldomain "$fulldomain"
_debug domain "$_domain"
_debug sub_domain "$_sub_domain"
+ _debug txtvalue "$txtvalue"
- _gandi_livedns_rest DELETE "domains/$_domain/records/$_sub_domain/TXT" ""
-
+ if ! _dns_gandi_existing_rrset_values "$_domain" "$_sub_domain"; then
+ return 1
+ fi
+ _new_rrset_values=$(echo "$_rrset_values" | sed "s/...$txtvalue...//g")
+ # Cleanup dangling commata.
+ _new_rrset_values=$(echo "$_new_rrset_values" | sed "s/, ,/ ,/g")
+ _new_rrset_values=$(echo "$_new_rrset_values" | sed "s/, *\]/\]/g")
+ _new_rrset_values=$(echo "$_new_rrset_values" | sed "s/\[ *,/\[/g")
+ _debug "New rrset_values" "$_new_rrset_values"
+
+ _gandi_livedns_rest PUT \
+ "domains/$_domain/records/$_sub_domain/TXT" \
+ "{\"rrset_ttl\": 300, \"rrset_values\": $_new_rrset_values}" &&
+ _contains "$response" '{"message": "DNS Record Created"}' &&
+ _info "Removing record $(__green "success")"
}
#################### Private functions below ##################################
return 1
}
+_dns_gandi_append_record() {
+ domain=$1
+ sub_domain=$2
+ txtvalue=$3
+
+ if _dns_gandi_existing_rrset_values "$domain" "$sub_domain"; then
+ _debug "Appending new value"
+ _rrset_values=$(echo "$_rrset_values" | sed "s/\"]/\",\"$txtvalue\"]/")
+ else
+ _debug "Creating new record" "$_rrset_values"
+ _rrset_values="[\"$txtvalue\"]"
+ fi
+ _debug new_rrset_values "$_rrset_values"
+ _gandi_livedns_rest PUT "domains/$_domain/records/$sub_domain/TXT" \
+ "{\"rrset_ttl\": 300, \"rrset_values\": $_rrset_values}" &&
+ _contains "$response" '{"message": "DNS Record Created"}' &&
+ _info "Adding record $(__green "success")"
+}
+
+_dns_gandi_existing_rrset_values() {
+ domain=$1
+ sub_domain=$2
+ if ! _gandi_livedns_rest GET "domains/$domain/records/$sub_domain"; then
+ return 1
+ fi
+ if ! _contains "$response" '"rrset_type": "TXT"'; then
+ _debug "Does not have a _acme-challenge TXT record yet."
+ return 1
+ fi
+ if _contains "$response" '"rrset_values": \[\]'; then
+ _debug "Empty rrset_values for TXT record, no previous TXT record."
+ return 1
+ fi
+ _debug "Already has TXT record."
+ _rrset_values=$(echo "$response" | _egrep_o 'rrset_values.*\[.*\]' |
+ _egrep_o '\[".*\"]')
+ return 0
+}
+
_gandi_livedns_rest() {
m=$1
ep="$2"