Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
Acme.Sh
Commits
2028e4c8
Unverified
Commit
2028e4c8
authored
Jan 22, 2020
by
neil
Committed by
GitHub
Jan 22, 2020
Browse files
Merge pull request #2700 from radek-sprta/clouddns
Support for CloudDNS API
parents
baff032e
5c7feba7
Changes
1
Hide whitespace changes
Inline
Side-by-side
dnsapi/dns_clouddns.sh
0 → 100755
View file @
2028e4c8
#!/usr/bin/env sh
# Author: Radek Sprta <sprta@vshosting.cz>
#CLOUDDNS_EMAIL=XXXXX
#CLOUDDNS_PASSWORD="YYYYYYYYY"
#CLOUDDNS_CLIENT_ID=XXXXX
CLOUDDNS_API
=
'https://admin.vshosting.cloud/clouddns'
CLOUDDNS_LOGIN_API
=
'https://admin.vshosting.cloud/api/public/auth/login'
######## Public functions #####################
# Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_clouddns_add
()
{
fulldomain
=
$1
txtvalue
=
$2
_debug
"fulldomain"
"
$fulldomain
"
CLOUDDNS_CLIENT_ID
=
"
${
CLOUDDNS_CLIENT_ID
:-
$(
_readaccountconf_mutable CLOUDDNS_CLIENT_ID
)
}
"
CLOUDDNS_EMAIL
=
"
${
CLOUDDNS_EMAIL
:-
$(
_readaccountconf_mutable CLOUDDNS_EMAIL
)
}
"
CLOUDDNS_PASSWORD
=
"
${
CLOUDDNS_PASSWORD
:-
$(
_readaccountconf_mutable CLOUDDNS_PASSWORD
)
}
"
if
[
-z
"
$CLOUDDNS_PASSWORD
"
]
||
[
-z
"
$CLOUDDNS_EMAIL
"
]
||
[
-z
"
$CLOUDDNS_CLIENT_ID
"
]
;
then
CLOUDDNS_CLIENT_ID
=
""
CLOUDDNS_EMAIL
=
""
CLOUDDNS_PASSWORD
=
""
_err
"You didn't specify a CloudDNS password, email and client ID yet."
return
1
fi
if
!
_contains
"
$CLOUDDNS_EMAIL
"
"@"
;
then
_err
"It seems that the CLOUDDNS_EMAIL=
$CLOUDDNS_EMAIL
is not a valid email address."
_err
"Please check and retry."
return
1
fi
# Save CloudDNS client id, email and password to config file
_saveaccountconf_mutable CLOUDDNS_CLIENT_ID
"
$CLOUDDNS_CLIENT_ID
"
_saveaccountconf_mutable CLOUDDNS_EMAIL
"
$CLOUDDNS_EMAIL
"
_saveaccountconf_mutable CLOUDDNS_PASSWORD
"
$CLOUDDNS_PASSWORD
"
_debug
"First detect the root zone"
if
!
_get_root
"
$fulldomain
"
;
then
_err
"Invalid domain"
return
1
fi
_debug _domain_id
"
$_domain_id
"
_debug _sub_domain
"
$_sub_domain
"
_debug _domain
"
$_domain
"
# Add TXT record
data
=
"{
\"
type
\"
:
\"
TXT
\"
,
\"
name
\"
:
\"
$fulldomain
.
\"
,
\"
value
\"
:
\"
$txtvalue
\"
,
\"
domainId
\"
:
\"
$_domain_id
\"
}"
if
_clouddns_api POST
"record-txt"
"
$data
"
;
then
if
_contains
"
$response
"
"
$txtvalue
"
;
then
_info
"Added, OK"
elif
_contains
"
$response
"
'"code":4136'
;
then
_info
"Already exists, OK"
else
_err
"Add TXT record error."
return
1
fi
fi
_debug
"Publishing record changes"
_clouddns_api PUT
"domain/
$_domain_id
/publish"
"{
\"
soaTtl
\"
:300}"
}
# Usage: rm _acme-challenge.www.domain.com
dns_clouddns_rm
()
{
fulldomain
=
$1
_debug
"fulldomain"
"
$fulldomain
"
CLOUDDNS_CLIENT_ID
=
"
${
CLOUDDNS_CLIENT_ID
:-
$(
_readaccountconf_mutable CLOUDDNS_CLIENT_ID
)
}
"
CLOUDDNS_EMAIL
=
"
${
CLOUDDNS_EMAIL
:-
$(
_readaccountconf_mutable CLOUDDNS_EMAIL
)
}
"
CLOUDDNS_PASSWORD
=
"
${
CLOUDDNS_PASSWORD
:-
$(
_readaccountconf_mutable CLOUDDNS_PASSWORD
)
}
"
_debug
"First detect the root zone"
if
!
_get_root
"
$fulldomain
"
;
then
_err
"Invalid domain"
return
1
fi
_debug _domain_id
"
$_domain_id
"
_debug _sub_domain
"
$_sub_domain
"
_debug _domain
"
$_domain
"
# Get record ID
_clouddns_api GET
"domain/
$_domain_id
"
if
_contains
"
$response
"
"lastDomainRecordList"
;
then
re
=
"
\"
lastDomainRecordList
\"
.*
\"
id
\"
:
\"
([^
\"
}]*)
\"
[^}]*
\"
name
\"
:
\"
$fulldomain
.
\"
,"
_last_domains
=
$(
echo
"
$response
"
| _egrep_o
"
$re
"
)
re2
=
"
\"
id
\"
:
\"
([^
\"
}]*)
\"
[^}]*
\"
name
\"
:
\"
$fulldomain
.
\"
,"
_record_id
=
$(
echo
"
$_last_domains
"
| _egrep_o
"
$re2
"
| _head_n 1 |
cut
-d
:
-f
2 |
cut
-d
,
-f
1 |
tr
-d
"
\"
"
)
_debug _record_id
"
$_record_id
"
else
_err
"Could not retrieve record ID"
return
1
fi
_info
"Removing record"
if
_clouddns_api DELETE
"record/
$_record_id
"
;
then
if
_contains
"
$response
"
"
\"
error
\"
:"
;
then
_err
"Could not remove record"
return
1
fi
fi
_debug
"Publishing record changes"
_clouddns_api PUT
"domain/
$_domain_id
/publish"
"{
\"
soaTtl
\"
:300}"
}
#################### Private functions below ##################################
# Usage: _get_root _acme-challenge.www.domain.com
# Returns:
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
_get_root
()
{
domain
=
$1
# Get domain root
data
=
"{
\"
search
\"
: [{
\"
name
\"
:
\"
clientId
\"
,
\"
operator
\"
:
\"
eq
\"
,
\"
value
\"
:
\"
$CLOUDDNS_CLIENT_ID
\"
}]}"
_clouddns_api
"POST"
"domain/search"
"
$data
"
domain_slice
=
"
$domain
"
while
[
-z
"
$domain_root
"
]
;
do
if
_contains
"
$response
"
"
\"
domainName
\"
:
\"
$domain_slice
\.\"
"
;
then
domain_root
=
"
$domain_slice
"
_debug domain_root
"
$domain_root
"
fi
domain_slice
=
"
$(
echo
"
$domain_slice
"
|
cut
-d
.
-f
2-
)
"
done
# Get domain id
data
=
"{
\"
search
\"
: [{
\"
name
\"
:
\"
clientId
\"
,
\"
operator
\"
:
\"
eq
\"
,
\"
value
\"
:
\"
$CLOUDDNS_CLIENT_ID
\"
},
\
{
\"
name
\"
:
\"
domainName
\"
,
\"
operator
\"
:
\"
eq
\"
,
\"
value
\"
:
\"
$domain_root
.
\"
}]}"
_clouddns_api
"POST"
"domain/search"
"
$data
"
if
_contains
"
$response
"
"
\"
id
\"
:
\"
"
;
then
re
=
'domainType\":\"[^\"]*\",\"id\":\"([^\"]*)\",'
# Match domain id
_domain_id
=
$(
echo
"
$response
"
| _egrep_o
"
$re
"
| _head_n 1 |
cut
-d
:
-f
3 |
tr
-d
"
\"
,"
)
if
[
"
$_domain_id
"
]
;
then
_sub_domain
=
$(
printf
"%s"
"
$domain
"
|
sed
"s/.
$domain_root
//"
)
_domain
=
"
$domain_root
"
return
0
fi
_err
'Domain name not found on your CloudDNS account'
return
1
fi
return
1
}
# Usage: _clouddns_api GET domain/search '{"data": "value"}'
# Returns:
# response='{"message": "api response"}'
_clouddns_api
()
{
method
=
$1
endpoint
=
"
$2
"
data
=
"
$3
"
_debug endpoint
"
$endpoint
"
if
[
-z
"
$CLOUDDNS_TOKEN
"
]
;
then
_clouddns_login
fi
_debug CLOUDDNS_TOKEN
"
$CLOUDDNS_TOKEN
"
export
_H1
=
"Content-Type: application/json"
export
_H2
=
"Authorization: Bearer
$CLOUDDNS_TOKEN
"
if
[
"
$method
"
!=
"GET"
]
;
then
_debug data
"
$data
"
response
=
"
$(
_post
"
$data
"
"
$CLOUDDNS_API
/
$endpoint
"
""
"
$method
"
|
tr
-d
'\t\r\n '
)
"
else
response
=
"
$(
_get
"
$CLOUDDNS_API
/
$endpoint
"
|
tr
-d
'\t\r\n '
)
"
fi
# shellcheck disable=SC2181
if
[
"
$?
"
!=
"0"
]
;
then
_err
"Error
$endpoint
"
return
1
fi
_debug2 response
"
$response
"
return
0
}
# Returns:
# CLOUDDNS_TOKEN=dslfje2rj23l
_clouddns_login
()
{
login_data
=
"{
\"
email
\"
:
\"
$CLOUDDNS_EMAIL
\"
,
\"
password
\"
:
\"
$CLOUDDNS_PASSWORD
\"
}"
response
=
"
$(
_post
"
$login_data
"
"
$CLOUDDNS_LOGIN_API
"
""
"POST"
"Content-Type: application/json"
)
"
if
_contains
"
$response
"
"
\"
accessToken
\"
:
\"
"
;
then
CLOUDDNS_TOKEN
=
$(
echo
"
$response
"
| _egrep_o
"
\"
accessToken
\"
:
\"
[^
\"
]*
\"
"
|
cut
-d
:
-f
2 |
tr
-d
\"
)
export
CLOUDDNS_TOKEN
else
echo
'Could not get CloudDNS access token; check your credentials'
return
1
fi
return
0
}
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