Browse Source
Add DNS method for Digital Ocean
Add DNS method for Digital Ocean
Uses the Digital Ocean command-line tool "doctl" (https://github.com/digitalocean/doctl) to add records supporting DNS verification of domain namespull/790/head
Chris Polley
8 years ago
1 changed files with 139 additions and 0 deletions
@ -0,0 +1,139 @@ |
|||
#!/bin/bash |
|||
|
|||
#Author: Neilpang |
|||
# original file dns_myapi.sh |
|||
# Modified by Chris Polley to support Digital Ocean |
|||
#Report Bugs here: https://github.com/Neilpang/acme.sh |
|||
# |
|||
#depends: doctl (https://github.com/digitalocean/doctl/) v1.5 |
|||
# (configured using `doctl auth init` and the acocunt's access token |
|||
# |
|||
######## Public functions ##################### |
|||
|
|||
#Usage: dns_myapi_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs" |
|||
dns_doctl_add() { |
|||
fulldomain=$1 |
|||
txtvalue=$2 |
|||
_info "Using dns_doctl" |
|||
_debug fulldomain "$fulldomain" |
|||
_debug txtvalue "$txtvalue" |
|||
|
|||
# digitalocean needs the domain to act upon, so split $fulldomain into record-name and domain |
|||
# "_acme-challenge" and "www.domain.com" in the above example |
|||
|
|||
|
|||
# get list of domains authorized |
|||
domains_avail=$( doctl compute domain list --no-header --format Domain | tr "$IFS" " " ) |
|||
_debug domains_avail "$domains_avail" |
|||
|
|||
if [ -z "$domains_avail" ] |
|||
then |
|||
_err "No domains in DigitalOcean DNS" |
|||
return 1 |
|||
fi |
|||
|
|||
for d in $domains_avail |
|||
do |
|||
_debug trying_domain "$d" |
|||
try_domain=${fulldomain##$d} |
|||
try_challenge=${fulldomain%%.$d} |
|||
_debug try_domain "$try_domain" |
|||
_debug try_challenge "$challenge" |
|||
|
|||
if [ "$fulldomain" == "$try_challenge.$d" ] |
|||
then |
|||
_debug matches "$d" |
|||
domain="$d" |
|||
challenge="$try_challenge" |
|||
else |
|||
_debug no_match "$d" |
|||
fi |
|||
done |
|||
|
|||
if [ -z "$domain" ] |
|||
then |
|||
_err "Unable to locate domain of $fulldomain in DigitalOcean DNS" |
|||
return 1 |
|||
fi |
|||
|
|||
record_name="$challenge" |
|||
_debug domain "$domain" |
|||
_debug record_name "$record_name" |
|||
_debug txtvalue "$txtvalue" |
|||
id_created=$( doctl compute domain records create $domain --record-data $txtvalue --record-name $record_name --record-type TXT --no-header --format ID ) |
|||
_debug id_created "$id_created" |
|||
_info "Created record $id_created in domain $domain with name $record_name and TXT $txtvalue" |
|||
if [ "" != "$id_created" ] |
|||
then |
|||
return 0 |
|||
else |
|||
_err "Error creating DNS record $fulldomain" |
|||
return 1 |
|||
fi |
|||
} |
|||
|
|||
#Usage: fulldomain txtvalue |
|||
#Remove the txt record after validation. |
|||
dns_doctl_rm() { |
|||
fulldomain=$1 |
|||
txtvalue=$2 |
|||
_info "Using dns_doctl" |
|||
_debug fulldomain "$fulldomain" |
|||
_debug txtvalue "$txtvalue" |
|||
|
|||
# get list of domains authorized |
|||
domains_avail=$( doctl compute domain list --no-header --format Domain | tr "$IFS" " " ) |
|||
_debug domains_avail "$domains_avail" |
|||
if [ -z "$domains_avail" ] |
|||
then |
|||
_err "No domains in DigitalOcean DNS" |
|||
return 1 |
|||
fi |
|||
|
|||
for d in $domains_avail |
|||
do |
|||
_debug trying_domain "$d" |
|||
try_domain=${fulldomain##$d} |
|||
try_challenge=${fulldomain%%.$d} |
|||
_debug try_domain "$try_domain" |
|||
_debug try_challenge "$try_challenge" |
|||
|
|||
if [ "$fulldomain" == "$try_challenge.$d" ] |
|||
then |
|||
_debug matches "$d" |
|||
domain="$d" |
|||
challenge="$try_challenge" |
|||
else |
|||
_debug no_match "$d" |
|||
fi |
|||
done |
|||
|
|||
if [ -z "$domain" ] |
|||
then |
|||
_err "Unable to locate domain of $fulldomain in DigitalOcean DNS" |
|||
return 1 |
|||
fi |
|||
|
|||
record_name="$challenge" |
|||
_debug domain "$domain" |
|||
_debug record_name "$record_name" |
|||
_debug txtvalue "$txtvalue" |
|||
|
|||
record_ids=$( doctl compute domain records list $domain --no-header --format=ID,Name,Data | grep $record_name | grep $txtvalue | awk '{print $1}' | tr "$IFS" " " ) |
|||
_debug record_ids "$record_ids" |
|||
# could be more than one; delete all matching records |
|||
if [ -z "$record_ids" ] |
|||
then |
|||
_err "Error: Unable to locate any DNS record matching $record_name with TXT $txtvalue -- you will need to delete record\(s\) manually" |
|||
# |
|||
else |
|||
for r in $record_ids |
|||
do |
|||
_info "Deleting record $r from domain $domain" |
|||
doctl compute domain records delete $domain $r |
|||
done |
|||
fi |
|||
|
|||
} |
|||
|
|||
#################### Private functions below ################################## |
Write
Preview
Loading…
Cancel
Save
Reference in new issue