mirror of
https://github.com/acmesh-official/acme.sh.git
synced 2025-07-04 17:14:12 +00:00
Merge branch 'acmesh-official:master' into master
This commit is contained in:
commit
4698b483cb
8
.github/workflows/dockerhub.yml
vendored
8
.github/workflows/dockerhub.yml
vendored
@ -28,9 +28,9 @@ jobs:
|
|||||||
id: step_one
|
id: step_one
|
||||||
run: |
|
run: |
|
||||||
if [ "$DOCKER_PASSWORD" ] ; then
|
if [ "$DOCKER_PASSWORD" ] ; then
|
||||||
echo "::set-output name=hasToken::true"
|
echo "hasToken=true" >>$GITHUB_OUTPUT
|
||||||
else
|
else
|
||||||
echo "::set-output name=hasToken::false"
|
echo "hasToken=false" >>$GITHUB_OUTPUT
|
||||||
fi
|
fi
|
||||||
- name: Check the value
|
- name: Check the value
|
||||||
run: echo ${{ steps.step_one.outputs.hasToken }}
|
run: echo ${{ steps.step_one.outputs.hasToken }}
|
||||||
@ -43,9 +43,9 @@ jobs:
|
|||||||
- name: checkout code
|
- name: checkout code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v1
|
uses: docker/setup-qemu-action@v2
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v1
|
uses: docker/setup-buildx-action@v2
|
||||||
- name: login to docker hub
|
- name: login to docker hub
|
||||||
run: |
|
run: |
|
||||||
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
|
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
|
||||||
|
@ -26,7 +26,7 @@ COPY ./ /install_acme.sh/
|
|||||||
RUN cd /install_acme.sh && ([ -f /install_acme.sh/acme.sh ] && /install_acme.sh/acme.sh --install || curl https://get.acme.sh | sh) && rm -rf /install_acme.sh/
|
RUN cd /install_acme.sh && ([ -f /install_acme.sh/acme.sh ] && /install_acme.sh/acme.sh --install || curl https://get.acme.sh | sh) && rm -rf /install_acme.sh/
|
||||||
|
|
||||||
|
|
||||||
RUN ln -s /root/.acme.sh/acme.sh /usr/local/bin/acme.sh && crontab -l | grep acme.sh | sed 's#> /dev/null##' | crontab -
|
RUN ln -s /root/.acme.sh/acme.sh /usr/local/bin/acme.sh && crontab -l | grep acme.sh | sed 's#> /dev/null#> /proc/1/fd/1 2>/proc/1/fd/2#' | crontab -
|
||||||
|
|
||||||
RUN for verb in help \
|
RUN for verb in help \
|
||||||
version \
|
version \
|
||||||
|
39
acme.sh
39
acme.sh
@ -1852,9 +1852,15 @@ _inithttp() {
|
|||||||
_ACME_CURL="$_ACME_CURL --cacert $CA_BUNDLE "
|
_ACME_CURL="$_ACME_CURL --cacert $CA_BUNDLE "
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if _contains "$(curl --help 2>&1)" "--globoff"; then
|
if _contains "$(curl --help 2>&1)" "--globoff" || _contains "$(curl --help curl 2>&1)" "--globoff"; then
|
||||||
_ACME_CURL="$_ACME_CURL -g "
|
_ACME_CURL="$_ACME_CURL -g "
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
#don't use --fail-with-body
|
||||||
|
##from curl 7.76: return fail on HTTP errors but keep the body
|
||||||
|
#if _contains "$(curl --help http 2>&1)" "--fail-with-body"; then
|
||||||
|
# _ACME_CURL="$_ACME_CURL --fail-with-body "
|
||||||
|
#fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -z "$_ACME_WGET" ] && _exists "wget"; then
|
if [ -z "$_ACME_WGET" ] && _exists "wget"; then
|
||||||
@ -1872,11 +1878,11 @@ _inithttp() {
|
|||||||
elif [ "$CA_BUNDLE" ]; then
|
elif [ "$CA_BUNDLE" ]; then
|
||||||
_ACME_WGET="$_ACME_WGET --ca-certificate=$CA_BUNDLE "
|
_ACME_WGET="$_ACME_WGET --ca-certificate=$CA_BUNDLE "
|
||||||
fi
|
fi
|
||||||
fi
|
|
||||||
|
|
||||||
#from wget 1.14: do not skip body on 404 error
|
#from wget 1.14: do not skip body on 404 error
|
||||||
if [ "$_ACME_WGET" ] && _contains "$($_ACME_WGET --help 2>&1)" "--content-on-error"; then
|
if _contains "$(wget --help 2>&1)" "--content-on-error"; then
|
||||||
_ACME_WGET="$_ACME_WGET --content-on-error "
|
_ACME_WGET="$_ACME_WGET --content-on-error "
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
__HTTP_INITIALIZED=1
|
__HTTP_INITIALIZED=1
|
||||||
@ -2223,6 +2229,16 @@ _send_signed_request() {
|
|||||||
_debug3 _body "$_body"
|
_debug3 _body "$_body"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
_retryafter=$(echo "$responseHeaders" | grep -i "^Retry-After *:" | cut -d : -f 2 | tr -d ' ' | tr -d '\r')
|
||||||
|
if [ "$code" = '503' ] || [ "$_retryafter" ]; then
|
||||||
|
_sleep_overload_retry_sec=$_retryafter
|
||||||
|
if [ -z "$_sleep_overload_retry_sec" ]; then
|
||||||
|
_sleep_overload_retry_sec=5
|
||||||
|
fi
|
||||||
|
_info "It seems the CA server is currently overloaded, let's wait and retry. Sleeping $_sleep_overload_retry_sec seconds."
|
||||||
|
_sleep $_sleep_overload_retry_sec
|
||||||
|
continue
|
||||||
|
fi
|
||||||
if _contains "$_body" "JWS has invalid anti-replay nonce" || _contains "$_body" "JWS has an invalid anti-replay nonce"; then
|
if _contains "$_body" "JWS has invalid anti-replay nonce" || _contains "$_body" "JWS has an invalid anti-replay nonce"; then
|
||||||
_info "It seems the CA server is busy now, let's wait and retry. Sleeping $_sleep_retry_sec seconds."
|
_info "It seems the CA server is busy now, let's wait and retry. Sleeping $_sleep_retry_sec seconds."
|
||||||
_CACHED_NONCE=""
|
_CACHED_NONCE=""
|
||||||
@ -2857,7 +2873,7 @@ _initpath() {
|
|||||||
|
|
||||||
if _isEccKey "$_ilength"; then
|
if _isEccKey "$_ilength"; then
|
||||||
DOMAIN_PATH="$domainhomeecc"
|
DOMAIN_PATH="$domainhomeecc"
|
||||||
else
|
elif [ -z "$__SELECTED_RSA_KEY" ]; then
|
||||||
if [ ! -d "$domainhome" ] && [ -d "$domainhomeecc" ]; then
|
if [ ! -d "$domainhome" ] && [ -d "$domainhomeecc" ]; then
|
||||||
_info "The domain '$domain' seems to have a ECC cert already, lets use ecc cert."
|
_info "The domain '$domain' seems to have a ECC cert already, lets use ecc cert."
|
||||||
DOMAIN_PATH="$domainhomeecc"
|
DOMAIN_PATH="$domainhomeecc"
|
||||||
@ -4018,7 +4034,7 @@ _ns_purge_cf() {
|
|||||||
|
|
||||||
#checks if cf server is available
|
#checks if cf server is available
|
||||||
_ns_is_available_cf() {
|
_ns_is_available_cf() {
|
||||||
if _get "https://cloudflare-dns.com" "" 1 >/dev/null 2>&1; then
|
if _get "https://cloudflare-dns.com" "" 10 >/dev/null; then
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
return 1
|
return 1
|
||||||
@ -4026,7 +4042,7 @@ _ns_is_available_cf() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_ns_is_available_google() {
|
_ns_is_available_google() {
|
||||||
if _get "https://dns.google" "" 1 >/dev/null 2>&1; then
|
if _get "https://dns.google" "" 10 >/dev/null; then
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
return 1
|
return 1
|
||||||
@ -4042,7 +4058,7 @@ _ns_lookup_google() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_ns_is_available_ali() {
|
_ns_is_available_ali() {
|
||||||
if _get "https://dns.alidns.com" "" 1 >/dev/null 2>&1; then
|
if _get "https://dns.alidns.com" "" 10 >/dev/null; then
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
return 1
|
return 1
|
||||||
@ -4058,7 +4074,7 @@ _ns_lookup_ali() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_ns_is_available_dp() {
|
_ns_is_available_dp() {
|
||||||
if _get "https://doh.pub" "" 1 >/dev/null 2>&1; then
|
if _get "https://doh.pub" "" 10 >/dev/null; then
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
return 1
|
return 1
|
||||||
@ -7502,6 +7518,9 @@ _process() {
|
|||||||
--keylength | -k)
|
--keylength | -k)
|
||||||
_keylength="$2"
|
_keylength="$2"
|
||||||
shift
|
shift
|
||||||
|
if [ "$_keylength" ] && ! _isEccKey "$_keylength"; then
|
||||||
|
export __SELECTED_RSA_KEY=1
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
-ak | --accountkeylength)
|
-ak | --accountkeylength)
|
||||||
_accountkeylength="$2"
|
_accountkeylength="$2"
|
||||||
|
@ -23,7 +23,7 @@ dns_huaweicloud_add() {
|
|||||||
|
|
||||||
HUAWEICLOUD_Username="${HUAWEICLOUD_Username:-$(_readaccountconf_mutable HUAWEICLOUD_Username)}"
|
HUAWEICLOUD_Username="${HUAWEICLOUD_Username:-$(_readaccountconf_mutable HUAWEICLOUD_Username)}"
|
||||||
HUAWEICLOUD_Password="${HUAWEICLOUD_Password:-$(_readaccountconf_mutable HUAWEICLOUD_Password)}"
|
HUAWEICLOUD_Password="${HUAWEICLOUD_Password:-$(_readaccountconf_mutable HUAWEICLOUD_Password)}"
|
||||||
HUAWEICLOUD_DomainName="${HUAWEICLOUD_DomainName:-$(_readaccountconf_mutable HUAWEICLOUD_Username)}"
|
HUAWEICLOUD_DomainName="${HUAWEICLOUD_DomainName:-$(_readaccountconf_mutable HUAWEICLOUD_DomainName)}"
|
||||||
|
|
||||||
# Check information
|
# Check information
|
||||||
if [ -z "${HUAWEICLOUD_Username}" ] || [ -z "${HUAWEICLOUD_Password}" ] || [ -z "${HUAWEICLOUD_DomainName}" ]; then
|
if [ -z "${HUAWEICLOUD_Username}" ] || [ -z "${HUAWEICLOUD_Password}" ] || [ -z "${HUAWEICLOUD_DomainName}" ]; then
|
||||||
@ -74,7 +74,7 @@ dns_huaweicloud_rm() {
|
|||||||
|
|
||||||
HUAWEICLOUD_Username="${HUAWEICLOUD_Username:-$(_readaccountconf_mutable HUAWEICLOUD_Username)}"
|
HUAWEICLOUD_Username="${HUAWEICLOUD_Username:-$(_readaccountconf_mutable HUAWEICLOUD_Username)}"
|
||||||
HUAWEICLOUD_Password="${HUAWEICLOUD_Password:-$(_readaccountconf_mutable HUAWEICLOUD_Password)}"
|
HUAWEICLOUD_Password="${HUAWEICLOUD_Password:-$(_readaccountconf_mutable HUAWEICLOUD_Password)}"
|
||||||
HUAWEICLOUD_DomainName="${HUAWEICLOUD_DomainName:-$(_readaccountconf_mutable HUAWEICLOUD_Username)}"
|
HUAWEICLOUD_DomainName="${HUAWEICLOUD_DomainName:-$(_readaccountconf_mutable HUAWEICLOUD_DomainName)}"
|
||||||
|
|
||||||
# Check information
|
# Check information
|
||||||
if [ -z "${HUAWEICLOUD_Username}" ] || [ -z "${HUAWEICLOUD_Password}" ] || [ -z "${HUAWEICLOUD_DomainName}" ]; then
|
if [ -z "${HUAWEICLOUD_Username}" ] || [ -z "${HUAWEICLOUD_Password}" ] || [ -z "${HUAWEICLOUD_DomainName}" ]; then
|
||||||
@ -98,19 +98,59 @@ dns_huaweicloud_rm() {
|
|||||||
fi
|
fi
|
||||||
_debug "Zone ID is:" "${zoneid}"
|
_debug "Zone ID is:" "${zoneid}"
|
||||||
|
|
||||||
# Remove all records
|
record_id="$(_get_recordset_id "${token}" "${fulldomain}" "${zoneid}")"
|
||||||
# Therotically HuaweiCloud does not allow more than one record set
|
_recursive_rm_record "${token}" "${fulldomain}" "${zoneid}" "${record_id}"
|
||||||
# But remove them recurringly to increase robusty
|
ret="$?"
|
||||||
while [ "${record_id}" != "0" ]; do
|
if [ "${ret}" != "0" ]; then
|
||||||
_debug "Removing Record"
|
_err "dns_api(dns_huaweicloud): Error removing record."
|
||||||
_rm_record "${token}" "${zoneid}" "${record_id}"
|
return 1
|
||||||
record_id="$(_get_recordset_id "${token}" "${fulldomain}" "${zoneid}")"
|
fi
|
||||||
done
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
################### Private functions below ##################################
|
################### Private functions below ##################################
|
||||||
|
|
||||||
|
# _recursive_rm_record
|
||||||
|
# remove all records from the record set
|
||||||
|
#
|
||||||
|
# _token=$1
|
||||||
|
# _domain=$2
|
||||||
|
# _zoneid=$3
|
||||||
|
# _record_id=$4
|
||||||
|
#
|
||||||
|
# Returns 0 on success
|
||||||
|
_recursive_rm_record() {
|
||||||
|
_token=$1
|
||||||
|
_domain=$2
|
||||||
|
_zoneid=$3
|
||||||
|
_record_id=$4
|
||||||
|
|
||||||
|
# Most likely to have problems will huaweicloud side if more than 50 attempts but still cannot fully remove the record set
|
||||||
|
# Maybe can be removed manually in the dashboard
|
||||||
|
_retry_cnt=50
|
||||||
|
|
||||||
|
# Remove all records
|
||||||
|
# Therotically HuaweiCloud does not allow more than one record set
|
||||||
|
# But remove them recurringly to increase robusty
|
||||||
|
|
||||||
|
while [ "${_record_id}" != "0" ] && [ "${_retry_cnt}" != "0" ]; do
|
||||||
|
_debug "Removing Record"
|
||||||
|
_retry_cnt=$((_retry_cnt - 1))
|
||||||
|
_rm_record "${_token}" "${_zoneid}" "${_record_id}"
|
||||||
|
_record_id="$(_get_recordset_id "${_token}" "${_domain}" "${_zoneid}")"
|
||||||
|
_debug2 "Checking record exists: record_id=${_record_id}"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Check if retry count is reached
|
||||||
|
if [ "${_retry_cnt}" = "0" ]; then
|
||||||
|
_debug "Failed to remove record after 50 attempts, please try removing it manually in the dashboard"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
# _get_zoneid
|
# _get_zoneid
|
||||||
#
|
#
|
||||||
# _token=$1
|
# _token=$1
|
||||||
@ -124,7 +164,7 @@ _get_zoneid() {
|
|||||||
|
|
||||||
i=1
|
i=1
|
||||||
while true; do
|
while true; do
|
||||||
h=$(printf "%s" "${_domain_string}" | cut -d . -f $i-100)
|
h=$(printf "%s" "${_domain_string}" | cut -d . -f "$i"-100)
|
||||||
if [ -z "$h" ]; then
|
if [ -z "$h" ]; then
|
||||||
#not valid
|
#not valid
|
||||||
return 1
|
return 1
|
||||||
@ -135,11 +175,11 @@ _get_zoneid() {
|
|||||||
if _contains "${response}" '"id"'; then
|
if _contains "${response}" '"id"'; then
|
||||||
zoneidlist=$(echo "${response}" | _egrep_o "\"id\": *\"[^\"]*\"" | cut -d : -f 2 | tr -d \" | tr -d " ")
|
zoneidlist=$(echo "${response}" | _egrep_o "\"id\": *\"[^\"]*\"" | cut -d : -f 2 | tr -d \" | tr -d " ")
|
||||||
zonenamelist=$(echo "${response}" | _egrep_o "\"name\": *\"[^\"]*\"" | cut -d : -f 2 | tr -d \" | tr -d " ")
|
zonenamelist=$(echo "${response}" | _egrep_o "\"name\": *\"[^\"]*\"" | cut -d : -f 2 | tr -d \" | tr -d " ")
|
||||||
_debug2 "Return Zone ID(s):" "${zoneidlist}"
|
_debug2 "Returned Zone ID(s):" "${zoneidlist}"
|
||||||
_debug2 "Return Zone Name(s):" "${zonenamelist}"
|
_debug2 "Returned Zone Name(s):" "${zonenamelist}"
|
||||||
zoneidnum=0
|
zoneidnum=0
|
||||||
zoneidcount=$(echo "${zoneidlist}" | grep -c '^')
|
zoneidcount=$(echo "${zoneidlist}" | grep -c '^')
|
||||||
_debug "Retund Zone ID(s) Count:" "${zoneidcount}"
|
_debug "Returned Zone ID(s) Count:" "${zoneidcount}"
|
||||||
while [ "${zoneidnum}" -lt "${zoneidcount}" ]; do
|
while [ "${zoneidnum}" -lt "${zoneidcount}" ]; do
|
||||||
zoneidnum=$(_math "$zoneidnum" + 1)
|
zoneidnum=$(_math "$zoneidnum" + 1)
|
||||||
_zoneid=$(echo "${zoneidlist}" | sed -n "${zoneidnum}p")
|
_zoneid=$(echo "${zoneidlist}" | sed -n "${zoneidnum}p")
|
||||||
@ -206,8 +246,7 @@ _add_record() {
|
|||||||
\"type\": \"TXT\",
|
\"type\": \"TXT\",
|
||||||
\"ttl\": 1,
|
\"ttl\": 1,
|
||||||
\"records\": [
|
\"records\": [
|
||||||
${_exist_record},
|
${_exist_record},\"\\\"${_txtvalue}\\\"\"
|
||||||
\"\\\"${_txtvalue}\\\"\"
|
|
||||||
]
|
]
|
||||||
}"
|
}"
|
||||||
fi
|
fi
|
||||||
@ -215,19 +254,16 @@ _add_record() {
|
|||||||
_record_id="$(_get_recordset_id "${_token}" "${_domain}" "${zoneid}")"
|
_record_id="$(_get_recordset_id "${_token}" "${_domain}" "${zoneid}")"
|
||||||
_debug "Record Set ID is:" "${_record_id}"
|
_debug "Record Set ID is:" "${_record_id}"
|
||||||
|
|
||||||
# Remove all records
|
|
||||||
while [ "${_record_id}" != "0" ]; do
|
|
||||||
_debug "Removing Record"
|
|
||||||
_rm_record "${_token}" "${zoneid}" "${_record_id}"
|
|
||||||
_record_id="$(_get_recordset_id "${_token}" "${_domain}" "${zoneid}")"
|
|
||||||
done
|
|
||||||
|
|
||||||
# Add brand new records with all old and new records
|
# Add brand new records with all old and new records
|
||||||
export _H2="Content-Type: application/json"
|
export _H2="Content-Type: application/json"
|
||||||
export _H1="X-Auth-Token: ${_token}"
|
export _H1="X-Auth-Token: ${_token}"
|
||||||
|
|
||||||
_debug2 "${_post_body}"
|
_debug2 "${_post_body}"
|
||||||
_post "${_post_body}" "${dns_api}/v2/zones/${zoneid}/recordsets" >/dev/null
|
if [ -z "${_exist_record}" ]; then
|
||||||
|
_post "${_post_body}" "${dns_api}/v2/zones/${zoneid}/recordsets" >/dev/null
|
||||||
|
else
|
||||||
|
_post "${_post_body}" "${dns_api}/v2/zones/${zoneid}/recordsets/${_record_id}" false "PUT" >/dev/null
|
||||||
|
fi
|
||||||
_code="$(grep "^HTTP" "$HTTP_HEADER" | _tail_n 1 | cut -d " " -f 2 | tr -d "\\r\\n")"
|
_code="$(grep "^HTTP" "$HTTP_HEADER" | _tail_n 1 | cut -d " " -f 2 | tr -d "\\r\\n")"
|
||||||
if [ "$_code" != "202" ]; then
|
if [ "$_code" != "202" ]; then
|
||||||
_err "dns_huaweicloud: http code ${_code}"
|
_err "dns_huaweicloud: http code ${_code}"
|
||||||
|
157
dnsapi/dns_ipv64.sh
Executable file
157
dnsapi/dns_ipv64.sh
Executable file
@ -0,0 +1,157 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
|
#Created by Roman Lumetsberger, to use ipv64.net's API to add/remove text records
|
||||||
|
#2022/11/29
|
||||||
|
|
||||||
|
# Pass credentials before "acme.sh --issue --dns dns_ipv64 ..."
|
||||||
|
# --
|
||||||
|
# export IPv64_Token="aaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||||
|
# --
|
||||||
|
#
|
||||||
|
|
||||||
|
IPv64_API="https://ipv64.net/api"
|
||||||
|
|
||||||
|
######## Public functions ######################
|
||||||
|
|
||||||
|
#Usage: dns_ipv64_add _acme-challenge.domain.ipv64.net "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
|
||||||
|
dns_ipv64_add() {
|
||||||
|
fulldomain=$1
|
||||||
|
txtvalue=$2
|
||||||
|
|
||||||
|
IPv64_Token="${IPv64_Token:-$(_readaccountconf_mutable IPv64_Token)}"
|
||||||
|
if [ -z "$IPv64_Token" ]; then
|
||||||
|
_err "You must export variable: IPv64_Token"
|
||||||
|
_err "The API Key for your IPv64 account is necessary."
|
||||||
|
_err "You can look it up in your IPv64 account."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Now save the credentials.
|
||||||
|
_saveaccountconf_mutable IPv64_Token "$IPv64_Token"
|
||||||
|
|
||||||
|
if ! _get_root "$fulldomain"; then
|
||||||
|
_err "invalid domain" "$fulldomain"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
_debug _sub_domain "$_sub_domain"
|
||||||
|
_debug _domain "$_domain"
|
||||||
|
|
||||||
|
# convert to lower case
|
||||||
|
_domain="$(echo "$_domain" | _lower_case)"
|
||||||
|
_sub_domain="$(echo "$_sub_domain" | _lower_case)"
|
||||||
|
# Now add the TXT record
|
||||||
|
_info "Trying to add TXT record"
|
||||||
|
if _ipv64_rest "POST" "add_record=$_domain&praefix=$_sub_domain&type=TXT&content=$txtvalue"; then
|
||||||
|
_info "TXT record has been successfully added."
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
_err "Errors happened during adding the TXT record, response=$_response"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#Usage: fulldomain txtvalue
|
||||||
|
#Usage: dns_ipv64_rm _acme-challenge.domain.ipv64.net "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
|
||||||
|
#Remove the txt record after validation.
|
||||||
|
dns_ipv64_rm() {
|
||||||
|
fulldomain=$1
|
||||||
|
txtvalue=$2
|
||||||
|
|
||||||
|
IPv64_Token="${IPv64_Token:-$(_readaccountconf_mutable IPv64_Token)}"
|
||||||
|
if [ -z "$IPv64_Token" ]; then
|
||||||
|
_err "You must export variable: IPv64_Token"
|
||||||
|
_err "The API Key for your IPv64 account is necessary."
|
||||||
|
_err "You can look it up in your IPv64 account."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! _get_root "$fulldomain"; then
|
||||||
|
_err "invalid domain" "$fulldomain"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
_debug _sub_domain "$_sub_domain"
|
||||||
|
_debug _domain "$_domain"
|
||||||
|
|
||||||
|
# convert to lower case
|
||||||
|
_domain="$(echo "$_domain" | _lower_case)"
|
||||||
|
_sub_domain="$(echo "$_sub_domain" | _lower_case)"
|
||||||
|
# Now delete the TXT record
|
||||||
|
_info "Trying to delete TXT record"
|
||||||
|
if _ipv64_rest "DELETE" "del_record=$_domain&praefix=$_sub_domain&type=TXT&content=$txtvalue"; then
|
||||||
|
_info "TXT record has been successfully deleted."
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
_err "Errors happened during deleting the TXT record, response=$_response"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#################### Private functions below ##################################
|
||||||
|
#_acme-challenge.www.domain.com
|
||||||
|
#returns
|
||||||
|
# _sub_domain=_acme-challenge.www
|
||||||
|
# _domain=domain.com
|
||||||
|
_get_root() {
|
||||||
|
domain="$1"
|
||||||
|
i=1
|
||||||
|
p=1
|
||||||
|
|
||||||
|
_ipv64_get "get_domains"
|
||||||
|
domain_data=$_response
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
h=$(printf "%s" "$domain" | cut -d . -f "$i"-100)
|
||||||
|
if [ -z "$h" ]; then
|
||||||
|
#not valid
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
#if _contains "$domain_data" "\""$h"\"\:"; then
|
||||||
|
if _contains "$domain_data" "\"""$h""\"\:"; then
|
||||||
|
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-"$p")
|
||||||
|
_domain="$h"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
p=$i
|
||||||
|
i=$(_math "$i" + 1)
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
#send get request to api
|
||||||
|
# $1 has to set the api-function
|
||||||
|
_ipv64_get() {
|
||||||
|
url="$IPv64_API?$1"
|
||||||
|
export _H1="Authorization: Bearer $IPv64_Token"
|
||||||
|
|
||||||
|
_response=$(_get "$url")
|
||||||
|
_response="$(echo "$_response" | _normalizeJson)"
|
||||||
|
|
||||||
|
if _contains "$_response" "429 Too Many Requests"; then
|
||||||
|
_info "API throttled, sleeping to reset the limit"
|
||||||
|
_sleep 10
|
||||||
|
_response=$(_get "$url")
|
||||||
|
_response="$(echo "$_response" | _normalizeJson)"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
_ipv64_rest() {
|
||||||
|
url="$IPv64_API"
|
||||||
|
export _H1="Authorization: Bearer $IPv64_Token"
|
||||||
|
export _H2="Content-Type: application/x-www-form-urlencoded"
|
||||||
|
_response=$(_post "$2" "$url" "" "$1")
|
||||||
|
|
||||||
|
if _contains "$_response" "429 Too Many Requests"; then
|
||||||
|
_info "API throttled, sleeping to reset the limit"
|
||||||
|
_sleep 10
|
||||||
|
_response=$(_post "$2" "$url" "" "$1")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! _contains "$_response" "\"info\":\"success\""; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
_debug2 response "$_response"
|
||||||
|
return 0
|
||||||
|
}
|
59
dnsapi/dns_nanelo.sh
Normal file
59
dnsapi/dns_nanelo.sh
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
|
# Official DNS API for Nanelo.com
|
||||||
|
|
||||||
|
# Provide the required API Key like this:
|
||||||
|
# NANELO_TOKEN="FmD408PdqT1E269gUK57"
|
||||||
|
|
||||||
|
NANELO_API="https://api.nanelo.com/v1/"
|
||||||
|
|
||||||
|
######## Public functions #####################
|
||||||
|
|
||||||
|
# Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
|
||||||
|
dns_nanelo_add() {
|
||||||
|
fulldomain=$1
|
||||||
|
txtvalue=$2
|
||||||
|
|
||||||
|
NANELO_TOKEN="${NANELO_TOKEN:-$(_readaccountconf_mutable NANELO_TOKEN)}"
|
||||||
|
if [ -z "$NANELO_TOKEN" ]; then
|
||||||
|
NANELO_TOKEN=""
|
||||||
|
_err "You didn't configure a Nanelo API Key yet."
|
||||||
|
_err "Please set NANELO_TOKEN and try again."
|
||||||
|
_err "Login to Nanelo.com and go to Settings > API Keys to get a Key"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
_saveaccountconf_mutable NANELO_TOKEN "$NANELO_TOKEN"
|
||||||
|
|
||||||
|
_info "Adding TXT record to ${fulldomain}"
|
||||||
|
response="$(_get "$NANELO_API$NANELO_TOKEN/dns/addrecord?type=TXT&ttl=60&name=${fulldomain}&value=${txtvalue}")"
|
||||||
|
if _contains "${response}" 'success'; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
_err "Could not create resource record, please check the logs"
|
||||||
|
_err "${response}"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
dns_nanelo_rm() {
|
||||||
|
fulldomain=$1
|
||||||
|
txtvalue=$2
|
||||||
|
|
||||||
|
NANELO_TOKEN="${NANELO_TOKEN:-$(_readaccountconf_mutable NANELO_TOKEN)}"
|
||||||
|
if [ -z "$NANELO_TOKEN" ]; then
|
||||||
|
NANELO_TOKEN=""
|
||||||
|
_err "You didn't configure a Nanelo API Key yet."
|
||||||
|
_err "Please set NANELO_TOKEN and try again."
|
||||||
|
_err "Login to Nanelo.com and go to Settings > API Keys to get a Key"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
_saveaccountconf_mutable NANELO_TOKEN "$NANELO_TOKEN"
|
||||||
|
|
||||||
|
_info "Deleting resource record $fulldomain"
|
||||||
|
response="$(_get "$NANELO_API$NANELO_TOKEN/dns/deleterecord?type=TXT&ttl=60&name=${fulldomain}&value=${txtvalue}")"
|
||||||
|
if _contains "${response}" 'success'; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
_err "Could not delete resource record, please check the logs"
|
||||||
|
_err "${response}"
|
||||||
|
return 1
|
||||||
|
}
|
@ -78,7 +78,7 @@ dns_vultr_rm() {
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
_record_id="$(echo "$response" | tr '{}' '\n' | grep '"TXT"' | grep -- "$txtvalue" | tr ',' '\n' | grep -i 'id' | cut -d : -f 2)"
|
_record_id="$(echo "$response" | tr '{}' '\n' | grep '"TXT"' | grep -- "$txtvalue" | tr ',' '\n' | grep -i 'id' | cut -d : -f 2 | tr -d '"')"
|
||||||
_debug _record_id "$_record_id"
|
_debug _record_id "$_record_id"
|
||||||
if [ "$_record_id" ]; then
|
if [ "$_record_id" ]; then
|
||||||
_info "Successfully retrieved the record id for ACME challenge."
|
_info "Successfully retrieved the record id for ACME challenge."
|
||||||
@ -116,7 +116,7 @@ _get_root() {
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if printf "%s\n" "$response" | grep '^\{.*\}' >/dev/null; then
|
if printf "%s\n" "$response" | grep -E '^\{.*\}' >/dev/null; then
|
||||||
if _contains "$response" "\"domain\":\"$_domain\""; then
|
if _contains "$response" "\"domain\":\"$_domain\""; then
|
||||||
_sub_domain="$(echo "$fulldomain" | sed "s/\\.$_domain\$//")"
|
_sub_domain="$(echo "$fulldomain" | sed "s/\\.$_domain\$//")"
|
||||||
return 0
|
return 0
|
||||||
|
@ -169,7 +169,7 @@ _clean_email_header() {
|
|||||||
# email
|
# email
|
||||||
_email_has_display_name() {
|
_email_has_display_name() {
|
||||||
_email="$1"
|
_email="$1"
|
||||||
expr "$_email" : '^.*[<>"]' >/dev/null
|
echo "$_email" | grep -q -E '^.*[<>"]'
|
||||||
}
|
}
|
||||||
|
|
||||||
##
|
##
|
||||||
@ -249,7 +249,7 @@ _mime_encoded_word() {
|
|||||||
_text="$1"
|
_text="$1"
|
||||||
# (regex character ranges like [a-z] can be locale-dependent; enumerate ASCII chars to avoid that)
|
# (regex character ranges like [a-z] can be locale-dependent; enumerate ASCII chars to avoid that)
|
||||||
_ascii='] $`"'"[!#%&'()*+,./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ~^_abcdefghijklmnopqrstuvwxyz{|}~-"
|
_ascii='] $`"'"[!#%&'()*+,./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ~^_abcdefghijklmnopqrstuvwxyz{|}~-"
|
||||||
if expr "$_text" : "^.*[^$_ascii]" >/dev/null; then
|
if echo "$_text" | grep -q -E "^.*[^$_ascii]"; then
|
||||||
# At least one non-ASCII char; convert entire thing to encoded word
|
# At least one non-ASCII char; convert entire thing to encoded word
|
||||||
printf "%s" "=?UTF-8?B?$(printf "%s" "$_text" | _base64)?="
|
printf "%s" "=?UTF-8?B?$(printf "%s" "$_text" | _base64)?="
|
||||||
else
|
else
|
||||||
|
Loading…
x
Reference in New Issue
Block a user