You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							200 lines
						
					
					
						
							5.9 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							200 lines
						
					
					
						
							5.9 KiB
						
					
					
				| #!/usr/bin/env sh | |
| # shellcheck disable=SC2034 | |
| dns_infomaniak_info='Infomaniak.com | |
| Site: Infomaniak.com | |
| 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 | |
| # once logged into https://manager.infomaniak.com add /api/dashboard to the URL | |
| # | |
| # 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 | |
| }
 |