mirror of
				https://github.com/hiskang/acme.sh
				synced 2025-10-31 02:17:18 +00:00 
			
		
		
		
	Merge pull request #1319 from TigerP/master
Add support for DirectAdmin
This commit is contained in:
		
						commit
						20e51f0b4d
					
				| @ -327,6 +327,7 @@ You don't have to do anything manually! | ||||
| 1. selectel.com(selectel.ru) DNS API | ||||
| 1. zonomi.com DNS API | ||||
| 1. DreamHost.com API | ||||
| 1. DirectAdmin API | ||||
| 
 | ||||
| 
 | ||||
| And:  | ||||
|  | ||||
| @ -757,6 +757,34 @@ acme.sh --issue --dns dns_dreamhost -d example.com -d www.example.com | ||||
| The 'DH_API_KEY' will be saved in `~/.acme.sh/account.conf` and will | ||||
| be reused when needed. | ||||
| 
 | ||||
| ## 41. Use DirectAdmin API | ||||
| The DirectAdmin interface has it's own Let's encrypt functionality, but this | ||||
| script can be used to generate certificates for names which are not hosted on | ||||
| DirectAdmin | ||||
| 
 | ||||
| User must provide login data and URL to the DirectAdmin incl. port. | ||||
| You can create an user which only has access to | ||||
| 
 | ||||
| - CMD_API_DNS_CONTROL | ||||
| - CMD_API_SHOW_DOMAINS | ||||
| 
 | ||||
| By using the Login Keys function. | ||||
| See also https://www.directadmin.com/api.php and https://www.directadmin.com/features.php?id=1298 | ||||
| 
 | ||||
| ``` | ||||
| export DA_Api="https://remoteUser:remotePassword@da.domain.tld:8443" | ||||
| export DA_Api_Insecure=1 | ||||
| ``` | ||||
| Set `DA_Api_Insecure` to 1 for insecure and 0 for secure -> difference is whether ssl cert is checked for validity (0) or whether it is just accepted (1) | ||||
| 
 | ||||
| Ok, let's issue a cert now: | ||||
| ``` | ||||
| acme.sh --issue --dns dns_da -d example.com -d www.example.com | ||||
| ``` | ||||
| 
 | ||||
| The `DA_Api` and `DA_Api_Insecure` will be saved in `~/.acme.sh/account.conf` and will be reused when needed. | ||||
| 
 | ||||
| 
 | ||||
| # Use custom API | ||||
| 
 | ||||
| If your API is not supported yet, you can write your own DNS API. | ||||
|  | ||||
							
								
								
									
										184
									
								
								dnsapi/dns_da.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										184
									
								
								dnsapi/dns_da.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,184 @@ | ||||
| #!/usr/bin/env sh | ||||
| # -*- mode: sh; tab-width: 2; indent-tabs-mode: s; coding: utf-8 -*- | ||||
| # vim: et ts=2 sw=2 | ||||
| # | ||||
| # DirectAdmin 1.41.0 API | ||||
| # The DirectAdmin interface has it's own Let's encrypt functionality, but this | ||||
| # script can be used to generate certificates for names which are not hosted on | ||||
| # DirectAdmin | ||||
| # | ||||
| # User must provide login data and URL to DirectAdmin incl. port. | ||||
| # You can create login key, by using the Login Keys function | ||||
| # ( https://da.example.com:8443/CMD_LOGIN_KEYS ), which only has access to  | ||||
| # - CMD_API_DNS_CONTROL | ||||
| # - CMD_API_SHOW_DOMAINS | ||||
| # | ||||
| # See also https://www.directadmin.com/api.php and | ||||
| # https://www.directadmin.com/features.php?id=1298 | ||||
| # | ||||
| # Report bugs to https://github.com/TigerP/acme.sh/issues | ||||
| # | ||||
| # Values to export: | ||||
| # export DA_Api="https://remoteUser:remotePassword@da.example.com:8443" | ||||
| # export DA_Api_Insecure=1 | ||||
| # | ||||
| # Set DA_Api_Insecure to 1 for insecure and 0 for secure -> difference is | ||||
| # whether ssl cert is checked for validity (0) or whether it is just accepted | ||||
| # (1) | ||||
| # | ||||
| ########  Public functions ##################### | ||||
| 
 | ||||
| # Usage: dns_myapi_add  _acme-challenge.www.example.com  "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs" | ||||
| # Used to add txt record | ||||
| dns_da_add() { | ||||
|   fulldomain="${1}" | ||||
|   txtvalue="${2}" | ||||
|   _debug "Calling: dns_da_add() '${fulldomain}' '${txtvalue}'" | ||||
|   _DA_credentials && _DA_getDomainInfo && _DA_addTxt | ||||
| } | ||||
| 
 | ||||
| # Usage: dns_da_rm  _acme-challenge.www.example.com  "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs" | ||||
| # Used to remove the txt record after validation | ||||
| dns_da_rm() { | ||||
|   fulldomain="${1}" | ||||
|   txtvalue="${2}" | ||||
|   _debug "Calling: dns_da_rm() '${fulldomain}' '${txtvalue}'" | ||||
|   _DA_credentials && _DA_getDomainInfo && _DA_rmTxt | ||||
| } | ||||
| 
 | ||||
| ####################  Private functions below ################################## | ||||
| # Usage: _DA_credentials | ||||
| # It will check if the needed settings are available | ||||
| _DA_credentials() { | ||||
|   DA_Api="${DA_Api:-$(_readaccountconf_mutable DA_Api)}" | ||||
|   DA_Api_Insecure="${DA_Api_Insecure:-$(_readaccountconf_mutable DA_Api_Insecure)}" | ||||
|   if [ -z "${DA_Api}" ] || [ -z "${DA_Api_Insecure}" ]; then | ||||
|     DA_Api="" | ||||
|     DA_Api_Insecure="" | ||||
|     _err "You haven't specified the DirectAdmin Login data, URL and whether you want check the DirectAdmin SSL cert. Please try again." | ||||
|     return 1 | ||||
|   else | ||||
|     _saveaccountconf_mutable DA_Api "${DA_Api}" | ||||
|     _saveaccountconf_mutable DA_Api_Insecure "${DA_Api_Insecure}" | ||||
|     # Set whether curl should use secure or insecure mode | ||||
|     export HTTPS_INSECURE="${DA_Api_Insecure}" | ||||
|   fi | ||||
| } | ||||
| 
 | ||||
| # Usage: _get_root _acme-challenge.www.example.com | ||||
| # Split the full domain to a domain and subdomain | ||||
| #returns | ||||
| # _sub_domain=_acme-challenge.www | ||||
| # _domain=example.com | ||||
| _get_root() { | ||||
|   domain=$1 | ||||
|   i=2 | ||||
|   p=1 | ||||
|   # Get a list of all the domains | ||||
|   # response will contain "list[]=example.com&list[]=example.org" | ||||
|   _da_api CMD_API_SHOW_DOMAINS "" "${domain}" | ||||
|   while true; do | ||||
|     h=$(printf "%s" "$domain" | cut -d . -f $i-100) | ||||
|     _debug h "$h" | ||||
|     if [ -z "$h" ]; then | ||||
|       # not valid | ||||
|       _debug "The given domain $h is not valid" | ||||
|       return 1 | ||||
|     fi | ||||
|     if _contains "$response" "$h" >/dev/null; then | ||||
|       _sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p) | ||||
|       _domain=$h | ||||
|       return 0 | ||||
|     fi | ||||
|     p=$i | ||||
|     i=$(_math "$i" + 1) | ||||
|   done | ||||
|   _debug "Stop on 100" | ||||
|   return 1 | ||||
| } | ||||
| 
 | ||||
| # Usage: _da_api CMD_API_* data example.com | ||||
| # Use the DirectAdmin API and check the result | ||||
| # returns | ||||
| #  response="error=0&text=Result text&details=" | ||||
| _da_api() { | ||||
|   cmd=$1 | ||||
|   data=$2 | ||||
|   domain=$3 | ||||
|   _debug "$domain; $data" | ||||
|   response="$(_post "$data" "$DA_Api/$cmd" "" "POST")" | ||||
| 
 | ||||
|   if [ "$?" != "0" ]; then | ||||
|     _err "error $cmd" | ||||
|     return 1 | ||||
|   fi | ||||
|   _debug response "$response" | ||||
| 
 | ||||
|   case "${cmd}" in | ||||
|     CMD_API_DNS_CONTROL) | ||||
|       # Parse the result in general | ||||
|       # error=0&text=Records Deleted&details= | ||||
|       # error=1&text=Cannot View Dns Record&details=No domain provided | ||||
|       err_field="$(_getfield "$response" 1 '&')" | ||||
|       txt_field="$(_getfield "$response" 2 '&')" | ||||
|       details_field="$(_getfield "$response" 3 '&')" | ||||
|       error="$(_getfield "$err_field" 2 '=')" | ||||
|       text="$(_getfield "$txt_field" 2 '=')" | ||||
|       details="$(_getfield "$details_field" 2 '=')" | ||||
|       _debug "error: ${error}, text: ${text}, details: ${details}" | ||||
|       if [ "$error" != "0" ]; then | ||||
|         _err "error $response" | ||||
|         return 1 | ||||
|       fi | ||||
|       ;; | ||||
|     CMD_API_SHOW_DOMAINS) ;; | ||||
|   esac | ||||
|   return 0 | ||||
| } | ||||
| 
 | ||||
| # Usage: _DA_getDomainInfo | ||||
| # Get the root zone if possible | ||||
| _DA_getDomainInfo() { | ||||
|   _debug "First detect the root zone" | ||||
|   if ! _get_root "$fulldomain"; then | ||||
|     _err "invalid domain" | ||||
|     return 1 | ||||
|   else | ||||
|     _debug "The root domain: $_domain" | ||||
|     _debug "The sub domain: $_sub_domain" | ||||
|   fi | ||||
|   return 0 | ||||
| } | ||||
| 
 | ||||
| # Usage: _DA_addTxt | ||||
| # Use the API to add a record | ||||
| _DA_addTxt() { | ||||
|   curData="domain=${_domain}&action=add&type=TXT&name=${_sub_domain}&value=\"${txtvalue}\"" | ||||
|   _debug "Calling _DA_addTxt: '${curData}' '${DA_Api}/CMD_API_DNS_CONTROL'" | ||||
|   _da_api CMD_API_DNS_CONTROL "${curData}" "${_domain}" | ||||
|   _debug "Result of _DA_addTxt: '$response'" | ||||
|   if _contains "${response}" 'error=0'; then | ||||
|     _debug "Add TXT succeeded" | ||||
|     return 0 | ||||
|   fi | ||||
|   _debug "Add TXT failed" | ||||
|   return 1 | ||||
| } | ||||
| 
 | ||||
| # Usage: _DA_rmTxt | ||||
| # Use the API to remove a record | ||||
| _DA_rmTxt() { | ||||
|   curData="domain=${_domain}&action=select&txtrecs0=name=${_sub_domain}&value=\"${txtvalue}\"" | ||||
|   _debug "Calling _DA_rmTxt: '${curData}' '${DA_Api}/CMD_API_DNS_CONTROL'" | ||||
|   if _da_api CMD_API_DNS_CONTROL "${curData}" "${_domain}"; then | ||||
|     _debug "Result of _DA_rmTxt: '$response'" | ||||
|   else | ||||
|     _err "Result of _DA_rmTxt: '$response'" | ||||
|   fi | ||||
|   if _contains "${response}" 'error=0'; then | ||||
|     _debug "RM TXT succeeded" | ||||
|     return 0 | ||||
|   fi | ||||
|   _debug "RM TXT failed" | ||||
|   return 1 | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user