diff --git a/README.md b/README.md
index 5e3709a1..66cac020 100644
--- a/README.md
+++ b/README.md
@@ -316,6 +316,7 @@ You don't have to do anything manually!
1. selectel.com(selectel.ru) DNS API
1. zonomi.com DNS API
1. DreamHost.com API
+
And:
1. lexicon DNS API: https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api
diff --git a/acme.sh b/acme.sh
index ebddf81d..a4224fc9 100755
--- a/acme.sh
+++ b/acme.sh
@@ -2763,9 +2763,9 @@ _isRealNginxConf() {
_left="$(sed -n "${_start_nn},99999p" "$2")"
_debug2 _left "$_left"
- if echo "$_left" | tr "\t" ' ' | grep -n "^ *server *" >/dev/null; then
- _end=$(echo "$_left" | tr "\t" ' ' | grep -n "^ *server *" | _head_n 1)
- _debug "_end" "$_end"
+ _end="$(echo "$_left" | tr "\t" ' ' | grep -n "^ *server *" | grep -v server_name | _head_n 1)"
+ _debug "_end" "$_end"
+ if [ "$_end" ]; then
_end_n=$(echo "$_end" | cut -d : -f 1)
_debug "_end_n" "$_end_n"
_seg_n=$(echo "$_left" | sed -n "1,${_end_n}p")
diff --git a/dnsapi/README.md b/dnsapi/README.md
index 8a1710f8..864bc1d7 100644
--- a/dnsapi/README.md
+++ b/dnsapi/README.md
@@ -585,7 +585,7 @@ For issues, please report to https://github.com/non7top/acme.sh/issues.
## 31. Use Hurricane Electric
-Hurricane Electric doesn't have an API so just set your login credentials like so:
+Hurricane Electric (https://dns.he.net/) doesn't have an API so just set your login credentials like so:
```
export HE_Username="yourusername"
diff --git a/dnsapi/dns_aws.sh b/dnsapi/dns_aws.sh
index ed317460..ee8efb38 100755
--- a/dnsapi/dns_aws.sh
+++ b/dnsapi/dns_aws.sh
@@ -42,7 +42,26 @@ dns_aws_add() {
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
- _aws_tmpl_xml="UPSERT$fulldomainTXT300\"$txtvalue\""
+ _info "Geting existing records for $fulldomain"
+ if ! aws_rest GET "2013-04-01$_domain_id/rrset" "name=$fulldomain&type=TXT"; then
+ return 1
+ fi
+
+ if _contains "$response" "$fulldomain."; then
+ _resource_record="$(echo "$response" | _egrep_o "" | sed "s///" | sed "s###")"
+ _debug "_resource_record" "$_resource_record"
+ else
+ _debug "single new add"
+ fi
+
+ if [ "$_resource_record" ] && _contains "$response" "$txtvalue"; then
+ _info "The txt record already exists, skip"
+ return 0
+ fi
+
+ _debug "Adding records"
+
+ _aws_tmpl_xml="UPSERT$fulldomainTXT300$_resource_record\"$txtvalue\""
if aws_rest POST "2013-04-01$_domain_id/rrset/" "" "$_aws_tmpl_xml" && _contains "$response" "ChangeResourceRecordSetsResponse"; then
_info "txt record updated success."
@@ -68,7 +87,20 @@ dns_aws_rm() {
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
- _aws_tmpl_xml="DELETE\"$txtvalue\"$fulldomain.TXT300"
+ _info "Geting existing records for $fulldomain"
+ if ! aws_rest GET "2013-04-01$_domain_id/rrset" "name=$fulldomain&type=TXT"; then
+ return 1
+ fi
+
+ if _contains "$response" "$fulldomain."; then
+ _resource_record="$(echo "$response" | _egrep_o "" | sed "s///" | sed "s###")"
+ _debug "_resource_record" "$_resource_record"
+ else
+ _debug "no records exists, skip"
+ return 0
+ fi
+
+ _aws_tmpl_xml="DELETE$_resource_record$fulldomain.TXT300"
if aws_rest POST "2013-04-01$_domain_id/rrset/" "" "$_aws_tmpl_xml" && _contains "$response" "ChangeResourceRecordSetsResponse"; then
_info "txt record deleted success."
@@ -87,7 +119,6 @@ _get_root() {
p=1
if aws_rest GET "2013-04-01/hostedzone"; then
- _debug "response" "$response"
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug2 "Checking domain: $h"
@@ -236,6 +267,7 @@ aws_rest() {
fi
_ret="$?"
+ _debug2 response "$response"
if [ "$_ret" = "0" ]; then
if _contains "$response" "/dev/null; then
- count=1
record_id=$(printf "%s\n" "$seg" | _egrep_o '"record_id":"[^"]*"' | cut -d : -f 2 | tr -d \" | _head_n 1)
_debug record_id "$record_id"
return 0
@@ -114,23 +98,6 @@ add_record() {
return 0
}
-#update the txt record
-#Usage: root sub txtvalue
-update_record() {
- root=$1
- sub=$2
- txtvalue=$3
- fulldomain="$sub.$root"
-
- _info "Updating record"
-
- if _rest PUT "record/$record_id" "{\"domain_id\": $_domain_id, \"host\":\"$_sub_domain\", \"value\":\"$txtvalue\", \"type\":\"TXT\",\"ttl\":600, \"line_id\":1}"; then
- return 0
- fi
-
- return 1
-}
-
#################### Private functions below ##################################
#_acme-challenge.www.domain.com
#returns
diff --git a/dnsapi/dns_he.sh b/dnsapi/dns_he.sh
index 4d1973ad..7b854ead 100755
--- a/dnsapi/dns_he.sh
+++ b/dnsapi/dns_he.sh
@@ -19,14 +19,16 @@ dns_he_add() {
_txt_value=$2
_info "Using DNS-01 Hurricane Electric hook"
+ HE_Username="${HE_Username:-$(_readaccountconf_mutable HE_Username)}"
+ HE_Password="${HE_Password:-$(_readaccountconf_mutable HE_Password)}"
if [ -z "$HE_Username" ] || [ -z "$HE_Password" ]; then
HE_Username=
HE_Password=
_err "No auth details provided. Please set user credentials using the \$HE_Username and \$HE_Password envoronment variables."
return 1
fi
- _saveaccountconf HE_Username "$HE_Username"
- _saveaccountconf HE_Password "$HE_Password"
+ _saveaccountconf_mutable HE_Username "$HE_Username"
+ _saveaccountconf_mutable HE_Password "$HE_Password"
# Fills in the $_zone_id
_find_zone "$_full_domain" || return 1
@@ -62,7 +64,8 @@ dns_he_rm() {
_full_domain=$1
_txt_value=$2
_info "Cleaning up after DNS-01 Hurricane Electric hook"
-
+ HE_Username="${HE_Username:-$(_readaccountconf_mutable HE_Username)}"
+ HE_Password="${HE_Password:-$(_readaccountconf_mutable HE_Password)}"
# fills in the $_zone_id
_find_zone "$_full_domain" || return 1
_debug "Zone id \"$_zone_id\" will be used."