Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add dnsapi for Vultr #2370

Merged
merged 10 commits into from
Jul 20, 2019
Merged
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
157 changes: 157 additions & 0 deletions dnsapi/dns_vultr.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
#!/usr/bin/env sh

#
#VULTR_API_KEY=000011112222333344445555666677778888

VULTR_Api="https://api.vultr.com/v1"

######## Public functions #####################

#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_vultr_add() {
fulldomain=$1
txtvalue=$2
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"

VULTR_API_KEY="${VULTR_API_KEY:-$(_readaccountconf_mutable VULTR_API_KEY)}"
if test -z "$VULTR_API_KEY"; then
VULTR_API_KEY=''
_err 'VULTR_API_KEY was not exported'
return 1
fi

_saveaccountconf_mutable VULTR_API_KEY "$VULTR_API_KEY"

_debug 'First detect the root zone'
if ! _get_root "$fulldomain"; then
return 1
fi
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"

_debug 'Getting txt records'
_vultr_rest GET "dns/records?domain=$_domain"

if printf "%s\n" "$response" | grep "\"type\":\"TXT\",\"name\":\"$fulldomain\"" >/dev/null; then
_err 'Error'
return 1
fi

if ! _vultr_rest POST 'dns/create_record' "domain=$_domain&name=$_sub_domain&data=\"$txtvalue\"&type=TXT"; then
_err "$response"
return 1
fi

_debug2 _response "$response"
return 0
}

#fulldomain txtvalue
dns_vultr_rm() {
fulldomain=$1
txtvalue=$2
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"

VULTR_API_KEY="${VULTR_API_KEY:-$(_readaccountconf_mutable VULTR_API_KEY)}"
if test -z "$VULTR_API_KEY"; then
VULTR_API_KEY=""
_err 'VULTR_API_KEY was not exported'
return 1
fi

_saveaccountconf_mutable VULTR_API_KEY "$VULTR_API_KEY"

_debug 'First detect the root zone'
if ! _get_root "$fulldomain"; then
return 1
fi
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"

_debug 'Getting txt records'
_vultr_rest GET "dns/records?domain=$_domain"

if printf "%s\n" "$response" | grep "\"type\":\"TXT\",\"name\":\"$fulldomain\"" >/dev/null; then
_err 'Error'
return 1
fi

_record="$(echo "$response" | _egrep_o "\"type\":\"TXT\",\"name\":\"_acme-challenge\",\"data\":\\W*$txtvalue\\W*\",\"priority\":0,\"RECORDID\":\\d*")"
Copy link
Contributor Author

@Fudoshiki Fudoshiki Jul 16, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don’t know how to replace \\W* in _egrep_o

Substring from response

{"type":"TXT","name":"_acme-challenge","data":"\"IikqiCI3suY0u-71M-apJt5Ix-0Ai6qDmmOaN4pkhzs\"","priority":0,"RECORDID":16806343,"ttl":300}

This doesn’t work

_record="$(echo "$response" | _egrep_o "\"type\":\"TXT\",\"name\":\"_acme-challenge\",\"data\":\"\\\"$txtvalue\\\"\",\"priority\":0,\"RECORDID\":\\d*")"

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

try this one:

_record_id="$( echo "$response" | tr '{}' '\n' | grep '"TXT"'| grep "$txtvalue" | tr ',' '\n' | grep -i 'RECORDID' | cut -d : -f 2)"

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Works fine

_record_id="$(_getfield "$_record" 6 ':')"

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please add check for _record_id here.

It can be empty.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sec

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not empty, works fine

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

_record_id="$(echo "$response" | tr '{}' '\n' | grep '"TXT"' | grep "$txtvalue" | tr ',' '\n' | grep -i 'RECORDID' | cut -d : -f 2)"
echo "$_record_id"
Removing DNS records.
Removing txt: QDPkHsxNfZJo7L3hQILAP-oNmq0WmQcNWMGtfEh5u4I for domain: _acme-challenge.sharevari.com
16857956
Removed: Success

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

txt records added and then removed from my vultr account

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I knew it works for you now.
but it never hurts if you check the value.
just check it as what I did for namesilo.

It makes your program more robust.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

if ! _vultr_rest POST 'dns/delete_record' "domain=$_domain&RECORDID=$_record_id"; then
_err "$response"
return 1
fi

_debug2 _response "$response"
return 0
}

#################### Private functions below ##################################
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
_get_root() {
domain=$1
i=1
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
return 1
fi

if ! _vultr_rest GET "dns/list"; then
return 1
fi

if printf "%s\n" "$response" | grep '^\[.*\]' >/dev/null; then
if _contains "$response" "\"domain\":\"$_domain\""; then
_sub_domain="$(echo "$fulldomain" | sed "s/\\.$_domain\$//")"
_domain=$_domain
return 0
else
_err 'Invalid domain'
return 1
fi
else
_err "$response"
return 1
fi
i=$(_math "$i" + 1)
done

return 1
}

_vultr_rest() {
m=$1
ep="$2"
data="$3"
_debug "$ep"

api_key_trimmed=$(echo $VULTR_API_KEY | tr -d '"')

export _H1="Api-Key: $api_key_trimmed"
export _H2='Content-Type: application/x-www-form-urlencoded'

if [ "$m" != "GET" ]; then
_debug data "$data"
response="$(_post "$data" "$VULTR_Api/$ep" "" "$m")"
else
response="$(_get "$VULTR_Api/$ep")"
fi

if [ "$?" != "0" ]; then
_err "Error $ep"
return 1
fi

_debug2 response "$response"
return 0
}