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
3d2df3ba
Unverified
Commit
3d2df3ba
authored
Nov 03, 2019
by
neil
Committed by
GitHub
Nov 03, 2019
Browse files
Merge pull request #2571 from Neilpang/dev
sync
parents
54143ae6
eb623878
Changes
25
Show whitespace changes
Inline
Side-by-side
.github/ISSUE_TEMPLATE.md
View file @
3d2df3ba
.travis.yml
View file @
3d2df3ba
...
...
@@ -28,7 +28,7 @@ script:
-
if [ "$TRAVIS_OS_NAME" = "linux" ]; then shellcheck -V ; fi
-
if [ "$TRAVIS_OS_NAME" = "linux" ]; then shellcheck -e SC2181 **/*.sh && echo "shellcheck OK" ; fi
-
cd ..
-
git clone https://github.com/Neilpang/acmetest.git && cp -r acme.sh acmetest/ && cd acmetest
-
git clone
--depth 1
https://github.com/Neilpang/acmetest.git && cp -r acme.sh acmetest/ && cd acmetest
-
if [ "$TRAVIS_OS_NAME" = "linux" -a "$NGROK_TOKEN" ]; then sudo TEST_LOCAL="$TEST_LOCAL" NGROK_TOKEN="$NGROK_TOKEN" ./rundocker.sh testplat ubuntu:latest ; fi
-
if [ "$TRAVIS_OS_NAME" = "osx" -a "$NGROK_TOKEN" ]; then sudo TEST_LOCAL="$TEST_LOCAL" NGROK_TOKEN="$NGROK_TOKEN" ACME_OPENSSL_BIN="$ACME_OPENSSL_BIN" ./letest.sh ; fi
...
...
Dockerfile
View file @
3d2df3ba
...
...
@@ -3,6 +3,7 @@ FROM alpine:3.10
RUN
apk update
-f
\
&&
apk
--no-cache
add
-f
\
openssl
\
openssh-client
\
coreutils
\
bind-tools
\
curl
\
...
...
acme.sh
View file @
3d2df3ba
...
...
@@ -153,7 +153,7 @@ fi
__green() {
if [ "${__INTERACTIVE}${ACME_NO_COLOR:-0}" = "10" -o "${ACME_FORCE_COLOR}" = "1" ]; then
printf '\
0
33[1;
31;
32m%b\
0
33[0m' "$1"
printf '\33[1;32m%b\33[0m' "$1"
return
fi
printf -- "%b" "$1"
...
...
@@ -161,7 +161,7 @@ __green() {
__red() {
if [ "${__INTERACTIVE}${ACME_NO_COLOR:-0}" = "10" -o "${ACME_FORCE_COLOR}" = "1" ]; then
printf '\
0
33[1;31
;40
m%b\
0
33[0m' "$1"
printf '\33[1;31m%b\33[0m' "$1"
return
fi
printf -- "%b" "$1"
...
...
@@ -265,6 +265,37 @@ _usage() {
printf "\n" >&2
}
__debug_bash_helper() {
# At this point only do for --debug 3
if [ "${DEBUG:-$DEBUG_LEVEL_NONE}" -lt "$DEBUG_LEVEL_3" ]; then
echo ""
return
fi
# Return extra debug info when running with bash, otherwise return empty
# string.
if [ -z "${BASH_VERSION}" ]; then
echo ""
return
fi
# We are a bash shell at this point, return the filename, function name, and
# line number as a string
_dbh_saveIFS=$IFS
IFS=" "
# Must use eval or syntax error happens under dash
# Use 'caller 1' as we want one level up the stack as we should be called
# by one of the _debug* functions
eval "_dbh_called=($(caller 1))"
IFS=$_dbh_saveIFS
_dbh_file=${_dbh_called[2]}
if [ -n "${_script_home}" ]; then
# Trim off the _script_home directory name
_dbh_file=${_dbh_file#$_script_home/}
fi
_dbh_function=${_dbh_called[1]}
_dbh_lineno=${_dbh_called[0]}
printf "%-40s " "$_dbh_file:${_dbh_function}:${_dbh_lineno}"
}
_debug() {
if [ "${LOG_LEVEL:-$DEFAULT_LOG_LEVEL}" -ge "$LOG_LEVEL_1" ]; then
_log "$@"
...
...
@@ -273,7 +304,8 @@ _debug() {
_syslog "$SYSLOG_DEBUG" "$@"
fi
if [ "${DEBUG:-$DEBUG_LEVEL_NONE}" -ge "$DEBUG_LEVEL_1" ]; then
_printargs "$@" >&2
_bash_debug=$(__debug_bash_helper)
_printargs "${_bash_debug}$@" >&2
fi
}
...
...
@@ -306,7 +338,8 @@ _debug2() {
_syslog "$SYSLOG_DEBUG" "$@"
fi
if [ "${DEBUG:-$DEBUG_LEVEL_NONE}" -ge "$DEBUG_LEVEL_2" ]; then
_printargs "$@" >&2
_bash_debug=$(__debug_bash_helper)
_printargs "${_bash_debug}$@" >&2
fi
}
...
...
@@ -338,7 +371,8 @@ _debug3() {
_syslog "$SYSLOG_DEBUG" "$@"
fi
if [ "${DEBUG:-$DEBUG_LEVEL_NONE}" -ge "$DEBUG_LEVEL_3" ]; then
_printargs "$@" >&2
_bash_debug=$(__debug_bash_helper)
_printargs "${_bash_debug}$@" >&2
fi
}
...
...
@@ -3678,7 +3712,7 @@ _ns_purge_cf() {
#checks if cf server is available
_ns_is_available_cf() {
if _get "https://cloudflare-dns.com"; then
if _get "https://cloudflare-dns.com"
>/dev/null 2>&1
; then
return 0
else
return 1
...
...
@@ -4047,7 +4081,18 @@ $_authorizations_map"
fi
if [ "$ACME_VERSION" = "2" ]; then
response="$(echo "$_authorizations_map" | grep "^$(_idn "$d")," | sed "s/$d,//")"
_idn_d="$(_idn "$d")"
_candindates="$(echo "$_authorizations_map" | grep "^$_idn_d,")"
_debug2 _candindates "$_candindates"
if [ "$(echo "$_candindates" | wc -l)" -gt 1 ]; then
for _can in $_candindates; do
if _startswith "$(echo "$_can" | tr '.' '|')" "$(echo "$_idn_d" | tr '.' '|'),"; then
_candindates="$_can"
break
fi
done
fi
response="$(echo "$_candindates" | sed "s/$_idn_d,//")"
_debug2 "response" "$response"
if [ -z "$response" ]; then
_err "get to authz error."
...
...
@@ -6059,7 +6104,7 @@ _send_notify() {
_set_notify_hook() {
_nhooks="$1"
_test_subject="Hello, this is notification from $PROJECT_NAME"
_test_subject="Hello, this is
a
notification from $PROJECT_NAME"
_test_content="If you receive this message, your notification works."
_send_notify "$_test_subject" "$_test_content" "$_nhooks" 0
...
...
deploy/gcore_cdn.sh
View file @
3d2df3ba
...
...
@@ -77,15 +77,15 @@ gcore_cdn_deploy() {
_debug _regex
"
$_regex
"
_resource
=
$(
echo
"
$_response
"
|
sed
's/},{/},\n{/g'
| _egrep_o
"
$_regex
"
)
_debug _resource
"
$_resource
"
_regex
=
".*
\"
id
\"
:
\(
[0-9]*
\)
,
.*$"
_regex
=
".*
\"
id
\"
:
\(
[0-9]*
\)
.*
\"
rules
\"
.*$"
_debug _regex
"
$_regex
"
_resourceId
=
$(
echo
"
$_resource
"
|
sed
-n
"s/
$_regex
/
\1
/p"
)
_debug _resourceId
"
$_resourceId
"
_regex
=
".*
\"
sslData
\"
:
\(
[0-9]*
\)
}
.*$"
_regex
=
".*
\"
sslData
\"
:
\(
[0-9]*
\)
.*$"
_debug _regex
"
$_regex
"
_sslDataOld
=
$(
echo
"
$_resource
"
|
sed
-n
"s/
$_regex
/
\1
/p"
)
_debug _sslDataOld
"
$_sslDataOld
"
_regex
=
".*
\"
originGroup
\"
:
\(
[0-9]*
\)
,
.*$"
_regex
=
".*
\"
originGroup
\"
:
\(
[0-9]*
\)
.*$"
_debug _regex
"
$_regex
"
_originGroup
=
$(
echo
"
$_resource
"
|
sed
-n
"s/
$_regex
/
\1
/p"
)
_debug _originGroup
"
$_originGroup
"
...
...
@@ -101,7 +101,7 @@ gcore_cdn_deploy() {
_debug _request
"
$_request
"
_response
=
$(
_post
"
$_request
"
"https://api.gcdn.co/sslData"
)
_debug _response
"
$_response
"
_regex
=
".*
\"
id
\"
:
\(
[0-9]*
\)
,
.*$"
_regex
=
".*
\"
id
\"
:
\(
[0-9]*
\)
.*$"
_debug _regex
"
$_regex
"
_sslDataAdd
=
$(
echo
"
$_response
"
|
sed
-n
"s/
$_regex
/
\1
/p"
)
_debug _sslDataAdd
"
$_sslDataAdd
"
...
...
deploy/qiniu.sh
View file @
3d2df3ba
deploy/routeros.sh
View file @
3d2df3ba
deploy/vault_cli.sh
View file @
3d2df3ba
dnsapi/dns_aws.sh
View file @
3d2df3ba
...
...
@@ -6,6 +6,8 @@
#AWS_SECRET_ACCESS_KEY="xxxxxxx"
#This is the Amazon Route53 api wrapper for acme.sh
#All `_sleep` commands are included to avoid Route53 throttling, see
#https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DNSLimitations.html#limits-api-requests
AWS_HOST
=
"route53.amazonaws.com"
AWS_URL
=
"https://
$AWS_HOST
"
...
...
@@ -43,6 +45,7 @@ dns_aws_add() {
_debug
"First detect the root zone"
if
!
_get_root
"
$fulldomain
"
;
then
_err
"invalid domain"
_sleep 1
return
1
fi
_debug _domain_id
"
$_domain_id
"
...
...
@@ -51,6 +54,7 @@ dns_aws_add() {
_info
"Getting existing records for
$fulldomain
"
if
!
aws_rest GET
"2013-04-01
$_domain_id
/rrset"
"name=
$fulldomain
&type=TXT"
;
then
_sleep 1
return
1
fi
...
...
@@ -63,6 +67,7 @@ dns_aws_add() {
if
[
"
$_resource_record
"
]
&&
_contains
"
$response
"
"
$txtvalue
"
;
then
_info
"The TXT record already exists. Skipping."
_sleep 1
return
0
fi
...
...
@@ -72,9 +77,10 @@ dns_aws_add() {
if
aws_rest POST
"2013-04-01
$_domain_id
/rrset/"
""
"
$_aws_tmpl_xml
"
&&
_contains
"
$response
"
"ChangeResourceRecordSetsResponse"
;
then
_info
"TXT record updated successfully."
_sleep 1
return
0
fi
_sleep 1
return
1
}
...
...
@@ -93,6 +99,7 @@ dns_aws_rm() {
_debug
"First detect the root zone"
if
!
_get_root
"
$fulldomain
"
;
then
_err
"invalid domain"
_sleep 1
return
1
fi
_debug _domain_id
"
$_domain_id
"
...
...
@@ -101,6 +108,7 @@ dns_aws_rm() {
_info
"Getting existing records for
$fulldomain
"
if
!
aws_rest GET
"2013-04-01
$_domain_id
/rrset"
"name=
$fulldomain
&type=TXT"
;
then
_sleep 1
return
1
fi
...
...
@@ -109,6 +117,7 @@ dns_aws_rm() {
_debug
"_resource_record"
"
$_resource_record
"
else
_debug
"no records exist, skip"
_sleep 1
return
0
fi
...
...
@@ -116,9 +125,10 @@ dns_aws_rm() {
if
aws_rest POST
"2013-04-01
$_domain_id
/rrset/"
""
"
$_aws_tmpl_xml
"
&&
_contains
"
$response
"
"ChangeResourceRecordSetsResponse"
;
then
_info
"TXT record deleted successfully."
_sleep 1
return
0
fi
_sleep 1
return
1
}
...
...
dnsapi/dns_da.sh
View file @
3d2df3ba
dnsapi/dns_doapi.sh
View file @
3d2df3ba
dnsapi/dns_durabledns.sh
View file @
3d2df3ba
dnsapi/dns_euserv.sh
View file @
3d2df3ba
dnsapi/dns_freedns.sh
View file @
3d2df3ba
...
...
@@ -303,9 +303,9 @@ _freedns_domain_id() {
return
1
fi
domain_id
=
"
$(
echo
"
$htmlpage
"
|
tr
-d
"
[:space:]
"
|
sed
's/<tr>/@<tr>/g'
|
tr
'@'
'\n'
\
domain_id
=
"
$(
echo
"
$htmlpage
"
|
tr
-d
"
\t\r\n\v\f
"
|
sed
's/<tr>/@<tr>/g'
|
tr
'@'
'\n'
\
|
grep
"<td>
$search_domain
</td>
\|
<td>
$search_domain
(.*)</td>"
\
|
_egrep_o
"
edit
\.
php
\
?
edit_domain_id=[0-9a-zA-Z]
+"
\
|
sed
-n
's/.*\(
edit\.php?edit_domain_id=[0-9a-zA-Z]
*\).*/\1/p'
\
|
cut
-d
=
-f
2
)
"
# The above beauty extracts domain ID from the html page...
# strip out all blank space and new lines. Then insert newlines
...
...
@@ -349,10 +349,10 @@ _freedns_data_id() {
return
1
fi
data_id
=
"
$(
echo
"
$htmlpage
"
|
tr
-d
"
[:space:]
"
|
sed
's/<tr>/@<tr>/g'
|
tr
'@'
'\n'
\
data_id
=
"
$(
echo
"
$htmlpage
"
|
tr
-d
"
\t\r\n\v\f
"
|
sed
's/<tr>/@<tr>/g'
|
tr
'@'
'\n'
\
|
grep
"<td[a-zA-Z=#]*>
$record_type
</td>"
\
|
grep
"<ahref.*>
$search_domain
</a>"
\
|
_egrep_o
"
edit
\.
php
\
?
data_id=[0-9a-zA-Z]
+"
\
|
sed
-n
's/.*\(
edit\.php?data_id=[0-9a-zA-Z]
*\).*/\1/p'
\
|
cut
-d
=
-f
2
)
"
# The above beauty extracts data ID from the html page...
# strip out all blank space and new lines. Then insert newlines
...
...
dnsapi/dns_leaseweb.sh
0 → 100644
View file @
3d2df3ba
#!/usr/bin/env sh
#Author: Rolph Haspers <r.haspers@global.leaseweb.com>
#Utilize leaseweb.com API to finish dns-01 verifications.
#Requires a Leaseweb API Key (export LSW_Key="Your Key")
#See http://developer.leaseweb.com for more information.
######## Public functions #####################
LSW_API
=
"https://api.leaseweb.com/hosting/v2/domains/"
#Usage: dns_leaseweb_add _acme-challenge.www.domain.com
dns_leaseweb_add
()
{
fulldomain
=
$1
txtvalue
=
$2
LSW_Key
=
"
${
LSW_Key
:-
$(
_readaccountconf_mutable LSW_Key
)
}
"
if
[
-z
"
$LSW_Key
"
]
;
then
LSW_Key
=
""
_err
"You don't specify Leaseweb api key yet."
_err
"Please create your key and try again."
return
1
fi
#save the api key to the account conf file.
_saveaccountconf_mutable LSW_Key
"
$LSW_Key
"
_debug
"First detect the root zone"
if
!
_get_root
"
$fulldomain
"
;
then
_err
"invalid domain"
return
1
fi
_debug _root_domain
"
$_domain
"
_debug _domain
"
$fulldomain
"
if
_lsw_api
"POST"
"
$_domain
"
"
$fulldomain
"
"
$txtvalue
"
;
then
if
[
"
$_code
"
=
"201"
]
;
then
_info
"Added, OK"
return
0
else
_err
"Add txt record error, invalid code. Code:
$_code
"
return
1
fi
fi
_err
"Add txt record error."
return
1
}
#Usage: fulldomain txtvalue
#Remove the txt record after validation.
dns_leaseweb_rm
()
{
fulldomain
=
$1
txtvalue
=
$2
LSW_Key
=
"
${
LSW_Key
:-
$(
_readaccountconf_mutable LSW_Key
)
}
"
_debug
"First detect the root zone"
if
!
_get_root
"
$fulldomain
"
;
then
_err
"invalid domain"
return
1
fi
_debug _root_domain
"
$_domain
"
_debug _domain
"
$fulldomain
"
if
_lsw_api
"DELETE"
"
$_domain
"
"
$fulldomain
"
"
$txtvalue
"
;
then
if
[
"
$_code
"
=
"204"
]
;
then
_info
"Deleted, OK"
return
0
else
_err
"Delete txt record error."
return
1
fi
fi
_err
"Delete txt record error."
return
1
}
#################### Private functions below ##################################
# _acme-challenge.www.domain.com
# returns
# _domain=domain.com
_get_root
()
{
rdomain
=
$1
i
=
"
$(
echo
"
$rdomain
"
|
tr
'.'
' '
|
wc
-w
)
"
i
=
$(
_math
"
$i
"
- 1
)
while
true
;
do
h
=
$(
printf
"%s"
"
$rdomain
"
|
cut
-d
.
-f
"
$i
"
-100
)
_debug h
"
$h
"
if
[
-z
"
$h
"
]
;
then
return
1
#not valid domain
fi
#Check API if domain exists
if
_lsw_api
"GET"
"
$h
"
;
then
if
[
"
$_code
"
=
"200"
]
;
then
_domain
=
"
$h
"
return
0
fi
fi
i
=
$(
_math
"
$i
"
- 1
)
if
[
"
$i
"
-lt
2
]
;
then
return
1
#not found, no need to check _acme-challenge.sub.domain in leaseweb api.
fi
done
return
1
}
_lsw_api
()
{
cmd
=
$1
d
=
$2
fd
=
$3
tvalue
=
$4
# Construct the HTTP Authorization header
export
_H2
=
"Content-Type: application/json"
export
_H1
=
"X-Lsw-Auth:
${
LSW_Key
}
"
if
[
"
$cmd
"
=
"GET"
]
;
then
response
=
"
$(
_get
"
$LSW_API
/
$d
"
)
"
_code
=
"
$(
grep
"^HTTP"
"
$HTTP_HEADER
"
| _tail_n 1 |
cut
-d
" "
-f
2 |
tr
-d
"
\\
r
\\
n"
)
"
_debug
"http response code
$_code
"
_debug response
"
$response
"
return
0
fi
if
[
"
$cmd
"
=
"POST"
]
;
then
data
=
"{
\"
name
\"
:
\"
$fd
.
\"
,
\"
type
\"
:
\"
TXT
\"
,
\"
content
\"
: [
\"
$tvalue
\"
],
\"
ttl
\"
: 60}"
response
=
"
$(
_post
"
$data
"
"
$LSW_API
/
$d
/resourceRecordSets"
"
$data
"
"POST"
)
"
_code
=
"
$(
grep
"^HTTP"
"
$HTTP_HEADER
"
| _tail_n 1 |
cut
-d
" "
-f
2 |
tr
-d
"
\\
r
\\
n"
)
"
_debug
"http response code
$_code
"
_debug response
"
$response
"
return
0
fi
if
[
"
$cmd
"
=
"DELETE"
]
;
then
response
=
"
$(
_post
""
"
$LSW_API
/
$d
/resourceRecordSets/
$fd
/TXT"
""
"DELETE"
)
"
_code
=
"
$(
grep
"^HTTP"
"
$HTTP_HEADER
"
| _tail_n 1 |
cut
-d
" "
-f
2 |
tr
-d
"
\\
r
\\
n"
)
"
_debug
"http response code
$_code
"
_debug response
"
$response
"
return
0
fi
return
1
}
dnsapi/dns_me.sh
View file @
3d2df3ba
dnsapi/dns_miab.sh
0 → 100644
View file @
3d2df3ba
#!/usr/bin/env sh
# Name: dns_miab.sh
#
# Authors:
# Darven Dissek 2018
# William Gertz 2019
#
# Thanks to Neil Pang and other developers here for code reused from acme.sh from DNS-01
# used to communicate with the MailinaBox Custom DNS API
# Report Bugs here:
# https://github.com/billgertz/MIAB_dns_api (for dns_miab.sh)
# https://github.com/Neilpang/acme.sh (for acme.sh)
#
######## Public functions #####################
#Usage: dns_miab_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_miab_add
()
{
fulldomain
=
$1
txtvalue
=
$2
_info
"Using miab challange add"
_debug fulldomain
"
$fulldomain
"
_debug txtvalue
"
$txtvalue
"
#retrieve MIAB environemt vars
if
!
_retrieve_miab_env
;
then
return
1
fi
#check domain and seperate into doamin and host
if
!
_get_root
"
$fulldomain
"
;
then
_err
"Cannot find any part of
${
fulldomain
}
is hosted on
${
MIAB_Server
}
"
return
1
fi
_debug2 _sub_domain
"
$_sub_domain
"
_debug2 _domain
"
$_domain
"
#add the challenge record
_api_path
=
"custom/
${
fulldomain
}
/txt"
_miab_rest
"
$txtvalue
"
"
$_api_path
"
"POST"
#check if result was good
if
_contains
"
$response
"
"updated DNS"
;
then
_info
"Successfully created the txt record"
return
0
else
_err
"Error encountered during record add"
_err
"
$response
"
return
1
fi
}
#Usage: dns_miab_rm _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_miab_rm
()
{
fulldomain
=
$1
txtvalue
=
$2
_info
"Using miab challage delete"
_debug fulldomain
"
$fulldomain
"
_debug txtvalue
"
$txtvalue
"
#retrieve MIAB environemt vars
if
!
_retrieve_miab_env
;
then
return
1
fi
#check domain and seperate into doamin and host
if
!
_get_root
"
$fulldomain
"
;
then
_err
"Cannot find any part of
${
fulldomain
}
is hosted on
${
MIAB_Server
}
"
return
1
fi
_debug2 _sub_domain
"
$_sub_domain
"
_debug2 _domain
"
$_domain
"
#Remove the challenge record
_api_path
=
"custom/
${
fulldomain
}
/txt"
_miab_rest
"
$txtvalue
"
"
$_api_path
"
"DELETE"
#check if result was good
if
_contains
"
$response
"
"updated DNS"
;
then
_info
"Successfully removed the txt record"
return
0
else
_err
"Error encountered during record remove"
_err
"
$response
"
return
1
fi
}
#################### Private functions below ##################################
#
#Usage: _get_root _acme-challenge.www.domain.com
#Returns:
# _sub_domain=_acme-challenge.www
# _domain=domain.com
_get_root
()
{
_passed_domain
=
$1
_debug _passed_domain
"
$_passed_domain
"
_i
=
2
_p
=
1
#get the zones hosed on MIAB server, must be a json stream
_miab_rest
""
"zones"
"GET"
if
!
_is_json
"
$response
"
;
then
_err
"ERROR fetching domain list"
_err
"
$response
"
return
1
fi
#cycle through the passed domain seperating out a test domain discarding
# the subdomain by marching thorugh the dots
while
true
;
do
_test_domain
=
$(
printf
"%s"
"
$_passed_domain
"
|
cut
-d
.
-f
${
_i
}
-100
)
_debug _test_domain
"
$_test_domain
"
if
[
-z
"
$_test_domain
"
]
;
then
return
1
fi
#report found if the test domain is in the json response and
# report the subdomain
if
_contains
"
$response
"
"
\"
$_test_domain
\"
"
;
then
_sub_domain
=
$(
printf
"%s"
"
$_passed_domain
"
|
cut
-d
.
-f
1-
${
_p
}
)
_domain
=
${
_test_domain
}
return
0
fi
#cycle to the next dot in the passed domain
_p
=
${
_i
}
_i
=
$(
_math
"
$_i
"
+ 1
)
done
return
1
}
#Usage: _retrieve_miab_env
#Returns (from store or environment variables):
# MIAB_Username
# MIAB_Password
# MIAB_Server
#retrieve MIAB environment variables, report errors and quit if problems
_retrieve_miab_env
()
{
MIAB_Username
=
"
${
MIAB_Username
:-
$(
_readaccountconf_mutable MIAB_Username
)
}
"
MIAB_Password
=
"
${
MIAB_Password
:-
$(
_readaccountconf_mutable MIAB_Password
)
}
"
MIAB_Server
=
"
${
MIAB_Server
:-
$(
_readaccountconf_mutable MIAB_Server
)
}
"
#debug log the environmental variables
_debug MIAB_Username
"
$MIAB_Username
"
_debug MIAB_Password
"
$MIAB_Password
"
_debug MIAB_Server
"
$MIAB_Server
"
#check if MIAB environemt vars set and quit if not
if
[
-z
"
$MIAB_Username
"
]
||
[
-z
"
$MIAB_Password
"
]
||
[
-z
"
$MIAB_Server
"
]
;
then
_err
"You didn't specify one or more of MIAB_Username, MIAB_Password or MIAB_Server."
_err
"Please check these environment variables and try again."
return
1
fi
#save the credentials to the account conf file.
_saveaccountconf_mutable MIAB_Username
"
$MIAB_Username
"
_saveaccountconf_mutable MIAB_Password
"
$MIAB_Password
"
_saveaccountconf_mutable MIAB_Server
"
$MIAB_Server
"
}
#Useage: _miab_rest "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs" "custom/_acme-challenge.www.domain.com/txt "POST"
#Returns: "updated DNS: domain.com"
#rest interface MIAB dns
_miab_rest
()
{
_data
=
"
$1
"
_api_path
=
"
$2
"
_httpmethod
=
"
$3
"
#encode username and password for basic authentication
_credentials
=
"
$(
printf
"%s"
"
$MIAB_Username
:
$MIAB_Password
"
| _base64
)
"
export
_H1
=
"Authorization: Basic
$_credentials
"
_url
=
"https://
${
MIAB_Server
}
/admin/dns/
${
_api_path
}
"
_debug2 _data
"
$_data
"
_debug _api_path
"
$_api_path
"
_debug2 _url
"
$_url
"
_debug2 _credentails
"
$_credentials
"
_debug _httpmethod
"
$_httpmethod
"
if
[
"
$_httpmethod
"
=
"GET"
]
;
then
response
=
"
$(
_get
"
$_url
"
)
"
else
response
=
"
$(
_post
"
$_data
"
"
$_url
"
""
"
$_httpmethod
"
)
"
fi
_retcode
=
"
$?
"
if
[
"
$_retcode
"
!=
"0"
]
;
then
_err
"MIAB REST authentication failed on
$_httpmethod
"
return
1
fi
_debug response
"
$response
"
return
0
}
#Usage: _is_json "\[\n "mydomain.com"\n]"
#Reurns "\[\n "mydomain.com"\n]"
#returns the string if it begins and ends with square braces
_is_json
()
{
_str
=
"
$(
echo
"
$1
"
| _normalizeJson
)
"
echo
"
$_str
"
|
grep
'^\[.*\]$'
>
/dev/null 2>&1
}
dnsapi/dns_namecheap.sh
View file @
3d2df3ba
dnsapi/dns_nic.sh
0 → 100644
View file @
3d2df3ba
#!/usr/bin/env sh
#
#NIC_Token="sdfsdfsdfljlbjkljlkjsdfoiwjedfglgkdlfgkfgldfkg"
#
#NIC_Username="000000/NIC-D"
#NIC_Password="xxxxxxx"
NIC_Api
=
"https://api.nic.ru"
dns_nic_add
()
{
fulldomain
=
"
${
1
}
"
txtvalue
=
"
${
2
}
"
NIC_Token
=
"
${
NIC_Token
:-
$(
_readaccountconf_mutable NIC_Token
)
}
"
NIC_Username
=
"
${
NIC_Username
:-
$(
_readaccountconf_mutable NIC_Username
)
}
"
NIC_Password
=
"
${
NIC_Password
:-
$(
_readaccountconf_mutable NIC_Password
)
}
"
if
[
-z
"
$NIC_Token
"
]
||
[
-z
"
$NIC_Username
"
]
||
[
-z
"
$NIC_Password
"
]
;
then
NIC_Token
=
""
NIC_Username
=
""
NIC_Password
=
""
_err
"You must export variables: NIC_Token, NIC_Username and NIC_Password"
return
1
fi
_saveaccountconf_mutable NIC_Customer
"
$NIC_Token
"
_saveaccountconf_mutable NIC_Username
"
$NIC_Username
"
_saveaccountconf_mutable NIC_Password
"
$NIC_Password
"
if
!
_nic_get_authtoken
"
$NIC_Username
"
"
$NIC_Password
"
"
$NIC_Token
"
;
then
_err
"get NIC auth token failed"
return
1
fi
_debug
"First detect the root zone"
if
!
_get_root
"
$fulldomain
"
;
then
_err
"Invalid domain"
return
1
fi
_debug _sub_domain
"
$_sub_domain
"
_debug _domain
"
$_domain
"
_debug _service
"
$_service
"
_info
"Adding record"
if
!
_nic_rest PUT
"services/
$_service
/zones/
$_domain
/records"
"<?xml version=
\"
1.0
\"
encoding=
\"
UTF-8
\"
?><request><rr-list><rr><name>
$_sub_domain
</name><type>TXT</type><txt><string>
$txtvalue
</string></txt></rr></rr-list></request>"
;
then
_err
"Add TXT record error"
return
1
fi
if
!
_nic_rest POST
"services/
$_service
/zones/
$_domain
/commit"
""
;
then
return
1
fi
_info
"Added, OK"
}
dns_nic_rm
()
{
fulldomain
=
"
${
1
}
"
txtvalue
=
"
${
2
}
"
NIC_Token
=
"
${
NIC_Token
:-
$(
_readaccountconf_mutable NIC_Token
)
}
"
NIC_Username
=
"
${
NIC_Username
:-
$(
_readaccountconf_mutable NIC_Username
)
}
"
NIC_Password
=
"
${
NIC_Password
:-
$(
_readaccountconf_mutable NIC_Password
)
}
"
if
[
-z
"
$NIC_Token
"
]
||
[
-z
"
$NIC_Username
"
]
||
[
-z
"
$NIC_Password
"
]
;
then
NIC_Token
=
""
NIC_Username
=
""
NIC_Password
=
""
_err
"You must export variables: NIC_Token, NIC_Username and NIC_Password"
return
1
fi
if
!
_nic_get_authtoken
"
$NIC_Username
"
"
$NIC_Password
"
"
$NIC_Token
"
;
then
_err
"get NIC auth token failed"
return
1
fi
if
!
_get_root
"
$fulldomain
"
;
then
_err
"Invalid domain"
return
1
fi
_debug _sub_domain
"
$_sub_domain
"
_debug _domain
"
$_domain
"
_debug _service
"
$_service
"
if
!
_nic_rest GET
"services/
$_service
/zones/
$_domain
/records"
;
then
_err
"Get records error"
return
1
fi
_domain_id
=
$(
printf
"%s"
"
$response
"
|
grep
"
$_sub_domain
"
|
grep
"
$txtvalue
"
|
sed
-r
"s/.*<rr id=
\"
(.*)
\"
.*/
\1
/g"
)
if
!
_nic_rest DELETE
"services/
$_service
/zones/
$_domain
/records/
$_domain_id
"
;
then
_err
"Delete record error"
return
1
fi
if
!
_nic_rest POST
"services/
$_service
/zones/
$_domain
/commit"
""
;
then
return
1
fi
}
#################### Private functions below ##################################
_nic_get_authtoken
()
{
username
=
"
$1
"
password
=
"
$2
"
token
=
"
$3
"
_info
"Getting NIC auth token"
export
_H1
=
"Authorization: Basic
$token
"
export
_H2
=
"Content-Type: application/x-www-form-urlencoded"
res
=
$(
_post
"grant_type=password&username=
$username
&password=
$password
&scope=%28GET%7CPUT%7CPOST%7CDELETE%29%3A%2Fdns-master%2F.%2B"
"
$NIC_Api
/oauth/token"
""
"POST"
)
if
_contains
"
$res
"
"access_token"
;
then
_auth_token
=
$(
printf
"%s"
"
$res
"
|
cut
-d
,
-f2
|
tr
-d
"
\"
"
|
sed
"s/access_token://"
)
_info
"Token received"
_debug _auth_token
"
$_auth_token
"
return
0
fi
return
1
}
_get_root
()
{
domain
=
"
$1
"
i
=
1
p
=
1
if
!
_nic_rest GET
"zones"
;
then
return
1
fi
_all_domains
=
$(
printf
"%s"
"
$response
"
|
grep
"idn-name"
|
sed
-r
"s/.*idn-name=
\"
(.*)
\"
name=.*/
\1
/g"
)
_debug2 _all_domains
"
$_all_domains
"
while
true
;
do
h
=
$(
printf
"%s"
"
$domain
"
|
cut
-d
.
-f
"
$i
"
-100
)
_debug h
"
$h
"
if
[
-z
"
$h
"
]
;
then
return
1
fi
if
_contains
"
$_all_domains
"
"^
$h
$"
;
then
_sub_domain
=
$(
printf
"%s"
"
$domain
"
|
cut
-d
.
-f
1-
$p
)
_domain
=
$h
_service
=
$(
printf
"%s"
"
$response
"
|
grep
"
$_domain
"
|
sed
-r
"s/.*service=
\"
(.*)
\"
.*
$/
\1
/"
)
return
0
fi
p
=
"
$i
"
i
=
$(
_math
"
$i
"
+ 1
)
done
return
1
}
_nic_rest
()
{
m
=
"
$1
"
ep
=
"
$2
"
data
=
"
$3
"
_debug
"
$ep
"
export
_H1
=
"Content-Type: application/xml"
export
_H2
=
"Authorization: Bearer
$_auth_token
"
if
[
"
$m
"
!=
"GET"
]
;
then
_debug data
"
$data
"
response
=
$(
_post
"
$data
"
"
$NIC_Api
/dns-master/
$ep
"
""
"
$m
"
)
else
response
=
$(
_get
"
$NIC_Api
/dns-master/
$ep
"
)
fi
if
_contains
"
$response
"
"<errors>"
;
then
error
=
$(
printf
"%s"
"
$response
"
|
grep
"error code"
|
sed
-r
"s/.*<error code=.*>(.*)<
\/
error>/
\1
/g"
)
_err
"Error:
$error
"
return
1
fi
if
!
_contains
"
$response
"
"<status>success</status>"
;
then
return
1
fi
_debug2 response
"
$response
"
return
0
}
dnsapi/dns_nsupdate.sh
View file @
3d2df3ba
Prev
1
2
Next
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