|
|
@ -6,6 +6,7 @@ Docs: github.com/acmesh-official/acme.sh/wiki/dnsapi2#dns_infomaniak |
|
|
|
Options: |
|
|
|
INFOMANIAK_API_TOKEN API Token |
|
|
|
Issues: github.com/acmesh-official/acme.sh/issues/3188 |
|
|
|
|
|
|
|
' |
|
|
|
|
|
|
|
# To use this API you need visit the API dashboard of your account |
|
|
@ -65,33 +66,32 @@ dns_infomaniak_add() { |
|
|
|
_debug fulldomain "$fulldomain" |
|
|
|
_debug txtvalue "$txtvalue" |
|
|
|
|
|
|
|
fqdn=${fulldomain#_acme-challenge.} |
|
|
|
|
|
|
|
# guess which base domain to add record to |
|
|
|
zone_and_id=$(_find_zone "$fqdn") |
|
|
|
if [ -z "$zone_and_id" ]; then |
|
|
|
_err "cannot find zone to modify" |
|
|
|
zone=$(_get_zone "$fulldomain") |
|
|
|
if [ -z "$zone" ]; then |
|
|
|
_err "cannot find zone:<${zone}> to modify" |
|
|
|
return 1 |
|
|
|
fi |
|
|
|
zone=${zone_and_id% *} |
|
|
|
domain_id=${zone_and_id#* } |
|
|
|
|
|
|
|
# extract first part of domain |
|
|
|
key=${fulldomain%."$zone"} |
|
|
|
|
|
|
|
_debug "zone:$zone id:$domain_id key:$key" |
|
|
|
_debug "key:$key" |
|
|
|
_debug "txtvalue: $txtvalue" |
|
|
|
|
|
|
|
# payload |
|
|
|
data="{\"type\": \"TXT\", \"source\": \"$key\", \"target\": \"$txtvalue\", \"ttl\": $INFOMANIAK_TTL}" |
|
|
|
|
|
|
|
# API call |
|
|
|
response=$(_post "$data" "${INFOMANIAK_API_URL}/1/domain/$domain_id/dns/record") |
|
|
|
if [ -n "$response" ] && echo "$response" | _contains '"result":"success"'; then |
|
|
|
_info "Record added" |
|
|
|
_debug "Response: $response" |
|
|
|
return 0 |
|
|
|
response=$(_post "$data" "${INFOMANIAK_API_URL}/2/zones/${zone}/records") |
|
|
|
if [ -n "$response" ]; then |
|
|
|
if [ ! "$(echo "$response" | _contains '"result":"success"')" ]; then |
|
|
|
_info "Record added" |
|
|
|
_debug "response: $response" |
|
|
|
return 0 |
|
|
|
fi |
|
|
|
fi |
|
|
|
_err "could not create record" |
|
|
|
_err "Could not create record." |
|
|
|
_debug "Response: $response" |
|
|
|
return 1 |
|
|
|
} |
|
|
@ -106,7 +106,7 @@ dns_infomaniak_rm() { |
|
|
|
|
|
|
|
if [ -z "$INFOMANIAK_API_TOKEN" ]; then |
|
|
|
INFOMANIAK_API_TOKEN="" |
|
|
|
_err "Please provide a valid Infomaniak API token in variable INFOMANIAK_API_TOKEN" |
|
|
|
_err "Please provide a valid Infomaniak API token in variable INFOMANIAK_API_TOKEN." |
|
|
|
return 1 |
|
|
|
fi |
|
|
|
|
|
|
@ -138,63 +138,53 @@ dns_infomaniak_rm() { |
|
|
|
_debug fulldomain "$fulldomain" |
|
|
|
_debug txtvalue "$txtvalue" |
|
|
|
|
|
|
|
fqdn=${fulldomain#_acme-challenge.} |
|
|
|
|
|
|
|
# guess which base domain to add record to |
|
|
|
zone_and_id=$(_find_zone "$fqdn") |
|
|
|
if [ -z "$zone_and_id" ]; then |
|
|
|
_err "cannot find zone to modify" |
|
|
|
zone=$(_get_zone "$fulldomain") |
|
|
|
if [ -z "$zone" ]; then |
|
|
|
_err "cannot find zone:<$zone> to modify" |
|
|
|
return 1 |
|
|
|
fi |
|
|
|
zone=${zone_and_id% *} |
|
|
|
domain_id=${zone_and_id#* } |
|
|
|
|
|
|
|
# extract first part of domain |
|
|
|
key=${fulldomain%."$zone"} |
|
|
|
key=$(echo "$key" | _lower_case) |
|
|
|
|
|
|
|
_debug "zone:$zone id:$domain_id key:$key" |
|
|
|
_debug "zone:$zone" |
|
|
|
_debug "key:$key" |
|
|
|
|
|
|
|
# find previous record |
|
|
|
# shellcheck disable=SC1004 |
|
|
|
record_id=$(_get "${INFOMANIAK_API_URL}/1/domain/$domain_id/dns/record" | sed 's/.*"data":\[\(.*\)\]}/\1/; s/},{/}\ |
|
|
|
{/g' | sed -n 's/.*"id":"*\([0-9]*\)"*.*"source_idn":"'"$fulldomain"'".*"target_idn":"'"$txtvalue"'".*/\1/p') |
|
|
|
# shellcheck disable=SC2086 |
|
|
|
response=$(_get "${INFOMANIAK_API_URL}/2/zones/${zone}/records" | sed 's/.*"data":\[\(.*\)\]}/\1/; s/},{/}{/g') |
|
|
|
record_id=$(echo "$response" | sed -n 's/.*"id":"*\([0-9]*\)"*.*"source":"'"$key"'".*"target":"\\"'"$txtvalue"'\\"".*/\1/p') |
|
|
|
_debug "key: $key" |
|
|
|
_debug "txtvalue: $txtvalue" |
|
|
|
_debug "record_id: $record_id" |
|
|
|
|
|
|
|
if [ -z "$record_id" ]; then |
|
|
|
_err "could not find record to delete" |
|
|
|
_debug "response: $response" |
|
|
|
return 1 |
|
|
|
fi |
|
|
|
_debug "record_id: $record_id" |
|
|
|
|
|
|
|
# API call |
|
|
|
response=$(_post "" "${INFOMANIAK_API_URL}/1/domain/$domain_id/dns/record/$record_id" "" DELETE) |
|
|
|
if [ -n "$response" ] && echo "$response" | _contains '"result":"success"'; then |
|
|
|
_info "Record deleted" |
|
|
|
return 0 |
|
|
|
response=$(_post "" "${INFOMANIAK_API_URL}/2/zones/${zone}/records/${record_id}" "" DELETE) |
|
|
|
if [ -n "$response" ]; then |
|
|
|
if [ ! "$(echo "$response" | _contains '"result":"success"')" ]; then |
|
|
|
_info "Record deleted" |
|
|
|
return 0 |
|
|
|
fi |
|
|
|
fi |
|
|
|
_err "could not delete record" |
|
|
|
_err "Could not delete record." |
|
|
|
_debug "Response: $response" |
|
|
|
return 1 |
|
|
|
} |
|
|
|
|
|
|
|
#################### Private functions below ################################## |
|
|
|
|
|
|
|
_get_domain_id() { |
|
|
|
_get_zone() { |
|
|
|
domain="$1" |
|
|
|
|
|
|
|
# Whatever the domain is, you can get the fqdn with the following. |
|
|
|
# shellcheck disable=SC1004 |
|
|
|
_get "${INFOMANIAK_API_URL}/1/product?service_name=domain&customer_name=$domain" | sed 's/.*"data":\[{\(.*\)}\]}/\1/; s/,/\ |
|
|
|
/g' | sed -n 's/^"id":\(.*\)/\1/p' |
|
|
|
} |
|
|
|
|
|
|
|
_find_zone() { |
|
|
|
zone="$1" |
|
|
|
|
|
|
|
# find domain in list, removing . parts sequentialy |
|
|
|
while _contains "$zone" '\.'; do |
|
|
|
_debug "testing $zone" |
|
|
|
id=$(_get_domain_id "$zone") |
|
|
|
if [ -n "$id" ]; then |
|
|
|
echo "$zone $id" |
|
|
|
return |
|
|
|
fi |
|
|
|
zone=${zone#*.} |
|
|
|
done |
|
|
|
response=$(_get "${INFOMANIAK_API_URL}/2/domains/${domain}/zones" | sed 's/.*\[{"fqdn"\:"\(.*\)/\1/') |
|
|
|
echo "${response%%\"*}" |
|
|
|
} |