You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
3.6 KiB
149 lines
3.6 KiB
#!/usr/bin/env sh
|
|
# shellcheck disable=SC2034
|
|
|
|
dns_yc_info='Yandex Cloud DNS
|
|
Site: Cloud.Yandex.com
|
|
Docs: github.com/acmesh-official/acme.sh/wiki/dnsapi2#dns_yc
|
|
Options:
|
|
YC_Zone_ID DNS Zone ID
|
|
YC_Folder_ID YC Folder ID
|
|
YC_SA_ID Service Account ID
|
|
YC_SA_Key_ID Service Account IAM Key ID
|
|
YC_SA_Key_File_Path Private key file path. Optional.
|
|
YC_SA_Key_File_PEM_b64 Base64 content of private key file. Optional.
|
|
Issues: github.com/acmesh-official/acme.sh/issues/4210
|
|
'
|
|
|
|
YC_Api="https://dns.api.cloud.yandex.net/dns/v1"
|
|
|
|
########################
|
|
# add
|
|
########################
|
|
|
|
dns_yc_add() {
|
|
fulldomain="$(echo "$1" | _lower_case)"
|
|
txtvalue="$2"
|
|
|
|
_yc_init || return 1
|
|
|
|
_debug "Detect root zone"
|
|
_get_root "$fulldomain" || return 1
|
|
|
|
_debug "Fetching existing TXT"
|
|
_yc_rest GET "zones/${_domain_id}:getRecordSet?type=TXT&name=$_sub_domain" || return 1
|
|
|
|
existing="$(_yc_extract_data_array)"
|
|
|
|
newdata="$(_yc_array_add "$existing" "$txtvalue")"
|
|
|
|
_info "Adding TXT record"
|
|
_yc_rest POST "zones/${_domain_id}:upsertRecordSets" \
|
|
"{\"merges\":[{\"name\":\"$_sub_domain\",\"type\":\"TXT\",\"ttl\":\"60\",\"data\":$newdata}]}" \
|
|
|| return 1
|
|
|
|
_contains "$response" "\"done\": true" || return 1
|
|
|
|
return 0
|
|
}
|
|
|
|
########################
|
|
# rm
|
|
########################
|
|
|
|
dns_yc_rm() {
|
|
fulldomain="$(echo "$1" | _lower_case)"
|
|
txtvalue="$2"
|
|
|
|
_yc_init || return 1
|
|
|
|
_get_root "$fulldomain" || return 1
|
|
|
|
_yc_rest GET "zones/${_domain_id}:getRecordSet?type=TXT&name=$_sub_domain" || return 1
|
|
|
|
existing="$(_yc_extract_data_array)"
|
|
|
|
[ -z "$existing" ] && return 0
|
|
|
|
newdata="$(_yc_array_remove "$existing" "$txtvalue")"
|
|
|
|
if [ "$newdata" = "$existing" ]; then
|
|
return 0
|
|
fi
|
|
|
|
if [ "$newdata" = "[]" ]; then
|
|
_yc_rest POST "zones/${_domain_id}:updateRecordSets" \
|
|
"{\"deletions\":[{\"name\":\"$_sub_domain\",\"type\":\"TXT\",\"ttl\":\"60\",\"data\":$existing}]}" \
|
|
|| return 1
|
|
else
|
|
_yc_rest POST "zones/${_domain_id}:upsertRecordSets" \
|
|
"{\"merges\":[{\"name\":\"$_sub_domain\",\"type\":\"TXT\",\"ttl\":\"60\",\"data\":$newdata}]}" \
|
|
|| return 1
|
|
fi
|
|
|
|
_contains "$response" "\"done\": true" || return 1
|
|
|
|
return 0
|
|
}
|
|
|
|
########################
|
|
# internal helpers
|
|
########################
|
|
|
|
_yc_init() {
|
|
|
|
YC_SA_ID="${YC_SA_ID:-$(_readaccountconf_mutable YC_SA_ID)}"
|
|
YC_SA_Key_ID="${YC_SA_Key_ID:-$(_readaccountconf_mutable YC_SA_Key_ID)}"
|
|
YC_Zone_ID="${YC_Zone_ID:-$(_readaccountconf_mutable YC_Zone_ID)}"
|
|
YC_Folder_ID="${YC_Folder_ID:-$(_readaccountconf_mutable YC_Folder_ID)}"
|
|
YC_SA_Key_File_Path="${YC_SA_Key_File_Path:-$(_readaccountconf_mutable YC_SA_Key_File_Path)}"
|
|
YC_SA_Key_File_PEM_b64="${YC_SA_Key_File_PEM_b64:-$(_readaccountconf_mutable YC_SA_Key_File_PEM_b64)}"
|
|
|
|
[ -z "$YC_SA_ID" ] && return 1
|
|
[ -z "$YC_SA_Key_ID" ] && return 1
|
|
|
|
if [ "$YC_SA_Key_File_PEM_b64" ]; then
|
|
tmpkey="$(_mktemp)"
|
|
echo "$YC_SA_Key_File_PEM_b64" | _dbase64 > "$tmpkey"
|
|
chmod 600 "$tmpkey"
|
|
YC_SA_Key_File="$tmpkey"
|
|
else
|
|
YC_SA_Key_File="$YC_SA_Key_File_Path"
|
|
fi
|
|
|
|
[ ! -f "$YC_SA_Key_File" ] && return 1
|
|
|
|
return 0
|
|
}
|
|
|
|
_yc_extract_data_array() {
|
|
echo "$response" | _normalizeJson | _egrep_o "\"data\":\\[[^\\]]*\\]" | _egrep_o "\\[[^\\]]*\\]"
|
|
}
|
|
|
|
_yc_array_add() {
|
|
arr="$1"
|
|
val="$2"
|
|
|
|
[ -z "$arr" ] && { printf "[\"%s\"]" "$val"; return; }
|
|
|
|
if printf "%s" "$arr" | _contains "\"$val\""; then
|
|
printf "%s" "$arr"
|
|
return
|
|
fi
|
|
|
|
printf "%s" "$arr" | sed "s/]$/,\"$val\"]/"
|
|
|
|
}
|
|
|
|
_yc_array_remove() {
|
|
arr="$1"
|
|
val="$2"
|
|
|
|
printf "%s" "$arr" | sed \
|
|
-e "s/\"$val\",//g" \
|
|
-e "s/,\"$val\"//g" \
|
|
-e "s/\"$val\"//g" \
|
|
-e 's/\[,/[/' \
|
|
-e 's/,\]/]/' \
|
|
-e 's/,,/,/g'
|
|
}
|
|
|