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
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
Show 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