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
27bbf0cc
Unverified
Commit
27bbf0cc
authored
Mar 01, 2022
by
fradev
Committed by
GitHub
Mar 01, 2022
Browse files
Merge branch 'acmesh-official:master' into master
parents
71a32477
2a2d5565
Changes
25
Hide whitespace changes
Inline
Side-by-side
dnsapi/dns_mythic_beasts.sh
0 → 100755
View file @
27bbf0cc
#!/usr/bin/env sh
# Mythic Beasts is a long-standing UK service provider using standards-based OAuth2 authentication
# To test: ./acme.sh --dns dns_mythic_beasts --test --debug 1 --output-insecure --issue --domain domain.com
# Cannot retest once cert is issued
# OAuth2 tokens only valid for 300 seconds so we do not store
# NOTE: This will remove all TXT records matching the fulldomain, not just the added ones (_acme-challenge.www.domain.com)
# Test OAuth2 credentials
#MB_AK="aaaaaaaaaaaaaaaa"
#MB_AS="bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
# URLs
MB_API
=
'https://api.mythic-beasts.com/dns/v2/zones'
MB_AUTH
=
'https://auth.mythic-beasts.com/login'
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_mythic_beasts_add
()
{
fulldomain
=
$1
txtvalue
=
$2
_info
"MYTHIC BEASTS Adding record
$fulldomain
=
$txtvalue
"
if
!
_initAuth
;
then
return
1
fi
if
!
_get_root
"
$fulldomain
"
;
then
return
1
fi
# method path body_data
if
_mb_rest POST
"
$_domain
/records/
$_sub_domain
/TXT"
"
$txtvalue
"
;
then
if
_contains
"
$response
"
"1 records added"
;
then
_info
"Added, verifying..."
# Max 120 seconds to publish
for
i
in
$(
seq
1 6
)
;
do
# Retry on error
if
!
_mb_rest GET
"
$_domain
/records/
$_sub_domain
/TXT?verify"
;
then
_sleep 20
else
_info
"Record published!"
return
0
fi
done
else
_err
"
\n
$response
"
fi
fi
_err
"Add txt record error."
return
1
}
#Usage: rm _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_mythic_beasts_rm
()
{
fulldomain
=
$1
txtvalue
=
$2
_info
"MYTHIC BEASTS Removing record
$fulldomain
=
$txtvalue
"
if
!
_initAuth
;
then
return
1
fi
if
!
_get_root
"
$fulldomain
"
;
then
return
1
fi
# method path body_data
if
_mb_rest DELETE
"
$_domain
/records/
$_sub_domain
/TXT"
"
$txtvalue
"
;
then
_info
"Record removed"
return
0
fi
_err
"Remove txt record error."
return
1
}
#################### Private functions below ##################################
#Possible formats:
# _acme-challenge.www.example.com
# _acme-challenge.example.com
# _acme-challenge.example.co.uk
# _acme-challenge.www.example.co.uk
# _acme-challenge.sub1.sub2.www.example.co.uk
# sub1.sub2.example.co.uk
# example.com
# example.co.uk
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
_get_root
()
{
domain
=
$1
i
=
1
p
=
1
_debug
"Detect the root zone"
while
true
;
do
h
=
$(
printf
"%s"
"
$domain
"
|
cut
-d
.
-f
$i
-100
)
if
[
-z
"
$h
"
]
;
then
_err
"Domain exhausted"
return
1
fi
# Use the status errors to find the domain, continue on 403 Access denied
# method path body_data
_mb_rest GET
"
$h
/records"
ret
=
"
$?
"
if
[
"
$ret
"
-eq
0
]
;
then
_sub_domain
=
$(
printf
"%s"
"
$domain
"
|
cut
-d
.
-f
1-
$p
)
_domain
=
"
$h
"
_debug _sub_domain
"
$_sub_domain
"
_debug _domain
"
$_domain
"
return
0
elif
[
"
$ret
"
-eq
1
]
;
then
return
1
fi
p
=
$i
i
=
$(
_math
"
$i
"
+ 1
)
if
[
"
$i
"
-gt
50
]
;
then
break
fi
done
_err
"Domain too long"
return
1
}
_initAuth
()
{
MB_AK
=
"
${
MB_AK
:-
$(
_readaccountconf_mutable MB_AK
)
}
"
MB_AS
=
"
${
MB_AS
:-
$(
_readaccountconf_mutable MB_AS
)
}
"
if
[
-z
"
$MB_AK
"
]
||
[
-z
"
$MB_AS
"
]
;
then
MB_AK
=
""
MB_AS
=
""
_err
"Please specify an OAuth2 Key & Secret"
return
1
fi
_saveaccountconf_mutable MB_AK
"
$MB_AK
"
_saveaccountconf_mutable MB_AS
"
$MB_AS
"
if
!
_oauth2
;
then
return
1
fi
_info
"Checking authentication"
_secure_debug access_token
"
$MB_TK
"
_sleep 1
# GET a list of zones
# method path body_data
if
!
_mb_rest GET
""
;
then
_err
"The token is invalid"
return
1
fi
_info
"Token OK"
return
0
}
# Github appears to use an outbound proxy for requests which means subsequent requests may not have the same
# source IP. The standard Mythic Beasts OAuth2 tokens are tied to an IP, meaning github test requests fail
# authentication. This is a work around using an undocumented MB API to obtain a token not tied to an
# IP just for the github tests.
_oauth2
()
{
if
[
"
$GITHUB_ACTIONS
"
=
"true"
]
;
then
_oauth2_github
else
_oauth2_std
fi
return
$?
}
_oauth2_std
()
{
# HTTP Basic Authentication
_H1
=
"Authorization: Basic
$(
echo
"
$MB_AK
:
$MB_AS
"
| _base64
)
"
_H2
=
"Accepts: application/json"
export
_H1 _H2
body
=
"grant_type=client_credentials"
_info
"Getting OAuth2 token..."
# body url [needbase64] [POST|PUT|DELETE] [ContentType]
response
=
"
$(
_post
"
$body
"
"
$MB_AUTH
"
""
"POST"
"application/x-www-form-urlencoded"
)
"
if
_contains
"
$response
"
"
\"
token_type
\"
:
\"
bearer
\"
"
;
then
MB_TK
=
"
$(
echo
"
$response
"
| _egrep_o
"access_token
\"
:
\"
[^
\"
]*
\"
"
|
cut
-d
:
-f
2 |
tr
-d
'"'
)
"
if
[
-z
"
$MB_TK
"
]
;
then
_err
"Unable to get access_token"
_err
"
\n
$response
"
return
1
fi
else
_err
"OAuth2 token_type not Bearer"
_err
"
\n
$response
"
return
1
fi
_debug2 response
"
$response
"
return
0
}
_oauth2_github
()
{
_H1
=
"Accepts: application/json"
export
_H1
body
=
"{
\"
login
\"
:{
\"
handle
\"
:
\"
$MB_AK
\"
,
\"
pass
\"
:
\"
$MB_AS
\"
,
\"
floating
\"
:1}}"
_info
"Getting Floating token..."
# body url [needbase64] [POST|PUT|DELETE] [ContentType]
response
=
"
$(
_post
"
$body
"
"
$MB_AUTH
"
""
"POST"
"application/json"
)
"
MB_TK
=
"
$(
echo
"
$response
"
| _egrep_o
"
\"
token
\"
:
\"
[^
\"
]*
\"
"
|
cut
-d
:
-f
2 |
tr
-d
'"'
)
"
if
[
-z
"
$MB_TK
"
]
;
then
_err
"Unable to get token"
_err
"
\n
$response
"
return
1
fi
_debug2 response
"
$response
"
return
0
}
# method path body_data
_mb_rest
()
{
# URL encoded body for single API operations
m
=
"
$1
"
ep
=
"
$2
"
data
=
"
$3
"
if
[
-z
"
$ep
"
]
;
then
_mb_url
=
"
$MB_API
"
else
_mb_url
=
"
$MB_API
/
$ep
"
fi
_H1
=
"Authorization: Bearer
$MB_TK
"
_H2
=
"Accepts: application/json"
export
_H1 _H2
if
[
"
$data
"
]
||
[
"
$m
"
=
"POST"
]
||
[
"
$m
"
=
"PUT"
]
||
[
"
$m
"
=
"DELETE"
]
;
then
# body url [needbase64] [POST|PUT|DELETE] [ContentType]
response
=
"
$(
_post
"data=
$data
"
"
$_mb_url
"
""
"
$m
"
"application/x-www-form-urlencoded"
)
"
else
response
=
"
$(
_get
"
$_mb_url
"
)
"
fi
if
[
"
$?
"
!=
"0"
]
;
then
_err
"Request error"
return
1
fi
header
=
"
$(
cat
"
$HTTP_HEADER
"
)
"
status
=
"
$(
echo
"
$header
"
| _egrep_o
"^HTTP[^ ]* .*$"
|
cut
-d
" "
-f
2-100 |
tr
-d
"
\f\n
"
)
"
code
=
"
$(
echo
"
$status
"
| _egrep_o
"^[0-9]*"
)
"
if
[
"
$code
"
-ge
400
]
||
_contains
"
$response
"
"
\"
error
\"
"
||
_contains
"
$response
"
"invalid_client"
;
then
_err
"error
$status
"
_err
"
\n
$response
"
_debug
"
\n
$header
"
return
2
fi
_debug2 response
"
$response
"
return
0
}
dnsapi/dns_opnsense.sh
View file @
27bbf0cc
...
...
@@ -150,7 +150,7 @@ _get_root() {
return
1
fi
_debug h
"
$h
"
id
=
$(
echo
"
$_domain_response
"
| _egrep_o
"
\"
[^
\"
]*
\"
:{
\"
enabled
\"
:
\"
1
\"
,
\"
type
\"
:{
\"
master
\"
:{
\"
value
\"
:
\"
master
\"
,
\"
selected
\"
:1},
\"
slave
\"
:{
\"
value
\"
:
\"
slave
\"
,
\"
selected
\"
:0}},
\"
masterip
\"
:
\"
[^
\"
]*
\"
(,
\"
allownotifyslave
\"
:{
\"\"
:{[^}]*}},|,)
\"
domainname
\"
:
\"
${
h
}
\"
"
|
cut
-d
':'
-f
1 |
cut
-d
'"'
-f
2
)
id
=
$(
echo
"
$_domain_response
"
| _egrep_o
"
\"
[^
\"
]*
\"
:{
\"
enabled
\"
:
\"
1
\"
,
\"
type
\"
:{
\"
master
\"
:{
\"
value
\"
:
\"
master
\"
,
\"
selected
\"
:1},
\"
slave
\"
:{
\"
value
\"
:
\"
slave
\"
,
\"
selected
\"
:0}},
\"
masterip
\"
:
{
\"
\"
:{[^}]*}}
(,
\"
allownotifyslave
\"
:{
\"\"
:{[^}]*}},|,)
\"
domainname
\"
:
\"
${
h
}
\"
"
|
cut
-d
':'
-f
1 |
cut
-d
'"'
-f
2
)
if
[
-n
"
$id
"
]
;
then
_debug
id
"
$id
"
...
...
dnsapi/dns_regru.sh
View file @
27bbf0cc
...
...
@@ -92,9 +92,10 @@ _get_root() {
domains_list
=
$(
echo
"
${
response
}
"
|
grep
dname |
sed
-r
"s/.*dname=
\"
([^
\"
]+)
\"
.*/
\\
1/g"
)
for
ITEM
in
${
domains_list
}
;
do
IDN_ITEM
=
"
$(
_idn
"
${
ITEM
}
"
)
"
case
"
${
domain
}
"
in
*${
ITEM
}*
)
_domain
=
${
ITEM
}
*${
IDN_
ITEM
}*
)
_domain
=
${
IDN_
ITEM
}
_debug _domain
"
${
_domain
}
"
return
0
;;
...
...
dnsapi/dns_simply.sh
View file @
27bbf0cc
#!/usr/bin/env sh
#
# API-integration for Simply.com (https://www.simply.com)
#SIMPLY_AccountName="accountname"
#
#SIMPLY_ApiKey="apikey"
#
#SIMPLY_Api="https://api.simply.com/1/[ACCOUNTNAME]/[APIKEY]"
SIMPLY_Api_Default
=
"https://api.simply.com/1"
#This is used for determining success of REST call
SIMPLY_SUCCESS_CODE
=
'"status":
200'
SIMPLY_SUCCESS_CODE
=
'"status":200'
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
...
...
@@ -51,7 +51,7 @@ dns_simply_rm() {
_simply_save_config
_debug
"Fi
rst detect
the
root
zone"
_debug
"Fi
nd
the
DNS
zone"
if
!
_get_root
"
$fulldomain
"
;
then
_err
"invalid domain"
...
...
@@ -77,8 +77,8 @@ dns_simply_rm() {
for
record
in
$records
;
do
_debug record
"
$record
"
record_data
=
$(
echo
"
$record
"
|
cut
-d
","
-f
3 |
sed
's/"//g'
|
grep
"data"
|
cut
-d
":"
-f
2
)
record_type
=
$(
echo
"
$record
"
|
cut
-d
","
-f
4 |
sed
's/"//g'
|
grep
"type"
|
cut
-d
":"
-f
2
)
record_data
=
$(
echo
"
$record
"
|
sed
-n
"s/.*
\"
data
\"
:
\"\(
[^
\"
]*
\)\"
.*/
\1
/p"
)
record_type
=
$(
echo
"
$record
"
|
sed
-n
"s/.*
\"
type
\"
:
\"\(
[^
\"
]*
\)\"
.*/
\1
/p"
)
_debug2 record_data
"
$record_data
"
_debug2 record_type
"
$record_type
"
...
...
@@ -151,7 +151,7 @@ _simply_save_config() {
_simply_get_all_records
()
{
domain
=
$1
if
!
_simply_rest GET
"my/products/
$domain
/dns/records"
;
then
if
!
_simply_rest GET
"my/products/
$domain
/dns/records
/
"
;
then
return
1
fi
...
...
@@ -169,7 +169,7 @@ _get_root() {
return
1
fi
if
!
_simply_rest GET
"my/products/
$h
/dns"
;
then
if
!
_simply_rest GET
"my/products/
$h
/dns
/
"
;
then
return
1
fi
...
...
@@ -193,7 +193,7 @@ _simply_add_record() {
data
=
"{
\"
name
\"
:
\"
$sub_domain
\"
,
\"
type
\"
:
\"
TXT
\"
,
\"
data
\"
:
\"
$txtval
\"
,
\"
priority
\"
:0,
\"
ttl
\"
: 3600}"
if
!
_simply_rest POST
"my/products/
$domain
/dns/records"
"
$data
"
;
then
if
!
_simply_rest POST
"my/products/
$domain
/dns/records
/
"
"
$data
"
;
then
_err
"Adding record not successfull!"
return
1
fi
...
...
@@ -214,7 +214,7 @@ _simply_delete_record() {
_debug record_id
"Delete record with id
$record_id
"
if
!
_simply_rest DELETE
"my/products/
$domain
/dns/records/
$record_id
"
;
then
if
!
_simply_rest DELETE
"my/products/
$domain
/dns/records/
$record_id
/
"
;
then
_err
"Deleting record not successfull!"
return
1
fi
...
...
@@ -250,6 +250,8 @@ _simply_rest() {
return
1
fi
response
=
"
$(
echo
"
$response
"
| _normalizeJson
)
"
_debug2 response
"
$response
"
if
_contains
"
$response
"
"Invalid account authorization"
;
then
...
...
notify/gotify.sh
0 → 100644
View file @
27bbf0cc
#!/usr/bin/env sh
#Support Gotify
#GOTIFY_URL="https://gotify.example.com"
#GOTIFY_TOKEN="123456789ABCDEF"
#optional
#GOTIFY_PRIORITY=0
# subject content statusCode
gotify_send
()
{
_subject
=
"
$1
"
_content
=
"
$2
"
_statusCode
=
"
$3
"
#0: success, 1: error 2($RENEW_SKIP): skipped
_debug
"_subject"
"
$_subject
"
_debug
"_content"
"
$_content
"
_debug
"_statusCode"
"
$_statusCode
"
GOTIFY_URL
=
"
${
GOTIFY_URL
:-
$(
_readaccountconf_mutable GOTIFY_URL
)
}
"
if
[
-z
"
$GOTIFY_URL
"
]
;
then
GOTIFY_URL
=
""
_err
"You didn't specify the gotify server url GOTIFY_URL."
return
1
fi
_saveaccountconf_mutable GOTIFY_URL
"
$GOTIFY_URL
"
GOTIFY_TOKEN
=
"
${
GOTIFY_TOKEN
:-
$(
_readaccountconf_mutable GOTIFY_TOKEN
)
}
"
if
[
-z
"
$GOTIFY_TOKEN
"
]
;
then
GOTIFY_TOKEN
=
""
_err
"You didn't specify the gotify token GOTIFY_TOKEN."
return
1
fi
_saveaccountconf_mutable GOTIFY_TOKEN
"
$GOTIFY_TOKEN
"
GOTIFY_PRIORITY
=
"
${
GOTIFY_PRIORITY
:-
$(
_readaccountconf_mutable GOTIFY_PRIORITY
)
}
"
if
[
-z
"
$GOTIFY_PRIORITY
"
]
;
then
GOTIFY_PRIORITY
=
0
else
_saveaccountconf_mutable GOTIFY_PRIORITY
"
$GOTIFY_PRIORITY
"
fi
export
_H1
=
"X-Gotify-Key:
${
GOTIFY_TOKEN
}
"
export
_H2
=
"Content-Type: application/json"
_content
=
$(
echo
"
$_content
"
| _json_encode
)
_subject
=
$(
echo
"
$_subject
"
| _json_encode
)
_data
=
"{
\"
title
\"
:
\"
${
_subject
}
\"
,
\"
message
\"
:
\"
${
_content
}
\"
,
\"
priority
\"
:
${
GOTIFY_PRIORITY
}
}"
response
=
"
$(
_post
"
${
_data
}
"
"
${
GOTIFY_URL
}
/message"
""
"POST"
"application/json"
)
"
if
[
"
$?
"
!=
"0"
]
;
then
_err
"Failed to send message"
_err
"
$response
"
return
1
fi
_debug2 response
"
$response
"
return
0
}
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