Browse Source

Use _post for DELETE and switch to JSON API (Alwaysdata default).

Paul Koppen 8 years ago
parent
commit
331b599a81
1 changed files with 43 additions and 38 deletions
  1. 43 38
      dnsapi/dns_ad.sh

+ 43 - 38
dnsapi/dns_ad.sh

@@ -5,8 +5,7 @@
 
 #This is the Alwaysdata api wrapper for acme.sh
 
-AD_HOST="api.alwaysdata.com"
-AD_URL="https://$AD_API_KEY:@$AD_HOST"
+AD_API_URL="https://$AD_API_KEY:@api.alwaysdata.com/v1"
 
 ########  Public functions #####################
 
@@ -35,7 +34,7 @@ dns_ad_add() {
 
   _ad_tmpl_json="{\"domain\":$_domain_id,\"type\":\"TXT\",\"name\":\"$_sub_domain\",\"value\":\"$txtvalue\"}"
   
-  if ad_rest POST "record/" "" "$_ad_tmpl_json" && [ -z "$response" ]; then
+  if _ad_rest POST "record/" "$_ad_tmpl_json" && [ -z "$response" ]; then
     _info "txt record updated success."
     return 0
   fi
@@ -57,37 +56,51 @@ dns_ad_rm() {
   _debug _sub_domain "$_sub_domain"
   _debug _domain "$_domain"
 
-  if ad_rest DELETE "record/" "domain=$_domain_id&name=$_sub_domain" "" && [ -z "$response" ]; then
-    _info "txt record deleted success."
-    return 0
+  _debug "Getting txt records"
+  _ad_rest GET "record/?domain=$_domain_id&name=$_sub_domain"
+  
+  if [ -n "$response" ]; then
+    record_id=$(printf "%s\n" "$response" | _egrep_o "\"id\":\s*[0-9]+" | cut -d : -f 2 | tr -d \ | head -n 1)
+    _debug record_id "$record_id"
+    if [ -z "$record_id" ]; then
+      _err "Can not get record id to remove."
+      return 1
+    fi
+    if _ad_rest DELETE "record/$record_id/" && [ -z "$response" ]; then
+      _info "txt record deleted success."
+      return 0
+    fi
+    _debug response "$response"
+    return 1
   fi
-  _debug response "$response"
 
   return 1
 }
 
 ####################  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 ad_rest GET "domain/"; then
+  if _ad_rest GET "domain/"; then
+    response="$(echo "$response" | tr -d "\n" | sed 's/{/\n&/g')"
     while true; do
       h=$(printf "%s" "$domain" | cut -d . -f $i-100)
+      _debug h "$h"
       if [ -z "$h" ]; then
         #not valid
         return 1
       fi
 
-      if _contains "$response" "<name>$h</name>"; then
-        hostedzone="$(echo "$response" | tr -d "\n" | sed 's/<object>/\n&/g' | _egrep_o "<object>.*<name>$h<.name>.*<.object>")"
-        if [ -z "$hostedzone" ]; then
-          _err "Error, can not get domain record."
-          return 1
-        fi
-        _domain_id=$(printf "%s\n" "$hostedzone" | _egrep_o "<id>.*<.id>" | head -n 1 | _egrep_o ">.*<" | tr -d "<>")
+      hostedzone="$(echo "$response" | _egrep_o "{.*\"name\":\s*\"$h\".*}")"
+      if [ "$hostedzone" ]; then
+        _domain_id=$(printf "%s\n" "$hostedzone" | _egrep_o "\"id\":\s*[0-9]+" | head -n 1 | cut -d : -f 2 | tr -d \ )
         if [ "$_domain_id" ]; then
           _sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
           _domain=$h
@@ -103,37 +116,29 @@ _get_root() {
 }
 
 #method uri qstr data
-ad_rest() {
+_ad_rest() {
   mtd="$1"
   ep="$2"
-  qsr="$3"
-  data="$4"
+  data="$3"
 
   _debug mtd "$mtd"
   _debug ep "$ep"
-  _debug qsr "$qsr"
-  _debug data "$data"
 
-  _H1="Accept: application/xml"
+  _H1="Accept: application/json"
+  _H2="Content-Type: application/json"
   
-  url="$AD_URL/v1/$ep?$qsr"
-
-  if [ "$mtd" = "GET" ]; then
-    response="$(_get "$url")"
-  elif [ "$mtd" = "DELETE" ]; then
-    response="$(_delete "$url")"
+  if [ "$mtd" != "GET" ]; then
+    # both POST and DELETE.
+    _debug data "$data"
+    response="$(_post "$data" "$AD_API_URL/$ep" "" "$mtd")"
   else
-    response="$(_post "$data" "$url")"
+    response="$(_get "$AD_API_URL/$ep")"
   fi
 
-  _ret="$?"
-  if [ "$_ret" = "0" ]; then
-    # Errors usually 404, otherwise just empty response. How to detect 404?
-    if _contains "$response" "<ErrorResponse"; then
-      _err "Response error:$response"
-      return 1
-    fi
+  if [ "$?" != "0" ]; then
+    _err "error $ep"
+    return 1
   fi
-
-  return "$_ret"
+  _debug2 response "$response"
+  return 0
 }