@ -14,39 +14,43 @@
# Git repo: https://github.com/phlegx/acme.sh
# Git repo: https://github.com/phlegx/acme.sh
# TODO: Better Error handling
# TODO: Better Error handling
########################################################################
########################################################################
KAS_Api = "https://kasapi.kasserver.com/dokumentation/formular.php"
KAS_Api = "https://kasapi.kasserver.com/soap/KasApi.php"
KAS_Auth = "https://kasapi.kasserver.com/soap/KasAuth.php"
######## Public functions #####################
######## Public functions #####################
dns_kas_add( ) {
dns_kas_add( ) {
_fulldomain = $1
_fulldomain = $1
_txtvalue = $2
_txtvalue = $2
_info "Using DNS-01 All-inkl/Kasserver hook"
_info " Adding $_fulldomain DNS TXT entry on All-inkl/Kasserver "
_info "Check and Save Props"
_info "### -> Using DNS-01 All-inkl/Kasserver hook"
_info " ### -> Adding $_fulldomain DNS TXT entry on All-inkl/Kasserver "
_info "### -> Retriving Credential Token"
_get_credential_token
_info "### -> Check and Save Props"
_check_and_save
_check_and_save
_info "Checking Zone and Record_Name"
_info "### -> Checking Zone and Record_Name"
_get_zone_and_record_name " $_fulldomain "
_get_zone_and_record_name " $_fulldomain "
_info "Getting Record ID"
_info "### -> Checking for existing Record entries"
_get_record_id
_get_record_id
_info "Creating TXT DNS record"
params = " ?kas_login= $KAS_Login "
params = " $params &kas_auth_type= $KAS_Authtype "
params = " $params &kas_auth_data= $KAS_Authdata "
params = " $params &var1=record_name "
params = " $params &wert1= $_record_name "
params = " $params &var2=record_type "
params = " $params &wert2=TXT "
params = " $params &var3=record_data "
params = " $params &wert3= $_txtvalue "
params = " $params &var4=record_aux "
params = " $params &wert4=0 "
params = " $params &kas_action=add_dns_settings "
params = " $params &var5=zone_host "
params = " $params &wert5= $_zone "
_debug2 "Wait for 10 seconds by default before calling KAS API."
_sleep 10
response = " $( _get " $KAS_Api $params " ) "
_debug2 "response" " $response "
# If there is a record_id, delete the entry
if [ -n " $_record_id " ] ; then
_info "Existing records found. Now deleting old entries"
for i in $_record_id ; do
_delete_RecordByID " $i "
done
else
_info "No record found."
fi
_info "### -> Creating TXT DNS record"
action = "add_dns_settings"
kasReqParam = " {\"record_name\":\" $_record_name \",\"record_type\":\"TXT\",\"record_data\":\" $_txtvalue \",\"record_aux\":\"0\",\"zone_host\":\" $_zone \"} "
response = " $( _callAPI " $action " " $kasReqParam " ) "
_debug2 "Response" " $response "
if ! _contains " $response " "TRUE" ; then
if ! _contains " $response " "TRUE" ; then
_err "An unkown error occurred, please check manually."
_err "An unkown error occurred, please check manually."
@ -58,45 +62,46 @@ dns_kas_add() {
dns_kas_rm( ) {
dns_kas_rm( ) {
_fulldomain = $1
_fulldomain = $1
_txtvalue = $2
_txtvalue = $2
_info "Using DNS-01 All-inkl/Kasserver hook"
_info "Cleaning up after All-inkl/Kasserver hook"
_info " Removing $_fulldomain DNS TXT entry on All-inkl/Kasserver "
_info "Check and Save Props"
_info "### -> Using DNS-01 All-inkl/Kasserver hook"
_info "### -> Cleaning up after All-inkl/Kasserver hook"
_info " ### -> Removing $_fulldomain DNS TXT entry on All-inkl/Kasserver "
_info "### -> Retriving Credential Token"
_get_credential_token
_info "### -> Check and Save Props"
_check_and_save
_check_and_save
_info "Checking Zone and Record_Name"
_info "### -> Checking Zone and Record_Name"
_get_zone_and_record_name " $_fulldomain "
_get_zone_and_record_name " $_fulldomain "
_info "Getting Record ID"
_info "### -> Getting Record ID"
_get_record_id
_get_record_id
_info " ### -> Removing entries with ID: $_record_id "
# If there is a record_id, delete the entry
# If there is a record_id, delete the entry
if [ -n " $_record_id " ] ; then
if [ -n " $_record_id " ] ; then
params = " ?kas_login= $KAS_Login "
params = " $params &kas_auth_type= $KAS_Authtype "
params = " $params &kas_auth_data= $KAS_Authdata "
params = " $params &kas_action=delete_dns_settings "
for i in $_record_id ; do
for i in $_record_id ; do
params2 = " $params &var1=record_id "
params2 = " $params2 &wert1= $i "
_debug2 "Wait for 10 seconds by default before calling KAS API."
_sleep 10
response = " $( _get " $KAS_Api $params2 " ) "
_debug2 "response" " $response "
if ! _contains " $response " "TRUE" ; then
_err "Either the txt record is not found or another error occurred, please check manually."
return 1
fi
_delete_RecordByID " $i "
done
done
else # Cannot delete or unkown error
else # Cannot delete or unkown error
_err "No record_id found that can be deleted. Please check manually."
return 1
_info "No record_id found that can be deleted. Please check manually."
fi
fi
return 0
return 0
}
}
########################## PRIVATE FUNCTIONS ###########################
########################## PRIVATE FUNCTIONS ###########################
# Delete Record ID
_delete_RecordByID( ) {
recId = $1
action = "delete_dns_settings"
kasReqParam = " {\"record_id\":\" $recId \"} "
response = " $( _callAPI " $action " " $kasReqParam " ) "
_debug2 "Response" " $response "
if ! _contains " $response " "TRUE" ; then
_info "Either the txt record is not found or another error occurred, please check manually."
fi
}
# Checks for the ENV variables and saves them
# Checks for the ENV variables and saves them
_check_and_save( ) {
_check_and_save( ) {
KAS_Login = " ${ KAS_Login :- $( _readaccountconf_mutable KAS_Login) } "
KAS_Login = " ${ KAS_Login :- $( _readaccountconf_mutable KAS_Login) } "
@ -119,50 +124,77 @@ _check_and_save() {
# Gets back the base domain/zone and record name.
# Gets back the base domain/zone and record name.
# See: https://github.com/Neilpang/acme.sh/wiki/DNS-API-Dev-Guide
# See: https://github.com/Neilpang/acme.sh/wiki/DNS-API-Dev-Guide
_get_zone_and_record_name( ) {
_get_zone_and_record_name( ) {
params = " ?kas_login= $KAS_Login "
params = " ?kas_login= $KAS_Login "
params = " $params &kas_auth_type= $KAS_Authtype "
params = " $params &kas_auth_data= $KAS_Authdata "
params = " $params &kas_action=get_domains "
_debug2 "Wait for 10 seconds by default before calling KAS API."
_sleep 10
response = " $( _get " $KAS_Api $params " ) "
_debug2 "response" " $response "
_zonen = " $( echo " $response " | tr -d "\n\r" | tr -d " " | tr '[]' '<>' | sed "s/=>Array/\n=> Array/g" | tr ' ' '\n' | grep "domain_name" | tr '<' '\n' | grep "domain_name" | sed "s/domain_name>=>//g" ) "
_domain = " $1 "
_temp_domain = " $( echo " $1 " | sed 's/\.$//' ) "
_rootzone = " $_domain "
for i in $_zonen ; do
l1 = ${# _rootzone }
action = "get_domains"
kasReqParam = "[]"
response = " $( _callAPI " $action " " $kasReqParam " ) "
_debug2 "Response" " $response "
zonen = " $( echo " $response " | sed 's/<item>/\n/g' | sed -r 's/(.*<key xsi:type="xsd:string">domain_name<\/key><value xsi:type="xsd:string">)(.*)(<\/value.*)/\2/' | sed '/^</d' ) "
domain = " $1 "
temp_domain = " $( echo " $1 " | sed 's/\.$//' ) "
rootzone = " $domain "
for i in $zonen ; do
l1 = ${# rootzone }
l2 = ${# i }
l2 = ${# i }
if _endswith " $_ domain " " $i " && [ " $l1 " -ge " $l2 " ] ; then
_ rootzone= " $i "
if _endswith " $domain " " $i " && [ " $l1 " -ge " $l2 " ] ; then
rootzone = " $i "
fi
fi
done
done
_zone = " ${ _ rootzone} . "
_ temp_record_name= " $( echo " $_ temp_domain " | sed " s/ $_ rootzone //g " ) "
_record_name = " $( echo " $_ temp_record_name " | sed 's/\.$//' ) "
_debug2 "Zone:" " $_zone "
_debug2 "Domain:" " $_ domain "
_debug2 "Record_Name:" " $_record_name "
_zone = " ${ rootzone } . "
temp_record_name = " $( echo " $temp_domain " | sed " s/ $rootzone //g " ) "
_record_name = " $( echo " $temp_record_name " | sed 's/\.$//' ) "
_debug "Zone:" " $_zone "
_debug "Domain:" " $domain "
_debug "Record_Name:" " $_record_name "
return 0
return 0
}
}
# Retrieve the DNS record ID
# Retrieve the DNS record ID
_get_record_id( ) {
_get_record_id( ) {
params = " ?kas_login= $KAS_Login "
params = " $params &kas_auth_type= $KAS_Authtype "
params = " $params &kas_auth_data= $KAS_Authdata "
params = " $params &kas_action=get_dns_settings "
params = " $params &var1=zone_host "
params = " $params &wert1= $_zone "
_debug2 "Wait for 10 seconds by default before calling KAS API."
action = "get_dns_settings"
kasReqParam = " {\"zone_host\":\" $_zone \",\"nameserver\":\"ns5.kasserver.com\"} "
response = " $( _callAPI " $action " " $kasReqParam " ) "
_debug2 "Response" " $response "
_record_id = " $( echo " $response " | sed 's/<item xsi:type="ns2:Map">/\n/g' | sed -n -e " /^.* $_record_name .*/Ip " | sed -n -e " /^.* $_txtvalue .*/Ip " | sed -r 's/(.*record_id<\/key><value xsi:type="xsd:string">)([0-9]+)(<\/value.*)/\2/' ) "
_debug "Record Id: " " $_record_id "
return 0
}
# Retrieve credential token
_get_credential_token( ) {
data = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns1=\"urn:xmethodsKasApiAuthentication\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><SOAP-ENV:Body><ns1:KasAuth>"
data = " $data <Params xsi:type=\"xsd:string\">{\"kas_login\":\" $KAS_Login \",\"kas_auth_type\":\" $KAS_Authtype \",\"kas_auth_data\":\" $KAS_Authdata \",\"session_lifetime\":600,\"session_update_lifetime\":\"Y\",\"session_2fa\":123456}</Params> "
data = " $data </ns1:KasAuth></SOAP-ENV:Body></SOAP-ENV:Envelope> "
_debug "Be frindly and wait 10 seconds by default before calling KAS API."
_sleep 10
_sleep 10
response = " $( _get " $KAS_Api $params " ) "
_debug2 "response" " $response "
_record_id = " $( echo " $response " | tr -d "\n\r" | tr -d " " | tr '[]' '<>' | sed "s/=>Array/\n=> Array/g" | tr ' ' '\n' | grep " => $_record_name < " | grep '>TXT<' | tr '<' '\n' | grep record_id | sed "s/record_id>=>//g" ) "
_debug2 _record_id " $_record_id "
contentType = "text/xml"
export _H1 = "SOAPAction: ns1:KasAuth"
response = " $( _post " $data " " $KAS_Auth " "" "POST" " $contentType " ) "
_debug2 "Response" " $response "
_credential_token = " $( echo " $response " | tr '\n' ' ' | sed 's/.*return xsi:type="xsd:string">\(.*\)<\/return>/\1/' | sed 's/<\/ns1:KasAuthResponse\(.*\)Envelope>.*//' ) "
_debug "Credential Token: " " $_credential_token "
return 0
return 0
}
}
_callAPI( ) {
kasaction = $1
kasReqParams = $2
baseParam = " <Params xsi:type=\"xsd:string\">{\"kas_login\":\" $KAS_Login \",\"kas_auth_type\":\"session\",\"kas_auth_data\":\" $_credential_token \",\"kas_action\":\" $kasaction \",\"KasRequestParams\": $kasReqParams "
baseParamClosing = "}</Params>"
data = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns1=\"urn:xmethodsKasApi\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><SOAP-ENV:Body><ns1:KasApi>"
data = " $data $baseParam $baseParamClosing "
data = " $data </ns1:KasApi></SOAP-ENV:Body></SOAP-ENV:Envelope> "
_debug2 "Request" " $data "
_debug "Be frindly and wait 10 seconds by default before calling KAS API."
_sleep 10
contentType = "text/xml"
export _H1 = "SOAPAction: ns1:KasApi"
response = " $( _post " $data " " $KAS_Api " "" "POST" " $contentType " ) "
_debug2 "Response" " $response "
echo " $response "
}