Skip to content

Commit

Permalink
fix pagination bug querying Linode API v4
Browse files Browse the repository at this point in the history
fixes issue acmesh-official#4956

previous code only worked for the first 10 domains on the account (as Linode
API returned a paginated response, with only 10 records).

This change makes an exact search query for each subdomain, completely removing any
need for walking through paginated responses. What makes it work for large
accounts with any number of domains.
  • Loading branch information
vmmello committed Jun 11, 2024
1 parent 0d8a314 commit 1c9423e
Showing 1 changed file with 22 additions and 14 deletions.
36 changes: 22 additions & 14 deletions dnsapi/dns_linode_v4.sh
Original file line number Diff line number Diff line change
Expand Up @@ -126,34 +126,41 @@ _Linode_API() {
# _domain=domain.com
# _domain_id=12345
_get_root() {
domain=$1
local full_host_str="$1"

i=2
p=1
while true; do
# loop through the received string (e.g. _acme-challenge.sub3.sub2.sub1.domain.tld),
# starting from the lowest subdomain, and check if it's a hosted domain
h=$(printf "%s" "$full_host_str" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi

if _rest GET; then
response="$(echo "$response" | tr -d "\n" | tr '{' "|" | sed 's/|/&{/g' | tr "|" "\n")"
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi

_debug "Querying Linode APIv4 for subdomain: $h"
if _H4="X-Filter: {\"domain\":\"$h\"}" _rest GET; then
_debug "Got response from API: $response"
response="$(echo "$response" | tr -d "\n" | tr '{' "|" | sed 's/|/&{/g' | tr "|" "\n")"
hostedzone="$(echo "$response" | _egrep_o "\{.*\"domain\": *\"$h\".*}")"
if [ "$hostedzone" ]; then
_domain_id=$(printf "%s\n" "$hostedzone" | _egrep_o "\"id\": *[0-9]+" | _head_n 1 | cut -d : -f 2 | tr -d \ )
_debug "Found domain hosted on Linode DNS. Zone: $h, id: $_domain_id"
if [ "$_domain_id" ]; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_sub_domain=$(printf "%s" "$full_host_str" | cut -d . -f 1-$p)
_domain=$h
return 0
fi
return 1
fi

p=$i
i=$(_math "$i" + 1)
done
fi
fi
done

return 1
}

Expand All @@ -169,6 +176,7 @@ _rest() {
export _H1="Accept: application/json"
export _H2="Content-Type: application/json"
export _H3="Authorization: Bearer $LINODE_V4_API_KEY"
export _H4 # used to query for the root domain on _get_root()

if [ "$mtd" != "GET" ]; then
# both POST and DELETE.
Expand Down

0 comments on commit 1c9423e

Please sign in to comment.