Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
Acme.Sh
Commits
0e8fef73
Unverified
Commit
0e8fef73
authored
Aug 17, 2022
by
Hobby-Student
Committed by
GitHub
Aug 17, 2022
Browse files
error handling, minor changes to params, ...
parent
d5b649a1
Changes
1
Hide whitespace changes
Inline
Side-by-side
dnsapi/dns_kas.sh
View file @
0e8fef73
...
...
@@ -5,55 +5,81 @@
# Environment variables:
#
# - $KAS_Login (Kasserver API login name)
# - $KAS_Authtype (Kasserver API auth type. Default:
sha1
)
# - $KAS_Authtype (Kasserver API auth type. Default:
plain
)
# - $KAS_Authdata (Kasserver API auth data.)
#
# Author: Martin Kammerlander, Phlegx Systems OG <martin.kammerlander@phlegx.com>
# Updated by: Marc-Oliver Lange <git@die-lang.es>
# Credits: Inspired by dns_he.sh. Thanks a lot man!
# Git repo: https://github.com/phlegx/acme.sh
# TODO: Better Error handling
# Author: squared GmbH <github@squaredgmbh.de>
# Credits:
# Inspired by dns_he.sh. Thanks a lot man!
# Previous version by Martin Kammerlander, Phlegx Systems OG <martin.kammerlander@phlegx.com>
# Previous update by Marc-Oliver Lange <git@die-lang.es>
# KASAPI SOAP guideline by https://github.com/o1oo11oo/kasapi.sh
########################################################################
KAS_Api
=
"https://kasapi.kasserver.com/soap/KasApi.php"
KAS_Auth
=
"https://kasapi.kasserver.com/soap/KasAuth.php"
KAS_Api_GET
=
"
$(
_get
"https://kasapi.kasserver.com/soap/wsdl/KasApi.wsdl"
)
"
KAS_Api
=
"
$(
echo
"
$KAS_Api_GET
"
|
tr
-d
' '
|
grep
-i
"<soap:addresslocation="
|
sed
"s/='/
\n
/g"
|
grep
-i
"http"
|
sed
"s/'
\/
>//g"
)
"
_info
"[KAS] -> API URL
$KAS_Api
"
KAS_Auth_GET
=
"
$(
_get
"https://kasapi.kasserver.com/soap/wsdl/KasAuth.wsdl"
)
"
KAS_Auth
=
"
$(
echo
"
$KAS_Auth_GET
"
|
tr
-d
' '
|
grep
-i
"<soap:addresslocation="
|
sed
"s/='/
\n
/g"
|
grep
-i
"http"
|
sed
"s/'
\/
>//g"
)
"
_info
"[KAS] -> AUTH URL
$KAS_Auth
"
KAS_default_ratelimit
=
5
# TODO - Every response delivers a ratelimit (seconds) where KASAPI is blocking a request.
######## Public functions #####################
dns_kas_add
()
{
_fulldomain
=
$1
_txtvalue
=
$2
_info
"
###
-> Using DNS-01 All-inkl/Kasserver hook"
_info
"
###
-> Adding
$_fulldomain
DNS TXT entry on All-inkl/Kasserver"
_info
"
###
-> Retriving Credential Token"
_info
"
[KAS]
-> Using DNS-01 All-inkl/Kasserver hook"
_info
"
[KAS]
-> Adding
$_fulldomain
DNS TXT entry on All-inkl/Kasserver"
_info
"
[KAS]
-> Retriving Credential Token"
_get_credential_token
_info
"
###
-> Check and Save Props"
_info
"
[KAS]
-> Check and Save Props"
_check_and_save
_info
"
###
-> Checking Zone and Record_Name"
_info
"
[KAS]
-> Checking Zone and Record_Name"
_get_zone_and_record_name
"
$_fulldomain
"
_info
"
###
-> Checking for existing Record entries"
_info
"
[KAS]
-> Checking for existing Record entries"
_get_record_id
# If there is a record_id, delete the entry
if
[
-n
"
$_record_id
"
]
;
then
_info
"Existing records found. Now deleting old entries"
_info
"
[KAS] ->
Existing records found. Now deleting old entries"
for
i
in
$_record_id
;
do
_delete_RecordByID
"
$i
"
done
else
_info
"No record found."
_info
"
[KAS] ->
No record found."
fi
_info
"
###
-> Creating TXT DNS record"
_info
"
[KAS]
-> 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
\"
}"
kasReqParam
=
"
\"
record_name
\"
:
\"
$_record_name
\"
"
kasReqParam
=
"
$kasReqParam
,
\"
record_type
\"
:
\"
TXT
\"
"
kasReqParam
=
"
$kasReqParam
,
\"
record_data
\"
:
\"
$_txtvalue
\"
"
kasReqParam
=
"
$kasReqParam
,
\"
record_aux
\"
:
\"
0
\"
"
kasReqParam
=
"
$kasReqParam
,
\"
zone_host
\"
:
\"
$_zone
\"
"
response
=
"
$(
_callAPI
"
$action
"
"
$kasReqParam
"
)
"
_debug2
"[KAS] -> Response"
"
$response
"
_debug2
"Response"
"
$response
"
if
!
_contains
"
$response
"
"TRUE"
;
then
_err
"An unkown error occurred, please check manually."
if
[
-z
"
$response
"
]
;
then
_info
"[KAS] -> Response was empty, please check manually."
return
1
elif
_contains
"
$response
"
"<SOAP-ENV:Fault>"
;
then
faultstring
=
"
$(
echo
"
$response
"
|
tr
-d
'\n\r'
|
sed
"s/<faultstring>/
\n
=> /g"
|
sed
"s/<
\/
faultstring>/
\n
/g"
|
grep
"=>"
|
sed
"s/=> //g"
)
"
case
"
${
faultstring
}
"
in
"record_already_exists"
)
_info
"[KAS] -> The record already exists, which must not be a problem. Please check manually."
;;
*
)
_err
"[KAS] -> An error =>
$faultstring
<= occurred, please check manually."
return
1
;;
esac
elif
!
_contains
"
$response
"
"<item><key xsi:type=
\"
xsd:string
\"
>ReturnString</key><value xsi:type=
\"
xsd:string
\"
>TRUE</value></item>"
;
then
_err
"[KAS] -> An unknown error occurred, please check manually."
return
1
fi
return
0
...
...
@@ -63,29 +89,29 @@ dns_kas_rm() {
_fulldomain
=
$1
_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
"
###
-> Retriving Credential Token"
_info
"
[KAS]
-> Using DNS-01 All-inkl/Kasserver hook"
_info
"
[KAS]
-> Cleaning up after All-inkl/Kasserver hook"
_info
"
[KAS]
-> Removing
$_fulldomain
DNS TXT entry on All-inkl/Kasserver"
_info
"
[KAS]
-> Retriving Credential Token"
_get_credential_token
_info
"
###
-> Check and Save Props"
_info
"
[KAS]
-> Check and Save Props"
_check_and_save
_info
"
###
-> Checking Zone and Record_Name"
_info
"
[KAS]
-> Checking Zone and Record_Name"
_get_zone_and_record_name
"
$_fulldomain
"
_info
"
###
-> Getting Record ID"
_info
"
[KAS]
-> Getting Record ID"
_get_record_id
_info
"
###
-> Removing entries with ID:
$_record_id
"
_info
"
[KAS]
-> Removing entries with ID:
$_record_id
"
# If there is a record_id, delete the entry
if
[
-n
"
$_record_id
"
]
;
then
for
i
in
$_record_id
;
do
_delete_RecordByID
"
$i
"
done
else
# Cannot delete or unkown error
_info
"No record_id found that can be deleted. Please check manually."
_info
"
[KAS] ->
No record_id found that can be deleted. Please check manually."
fi
return
0
}
...
...
@@ -95,11 +121,27 @@ dns_kas_rm() {
_delete_RecordByID
()
{
recId
=
$1
action
=
"delete_dns_settings"
kasReqParam
=
"
{
\"
record_id
\"
:
\"
$recId
\"
}
"
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."
_debug2
"[KAS] -> Response"
"
$response
"
if
[
-z
"
$response
"
]
;
then
_info
"[KAS] -> Response was empty, please check manually."
return
1
elif
_contains
"
$response
"
"<SOAP-ENV:Fault>"
;
then
faultstring
=
"
$(
echo
"
$response
"
|
tr
-d
'\n\r'
|
sed
"s/<faultstring>/
\n
=> /g"
|
sed
"s/<
\/
faultstring>/
\n
/g"
|
grep
"=>"
|
sed
"s/=> //g"
)
"
case
"
${
faultstring
}
"
in
"record_id_not_found"
)
_info
"[KAS] -> The record was not found, which perhaps is not a problem. Please check manually."
;;
*
)
_err
"[KAS] -> An error =>
$faultstring
<= occurred, please check manually."
return
1
;;
esac
elif
!
_contains
"
$response
"
"<item><key xsi:type=
\"
xsd:string
\"
>ReturnString</key><value xsi:type=
\"
xsd:string
\"
>TRUE</value></item>"
;
then
_err
"[KAS] -> An unknown error occurred, please check manually."
return
1
fi
}
# Checks for the ENV variables and saves them
...
...
@@ -112,7 +154,7 @@ _check_and_save() {
KAS_Login
=
KAS_Authtype
=
KAS_Authdata
=
_err
"No auth details provided. Please set user credentials using the
\$
KAS_Login,
\$
KAS_Authtype, and
\$
KAS_Authdata environment variables."
_err
"
[KAS] ->
No auth details provided. Please set user credentials using the
\$
KAS_Login,
\$
KAS_Authtype, and
\$
KAS_Authdata environment variables."
return
1
fi
_saveaccountconf_mutable KAS_Login
"
$KAS_Login
"
...
...
@@ -125,9 +167,18 @@ _check_and_save() {
# See: https://github.com/Neilpang/acme.sh/wiki/DNS-API-Dev-Guide
_get_zone_and_record_name
()
{
action
=
"get_domains"
kasReqParam
=
"[]"
response
=
"
$(
_callAPI
"
$action
"
"
$kasReqParam
"
)
"
_debug2
"Response"
"
$response
"
response
=
"
$(
_callAPI
"
$action
"
)
"
_debug2
"[KAS] -> Response"
"
$response
"
if
[
-z
"
$response
"
]
;
then
_info
"[KAS] -> Response was empty, please check manually."
return
1
elif
_contains
"
$response
"
"<SOAP-ENV:Fault>"
;
then
faultstring
=
"
$(
echo
"
$response
"
|
tr
-d
'\n\r'
|
sed
"s/<faultstring>/
\n
=> /g"
|
sed
"s/<
\/
faultstring>/
\n
/g"
|
grep
"=>"
|
sed
"s/=> //g"
)
"
_err
"[KAS] -> Either no domains were found or another error =>
$faultstring
<= occurred, please check manually."
return
1
fi
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/\.$//'
)
"
...
...
@@ -142,59 +193,80 @@ _get_zone_and_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
"
_debug
"
[KAS] ->
Zone:"
"
$_zone
"
_debug
"
[KAS] ->
Domain:"
"
$domain
"
_debug
"
[KAS] ->
Record_Name:"
"
$_record_name
"
return
0
}
# Retrieve the DNS record ID
_get_record_id
()
{
action
=
"get_dns_settings"
kasReqParam
=
"
{
\"
zone_host
\"
:
\"
$_zone
\"
,
\"
nameserver
\"
:
\"
ns5.kasserver.com
\"
}
"
kasReqParam
=
"
\"
zone_host
\"
:
\"
$_zone
\"
"
response
=
"
$(
_callAPI
"
$action
"
"
$kasReqParam
"
)
"
_debug2
"[KAS] -> Response"
"
$response
"
if
[
-z
"
$response
"
]
;
then
_info
"[KAS] -> Response was empty, please check manually."
return
1
elif
_contains
"
$response
"
"<SOAP-ENV:Fault>"
;
then
faultstring
=
"
$(
echo
"
$response
"
|
tr
-d
'\n\r'
|
sed
"s/<faultstring>/
\n
=> /g"
|
sed
"s/<
\/
faultstring>/
\n
/g"
|
grep
"=>"
|
sed
"s/=> //g"
)
"
_err
"[KAS] -> Either no domains were found or another error =>
$faultstring
<= occurred, please check manually."
return
1
fi
_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
"
_record_id
=
"
$(
echo
"
$response
"
|
tr
-d
'\n\r'
|
sed
"s/<item xsi:type=
\"
ns2:Map
\"
>/
\n
/g"
|
grep
-i
"
$_record_name
"
|
grep
-i
">TXT<"
|
sed
"s/<item><key xsi:type=
\"
xsd:string
\"
>record_id<
\/
key><value xsi:type=
\"
xsd:string
\"
>/=>/g"
|
sed
"s/<
\/
value><
\/
item>/
\n
/g"
|
grep
"=>"
|
sed
"s/=>//g"
)
"
_debug
"[KAS] -> 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>"
baseParamAuth
=
"
\"
kas_login
\"
:
\"
$KAS_Login
\"
"
baseParamAuth
=
"
$baseParamAuth
,
\"
kas_auth_type
\"
:
\"
$KAS_Authtype
\"
"
baseParamAuth
=
"
$baseParamAuth
,
\"
kas_auth_data
\"
:
\"
$KAS_Authdata
\"
"
baseParamAuth
=
"
$baseParamAuth
,
\"
session_lifetime
\"
:600"
baseParamAuth
=
"
$baseParamAuth
,
\"
session_update_lifetime
\"
:
\"
Y
\"
"
_debug
"Be frindly and wait 10 seconds by default before calling KAS API."
_sleep 10
data
=
'<?xml version="1.0" encoding="UTF-8"?><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><Params xsi:type="xsd:string">{'
data
=
"
$data$baseParamAuth
}</Params></ns1:KasAuth></SOAP-ENV:Body></SOAP-ENV:Envelope>"
_debug
"[KAS] -> Be friendly and wait
$KAS_default_ratelimit
seconds by default before calling KAS API."
_sleep
$KAS_default_ratelimit
contentType
=
"text/xml"
export
_H1
=
"SOAPAction:
ns1:
KasAuth"
export
_H1
=
"SOAPAction:
urn:xmethodsKasApiAuthentication#
KasAuth"
response
=
"
$(
_post
"
$data
"
"
$KAS_Auth
"
""
"POST"
"
$contentType
"
)
"
_debug2
"Response"
"
$response
"
_debug2
"
[KAS] ->
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
"
_debug
"
[KAS] ->
Credential Token: "
"
$_credential_token
"
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
baseParamAuth
=
"
\"
kas_login
\"
:
\"
$KAS_Login
\"
"
baseParamAuth
=
"
$baseParamAuth
,
\"
kas_auth_type
\"
:
\"
session
\"
"
baseParamAuth
=
"
$baseParamAuth
,
\"
kas_auth_data
\"
:
\"
$_credential_token
\"
"
data
=
'<?xml version="1.0" encoding="UTF-8"?><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><Params xsi:type="xsd:string">{'
data
=
"
$data$baseParamAuth
,
\"
kas_action
\"
:
\"
$kasaction
\"
"
if
[
-n
"
$kasReqParams
"
]
;
then
data
=
"
$data
,
\"
KasRequestParams
\"
:{
$kasReqParams
}"
fi
data
=
"
$data
}</Params></ns1:KasApi></SOAP-ENV:Body></SOAP-ENV:Envelope>"
_debug2
"[KAS] -> Request"
"
$data
"
_debug
"[KAS] -> Be friendly and wait
$KAS_default_ratelimit
seconds by default before calling KAS API."
_sleep
$KAS_default_ratelimit
contentType
=
"text/xml"
export
_H1
=
"SOAPAction:
ns1:
KasApi"
export
_H1
=
"SOAPAction:
urn:xmethodsKasApi#
KasApi"
response
=
"
$(
_post
"
$data
"
"
$KAS_Api
"
""
"POST"
"
$contentType
"
)
"
_debug2
"Response"
"
$response
"
_debug2
"
[KAS] ->
Response"
"
$response
"
echo
"
$response
"
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment