Merge branch 'dev' of https://github.com/Neilpang/acme.sh
						commit
						520c454f22
					
				| 
						 | 
				
			
			@ -315,6 +315,13 @@ You don't have to do anything manually!
 | 
			
		|||
1. Azure DNS
 | 
			
		||||
1. selectel.com(selectel.ru) DNS API
 | 
			
		||||
1. zonomi.com DNS API
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
And: 
 | 
			
		||||
 | 
			
		||||
1. lexicon DNS API: https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								acme.sh
								
								
								
								
							
							
						
						
									
										2
									
								
								acme.sh
								
								
								
								
							| 
						 | 
				
			
			@ -4545,7 +4545,7 @@ _installcert() {
 | 
			
		|||
      cat "$CERT_KEY_PATH" >"$_real_key"
 | 
			
		||||
    else
 | 
			
		||||
      cat "$CERT_KEY_PATH" >"$_real_key"
 | 
			
		||||
      chmod 700 "$_real_key"
 | 
			
		||||
      chmod 600 "$_real_key"
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -409,10 +409,13 @@ 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/
 | 
			
		||||
You need to set the HTTP API user ID and password credentials. See: https://www.cloudns.net/wiki/article/42/. For security reasons, it's recommended to use a sub user ID that only has access to the necessary zones, as a regular API user has access to your entire account.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
export CLOUDNS_AUTH_ID=XXXXX
 | 
			
		||||
# Use this for a sub auth ID
 | 
			
		||||
export CLOUDNS_SUB_AUTH_ID=XXXXX
 | 
			
		||||
# Use this for a regular auth ID
 | 
			
		||||
#export CLOUDNS_AUTH_ID=XXXXX
 | 
			
		||||
export CLOUDNS_AUTH_PASSWORD="YYYYYYYYY"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -585,7 +588,7 @@ For issues, please report to https://github.com/non7top/acme.sh/issues.
 | 
			
		|||
 | 
			
		||||
## 31. Use Hurricane Electric
 | 
			
		||||
 | 
			
		||||
Hurricane Electric doesn't have an API so just set your login credentials like so:
 | 
			
		||||
Hurricane Electric (https://dns.he.net/) doesn't have an API so just set your login credentials like so:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
export HE_Username="yourusername"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,7 +42,26 @@ dns_aws_add() {
 | 
			
		|||
  _debug _sub_domain "$_sub_domain"
 | 
			
		||||
  _debug _domain "$_domain"
 | 
			
		||||
 | 
			
		||||
  _aws_tmpl_xml="<ChangeResourceRecordSetsRequest xmlns=\"https://route53.amazonaws.com/doc/2013-04-01/\"><ChangeBatch><Changes><Change><Action>UPSERT</Action><ResourceRecordSet><Name>$fulldomain</Name><Type>TXT</Type><TTL>300</TTL><ResourceRecords><ResourceRecord><Value>\"$txtvalue\"</Value></ResourceRecord></ResourceRecords></ResourceRecordSet></Change></Changes></ChangeBatch></ChangeResourceRecordSetsRequest>"
 | 
			
		||||
  _info "Geting existing records for $fulldomain"
 | 
			
		||||
  if ! aws_rest GET "2013-04-01$_domain_id/rrset" "name=$fulldomain&type=TXT"; then
 | 
			
		||||
    return 1
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if _contains "$response" "<Name>$fulldomain.</Name>"; then
 | 
			
		||||
    _resource_record="$(echo "$response" | _egrep_o "<ResourceRecords.*</ResourceRecords>" | sed "s/<ResourceRecords>//" | sed "s#</ResourceRecords>##")"
 | 
			
		||||
    _debug "_resource_record" "$_resource_record"
 | 
			
		||||
  else
 | 
			
		||||
    _debug "single new add"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if [ "$_resource_record" ] && _contains "$response" "$txtvalue"; then
 | 
			
		||||
    _info "The txt record already exists, skip"
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  _debug "Adding records"
 | 
			
		||||
 | 
			
		||||
  _aws_tmpl_xml="<ChangeResourceRecordSetsRequest xmlns=\"https://route53.amazonaws.com/doc/2013-04-01/\"><ChangeBatch><Changes><Change><Action>UPSERT</Action><ResourceRecordSet><Name>$fulldomain</Name><Type>TXT</Type><TTL>300</TTL><ResourceRecords>$_resource_record<ResourceRecord><Value>\"$txtvalue\"</Value></ResourceRecord></ResourceRecords></ResourceRecordSet></Change></Changes></ChangeBatch></ChangeResourceRecordSetsRequest>"
 | 
			
		||||
 | 
			
		||||
  if aws_rest POST "2013-04-01$_domain_id/rrset/" "" "$_aws_tmpl_xml" && _contains "$response" "ChangeResourceRecordSetsResponse"; then
 | 
			
		||||
    _info "txt record updated success."
 | 
			
		||||
| 
						 | 
				
			
			@ -68,7 +87,20 @@ dns_aws_rm() {
 | 
			
		|||
  _debug _sub_domain "$_sub_domain"
 | 
			
		||||
  _debug _domain "$_domain"
 | 
			
		||||
 | 
			
		||||
  _aws_tmpl_xml="<ChangeResourceRecordSetsRequest xmlns=\"https://route53.amazonaws.com/doc/2013-04-01/\"><ChangeBatch><Changes><Change><Action>DELETE</Action><ResourceRecordSet><ResourceRecords><ResourceRecord><Value>\"$txtvalue\"</Value></ResourceRecord></ResourceRecords><Name>$fulldomain.</Name><Type>TXT</Type><TTL>300</TTL></ResourceRecordSet></Change></Changes></ChangeBatch></ChangeResourceRecordSetsRequest>"
 | 
			
		||||
  _info "Geting existing records for $fulldomain"
 | 
			
		||||
  if ! aws_rest GET "2013-04-01$_domain_id/rrset" "name=$fulldomain&type=TXT"; then
 | 
			
		||||
    return 1
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if _contains "$response" "<Name>$fulldomain.</Name>"; then
 | 
			
		||||
    _resource_record="$(echo "$response" | _egrep_o "<ResourceRecords.*</ResourceRecords>" | sed "s/<ResourceRecords>//" | sed "s#</ResourceRecords>##")"
 | 
			
		||||
    _debug "_resource_record" "$_resource_record"
 | 
			
		||||
  else
 | 
			
		||||
    _debug "no records exists, skip"
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  _aws_tmpl_xml="<ChangeResourceRecordSetsRequest xmlns=\"https://route53.amazonaws.com/doc/2013-04-01/\"><ChangeBatch><Changes><Change><Action>DELETE</Action><ResourceRecordSet><ResourceRecords>$_resource_record</ResourceRecords><Name>$fulldomain.</Name><Type>TXT</Type><TTL>300</TTL></ResourceRecordSet></Change></Changes></ChangeBatch></ChangeResourceRecordSetsRequest>"
 | 
			
		||||
 | 
			
		||||
  if aws_rest POST "2013-04-01$_domain_id/rrset/" "" "$_aws_tmpl_xml" && _contains "$response" "ChangeResourceRecordSetsResponse"; then
 | 
			
		||||
    _info "txt record deleted success."
 | 
			
		||||
| 
						 | 
				
			
			@ -87,7 +119,6 @@ _get_root() {
 | 
			
		|||
  p=1
 | 
			
		||||
 | 
			
		||||
  if aws_rest GET "2013-04-01/hostedzone"; then
 | 
			
		||||
    _debug "response" "$response"
 | 
			
		||||
    while true; do
 | 
			
		||||
      h=$(printf "%s" "$domain" | cut -d . -f $i-100)
 | 
			
		||||
      _debug2 "Checking domain: $h"
 | 
			
		||||
| 
						 | 
				
			
			@ -236,6 +267,7 @@ aws_rest() {
 | 
			
		|||
  fi
 | 
			
		||||
 | 
			
		||||
  _ret="$?"
 | 
			
		||||
  _debug2 response "$response"
 | 
			
		||||
  if [ "$_ret" = "0" ]; then
 | 
			
		||||
    if _contains "$response" "<ErrorResponse"; then
 | 
			
		||||
      _err "Response error:$response"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@
 | 
			
		|||
# Repository: https://github.com/ClouDNS/acme.sh/
 | 
			
		||||
 | 
			
		||||
#CLOUDNS_AUTH_ID=XXXXX
 | 
			
		||||
#CLOUDNS_SUB_AUTH_ID=XXXXX
 | 
			
		||||
#CLOUDNS_AUTH_PASSWORD="YYYYYYYYY"
 | 
			
		||||
CLOUDNS_API="https://api.cloudns.net"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -97,17 +98,19 @@ _dns_cloudns_init_check() {
 | 
			
		|||
  fi
 | 
			
		||||
 | 
			
		||||
  CLOUDNS_AUTH_ID="${CLOUDNS_AUTH_ID:-$(_readaccountconf_mutable CLOUDNS_AUTH_ID)}"
 | 
			
		||||
  CLOUDNS_SUB_AUTH_ID="${CLOUDNS_SUB_AUTH_ID:-$(_readaccountconf_mutable CLOUDNS_SUB_AUTH_ID)}"
 | 
			
		||||
  CLOUDNS_AUTH_PASSWORD="${CLOUDNS_AUTH_PASSWORD:-$(_readaccountconf_mutable CLOUDNS_AUTH_PASSWORD)}"
 | 
			
		||||
  if [ -z "$CLOUDNS_AUTH_ID" ] || [ -z "$CLOUDNS_AUTH_PASSWORD" ]; then
 | 
			
		||||
  if [ -z "$CLOUDNS_AUTH_ID$CLOUDNS_SUB_AUTH_ID" ] || [ -z "$CLOUDNS_AUTH_PASSWORD" ]; then
 | 
			
		||||
    CLOUDNS_AUTH_ID=""
 | 
			
		||||
    CLOUDNS_SUB_AUTH_ID=""
 | 
			
		||||
    CLOUDNS_AUTH_PASSWORD=""
 | 
			
		||||
    _err "You don't specify cloudns api id and password yet."
 | 
			
		||||
    _err "Please create you id and password and try again."
 | 
			
		||||
    return 1
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if [ -z "$CLOUDNS_AUTH_ID" ]; then
 | 
			
		||||
    _err "CLOUDNS_AUTH_ID is not configured"
 | 
			
		||||
  if [ -z "$CLOUDNS_AUTH_ID" ] && [ -z "$CLOUDNS_SUB_AUTH_ID" ]; then
 | 
			
		||||
    _err "CLOUDNS_AUTH_ID or CLOUDNS_SUB_AUTH_ID is not configured"
 | 
			
		||||
    return 1
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -125,6 +128,7 @@ _dns_cloudns_init_check() {
 | 
			
		|||
 | 
			
		||||
  #save the api id and password to the account conf file.
 | 
			
		||||
  _saveaccountconf_mutable CLOUDNS_AUTH_ID "$CLOUDNS_AUTH_ID"
 | 
			
		||||
  _saveaccountconf_mutable CLOUDNS_SUB_AUTH_ID "$CLOUDNS_SUB_AUTH_ID"
 | 
			
		||||
  _saveaccountconf_mutable CLOUDNS_AUTH_PASSWORD "$CLOUDNS_AUTH_PASSWORD"
 | 
			
		||||
 | 
			
		||||
  CLOUDNS_INIT_CHECK_COMPLETED=1
 | 
			
		||||
| 
						 | 
				
			
			@ -168,12 +172,19 @@ _dns_cloudns_http_api_call() {
 | 
			
		|||
  method=$1
 | 
			
		||||
 | 
			
		||||
  _debug CLOUDNS_AUTH_ID "$CLOUDNS_AUTH_ID"
 | 
			
		||||
  _debug CLOUDNS_SUB_AUTH_ID "$CLOUDNS_SUB_AUTH_ID"
 | 
			
		||||
  _debug CLOUDNS_AUTH_PASSWORD "$CLOUDNS_AUTH_PASSWORD"
 | 
			
		||||
 | 
			
		||||
  if [ -z "$2" ]; then
 | 
			
		||||
    data="auth-id=$CLOUDNS_AUTH_ID&auth-password=$CLOUDNS_AUTH_PASSWORD"
 | 
			
		||||
  if [ ! -z "$CLOUDNS_SUB_AUTH_ID" ]; then
 | 
			
		||||
    auth_user="sub-auth-id=$CLOUDNS_SUB_AUTH_ID"
 | 
			
		||||
  else
 | 
			
		||||
    data="auth-id=$CLOUDNS_AUTH_ID&auth-password=$CLOUDNS_AUTH_PASSWORD&$2"
 | 
			
		||||
    auth_user="auth-id=$CLOUDNS_AUTH_ID"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if [ -z "$2" ]; then
 | 
			
		||||
    data="$auth_user&auth-password=$CLOUDNS_AUTH_PASSWORD"
 | 
			
		||||
  else
 | 
			
		||||
    data="$auth_user&auth-password=$CLOUDNS_AUTH_PASSWORD&$2"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  response="$(_get "$CLOUDNS_API/$method?$data")"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,33 +36,18 @@ dns_cx_add() {
 | 
			
		|||
    return 1
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  existing_records "$_domain" "$_sub_domain"
 | 
			
		||||
  _debug count "$count"
 | 
			
		||||
  if [ "$?" != "0" ]; then
 | 
			
		||||
    _err "Error get existing records."
 | 
			
		||||
    return 1
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if [ "$count" = "0" ]; then
 | 
			
		||||
    add_record "$_domain" "$_sub_domain" "$txtvalue"
 | 
			
		||||
  else
 | 
			
		||||
    update_record "$_domain" "$_sub_domain" "$txtvalue"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if [ "$?" = "0" ]; then
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
  return 1
 | 
			
		||||
  add_record "$_domain" "$_sub_domain" "$txtvalue"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#fulldomain
 | 
			
		||||
#fulldomain txtvalue
 | 
			
		||||
dns_cx_rm() {
 | 
			
		||||
  fulldomain=$1
 | 
			
		||||
  txtvalue=$2
 | 
			
		||||
  REST_API="$CX_Api"
 | 
			
		||||
  if _get_root "$fulldomain"; then
 | 
			
		||||
    record_id=""
 | 
			
		||||
    existing_records "$_domain" "$_sub_domain"
 | 
			
		||||
    if ! [ "$record_id" = "" ]; then
 | 
			
		||||
    existing_records "$_domain" "$_sub_domain" "$txtvalue"
 | 
			
		||||
    if [ "$record_id" ]; then
 | 
			
		||||
      _rest DELETE "record/$record_id/$_domain_id" "{}"
 | 
			
		||||
      _info "Deleted record ${fulldomain}"
 | 
			
		||||
    fi
 | 
			
		||||
| 
						 | 
				
			
			@ -89,7 +74,6 @@ existing_records() {
 | 
			
		|||
  fi
 | 
			
		||||
 | 
			
		||||
  if printf "%s" "$response" | grep '"type":"TXT"' >/dev/null; then
 | 
			
		||||
    count=1
 | 
			
		||||
    record_id=$(printf "%s\n" "$seg" | _egrep_o '"record_id":"[^"]*"' | cut -d : -f 2 | tr -d \" | _head_n 1)
 | 
			
		||||
    _debug record_id "$record_id"
 | 
			
		||||
    return 0
 | 
			
		||||
| 
						 | 
				
			
			@ -114,23 +98,6 @@ add_record() {
 | 
			
		|||
  return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#update the txt record
 | 
			
		||||
#Usage: root sub txtvalue
 | 
			
		||||
update_record() {
 | 
			
		||||
  root=$1
 | 
			
		||||
  sub=$2
 | 
			
		||||
  txtvalue=$3
 | 
			
		||||
  fulldomain="$sub.$root"
 | 
			
		||||
 | 
			
		||||
  _info "Updating record"
 | 
			
		||||
 | 
			
		||||
  if _rest PUT "record/$record_id" "{\"domain_id\": $_domain_id, \"host\":\"$_sub_domain\", \"value\":\"$txtvalue\", \"type\":\"TXT\",\"ttl\":600, \"line_id\":1}"; then
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  return 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
####################  Private functions below ##################################
 | 
			
		||||
#_acme-challenge.www.domain.com
 | 
			
		||||
#returns
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,14 +19,16 @@ dns_he_add() {
 | 
			
		|||
  _txt_value=$2
 | 
			
		||||
  _info "Using DNS-01 Hurricane Electric hook"
 | 
			
		||||
 | 
			
		||||
  HE_Username="${HE_Username:-$(_readaccountconf_mutable HE_Username)}"
 | 
			
		||||
  HE_Password="${HE_Password:-$(_readaccountconf_mutable HE_Password)}"
 | 
			
		||||
  if [ -z "$HE_Username" ] || [ -z "$HE_Password" ]; then
 | 
			
		||||
    HE_Username=
 | 
			
		||||
    HE_Password=
 | 
			
		||||
    _err "No auth details provided. Please set user credentials using the \$HE_Username and \$HE_Password envoronment variables."
 | 
			
		||||
    return 1
 | 
			
		||||
  fi
 | 
			
		||||
  _saveaccountconf HE_Username "$HE_Username"
 | 
			
		||||
  _saveaccountconf HE_Password "$HE_Password"
 | 
			
		||||
  _saveaccountconf_mutable HE_Username "$HE_Username"
 | 
			
		||||
  _saveaccountconf_mutable HE_Password "$HE_Password"
 | 
			
		||||
 | 
			
		||||
  # Fills in the $_zone_id
 | 
			
		||||
  _find_zone "$_full_domain" || return 1
 | 
			
		||||
| 
						 | 
				
			
			@ -62,7 +64,8 @@ dns_he_rm() {
 | 
			
		|||
  _full_domain=$1
 | 
			
		||||
  _txt_value=$2
 | 
			
		||||
  _info "Cleaning up after DNS-01 Hurricane Electric hook"
 | 
			
		||||
 | 
			
		||||
  HE_Username="${HE_Username:-$(_readaccountconf_mutable HE_Username)}"
 | 
			
		||||
  HE_Password="${HE_Password:-$(_readaccountconf_mutable HE_Password)}"
 | 
			
		||||
  # fills in the $_zone_id
 | 
			
		||||
  _find_zone "$_full_domain" || return 1
 | 
			
		||||
  _debug "Zone id \"$_zone_id\" will be used."
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue