1
0

dns_openprovider_rest.sh 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #!/usr/bin/env sh
  2. # shellcheck disable=SC2034
  3. dns_openprovider_rest_info='OpenProvider (REST)
  4. Domains: OpenProvider.com
  5. Site: OpenProvider.eu
  6. Docs: github.com/acmesh-official/acme.sh/wiki/dnsapi2#dns_openprovider_rest
  7. Options:
  8. OPENPROVIDER_REST_USERNAME Openprovider Account Username
  9. OPENPROVIDER_REST_PASSWORD Openprovider Account Password
  10. Issues: github.com/acmesh-official/acme.sh/issues/6122
  11. Author: Lambiek12
  12. '
  13. OPENPROVIDER_API_URL="https://api.openprovider.eu/v1beta"
  14. ######## Public functions #####################
  15. # Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
  16. # Used to add txt record
  17. dns_openprovider_rest_add() {
  18. fulldomain=$1
  19. txtvalue=$2
  20. _openprovider_prepare_credentials || return 1
  21. _debug "Try fetch OpenProvider DNS zone details"
  22. if ! _get_dns_zone "$fulldomain"; then
  23. _err "DNS zone not found within configured OpenProvider account."
  24. return 1
  25. fi
  26. if [ -n "$_domain_id" ]; then
  27. addzonerecordrequestparameters="dns/zones/$_domain_name"
  28. addzonerecordrequestbody="{\"id\":$_domain_id,\"name\":\"$_domain_name\",\"records\":{\"add\":[{\"name\":\"$_sub_domain\",\"ttl\":900,\"type\":\"TXT\",\"value\":\"$txtvalue\"}]}}"
  29. if _openprovider_rest PUT "$addzonerecordrequestparameters" "$addzonerecordrequestbody"; then
  30. if _contains "$response" "\"success\":true"; then
  31. return 0
  32. elif _contains "$response" "\"Duplicate record\""; then
  33. _debug "Record already existed"
  34. return 0
  35. else
  36. _err "Adding TXT record failed due to errors."
  37. return 1
  38. fi
  39. fi
  40. fi
  41. _err "Adding TXT record failed due to errors."
  42. return 1
  43. }
  44. # Usage: rm _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
  45. # Used to remove the txt record after validation
  46. dns_openprovider_rest_rm() {
  47. fulldomain=$1
  48. txtvalue=$2
  49. _openprovider_prepare_credentials || return 1
  50. _debug "Try fetch OpenProvider DNS zone details"
  51. if ! _get_dns_zone "$fulldomain"; then
  52. _err "DNS zone not found within configured OpenProvider account."
  53. return 1
  54. fi
  55. if [ -n "$_domain_id" ]; then
  56. removezonerecordrequestparameters="dns/zones/$_domain_name"
  57. removezonerecordrequestbody="{\"id\":$_domain_id,\"name\":\"$_domain_name\",\"records\":{\"remove\":[{\"name\":\"$_sub_domain\",\"ttl\":900,\"type\":\"TXT\",\"value\":\"\\\"$txtvalue\\\"\"}]}}"
  58. if _openprovider_rest PUT "$removezonerecordrequestparameters" "$removezonerecordrequestbody"; then
  59. if _contains "$response" "\"success\":true"; then
  60. return 0
  61. else
  62. _err "Removing TXT record failed due to errors."
  63. return 1
  64. fi
  65. fi
  66. fi
  67. _err "Removing TXT record failed due to errors."
  68. return 1
  69. }
  70. #################### OpenProvider API common functions ####################
  71. _openprovider_prepare_credentials() {
  72. OPENPROVIDER_REST_USERNAME="${OPENPROVIDER_REST_USERNAME:-$(_readaccountconf_mutable OPENPROVIDER_REST_USERNAME)}"
  73. OPENPROVIDER_REST_PASSWORD="${OPENPROVIDER_REST_PASSWORD:-$(_readaccountconf_mutable OPENPROVIDER_REST_PASSWORD)}"
  74. if [ -z "$OPENPROVIDER_REST_USERNAME" ] || [ -z "$OPENPROVIDER_REST_PASSWORD" ]; then
  75. OPENPROVIDER_REST_USERNAME=""
  76. OPENPROVIDER_REST_PASSWORD=""
  77. _err "You didn't specify the Openprovider username or password yet."
  78. return 1
  79. fi
  80. #save the credentials to the account conf file.
  81. _saveaccountconf_mutable OPENPROVIDER_REST_USERNAME "$OPENPROVIDER_REST_USERNAME"
  82. _saveaccountconf_mutable OPENPROVIDER_REST_PASSWORD "$OPENPROVIDER_REST_PASSWORD"
  83. }
  84. _openprovider_rest() {
  85. httpmethod=$1
  86. queryparameters=$2
  87. requestbody=$3
  88. _openprovider_rest_login
  89. if [ -z "$openproviderauthtoken" ]; then
  90. _err "Unable to fetch authentication token from Openprovider API."
  91. return 1
  92. fi
  93. export _H1="Content-Type: application/json"
  94. export _H2="Accept: application/json"
  95. export _H3="Authorization: Bearer $openproviderauthtoken"
  96. if [ "$httpmethod" != "GET" ]; then
  97. response="$(_post "$requestbody" "$OPENPROVIDER_API_URL/$queryparameters" "" "$httpmethod")"
  98. else
  99. response="$(_get "$OPENPROVIDER_API_URL/$queryparameters")"
  100. fi
  101. if [ "$?" != "0" ]; then
  102. _err "No valid parameters supplied for Openprovider API: Error $queryparameters"
  103. return 1
  104. fi
  105. _debug2 response "$response"
  106. return 0
  107. }
  108. _openprovider_rest_login() {
  109. export _H1="Content-Type: application/json"
  110. export _H2="Accept: application/json"
  111. loginrequesturl="$OPENPROVIDER_API_URL/auth/login"
  112. loginrequestbody="{\"ip\":\"0.0.0.0\",\"password\":\"$OPENPROVIDER_REST_PASSWORD\",\"username\":\"$OPENPROVIDER_REST_USERNAME\"}"
  113. loginresponse="$(_post "$loginrequestbody" "$loginrequesturl" "" "POST")"
  114. openproviderauthtoken="$(printf "%s\n" "$loginresponse" | _egrep_o '"token" *: *"[^"]*' | _head_n 1 | sed 's#^"token" *: *"##')"
  115. export openproviderauthtoken
  116. }
  117. #################### Private functions ##################################
  118. # Usage: _get_dns_zone _acme-challenge.www.domain.com
  119. # Returns:
  120. # _domain_id=123456789
  121. # _domain_name=domain.com
  122. # _sub_domain=_acme-challenge.www
  123. _get_dns_zone() {
  124. domain=$1
  125. i=1
  126. p=1
  127. while true; do
  128. h=$(printf "%s" "$domain" | cut -d . -f "$i"-100)
  129. if [ -z "$h" ]; then
  130. # Empty value not allowed
  131. return 1
  132. fi
  133. if ! _openprovider_rest GET "dns/zones/$h" ""; then
  134. return 1
  135. fi
  136. if _contains "$response" "\"name\":\"$h\""; then
  137. _domain_id="$(printf "%s\n" "$response" | _egrep_o '"id" *: *[^,]*' | _head_n 1 | sed 's#^"id" *: *##')"
  138. _debug _domain_id "$_domain_id"
  139. _domain_name="$h"
  140. _debug _domain_name "$_domain_name"
  141. _sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-"$p")
  142. _debug _sub_domain "$_sub_domain"
  143. return 0
  144. fi
  145. p=$i
  146. i=$(_math "$i" + 1)
  147. done
  148. return 1
  149. }