| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- #!/usr/bin/env sh
- ###############################################################################
- # Infomaniak API integration
- #
- # To use this API you need visit the API dashboard of your account
- # once logged into https://manager.infomaniak.com add /api/dashboard to the URL
- #
- # Please report bugs to
- # https://github.com/acmesh-official/acme.sh/issues/3188
- #
- # Note: the URL looks like this:
- # https://manager.infomaniak.com/v3/<account_id>/api/dashboard
- # Then generate a token with the scope Domain
- # this is given as an environment variable INFOMANIAK_API_TOKEN
- ###############################################################################
- # base variables
- DEFAULT_INFOMANIAK_API_URL="https://api.infomaniak.com"
- DEFAULT_INFOMANIAK_TTL=300
- ######## Public functions #####################
- #Usage: dns_infomaniak_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
- dns_infomaniak_add() {
- INFOMANIAK_API_TOKEN="${INFOMANIAK_API_TOKEN:-$(_readaccountconf_mutable INFOMANIAK_API_TOKEN)}"
- INFOMANIAK_API_URL="${INFOMANIAK_API_URL:-$(_readaccountconf_mutable INFOMANIAK_API_URL)}"
- INFOMANIAK_TTL="${INFOMANIAK_TTL:-$(_readaccountconf_mutable INFOMANIAK_TTL)}"
- if [ -z "$INFOMANIAK_API_TOKEN" ]; then
- INFOMANIAK_API_TOKEN=""
- _err "Please provide a valid Infomaniak API token in variable INFOMANIAK_API_TOKEN"
- return 1
- fi
- if [ -z "$INFOMANIAK_API_URL" ]; then
- INFOMANIAK_API_URL="$DEFAULT_INFOMANIAK_API_URL"
- fi
- if [ -z "$INFOMANIAK_TTL" ]; then
- INFOMANIAK_TTL="$DEFAULT_INFOMANIAK_TTL"
- fi
- #save the token to the account conf file.
- _saveaccountconf_mutable INFOMANIAK_API_TOKEN "$INFOMANIAK_API_TOKEN"
- if [ "$INFOMANIAK_API_URL" != "$DEFAULT_INFOMANIAK_API_URL" ]; then
- _saveaccountconf_mutable INFOMANIAK_API_URL "$INFOMANIAK_API_URL"
- fi
- if [ "$INFOMANIAK_TTL" != "$DEFAULT_INFOMANIAK_TTL" ]; then
- _saveaccountconf_mutable INFOMANIAK_TTL "$INFOMANIAK_TTL"
- fi
- export _H1="Authorization: Bearer $INFOMANIAK_API_TOKEN"
- export _H2="Content-Type: application/json"
- fulldomain="$1"
- txtvalue="$2"
- _info "Infomaniak DNS API"
- _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"
- 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"
- # 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
- fi
- _err "could not create record"
- _debug "Response: $response"
- return 1
- }
- #Usage: fulldomain txtvalue
- #Remove the txt record after validation.
- dns_infomaniak_rm() {
- INFOMANIAK_API_TOKEN="${INFOMANIAK_API_TOKEN:-$(_readaccountconf_mutable INFOMANIAK_API_TOKEN)}"
- INFOMANIAK_API_URL="${INFOMANIAK_API_URL:-$(_readaccountconf_mutable INFOMANIAK_API_URL)}"
- INFOMANIAK_TTL="${INFOMANIAK_TTL:-$(_readaccountconf_mutable INFOMANIAK_TTL)}"
- if [ -z "$INFOMANIAK_API_TOKEN" ]; then
- INFOMANIAK_API_TOKEN=""
- _err "Please provide a valid Infomaniak API token in variable INFOMANIAK_API_TOKEN"
- return 1
- fi
- if [ -z "$INFOMANIAK_API_URL" ]; then
- INFOMANIAK_API_URL="$DEFAULT_INFOMANIAK_API_URL"
- fi
- if [ -z "$INFOMANIAK_TTL" ]; then
- INFOMANIAK_TTL="$DEFAULT_INFOMANIAK_TTL"
- fi
- #save the token to the account conf file.
- _saveaccountconf_mutable INFOMANIAK_API_TOKEN "$INFOMANIAK_API_TOKEN"
- if [ "$INFOMANIAK_API_URL" != "$DEFAULT_INFOMANIAK_API_URL" ]; then
- _saveaccountconf_mutable INFOMANIAK_API_URL "$INFOMANIAK_API_URL"
- fi
- if [ "$INFOMANIAK_TTL" != "$DEFAULT_INFOMANIAK_TTL" ]; then
- _saveaccountconf_mutable INFOMANIAK_TTL "$INFOMANIAK_TTL"
- fi
- export _H1="Authorization: Bearer $INFOMANIAK_API_TOKEN"
- export _H2="ContentType: application/json"
- fulldomain=$1
- txtvalue=$2
- _info "Infomaniak DNS API"
- _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"
- 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"
- # 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')
- if [ -z "$record_id" ]; then
- _err "could not find record to delete"
- 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
- fi
- _err "could not delete record"
- return 1
- }
- #################### Private functions below ##################################
- _get_domain_id() {
- domain="$1"
- # 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
- }
|