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
329a1e6f
Unverified
Commit
329a1e6f
authored
Aug 21, 2018
by
neil
Committed by
GitHub
Aug 21, 2018
Browse files
Merge pull request #1623 from lenartj/dev
Added support for Google Cloud DNS API (dns_gcloud)
parents
659a60ae
9c39121e
Changes
3
Show whitespace changes
Inline
Side-by-side
README.md
View file @
329a1e6f
...
...
@@ -322,6 +322,7 @@ You don't have to do anything manually!
1.
TELE3 (https://www.tele3.cz)
1.
EUSERV.EU (https://www.euserv.eu)
1.
DNSPod.com API (https://www.dnspod.com)
1.
Google Cloud DNS API
And:
...
...
dnsapi/README.md
View file @
329a1e6f
...
...
@@ -876,6 +876,7 @@ acme.sh --issue --dns dns_tele3 -d example.com -d *.example.com
```
The TELE3_Key and TELE3_Secret will be saved in ~/.acme.sh/account.conf and will be reused when needed.
<<<<<<< HEAD
## 47. Use Euserv.eu API
First you need to login to your euserv.eu account and activate your API Administration (API Verwaltung).
...
...
@@ -914,6 +915,28 @@ acme.sh --issue --dns dns_dpi -d example.com -d www.example.com
The
`DPI_Id`
and
`DPI_Key`
will be saved in
`~/.acme.sh/account.conf`
and will be reused when needed.
## 49. Use Google Cloud DNS API to automatically issue cert
First you need to authenticate to gcloud.
```
gcloud init
```
**The `dns_gcloud` script uses the active gcloud configuration and credentials.**
There is no logic inside
`dns_gcloud`
to override the project and other settings.
If needed, create additional
[
gcloud configurations
](
https://cloud.google.com/sdk/gcloud/reference/topic/configurations
)
.
You can change the configuration being used without
*activating*
it; simply set the
`CLOUDSDK_ACTIVE_CONFIG_NAME`
environment variable.
To issue a certificate you can:
```
export CLOUDSDK_ACTIVE_CONFIG_NAME=default # see the note above
acme.sh --issue --dns dns_gcloud -d example.com -d '*.example.com'
```
`dns_gcloud`
also supports
[
DNS alias mode
](
https://github.com/Neilpang/acme.sh/wiki/DNS-alias-mode
)
.
=======
# Use custom API
If your API is not supported yet, you can write your own DNS API.
...
...
dnsapi/dns_gcloud.sh
0 → 100755
View file @
329a1e6f
#!/usr/bin/env sh
# Author: Janos Lenart <janos@lenart.io>
######## Public functions #####################
# Usage: dns_gcloud_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_gcloud_add
()
{
fulldomain
=
$1
txtvalue
=
$2
_info
"Using gcloud"
_debug fulldomain
"
$fulldomain
"
_debug txtvalue
"
$txtvalue
"
_dns_gcloud_find_zone
||
return
$?
# Add an extra RR
_dns_gcloud_start_tr
||
return
$?
_dns_gcloud_get_rrdatas
||
return
$?
echo
"
$rrdatas
"
| _dns_gcloud_remove_rrs
||
return
$?
printf
"%s
\n
%s
\n
"
"
$rrdatas
"
"
\"
$txtvalue
\"
"
|
grep
-v
'^$'
| _dns_gcloud_add_rrs
||
return
$?
_dns_gcloud_execute_tr
||
return
$?
_info
"
$fulldomain
record added"
}
# Usage: dns_gcloud_rm _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
# Remove the txt record after validation.
dns_gcloud_rm
()
{
fulldomain
=
$1
txtvalue
=
$2
_info
"Using gcloud"
_debug fulldomain
"
$fulldomain
"
_debug txtvalue
"
$txtvalue
"
_dns_gcloud_find_zone
||
return
$?
# Remove one RR
_dns_gcloud_start_tr
||
return
$?
_dns_gcloud_get_rrdatas
||
return
$?
echo
"
$rrdatas
"
| _dns_gcloud_remove_rrs
||
return
$?
echo
"
$rrdatas
"
|
grep
-F
-v
"
\"
$txtvalue
\"
"
| _dns_gcloud_add_rrs
||
return
$?
_dns_gcloud_execute_tr
||
return
$?
_info
"
$fulldomain
record added"
}
#################### Private functions below ##################################
_dns_gcloud_start_tr
()
{
if
!
trd
=
$(
mktemp
-d
)
;
then
_err
"_dns_gcloud_start_tr: failed to create temporary directory"
return
1
fi
tr
=
"
$trd
/tr.yaml"
_debug
tr
"
$tr
"
if
!
gcloud dns record-sets transaction start
\
--transaction-file
=
"
$tr
"
\
--zone
=
"
$managedZone
"
;
then
rm
-r
"
$trd
"
_err
"_dns_gcloud_start_tr: failed to execute transaction"
return
1
fi
}
_dns_gcloud_execute_tr
()
{
if
!
gcloud dns record-sets transaction execute
\
--transaction-file
=
"
$tr
"
\
--zone
=
"
$managedZone
"
;
then
_debug
tr
"
$(
cat
"
$tr
"
)
"
rm
-r
"
$trd
"
_err
"_dns_gcloud_execute_tr: failed to execute transaction"
return
1
fi
rm
-r
"
$trd
"
for
i
in
$(
seq
1 120
)
;
do
if
gcloud dns record-sets changes list
\
--zone
=
"
$managedZone
"
\
--filter
=
'status != done'
\
|
grep
-q
'^.*'
;
then
_info
"_dns_gcloud_execute_tr: waiting for transaction to be comitted (
$i
/120)..."
sleep
5
else
return
0
fi
done
_err
"_dns_gcloud_execute_tr: transaction is still pending after 10 minutes"
rm
-r
"
$trd
"
return
1
}
_dns_gcloud_remove_rrs
()
{
if
!
xargs
--no-run-if-empty
gcloud dns record-sets transaction remove
\
--name
=
"
$fulldomain
."
\
--ttl
=
"
$ttl
"
\
--type
=
TXT
\
--zone
=
"
$managedZone
"
\
--transaction-file
=
"
$tr
"
;
then
_debug
tr
"
$(
cat
"
$tr
"
)
"
rm
-r
"
$trd
"
_err
"_dns_gcloud_remove_rrs: failed to remove RRs"
return
1
fi
}
_dns_gcloud_add_rrs
()
{
ttl
=
60
if
!
xargs
--no-run-if-empty
gcloud dns record-sets transaction add
\
--name
=
"
$fulldomain
."
\
--ttl
=
"
$ttl
"
\
--type
=
TXT
\
--zone
=
"
$managedZone
"
\
--transaction-file
=
"
$tr
"
;
then
_debug
tr
"
$(
cat
"
$tr
"
)
"
rm
-r
"
$trd
"
_err
"_dns_gcloud_add_rrs: failed to add RRs"
return
1
fi
}
_dns_gcloud_find_zone
()
{
# Prepare a filter that matches zones that are suiteable for this entry.
# For example, _acme-challenge.something.domain.com might need to go into something.domain.com or domain.com;
# this function finds the longest postfix that has a managed zone.
part
=
"
$fulldomain
"
filter
=
"dnsName=( "
while
[
"
$part
"
!=
""
]
;
do
filter
=
"
$filter$part
. "
part
=
"
$(
echo
"
$part
"
|
sed
's/[^.]*\.*//'
)
"
done
filter
=
"
$filter
)"
_debug filter
"
$filter
"
# List domains and find the longest match (in case of some levels of delegation)
if
!
match
=
$(
gcloud dns managed-zones list
\
--format
=
"value(name, dnsName)"
\
--filter
=
"
$filter
"
\
|
while
read
-r
dnsName name
;
do
printf
"%s
\t
%s
\t
%s
\n
"
"
${#
dnsName
}
"
"
$dnsName
"
"
$name
"
done
\
|
sort
-n
-r
| _head_n 1 |
cut
-f2
,3 |
grep
'^.*'
)
;
then
_err
"_dns_gcloud_find_zone: Can't find a matching managed zone! Perhaps wrong project or gcloud credentials?"
return
1
fi
dnsName
=
$(
echo
"
$match
"
|
cut
-f2
)
_debug dnsName
"
$dnsName
"
managedZone
=
$(
echo
"
$match
"
|
cut
-f1
)
_debug managedZone
"
$managedZone
"
}
_dns_gcloud_get_rrdatas
()
{
if
!
rrdatas
=
$(
gcloud dns record-sets list
\
--zone
=
"
$managedZone
"
\
--name
=
"
$fulldomain
."
\
--type
=
TXT
\
--format
=
"value(ttl,rrdatas)"
)
;
then
_err
"_dns_gcloud_get_rrdatas: Failed to list record-sets"
rm
-r
"
$trd
"
return
1
fi
ttl
=
$(
echo
"
$rrdatas
"
|
cut
-f1
)
rrdatas
=
$(
echo
"
$rrdatas
"
|
cut
-f2
|
sed
's/","/"\n"/g'
)
}
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