4 # http://doc.livedns.gandi.net/
7 # Requires GANDI API KEY set in GANDI_LIVEDNS_KEY set as environment variable
9 #Author: Frédéric Crozat <fcrozat@suse.com>
10 # Dominik Röttsches <drott@google.com>
11 #Report Bugs here: https://github.com/fcrozat/acme.sh
13 ######## Public functions #####################
15 GANDI_LIVEDNS_API
="https://dns.api.gandi.net/api/v5"
17 #Usage: dns_gandi_livedns_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
18 dns_gandi_livedns_add
() {
22 if [ -z "$GANDI_LIVEDNS_KEY" ]; then
23 _err
"No API key specified for Gandi LiveDNS."
24 _err
"Create your key and export it as GANDI_LIVEDNS_KEY"
28 _saveaccountconf GANDI_LIVEDNS_KEY
"$GANDI_LIVEDNS_KEY"
30 _debug
"First detect the root zone"
31 if ! _get_root
"$fulldomain"; then
35 _debug fulldomain
"$fulldomain"
36 _debug txtvalue
"$txtvalue"
37 _debug domain
"$_domain"
38 _debug sub_domain
"$_sub_domain"
40 _dns_gandi_append_record
"$_domain" "$_sub_domain" "$txtvalue"
43 #Usage: fulldomain txtvalue
44 #Remove the txt record after validation.
45 dns_gandi_livedns_rm
() {
49 _debug
"First detect the root zone"
50 if ! _get_root
"$fulldomain"; then
55 _debug fulldomain
"$fulldomain"
56 _debug domain
"$_domain"
57 _debug sub_domain
"$_sub_domain"
58 _debug txtvalue
"$txtvalue"
60 if ! _dns_gandi_existing_rrset_values
"$_domain" "$_sub_domain"; then
63 _new_rrset_values
=$
(echo "$_rrset_values" |
sed "s/...$txtvalue...//g")
64 # Cleanup dangling commata.
65 _new_rrset_values
=$
(echo "$_new_rrset_values" |
sed "s/, ,/ ,/g")
66 _new_rrset_values
=$
(echo "$_new_rrset_values" |
sed "s/, *\]/\]/g")
67 _new_rrset_values
=$
(echo "$_new_rrset_values" |
sed "s/\[ *,/\[/g")
68 _debug
"New rrset_values" "$_new_rrset_values"
70 _gandi_livedns_rest PUT \
71 "domains/$_domain/records/$_sub_domain/TXT" \
72 "{\"rrset_ttl\": 300, \"rrset_values\": $_new_rrset_values}" &&
73 _contains
"$response" '{"message": "DNS Record Created"}' &&
74 _info
"Removing record $(__green "success
")"
77 #################### Private functions below ##################################
78 #_acme-challenge.www.domain.com
80 # _sub_domain=_acme-challenge.www
87 h
=$
(printf "%s" "$domain" | cut
-d .
-f $i-100)
94 if ! _gandi_livedns_rest GET
"domains/$h"; then
98 if _contains
"$response" '"code": 401'; then
101 elif _contains
"$response" '"code": 404'; then
102 _debug
"$h not found"
104 _sub_domain
=$
(printf "%s" "$domain" | cut
-d .
-f 1-$p)
114 _dns_gandi_append_record
() {
119 if _dns_gandi_existing_rrset_values
"$domain" "$sub_domain"; then
120 _debug
"Appending new value"
121 _rrset_values
=$
(echo "$_rrset_values" |
sed "s/\"]/\",\"$txtvalue\"]/")
123 _debug
"Creating new record" "$_rrset_values"
124 _rrset_values
="[\"$txtvalue\"]"
126 _debug new_rrset_values
"$_rrset_values"
127 _gandi_livedns_rest PUT
"domains/$_domain/records/$sub_domain/TXT" \
128 "{\"rrset_ttl\": 300, \"rrset_values\": $_rrset_values}" &&
129 _contains
"$response" '{"message": "DNS Record Created"}' &&
130 _info
"Adding record $(__green "success
")"
133 _dns_gandi_existing_rrset_values
() {
136 if ! _gandi_livedns_rest GET
"domains/$domain/records/$sub_domain"; then
139 if ! _contains
"$response" '"rrset_type": "TXT"'; then
140 _debug
"Does not have a _acme-challenge TXT record yet."
143 if _contains
"$response" '"rrset_values": \[\]'; then
144 _debug
"Empty rrset_values for TXT record, no previous TXT record."
147 _debug
"Already has TXT record."
148 _rrset_values
=$
(echo "$response" | _egrep_o
'rrset_values.*\[.*\]' |
153 _gandi_livedns_rest
() {
159 export _H1
="Content-Type: application/json"
160 export _H2
="X-Api-Key: $GANDI_LIVEDNS_KEY"
162 if [ "$m" = "GET" ]; then
163 response
="$(_get "$GANDI_LIVEDNS_API/$ep")"
166 response
="$(_post "$data" "$GANDI_LIVEDNS_API/$ep" "" "$m")"
169 if [ "$?" != "0" ]; then
173 _debug2 response
"$response"