mirror of
				https://github.com/hiskang/acme.sh
				synced 2025-10-31 10:27:22 +00:00 
			
		
		
		
	Merge pull request #723 from ClouDNS/master
Add DNS API support for ClouDNS
This commit is contained in:
		
						commit
						7479706b29
					
				| @ -309,6 +309,7 @@ You don't have to do anything manually! | ||||
| 1. Gandi LiveDNS API | ||||
| 1. Knot DNS API | ||||
| 1. DigitalOcean API (native) | ||||
| 1. ClouDNS.net API | ||||
| 
 | ||||
| **More APIs coming soon...** | ||||
| 
 | ||||
|  | ||||
| @ -407,6 +407,20 @@ Ok, let's issue a cert now: | ||||
| acme.sh --issue --dns dns_dgon -d example.com -d www.example.com | ||||
| ``` | ||||
| 
 | ||||
| ## 21. Use ClouDNS.net API | ||||
| 
 | ||||
| You need to set the HTTP API user ID and password credentials. See: https://www.cloudns.net/wiki/article/42/ | ||||
| 
 | ||||
| ``` | ||||
| export CLOUDNS_AUTH_ID=XXXXX | ||||
| export CLOUDNS_AUTH_PASSWORD="YYYYYYYYY" | ||||
| ``` | ||||
| 
 | ||||
| Ok, let's issue a cert now: | ||||
| ``` | ||||
| acme.sh --issue --dns dns_cloudns -d example.com -d www.example.com | ||||
| ``` | ||||
| 
 | ||||
| # Use custom API | ||||
| 
 | ||||
| If your API is not supported yet, you can write your own DNS API. | ||||
|  | ||||
							
								
								
									
										170
									
								
								dnsapi/dns_cloudns.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										170
									
								
								dnsapi/dns_cloudns.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,170 @@ | ||||
| #!/usr/bin/env sh | ||||
| 
 | ||||
| # Author: Boyan Peychev <boyan at cloudns dot net> | ||||
| # Repository: https://github.com/ClouDNS/acme.sh/ | ||||
| 
 | ||||
| #CLOUDNS_AUTH_ID=XXXXX | ||||
| #CLOUDNS_AUTH_PASSWORD="YYYYYYYYY" | ||||
| CLOUDNS_API="https://api.cloudns.net" | ||||
| 
 | ||||
| ########  Public functions ##################### | ||||
| 
 | ||||
| #Usage: dns_cloudns_add   _acme-challenge.www.domain.com   "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs" | ||||
| dns_cloudns_add() { | ||||
|   _info "Using cloudns" | ||||
| 
 | ||||
|   if ! _dns_cloudns_init_check; then | ||||
|     return 1 | ||||
|   fi | ||||
| 
 | ||||
|   zone="$(_dns_cloudns_get_zone_name "$1")" | ||||
|   if [ -z "$zone" ]; then | ||||
|     _err "Missing DNS zone at ClouDNS. Please log into your control panel and create the required DNS zone for the initial setup." | ||||
|     return 1 | ||||
|   fi | ||||
| 
 | ||||
|   host="$(echo "$1" | sed "s/\.$zone\$//")" | ||||
|   record=$2 | ||||
|   record_id=$(_dns_cloudns_get_record_id "$zone" "$host") | ||||
| 
 | ||||
|   _debug zone "$zone" | ||||
|   _debug host "$host" | ||||
|   _debug record "$record" | ||||
|   _debug record_id "$record_id" | ||||
| 
 | ||||
|   if [ -z "$record_id" ]; then | ||||
|     _info "Adding the TXT record for $1" | ||||
|     _dns_cloudns_http_api_call "dns/add-record.json" "domain-name=$zone&record-type=TXT&host=$host&record=$record&ttl=60" | ||||
|     if ! _contains "$response" "\"status\":\"Success\""; then | ||||
|       _err "Record cannot be added." | ||||
|       return 1 | ||||
|     fi | ||||
|     _info "Added." | ||||
|   else | ||||
|     _info "Updating the TXT record for $1" | ||||
|     _dns_cloudns_http_api_call "dns/mod-record.json" "domain-name=$zone&record-id=$record_id&record-type=TXT&host=$host&record=$record&ttl=60" | ||||
|     if ! _contains "$response" "\"status\":\"Success\""; then | ||||
|       _err "The TXT record for $1 cannot be updated." | ||||
|       return 1 | ||||
|     fi | ||||
|     _info "Updated." | ||||
|   fi | ||||
| 
 | ||||
|   return 0 | ||||
| } | ||||
| 
 | ||||
| #Usage: dns_cloudns_rm   _acme-challenge.www.domain.com   "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs" | ||||
| dns_cloudns_rm() { | ||||
|   _info "Using cloudns" | ||||
| 
 | ||||
|   if ! _dns_cloudns_init_check; then | ||||
|     return 1 | ||||
|   fi | ||||
| 
 | ||||
|   if [ -z "$zone" ]; then | ||||
|     zone="$(_dns_cloudns_get_zone_name "$1")" | ||||
|     if [ -z "$zone" ]; then | ||||
|       _err "Missing DNS zone at ClouDNS. Please log into your control panel and create the required DNS zone for the initial setup." | ||||
|       return 1 | ||||
|     fi | ||||
|   fi | ||||
| 
 | ||||
|   host="$(echo "$1" | sed "s/\.$zone\$//")" | ||||
|   record=$2 | ||||
|   record_id=$(_dns_cloudns_get_record_id "$zone" "$host") | ||||
| 
 | ||||
|   _debug zone "$zone" | ||||
|   _debug host "$host" | ||||
|   _debug record "$record" | ||||
|   _debug record_id "$record_id" | ||||
| 
 | ||||
|   if [ ! -z "$record_id" ]; then | ||||
|     _info "Deleting the TXT record for $1" | ||||
|     _dns_cloudns_http_api_call "dns/delete-record.json" "domain-name=$zone&record-id=$record_id" | ||||
|     if ! _contains "$response" "\"status\":\"Success\""; then | ||||
|       _err "The TXT record for $1 cannot be deleted." | ||||
|       return 1 | ||||
|     fi | ||||
|     _info "Deleted." | ||||
|   fi | ||||
|   return 0 | ||||
| } | ||||
| 
 | ||||
| ####################  Private functions below ################################## | ||||
| _dns_cloudns_init_check() { | ||||
|   if [ ! -z "$CLOUDNS_INIT_CHECK_COMPLETED" ]; then | ||||
|     return 0 | ||||
|   fi | ||||
| 
 | ||||
|   if [ -z "$CLOUDNS_AUTH_ID" ]; then | ||||
|     _err "CLOUDNS_AUTH_ID is not configured" | ||||
|     return 1 | ||||
|   fi | ||||
| 
 | ||||
|   if [ -z "$CLOUDNS_AUTH_PASSWORD" ]; then | ||||
|     _err "CLOUDNS_AUTH_PASSWORD is not configured" | ||||
|     return 1 | ||||
|   fi | ||||
| 
 | ||||
|   _dns_cloudns_http_api_call "dns/login.json" "" | ||||
| 
 | ||||
|   if ! _contains "$response" "\"status\":\"Success\""; then | ||||
|     _err "Invalid CLOUDNS_AUTH_ID or CLOUDNS_AUTH_PASSWORD. Please check your login credentials." | ||||
|     return 1 | ||||
|   fi | ||||
| 
 | ||||
|   CLOUDNS_INIT_CHECK_COMPLETED=1 | ||||
| 
 | ||||
|   return 0 | ||||
| } | ||||
| 
 | ||||
| _dns_cloudns_get_zone_name() { | ||||
|   i=2 | ||||
|   while true; do | ||||
|     zoneForCheck=$(printf "%s" "$1" | cut -d . -f $i-100) | ||||
| 
 | ||||
|     if [ -z "$zoneForCheck" ]; then | ||||
|       return 1 | ||||
|     fi | ||||
| 
 | ||||
|     _debug zoneForCheck "$zoneForCheck" | ||||
| 
 | ||||
|     _dns_cloudns_http_api_call "dns/get-zone-info.json" "domain-name=$zoneForCheck" | ||||
| 
 | ||||
|     if ! _contains "$response" "\"status\":\"Failed\""; then | ||||
|       echo "$zoneForCheck" | ||||
|       return 0 | ||||
|     fi | ||||
| 
 | ||||
|     i=$(_math "$i" + 1) | ||||
|   done | ||||
|   return 1 | ||||
| } | ||||
| 
 | ||||
| _dns_cloudns_get_record_id() { | ||||
|   _dns_cloudns_http_api_call "dns/records.json" "domain-name=$1&host=$2&type=TXT" | ||||
|   if _contains "$response" "\"id\":"; then | ||||
|     echo "$response" | cut -d '"' -f 2 | ||||
|     return 0 | ||||
|   fi | ||||
|   return 1 | ||||
| } | ||||
| 
 | ||||
| _dns_cloudns_http_api_call() { | ||||
|   method=$1 | ||||
| 
 | ||||
|   _debug CLOUDNS_AUTH_ID "$CLOUDNS_AUTH_ID" | ||||
|   _debug CLOUDNS_AUTH_PASSWORD "$CLOUDNS_AUTH_PASSWORD" | ||||
| 
 | ||||
|   if [ -z "$2" ]; then | ||||
|     data="auth-id=$CLOUDNS_AUTH_ID&auth-password=$CLOUDNS_AUTH_PASSWORD" | ||||
|   else | ||||
|     data="auth-id=$CLOUDNS_AUTH_ID&auth-password=$CLOUDNS_AUTH_PASSWORD&$2" | ||||
|   fi | ||||
| 
 | ||||
|   response="$(_get "$CLOUDNS_API/$method?$data")" | ||||
| 
 | ||||
|   _debug2 response "$response" | ||||
| 
 | ||||
|   return 0 | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user