dns_edgecenter.sh 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #!/usr/bin/env sh
  2. # shellcheck disable=SC2034
  3. dns_edgecenter_info='EdgeCenter.ru
  4. Site: EdgeCenter.ru
  5. Docs: github.com/acmesh-official/acme.sh/wiki/dnsapi2#dns_edgecenter
  6. Options:
  7. EDGECENTER_API_KEY API Key
  8. Issues: github.com/acmesh-official/acme.sh/issues/6313
  9. Author: Konstantin Ruchev <[email protected]>
  10. '
  11. EDGECENTER_API="https://api.edgecenter.ru"
  12. DOMAIN_TYPE=
  13. DOMAIN_MASTER=
  14. ######## Public functions #####################
  15. #Usage: dns_edgecenter_add _acme-challenge.www.domain.com "TXT_RECORD_VALUE"
  16. dns_edgecenter_add() {
  17. fulldomain="$1"
  18. txtvalue="$2"
  19. _info "Using EdgeCenter DNS API"
  20. if ! _dns_edgecenter_init_check; then
  21. return 1
  22. fi
  23. _debug "Detecting root zone for $fulldomain"
  24. if ! _get_root "$fulldomain"; then
  25. return 1
  26. fi
  27. subdomain="${fulldomain%."$_zone"}"
  28. subdomain=${subdomain%.}
  29. _debug "Zone: $_zone"
  30. _debug "Subdomain: $subdomain"
  31. _debug "TXT value: $txtvalue"
  32. payload='{"resource_records": [ { "content": ["'"$txtvalue"'"] } ], "ttl": 60 }'
  33. _dns_edgecenter_http_api_call "post" "dns/v2/zones/$_zone/$subdomain.$_zone/txt" "$payload"
  34. if _contains "$response" '"error":"rrset is already exists"'; then
  35. _debug "RRSet exists, merging values"
  36. _dns_edgecenter_http_api_call "get" "dns/v2/zones/$_zone/$subdomain.$_zone/txt"
  37. current="$response"
  38. newlist=""
  39. for v in $(echo "$current" | sed -n 's/.*"content":\["\([^"]*\)"\].*/\1/p'); do
  40. newlist="$newlist {\"content\":[\"$v\"]},"
  41. done
  42. newlist="$newlist{\"content\":[\"$txtvalue\"]}"
  43. putdata="{\"resource_records\":[${newlist}]}
  44. "
  45. _dns_edgecenter_http_api_call "put" "dns/v2/zones/$_zone/$subdomain.$_zone/txt" "$putdata"
  46. _info "Updated existing RRSet with new TXT value."
  47. return 0
  48. fi
  49. if _contains "$response" '"exception":'; then
  50. _err "Record cannot be added."
  51. return 1
  52. fi
  53. _info "TXT record added successfully."
  54. return 0
  55. }
  56. #Usage: dns_edgecenter_rm _acme-challenge.www.domain.com "TXT_RECORD_VALUE"
  57. dns_edgecenter_rm() {
  58. fulldomain="$1"
  59. txtvalue="$2"
  60. _info "Removing TXT record for $fulldomain"
  61. if ! _dns_edgecenter_init_check; then
  62. return 1
  63. fi
  64. if ! _get_root "$fulldomain"; then
  65. return 1
  66. fi
  67. subdomain="${fulldomain%."$_zone"}"
  68. subdomain=${subdomain%.}
  69. _dns_edgecenter_http_api_call "delete" "dns/v2/zones/$_zone/$subdomain.$_zone/txt"
  70. if [ -z "$response" ]; then
  71. _info "TXT record deleted successfully."
  72. else
  73. _info "TXT record may not have been deleted: $response"
  74. fi
  75. return 0
  76. }
  77. #################### Private functions below ##################################
  78. _dns_edgecenter_init_check() {
  79. EDGECENTER_API_KEY="${EDGECENTER_API_KEY:-$(_readaccountconf_mutable EDGECENTER_API_KEY)}"
  80. if [ -z "$EDGECENTER_API_KEY" ]; then
  81. _err "EDGECENTER_API_KEY was not exported."
  82. return 1
  83. fi
  84. _saveaccountconf_mutable EDGECENTER_API_KEY "$EDGECENTER_API_KEY"
  85. export _H1="Authorization: APIKey $EDGECENTER_API_KEY"
  86. _dns_edgecenter_http_api_call "get" "dns/v2/clients/me/features"
  87. if ! _contains "$response" '"id":'; then
  88. _err "Invalid API key."
  89. return 1
  90. fi
  91. return 0
  92. }
  93. _get_root() {
  94. domain="$1"
  95. i=1
  96. while true; do
  97. h=$(printf "%s" "$domain" | cut -d . -f "$i"-)
  98. if [ -z "$h" ]; then
  99. return 1
  100. fi
  101. _dns_edgecenter_http_api_call "get" "dns/v2/zones/$h"
  102. if ! _contains "$response" 'zone is not found'; then
  103. _zone="$h"
  104. return 0
  105. fi
  106. i=$((i + 1))
  107. done
  108. return 1
  109. }
  110. _dns_edgecenter_http_api_call() {
  111. mtd="$1"
  112. endpoint="$2"
  113. data="$3"
  114. export _H1="Authorization: APIKey $EDGECENTER_API_KEY"
  115. case "$mtd" in
  116. get)
  117. response="$(_get "$EDGECENTER_API/$endpoint")"
  118. ;;
  119. post)
  120. response="$(_post "$data" "$EDGECENTER_API/$endpoint")"
  121. ;;
  122. delete)
  123. response="$(_post "" "$EDGECENTER_API/$endpoint" "" "DELETE")"
  124. ;;
  125. put)
  126. response="$(_post "$data" "$EDGECENTER_API/$endpoint" "" "PUT")"
  127. ;;
  128. *)
  129. _err "Unknown HTTP method $mtd"
  130. return 1
  131. ;;
  132. esac
  133. _debug "HTTP $mtd response: $response"
  134. return 0
  135. }