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
d108072b
Unverified
Commit
d108072b
authored
May 30, 2023
by
Martin Arndt
Committed by
GitHub
May 30, 2023
Browse files
Add ArtFiles.de DNS API plugin
parent
51be15f6
Changes
1
Show whitespace changes
Inline
Side-by-side
dnsapi/dns_artfiles.sh
0 → 100644
View file @
d108072b
#!/usr/bin/env sh
################################################################################
# ACME.sh 3rd party DNS API plugin for ArtFiles.de
################################################################################
# Author: Martin Arndt, https://troublezone.net/
# Released: 2022-02-27
# Issues: https://github.com/Eagle3386/acme.sh/issues
################################################################################
# Usage:
# 1. export AF_API_USERNAME="api12345678"
# 2. export AF_API_PASSWORD="apiPassword"
# 3. acme.sh --issue -d example.com --dns dns_artfiles
################################################################################
########## API configuration ###################################################
AF_API_SUCCESS
=
'status":"OK'
AF_URL_DCP
=
'https://dcp.c.artfiles.de/api/'
AF_URL_DNS
=
${
AF_URL_DCP
}
'dns/{*}_dns.html?domain='
AF_URL_DOMAINS
=
${
AF_URL_BASE
}
'domain/get_domains.html'
########## Public functions ####################################################
# Adds a new TXT record for given ACME challenge value & domain.
# Usage: dns_artfiles_add _acme-challenge.www.example.com "ACME challenge value"
dns_artfiles_add
()
{
domain
=
"
$1
"
txtValue
=
"
$2
"
_info
'Using ArtFiles.de DNS addition API'
_debug
'Domain'
"
$domain
"
_debug
'txtValue'
"
$txtValue
"
AF_API_USERNAME
=
"
${
AF_API_USERNAME
:-
$(
_readaccountconf_mutable AF_API_USERNAME
)
}
"
AF_API_PASSWORD
=
"
${
AF_API_PASSWORD
:-
$(
_readaccountconf_mutable AF_API_PASSWORD
)
}
"
if
[
-z
"
$AF_API_USERNAME
"
]
||
[
-z
"
$AF_API_PASSWORD
"
]
;
then
_err
'Missing ArtFiles.de username and/or password.'
_err
'Please ensure both are set via export command & try again.'
return
1
fi
_saveaccountconf_mutable
'AF_API_USERNAME'
"
$AF_API_USERNAME
"
_saveaccountconf_mutable
'AF_API_PASSWORD'
"
$AF_API_PASSWORD
"
_set_headers
_get_zone
"
$domain
"
_dns
'GET'
if
!
_contains
"
$response
"
'TXT'
;
then
_err
'Retrieving TXT records failed.'
return
1
fi
_clean_records
_dns
'SET'
"
$(
printf
--
'%s\n_acme-challenge "%s"'
"
$response
"
"
$txtValue
"
)
"
if
!
_contains
"
$response
"
"
$AF_API_SUCCESS
"
;
then
_err
'Adding ACME challenge value failed.'
return
1
fi
}
# Removes the existing TXT record for given ACME challenge value & domain.
# Usage: dns_artfiles_rm _acme-challenge.www.example.com "ACME challenge value"
dns_artfiles_rm
()
{
domain
=
"
$1
"
txtValue
=
"
$2
"
_info
'Using ArtFiles.de DNS removal API'
_debug
'Domain'
"
$domain
"
_debug
'txtValue'
"
$txtValue
"
_set_headers
_get_zone
"
$domain
"
if
!
_dns
'GET'
;
then
return
1
fi
if
!
_contains
"
$response
"
"
$txtValue
"
;
then
_err
'Retrieved TXT records are missing given ACME challenge value.'
return
1
fi
_clean_records
response
=
"
$(
printf
--
'%s'
"
$response
"
|
sed
'$d'
)
"
_dns
'SET'
"
$response
"
if
!
_contains
"
$response
"
"
$AF_API_SUCCESS
"
;
then
_err
'Removing ACME challenge value failed.'
return
1
fi
}
########## Private functions ###################################################
# Cleans awful TXT records response of ArtFiles's API & pretty prints it.
# Usage: _clean_records
_clean_records
()
{
# Extract TXT part, strip trailing quote sign (ACME.sh API guidelines forbid
# usage of SED's GNU extensions, hence couldn't omit it via regex), strip '\'
# from '\"' & turn '\n' into real LF characters.
# Yup, awful API to use - but that's all we got to get this working, so... ;)
_debug2
'Raw '
"
$response
"
response
=
"
$(
printf
--
'%s'
"
$response
"
\
|
sed
's/^\(.*TXT":"\)\([^,}]*\)\(.*\)$/\2/;s/.$//;s/\\"/"/g;s/\\n/\n/g'
)
"
_debug2
'Clean'
"
$response
"
}
# Executes an HTTP GET or POST request for getting or setting DNS records,
# containing given payload upon POST.
# Usage: _dns [GET | SET] [payload]
_dns
()
{
action
=
"
$1
"
payload
=
"
$(
printf
--
'%s'
"
$2
"
| _url_encode
)
"
url
=
"
$(
printf
--
'%s%s'
"
$AF_URL_DNS
"
"
$domain
"
\
|
sed
's/{\*}/'
"
$(
printf
--
'%s'
"
$action
"
| _lower_case
)
"
'/'
)
"
if
[
"
$action
"
=
'SET'
]
;
then
_debug2
'Payload'
"
$payload
"
response
=
"
$(
_post
''
"
$url
&TXT=
$payload
"
''
'POST'
'application/x-www-form-urlencoded'
)
"
else
response
=
"
$(
_get
"
$url
"
''
10
)
"
fi
if
!
_contains
"
$response
"
"
$AF_API_SUCCESS
"
;
then
_err
"DNS API error:
$response
"
return
1
fi
_debug
'Response'
"
$response
"
return
0
}
# Gets the root domain zone for given domain.
# Usage: _get_zone _acme-challenge.www.example.com
_get_zone
()
{
fqdn
=
"
$1
"
domains
=
"
$(
_get
"
$AF_URL_DOMAINS
"
""
10
)
"
_info
'Getting domain zone...'
_debug2
'FQDN'
"
$fqdn
"
_debug2
'Domains'
"
$domains
"
while
_contains
"
$fqdn
"
"."
;
do
if
_contains
"
$domains
"
"
$fqdn
"
;
then
domain
=
"
$fqdn
"
_info
"Found root domain zone:
$domain
"
break
else
fqdn
=
"
${
fqdn
#*.
}
"
_debug2
'FQDN'
"
$fqdn
"
fi
done
if
[
"
$domain
"
=
"
$fqdn
"
]
;
then
return
0
fi
_err
'Couldn'
\'
't find root domain zone.'
return
1
}
# Adds the HTTP Authorization & Content-Type headers to a follow-up request.
# Usage: _set_headers
_set_headers
()
{
encoded
=
"
$(
printf
--
'%s:%s'
"
$AF_API_USERNAME
"
"
$AF_API_PASSWORD
"
| _base64
)
"
export
_H1
=
"Authorization: Basic
$encoded
"
export
_H2
=
'Content-Type: application/json'
}
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