From 5fd0e5add2b29c6e05b482c3c49bf82b9a905e22 Mon Sep 17 00:00:00 2001
From: neil <github@neilpang.com>
Date: Wed, 21 Oct 2020 15:07:25 +0800
Subject: [PATCH 1/7] Update DNS.yml

---
 .github/workflows/DNS.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/DNS.yml b/.github/workflows/DNS.yml
index 25d92137..b7153506 100644
--- a/.github/workflows/DNS.yml
+++ b/.github/workflows/DNS.yml
@@ -94,7 +94,7 @@ jobs:
     steps:
     - uses: actions/checkout@v2
     - name: Install tools
-      run:  brew update && brew install socat;
+      run:  brew install socat
     - name: Clone acmetest
       run: cd .. && git clone https://github.com/acmesh-official/acmetest.git  && cp -r acme.sh acmetest/
     - name: Run acmetest

From 7cc30c268b6c1f79be55fa3a8d31ec50892a4a78 Mon Sep 17 00:00:00 2001
From: ma331 <59875686+ma331@users.noreply.github.com>
Date: Thu, 29 Oct 2020 11:14:44 +0100
Subject: [PATCH 2/7] Script to use with Anexia CloudDNS

---
 dnsapi/dns_anx.sh | 157 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 157 insertions(+)
 create mode 100644 dnsapi/dns_anx.sh

diff --git a/dnsapi/dns_anx.sh b/dnsapi/dns_anx.sh
new file mode 100644
index 00000000..9865adc2
--- /dev/null
+++ b/dnsapi/dns_anx.sh
@@ -0,0 +1,157 @@
+#!/usr/bin/env sh
+
+#ANX_Token="xxxx"
+
+ANX_API='https://engine.anexia-it.com/api/clouddns/v1'
+
+########  Public functions #####################
+
+dns_anx_add() {
+  fulldomain=$1
+  txtvalue=$2
+
+  _info "Using ANX CDNS API"
+
+  ANX_Token="${ANX_Token:-$(_readaccountconf_mutable ANX_Token)}"
+  _debug fulldomain "$fulldomain"
+  _debug txtvalue "$txtvalue"
+
+  if [ "$ANX_Token" ]; then
+    _saveaccountconf_mutable ANX_Token "$ANX_Token"
+  else
+   _err "You didn't specify a ANEXIA Engine API token."
+   return 1
+  fi
+
+  _debug "First detect the root zone"
+  if ! _get_root "$fulldomain"; then
+    _err "invalid domain"
+    return 1
+  fi
+
+  # Always add records, wildcard need two records with the same name
+  _anx_rest POST "zone.json/${_domain}/records" "{\"name\":\"$_sub_domain\",\"type\":\"TXT\",\"rdata\":\"$txtvalue\"}"
+  if _contains "$response" "$txtvalue"; then
+    return 0
+  else
+    return 1
+  fi
+}
+
+dns_anx_rm() {
+  fulldomain=$1
+  txtvalue=$2
+
+  _info "Using ANX CDNS API"
+
+  ANX_Token="${ANX_Token:-$(_readaccountconf_mutable ANX_Token)}"
+
+  _debug fulldomain "$fulldomain"
+  _debug txtvalue "$txtvalue"
+
+  _debug "First detect the root zone"
+  if ! _get_root "$fulldomain"; then
+    _err "invalid domain"
+    return 1
+  fi
+
+  _get_record_id
+
+  if _is_uuid "$_record_id"; then
+    if ! _anx_rest DELETE "zone.json/${_domain}/records/$_record_id"; then
+      _err "Delete record"
+      return 1
+    fi
+  else
+    _info "No record found."
+  fi
+  echo "$response" | tr -d " " | grep \"status\":\"OK\" >/dev/null
+}
+
+####################  Private functions below ##################################
+
+_is_uuid() {
+  pattern='^\{?[A-Z0-9a-z]{8}-[A-Z0-9a-z]{4}-[A-Z0-9a-z]{4}-[A-Z0-9a-z]{4}-[A-Z0-9a-z]{12}\}?$'
+  if echo "$1" | _egrep_o "$pattern" >/dev/null; then
+    return 0
+  fi
+  return 1
+}
+
+_get_record_id() {
+  _debug subdomain "$_sub_domain"
+  _debug domain "$_domain"
+
+  if _anx_rest GET "zone.json/${_domain}/records?name=$_sub_domain&type=TXT"; then
+    _debug response "$response"
+    if _contains "$response" "\"name\":\"$_sub_domain\"" >/dev/null; then
+      _record_id=$(printf "%s\n" "$response" | _egrep_o "\[.\"identifier\":\"[^\"]*\"" | head -n 1 | cut -d : -f 2 | tr -d \")
+    else
+      _record_id=''
+    fi
+  else
+    _err "Search existing record"
+  fi
+}
+
+_anx_rest() {
+  m=$1
+  ep="$2"
+  data="$3"
+  _debug "$ep"
+
+  export _H1="Content-Type: application/json"
+  export _H2="Authorization: Token $ANX_Token"
+
+  if [ "$m" != "GET" ]; then
+    _debug data "$data"
+    response="$(_post "$data" "${ANX_API}/$ep" "" "$m")"
+  else
+    response="$(_get "${ANX_API}/$ep")"
+  fi
+
+  # shellcheck disable=SC2181
+  if [ "$?" != "0" ]; then
+    _err "error $ep"
+    return 1
+  fi
+  _debug response "$response"
+  return 0
+}
+
+
+#_acme-challenge.www.domain.com
+#returns
+# _sub_domain=_acme-challenge.www
+# _domain=domain.com
+_get_root() {
+  domain=$1
+  i=1
+  p=1
+
+  while true; do
+    h=$(printf "%s" "$domain" | cut -d . -f $i-100)
+    _debug h "$h"
+    if [ -z "$h" ]; then
+      #not valid
+      return 1
+    fi
+
+    # Does a zone with that name exist?
+    _anx_rest GET "zone.json/$h"
+    # shellcheck disable=SC2154
+    if [ "$code" -ne 200 ]; then
+      continue
+    fi
+
+    if _contains "$response" "\"name\":\"$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
+}

From fe54d5b8aeef06a7244e08c380af68eaea9884bc Mon Sep 17 00:00:00 2001
From: ma331 <59875686+ma331@users.noreply.github.com>
Date: Thu, 29 Oct 2020 12:51:49 +0100
Subject: [PATCH 3/7] fixed spacing in two lines

---
 dnsapi/dns_anx.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/dnsapi/dns_anx.sh b/dnsapi/dns_anx.sh
index 9865adc2..66430d3e 100644
--- a/dnsapi/dns_anx.sh
+++ b/dnsapi/dns_anx.sh
@@ -19,8 +19,8 @@ dns_anx_add() {
   if [ "$ANX_Token" ]; then
     _saveaccountconf_mutable ANX_Token "$ANX_Token"
   else
-   _err "You didn't specify a ANEXIA Engine API token."
-   return 1
+    _err "You didn't specify a ANEXIA Engine API token."
+    return 1
   fi
 
   _debug "First detect the root zone"

From bc62d49fc900e2f5b31881e02c432433435ae245 Mon Sep 17 00:00:00 2001
From: ma331 <59875686+ma331@users.noreply.github.com>
Date: Thu, 29 Oct 2020 13:04:29 +0100
Subject: [PATCH 4/7] removed empty line to make shfmt happy

---
 dnsapi/dns_anx.sh | 1 -
 1 file changed, 1 deletion(-)

diff --git a/dnsapi/dns_anx.sh b/dnsapi/dns_anx.sh
index 66430d3e..b84fac8c 100644
--- a/dnsapi/dns_anx.sh
+++ b/dnsapi/dns_anx.sh
@@ -119,7 +119,6 @@ _anx_rest() {
   return 0
 }
 
-
 #_acme-challenge.www.domain.com
 #returns
 # _sub_domain=_acme-challenge.www

From 92bbdce4351028909e83c189dc77ab313b3684d4 Mon Sep 17 00:00:00 2001
From: ma331 <59875686+ma331@users.noreply.github.com>
Date: Thu, 29 Oct 2020 13:35:53 +0100
Subject: [PATCH 5/7] changed comment

---
 dnsapi/dns_anx.sh | 1 +
 1 file changed, 1 insertion(+)

diff --git a/dnsapi/dns_anx.sh b/dnsapi/dns_anx.sh
index b84fac8c..027f6820 100644
--- a/dnsapi/dns_anx.sh
+++ b/dnsapi/dns_anx.sh
@@ -1,5 +1,6 @@
 #!/usr/bin/env sh
 
+### Anexia CloudDNS acme.sh hook
 #ANX_Token="xxxx"
 
 ANX_API='https://engine.anexia-it.com/api/clouddns/v1'

From 812333e9aef404d3b5e7b5f0cdfa935b20c3895c Mon Sep 17 00:00:00 2001
From: ma331 <59875686+ma331@users.noreply.github.com>
Date: Thu, 29 Oct 2020 14:01:08 +0100
Subject: [PATCH 6/7] Changed comment once more

---
 dnsapi/dns_anx.sh | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/dnsapi/dns_anx.sh b/dnsapi/dns_anx.sh
index 027f6820..8c46e405 100644
--- a/dnsapi/dns_anx.sh
+++ b/dnsapi/dns_anx.sh
@@ -1,6 +1,8 @@
 #!/usr/bin/env sh
 
-### Anexia CloudDNS acme.sh hook
+# Anexia CloudDNS acme.sh hook
+# Author: MA
+
 #ANX_Token="xxxx"
 
 ANX_API='https://engine.anexia-it.com/api/clouddns/v1'

From d58fb2bbc01f8d2596c5365db9e644d1fc99773a Mon Sep 17 00:00:00 2001
From: ma331 <59875686+ma331@users.noreply.github.com>
Date: Fri, 30 Oct 2020 14:13:32 +0100
Subject: [PATCH 7/7] Speedup for _get_root function

---
 dnsapi/dns_anx.sh | 13 ++-----------
 1 file changed, 2 insertions(+), 11 deletions(-)

diff --git a/dnsapi/dns_anx.sh b/dnsapi/dns_anx.sh
index 8c46e405..c1a1130a 100644
--- a/dnsapi/dns_anx.sh
+++ b/dnsapi/dns_anx.sh
@@ -122,15 +122,13 @@ _anx_rest() {
   return 0
 }
 
-#_acme-challenge.www.domain.com
-#returns
-# _sub_domain=_acme-challenge.www
-# _domain=domain.com
 _get_root() {
   domain=$1
   i=1
   p=1
 
+  _anx_rest GET "zone.json"
+
   while true; do
     h=$(printf "%s" "$domain" | cut -d . -f $i-100)
     _debug h "$h"
@@ -139,13 +137,6 @@ _get_root() {
       return 1
     fi
 
-    # Does a zone with that name exist?
-    _anx_rest GET "zone.json/$h"
-    # shellcheck disable=SC2154
-    if [ "$code" -ne 200 ]; then
-      continue
-    fi
-
     if _contains "$response" "\"name\":\"$h\""; then
       _sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
       _domain=$h