Lonnie Abelbeck
7 years ago
2 changed files with 373 additions and 0 deletions
@ -0,0 +1,340 @@ |
|||
#!/usr/bin/env sh |
|||
# |
|||
# Dyn.com Domain API |
|||
# |
|||
# Author: Gerd Naschenweng |
|||
# https://github.com/magicdude4eva |
|||
# |
|||
# Dyn Managed DNS API |
|||
# https://help.dyn.com/dns-api-knowledge-base/ |
|||
# |
|||
# It is recommended to add a "Dyn Managed DNS" user specific for API access. |
|||
# The "Zones & Records Permissions" required by this script are: |
|||
# -- |
|||
# RecordAdd |
|||
# RecordUpdate |
|||
# RecordDelete |
|||
# RecordGet |
|||
# ZoneGet |
|||
# ZoneAddNode |
|||
# ZoneRemoveNode |
|||
# ZonePublish |
|||
# -- |
|||
# |
|||
# Pass credentials before "acme.sh --issue --dns dns_dyn ..." |
|||
# -- |
|||
# export DYN_Customer="customer" |
|||
# export DYN_Username="apiuser" |
|||
# export DYN_Password="secret" |
|||
# -- |
|||
|
|||
DYN_API="https://api.dynect.net/REST" |
|||
|
|||
#REST_API |
|||
######## Public functions ##################### |
|||
|
|||
#Usage: add _acme-challenge.www.domain.com "Challenge-code" |
|||
dns_dyn_add() { |
|||
fulldomain="$1" |
|||
txtvalue="$2" |
|||
|
|||
DYN_Customer="${DYN_Customer:-$(_readaccountconf_mutable DYN_Customer)}" |
|||
DYN_Username="${DYN_Username:-$(_readaccountconf_mutable DYN_Username)}" |
|||
DYN_Password="${DYN_Password:-$(_readaccountconf_mutable DYN_Password)}" |
|||
if [ -z "$DYN_Customer" ] || [ -z "$DYN_Username" ] || [ -z "$DYN_Password" ]; then |
|||
DYN_Customer="" |
|||
DYN_Username="" |
|||
DYN_Password="" |
|||
_err "You must export variables: DYN_Customer, DYN_Username and DYN_Password" |
|||
return 1 |
|||
fi |
|||
|
|||
#save the config variables to the account conf file. |
|||
_saveaccountconf_mutable DYN_Customer "$DYN_Customer" |
|||
_saveaccountconf_mutable DYN_Username "$DYN_Username" |
|||
_saveaccountconf_mutable DYN_Password "$DYN_Password" |
|||
|
|||
if ! _dyn_get_authtoken; then |
|||
return 1 |
|||
fi |
|||
|
|||
if [ -z "$_dyn_authtoken" ]; then |
|||
_dyn_end_session |
|||
return 1 |
|||
fi |
|||
|
|||
if ! _dyn_get_zone; then |
|||
_dyn_end_session |
|||
return 1 |
|||
fi |
|||
|
|||
if ! _dyn_add_record; then |
|||
_dyn_end_session |
|||
return 1 |
|||
fi |
|||
|
|||
if ! _dyn_publish_zone; then |
|||
_dyn_end_session |
|||
return 1 |
|||
fi |
|||
|
|||
_dyn_end_session |
|||
|
|||
return 0 |
|||
} |
|||
|
|||
#Usage: fulldomain txtvalue |
|||
#Remove the txt record after validation. |
|||
dns_dyn_rm() { |
|||
fulldomain="$1" |
|||
txtvalue="$2" |
|||
|
|||
DYN_Customer="${DYN_Customer:-$(_readaccountconf_mutable DYN_Customer)}" |
|||
DYN_Username="${DYN_Username:-$(_readaccountconf_mutable DYN_Username)}" |
|||
DYN_Password="${DYN_Password:-$(_readaccountconf_mutable DYN_Password)}" |
|||
if [ -z "$DYN_Customer" ] || [ -z "$DYN_Username" ] || [ -z "$DYN_Password" ]; then |
|||
DYN_Customer="" |
|||
DYN_Username="" |
|||
DYN_Password="" |
|||
_err "You must export variables: DYN_Customer, DYN_Username and DYN_Password" |
|||
return 1 |
|||
fi |
|||
|
|||
if ! _dyn_get_authtoken; then |
|||
return 1 |
|||
fi |
|||
|
|||
if [ -z "$_dyn_authtoken" ]; then |
|||
_dyn_end_session |
|||
return 1 |
|||
fi |
|||
|
|||
if ! _dyn_get_zone; then |
|||
_dyn_end_session |
|||
return 1 |
|||
fi |
|||
|
|||
if ! _dyn_get_record_id; then |
|||
_dyn_end_session |
|||
return 1 |
|||
fi |
|||
|
|||
if [ -z "$_dyn_record_id" ]; then |
|||
_dyn_end_session |
|||
return 1 |
|||
fi |
|||
|
|||
if ! _dyn_rm_record; then |
|||
_dyn_end_session |
|||
return 1 |
|||
fi |
|||
|
|||
if ! _dyn_publish_zone; then |
|||
_dyn_end_session |
|||
return 1 |
|||
fi |
|||
|
|||
_dyn_end_session |
|||
|
|||
return 0 |
|||
} |
|||
|
|||
#################### Private functions below ################################## |
|||
|
|||
#get Auth-Token |
|||
_dyn_get_authtoken() { |
|||
|
|||
_info "Start Dyn API Session" |
|||
|
|||
data="{\"customer_name\":\"$DYN_Customer\", \"user_name\":\"$DYN_Username\", \"password\":\"$DYN_Password\"}" |
|||
dyn_url="$DYN_API/Session/" |
|||
method="POST" |
|||
|
|||
_debug data "$data" |
|||
_debug dyn_url "$dyn_url" |
|||
|
|||
export _H1="Content-Type: application/json" |
|||
|
|||
response="$(_post "$data" "$dyn_url" "" "$method")" |
|||
sessionstatus="$(printf "%s\n" "$response" | _egrep_o '"status" *: *"[^"]*' | head -n 1 | sed 's#^"status" *: *"##')" |
|||
|
|||
_debug response "$response" |
|||
_debug sessionstatus "$sessionstatus" |
|||
|
|||
if [ "$sessionstatus" = "success" ]; then |
|||
_dyn_authtoken="$(printf "%s\n" "$response" | _egrep_o '"token" *: *"[^"]*' | head -n 1 | sed 's#^"token" *: *"##')" |
|||
_info "Token received" |
|||
_debug _dyn_authtoken "$_dyn_authtoken" |
|||
return 0 |
|||
fi |
|||
|
|||
_dyn_authtoken="" |
|||
_err "get token failed" |
|||
return 1 |
|||
} |
|||
|
|||
#fulldomain=_acme-challenge.www.domain.com |
|||
#returns |
|||
# _dyn_zone=domain.com |
|||
_dyn_get_zone() { |
|||
i=2 |
|||
while true; do |
|||
domain="$(printf "%s" "$fulldomain" | cut -d . -f "$i-100")" |
|||
if [ -z "$domain" ]; then |
|||
break |
|||
fi |
|||
|
|||
dyn_url="$DYN_API/Zone/$domain/" |
|||
|
|||
export _H1="Auth-Token: $_dyn_authtoken" |
|||
export _H2="Content-Type: application/json" |
|||
|
|||
response="$(_get "$dyn_url" "" "")" |
|||
sessionstatus="$(printf "%s\n" "$response" | _egrep_o '"status" *: *"[^"]*' | head -n 1 | sed 's#^"status" *: *"##')" |
|||
|
|||
_debug dyn_url "$dyn_url" |
|||
_debug response "$response" |
|||
_debug sessionstatus "$sessionstatus" |
|||
|
|||
if [ "$sessionstatus" = "success" ]; then |
|||
_dyn_zone="$domain" |
|||
return 0 |
|||
fi |
|||
i=$(_math "$i" + 1) |
|||
done |
|||
|
|||
_dyn_zone="" |
|||
_err "get zone failed" |
|||
return 1 |
|||
} |
|||
|
|||
#add TXT record |
|||
_dyn_add_record() { |
|||
|
|||
_info "Adding TXT record" |
|||
|
|||
data="{\"rdata\":{\"txtdata\":\"$txtvalue\"},\"ttl\":\"300\"}" |
|||
dyn_url="$DYN_API/TXTRecord/$_dyn_zone/$fulldomain/" |
|||
method="POST" |
|||
|
|||
export _H1="Auth-Token: $_dyn_authtoken" |
|||
export _H2="Content-Type: application/json" |
|||
|
|||
response="$(_post "$data" "$dyn_url" "" "$method")" |
|||
sessionstatus="$(printf "%s\n" "$response" | _egrep_o '"status" *: *"[^"]*' | head -n 1 | sed 's#^"status" *: *"##')" |
|||
|
|||
_debug response "$response" |
|||
_debug sessionstatus "$sessionstatus" |
|||
|
|||
if [ "$sessionstatus" = "success" ]; then |
|||
_info "TXT Record successfully added" |
|||
return 0 |
|||
fi |
|||
|
|||
_err "add TXT record failed" |
|||
return 1 |
|||
} |
|||
|
|||
#publish the zone |
|||
_dyn_publish_zone() { |
|||
|
|||
_info "Publishing zone" |
|||
|
|||
data="{\"publish\":\"true\"}" |
|||
dyn_url="$DYN_API/Zone/$_dyn_zone/" |
|||
method="PUT" |
|||
|
|||
export _H1="Auth-Token: $_dyn_authtoken" |
|||
export _H2="Content-Type: application/json" |
|||
|
|||
response="$(_post "$data" "$dyn_url" "" "$method")" |
|||
sessionstatus="$(printf "%s\n" "$response" | _egrep_o '"status" *: *"[^"]*' | head -n 1 | sed 's#^"status" *: *"##')" |
|||
|
|||
_debug response "$response" |
|||
_debug sessionstatus "$sessionstatus" |
|||
|
|||
if [ "$sessionstatus" = "success" ]; then |
|||
_info "Zone published" |
|||
return 0 |
|||
fi |
|||
|
|||
_err "publish zone failed" |
|||
return 1 |
|||
} |
|||
|
|||
#get record_id of TXT record so we can delete the record |
|||
_dyn_get_record_id() { |
|||
|
|||
_info "Getting record_id of TXT record" |
|||
|
|||
dyn_url="$DYN_API/TXTRecord/$_dyn_zone/$fulldomain/" |
|||
|
|||
export _H1="Auth-Token: $_dyn_authtoken" |
|||
export _H2="Content-Type: application/json" |
|||
|
|||
response="$(_get "$dyn_url" "" "")" |
|||
sessionstatus="$(printf "%s\n" "$response" | _egrep_o '"status" *: *"[^"]*' | head -n 1 | sed 's#^"status" *: *"##')" |
|||
|
|||
_debug response "$response" |
|||
_debug sessionstatus "$sessionstatus" |
|||
|
|||
if [ "$sessionstatus" = "success" ]; then |
|||
_dyn_record_id="$(printf "%s\n" "$response" | _egrep_o "\"data\" *: *\[\"/REST/TXTRecord/$_dyn_zone/$fulldomain/[^\"]*" | head -n 1 | sed "s#^\"data\" *: *\[\"/REST/TXTRecord/$_dyn_zone/$fulldomain/##")" |
|||
_debug _dyn_record_id "$_dyn_record_id" |
|||
return 0 |
|||
fi |
|||
|
|||
_dyn_record_id="" |
|||
_err "getting record_id failed" |
|||
return 1 |
|||
} |
|||
|
|||
#delete TXT record |
|||
_dyn_rm_record() { |
|||
|
|||
_info "Deleting TXT record" |
|||
|
|||
dyn_url="$DYN_API/TXTRecord/$_dyn_zone/$fulldomain/$_dyn_record_id/" |
|||
method="DELETE" |
|||
|
|||
_debug dyn_url "$dyn_url" |
|||
|
|||
export _H1="Auth-Token: $_dyn_authtoken" |
|||
export _H2="Content-Type: application/json" |
|||
|
|||
response="$(_post "" "$dyn_url" "" "$method")" |
|||
sessionstatus="$(printf "%s\n" "$response" | _egrep_o '"status" *: *"[^"]*' | head -n 1 | sed 's#^"status" *: *"##')" |
|||
|
|||
_debug response "$response" |
|||
_debug sessionstatus "$sessionstatus" |
|||
|
|||
if [ "$sessionstatus" = "success" ]; then |
|||
_info "TXT record successfully deleted" |
|||
return 0 |
|||
fi |
|||
|
|||
_err "delete TXT record failed" |
|||
return 1 |
|||
} |
|||
|
|||
#logout |
|||
_dyn_end_session() { |
|||
|
|||
_info "End Dyn API Session" |
|||
|
|||
dyn_url="$DYN_API/Session/" |
|||
method="DELETE" |
|||
|
|||
_debug dyn_url "$dyn_url" |
|||
|
|||
export _H1="Auth-Token: $_dyn_authtoken" |
|||
export _H2="Content-Type: application/json" |
|||
|
|||
response="$(_post "" "$dyn_url" "" "$method")" |
|||
|
|||
_debug response "$response" |
|||
|
|||
_dyn_authtoken="" |
|||
return 0 |
|||
} |
|||
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue