acme.sh/dnsapi/dns_linode.sh

185 lines
4.6 KiB
Bash
Raw Normal View History

#!/usr/bin/env sh
2017-01-16 08:42:17 +00:00
2017-01-31 03:43:30 +00:00
#Author: Philipp Grosswiler <philipp.grosswiler@swiss-design.net>
LINODE_API_URL="https://api.linode.com/v4/domains"
2017-01-16 08:42:17 +00:00
######## Public functions #####################
#Usage: dns_linode_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_linode_add() {
fulldomain="${1}"
txtvalue="${2}"
2017-01-31 03:43:30 +00:00
if ! _Linode_API; then
return 1
fi
2017-01-16 08:42:17 +00:00
_info "Using Linode"
_debug "Calling: dns_linode_add() '${fulldomain}' '${txtvalue}'"
2017-01-31 03:43:30 +00:00
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "Domain does not exist."
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_payload="{
\"type\": \"TXT\",
\"name\": \"$_sub_domain\",
\"target\": \"$txtvalue\"
}"
2017-01-31 03:43:30 +00:00
if _rest POST "/$_domain_id/records" "$_payload" && [ -n "$response" ]; then
_resource_id=$(printf "%s\n" "$response" | _egrep_o "\"id\":\s*[0-9]+" | cut -d : -f 2 | tr -d " " | _head_n 1)
2017-01-31 03:43:30 +00:00
_debug _resource_id "$_resource_id"
if [ -z "$_resource_id" ]; then
_err "Error adding the domain resource."
return 1
fi
2017-01-16 08:42:17 +00:00
2017-01-31 03:43:30 +00:00
_info "Domain resource successfully added."
return 0
fi
return 1
2017-01-16 08:42:17 +00:00
}
#Usage: dns_linode_rm _acme-challenge.www.domain.com
dns_linode_rm() {
fulldomain="${1}"
2017-01-31 03:43:30 +00:00
if ! _Linode_API; then
return 1
fi
2017-01-16 08:42:17 +00:00
_info "Using Linode"
_debug "Calling: dns_linode_rm() '${fulldomain}'"
2017-01-31 03:43:30 +00:00
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "Domain does not exist."
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
if _rest GET "/$_domain_id/records" && [ -n "$response" ]; then
2017-08-03 13:47:45 +00:00
response="$(echo "$response" | tr -d "\n" | tr '{' "|" | sed 's/|/&{/g' | tr "|" "\n")"
2017-01-31 03:43:30 +00:00
resource="$(echo "$response" | _egrep_o "{.*\"name\":\s*\"$_sub_domain\".*}")"
2017-01-31 03:43:30 +00:00
if [ "$resource" ]; then
_resource_id=$(printf "%s\n" "$resource" | _egrep_o "\"id\":\s*[0-9]+" | _head_n 1 | cut -d : -f 2 | tr -d \ )
2017-01-31 03:43:30 +00:00
if [ "$_resource_id" ]; then
_debug _resource_id "$_resource_id"
2017-01-16 08:42:17 +00:00
if _rest DELETE "/$_domain_id/records/$_resource_id" && [ -n "$response" ]; then
# On 200/OK, empty set is returned. Check for error, if any.
_error_response=$(printf "%s\n" "$response" | _egrep_o "\"errors\"" | cut -d : -f 2 | tr -d " " | _head_n 1)
2017-01-31 03:43:30 +00:00
if [ -n "$_error_response" ]; then
_err "Error deleting the domain resource: $_error_response"
2017-01-31 03:43:30 +00:00
return 1
fi
_info "Domain resource successfully deleted."
return 0
fi
fi
return 1
fi
return 0
fi
return 1
2017-01-16 08:42:17 +00:00
}
#################### Private functions below ##################################
2017-01-31 03:43:30 +00:00
_Linode_API() {
if [ -z "$LINODE_API_KEY" ]; then
LINODE_API_KEY=""
_err "You didn't specify the Linode API key yet."
_err "Please create your key and try again."
2017-01-16 08:42:17 +00:00
return 1
fi
2017-01-31 03:43:30 +00:00
_saveaccountconf LINODE_API_KEY "$LINODE_API_KEY"
2017-01-16 08:42:17 +00:00
}
2017-01-31 03:43:30 +00:00
#################### Private functions below ##################################
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=12345
_get_root() {
domain=$1
i=2
p=1
if _rest GET; then
2017-08-03 13:47:45 +00:00
response="$(echo "$response" | tr -d "\n" | tr '{' "|" | sed 's/|/&{/g' | tr "|" "\n")"
2017-01-31 03:43:30 +00:00
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
2017-01-16 08:42:17 +00:00
hostedzone="$(echo "$response" | _egrep_o "{.*\"domain\":\s*\"$h\".*}")"
2017-01-31 03:43:30 +00:00
if [ "$hostedzone" ]; then
_domain_id=$(printf "%s\n" "$hostedzone" | _egrep_o "\"id\":\s*[0-9]+" | _head_n 1 | cut -d : -f 2 | tr -d \ )
2017-01-31 03:43:30 +00:00
if [ "$_domain_id" ]; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain=$h
return 0
fi
return 1
fi
p=$i
i=$(_math "$i" + 1)
done
2017-01-16 08:42:17 +00:00
fi
2017-01-31 03:43:30 +00:00
return 1
2017-01-16 08:42:17 +00:00
}
2017-01-31 03:43:30 +00:00
#method method action data
_rest() {
mtd="$1"
ep="$2"
data="$3"
_debug mtd "$mtd"
_debug ep "$ep"
export _H1="Accept: application/json"
export _H2="Content-Type: application/json"
export _H3="Authorization: Bearer $LINODE_API_KEY"
2017-01-31 03:43:30 +00:00
if [ "$mtd" != "GET" ]; then
# both POST and DELETE.
_debug data "$data"
response="$(_post "$data" "$LINODE_API_URL$ep" "" "$mtd")"
else
response="$(_get "$LINODE_API_URL$ep$data")"
fi
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}