Compare commits

...

2732 Commits
cron ... 3.0.3

Author SHA1 Message Date
neil
6887805402 Merge pull request #4067 from acmesh-official/dev
sync
2022-05-04 18:36:45 +08:00
neil
7f9074adbf fix format 2022-05-03 21:35:26 +08:00
neil
64847afc3f save the default key length 2022-05-03 21:19:29 +08:00
neil
641f6977a9 Merge pull request #4065 from acmesh-official/dev
sync
2022-05-03 18:38:45 +08:00
neil
84c2b0c3d7 Merge pull request #4063 from nicolaspn/OVH_DNS_refresh_after_delete_txt_record
Ovh dns refresh after delete txt record
2022-05-02 23:34:14 +08:00
nicolaspn
24ce7c1991 Add call dns OVH API for refresh domain after delete TXT record 2022-05-02 16:16:56 +02:00
neil
8be3465f94 Merge pull request #4061 from acmesh-official/dev
Dev
2022-04-30 22:47:57 +08:00
neil
8ba7d02fdb Merge pull request #4059 from NerLOR/master
dns_world4you: fix _parse_paket_nr
2022-04-29 14:48:31 +08:00
neil
ef8a199a5a Merge pull request #4057 from mrakopes/master
issue 3007 - fix base64 decoding logic for single- and multi-line encoded string
2022-04-29 09:25:39 +08:00
Lorenz Stechauner
db83643c1e dns_world4you: fix _parse_paket_nr
Signed-off-by: Lorenz Stechauner <lorenz.stechauner@necronda.net>
2022-04-28 20:49:55 +02:00
mrakopes
9b6f775276 fix base64 decoding logic for single- ane multi-line encoded string 2022-04-28 13:25:22 +02:00
neilpang
69040dd668 fix format 2022-04-28 18:09:26 +08:00
neilpang
14b5914233 fix renew bug 2022-04-28 18:06:07 +08:00
neil
a0eabd2298 Merge pull request #4049 from Aarup/dev
Removed GratisDNS api
2022-04-25 16:10:39 +08:00
Jakob Aarup Skov
9b27298d54 Removed GratisDNS api 2022-04-25 09:43:38 +02:00
neil
3075b4515a Merge pull request #4045 from axelhahn/4044-use-challenge-alias-false
handle challenge-alias "false"
2022-04-21 16:35:29 +08:00
neil
39bc417706 Update acme.sh 2022-04-21 07:02:53 +08:00
neil
e11e32cd52 Merge pull request #4035 from ccope-netgate/master
LoopiaAPI error handling isn't compatible with FreeBSD
2022-04-21 06:58:44 +08:00
Hahn Axel (hahn)
019a7bd66b handle challenge-alias "false" 2022-04-20 16:03:36 +02:00
neil
4d89ce5d50 read csr with empty subject
https://github.com/acmesh-official/acme.sh/issues/4024
2022-04-20 09:14:53 +08:00
Sing Yu Chan
c31027b284 use sleep infinity instead sleep 1 2022-04-20 09:04:13 +08:00
neil
f17ec7a4f5 Merge pull request #4037 from ahwayakchih/master
Update dns_mydevil.sh
2022-04-20 09:01:29 +08:00
neil
deec6aab1a Merge pull request #4039 from DerVerruckteFuchs/1984-update-URL
1984 update url
2022-04-20 09:00:14 +08:00
Bruce Lam
3e8d9a1987 added: ipv6 identifier support 2022-04-20 08:23:22 +08:00
DerVerruckteFuchs
5e465a298f Update 1984 Hosting's URL 2022-04-15 23:04:10 -04:00
Marcin Konicki
515c9e7811 Fix DNS handling for MyDevil.net
MyDevil updated their tool to require y|n confirmation when deleting record.
2022-04-15 10:38:45 +02:00
Christopher Cope
03c8309703 Fix dns_loopia on FreeBSD 2022-04-13 15:41:44 -04:00
neilpang
2c28d6b10c fix for renew server 2022-04-13 20:20:28 +08:00
neil
df79443ed8 Merge pull request #3997 from tumarov/fornex_com_support
fornex.com API support
2022-04-12 11:01:53 +08:00
neil
2b891f7f1d Update dns_fornex.sh 2022-04-12 10:11:05 +08:00
neil
e4ed0b1884 Merge pull request #4029 from quthla/patch-1
Store Mailcow deploy parameters
2022-04-12 10:06:35 +08:00
neil
c8c1c09189 Merge pull request #4032 from acmesh-official/dev
sync
2022-04-12 10:05:22 +08:00
quthla
08ae8cc3cb Fix 2022-04-11 11:39:21 +02:00
quthla
201673ca8a Store Mailcow deploy parameters 2022-04-11 00:29:55 +02:00
Bruce Lam
29e23ac9ce Due to down of cloudxns.net, remove dns_cx.sh 2022-04-10 19:57:25 +08:00
neilpang
00483e8cdd exclude zerossl tests in the CI
It's not stable
2022-04-10 19:42:49 +08:00
neil
83da01a2e1 Merge pull request #4027 from acmesh-official/dev
sync
2022-04-10 14:49:09 +08:00
neil
7cd6ff054b add 2022-04-10 14:48:10 +08:00
neilpang
6be2bb2289 Update acme.sh
revert only when there is no `--server` specified.
2022-04-08 22:28:21 +08:00
neilpang
439defca42 switch from staging api to production api
https://github.com/acmesh-official/acme.sh/issues/2401
2022-04-08 22:15:26 +08:00
neil
8a85bb2989 Merge pull request #4017 from exogee-technology/dev
Fix / Netlify API should only match exact domain matches.
2022-04-08 21:03:54 +08:00
neil
5e7519183d Merge pull request #4020 from sjau/dns_ispconfig_typo
dns_ispconfig: add missing brackets
2022-04-07 17:29:25 +08:00
hyper_ch
40e7eca1ee dns_ispconfig: adding missing brackets 2022-04-07 11:07:06 +02:00
Kevin Brown
481f02de88 Also check for the closing quote so that only exact domain matches are found. 2022-04-06 14:29:25 +10:00
neilpang
6a90856f0e don't renew cert if valid-to is set to an absolute date
don't renew cert if valid-to is set to an absolute date
2022-04-05 17:05:33 +08:00
neil
dcbbee8adb Merge pull request #4012 from acmesh-official/dev
Support "NotBefore" and NotAfter
2022-04-03 22:01:00 +08:00
neilpang
225adcc836 fix renewal for validto
fix renewal for validto
2022-04-03 21:58:41 +08:00
neilpang
0f607413d0 fix for solaris time format 2022-04-03 20:05:30 +08:00
neilpang
922553032b typo 2022-04-02 09:35:17 +08:00
neilpang
b49999721c Update acme.sh 2022-04-01 21:58:29 +08:00
neilpang
de4c4eedd8 Support NotBefore and NotAfter
Add `--valid-from` and `--valid-to`:
https://github.com/acmesh-official/acme.sh/wiki/Validity
2022-04-01 21:22:42 +08:00
neilpang
bcc984fc09 minor 2022-03-31 09:46:42 +08:00
neilpang
d53262fab6 fix update account
fix https://github.com/acmesh-official/acme.sh/issues/4009
2022-03-31 09:35:32 +08:00
neilpang
532e44bcea normalize domains
fix https://github.com/acmesh-official/acme.sh/issues/4005
2022-03-30 23:37:38 +08:00
neilpang
3fb67629c1 Update README.md 2022-03-30 23:06:07 +08:00
neil
6145465823 Merge pull request #4006 from acmesh-official/dev
sync
2022-03-30 23:03:44 +08:00
neilpang
fb5091a388 support Google ACME server
see: https://github.com/acmesh-official/acme.sh/wiki/Server
2022-03-30 22:47:12 +08:00
neilpang
0d05f9ba80 Update acme.sh
fix https://github.com/acmesh-official/acme.sh/issues/4001
2022-03-27 12:08:24 +08:00
neil
a300df0020 Update dns_fornex.sh 2022-03-25 15:48:17 +08:00
neil
a50158cbeb Merge pull request #3982 from waldner/master
Geoscaling: read credentials when removing records too
2022-03-24 15:15:58 +08:00
Timur Umarov
7278fd25e5 Added fornex.com api 2022-03-23 17:46:38 +03:00
neil
6fb8c0ec4c Merge pull request #3989 from abiessmann/deploy_routeros_handle_remote_errors
deploy/routeros: handle errors
2022-03-20 13:30:58 +08:00
neil
07cedc55e2 Merge pull request #3978 from nikolajbrinch/dev
Fixes Simply.com to use REST API version 2 with Basic Auth
2022-03-20 13:19:13 +08:00
neil
ae3cc81f03 Merge pull request #2924 from ianepperson/master
Add Discord notification
2022-03-20 12:43:43 +08:00
neil
97a45e3b02 Update discord.sh 2022-03-20 12:43:23 +08:00
neil
451b290b79 Update discord.sh 2022-03-20 12:42:35 +08:00
neil
499ea07934 Merge pull request #3993 from imgrant/deploy-truenas-s3-feature
feat: Configure TrueNAS S3 certificate
2022-03-20 12:34:58 +08:00
Ian Grant
afa06267a2 style: Neaten up some of the info & error messages, fix some typos 2022-03-19 20:39:48 +00:00
Ian Grant
d4a6d9c076 fix: Adjust the sed extraction of certificate ID from JSON response
Prior to this, an error in the regex didn't match. Resolves #3992 (TrueNAS deploy hook fails to set certificate for FTP or WebDAV)
2022-03-19 20:38:47 +00:00
Ian Grant
c3f6112443 feat: Configure certificate for TrueNAS S3 service (MinIO) 2022-03-19 20:36:11 +00:00
Andreas Bießmann
3411b736dd deploy/routeros: add error handling for scp
In order to stop processing on failure to copy certificate
to remote side, fail on error of scp command.

Signed-off-by: Andreas Bießmann <andreas@biessmann.org>
2022-03-18 09:10:12 +01:00
Andreas Bießmann
c603b9c40b deploy/routeros: add error handling for ssh
In order to detect errorneous scripts on remote side, catch return code
and handle it respectively.

Signed-off-by: Andreas Bießmann <andreas@biessmann.org>
Reviewed-by: Ross Shen @sjtuross
2022-03-18 09:07:59 +01:00
neil
1e2c5d038f Merge pull request #3986 from abiessmann/fix_depoly_routeros
deploy/routeros.sh: fix routeros script
2022-03-17 21:25:59 +08:00
Andreas Bießmann
9d6d96adf3 deploy/routeros.sh: fix routeros script
Commit c46ceb06b4 introduced an error in
routeros script.

Fix it!

Signed-off-by: Andreas Bießmann <andreas@biessmann.org>
2022-03-17 12:24:42 +01:00
waldner
8d574ecb34 Geoscaling: get creds for removal too 2022-03-15 18:56:54 +01:00
neil
9ebb2ac2e4 Merge pull request #3980 from acmesh-official/dev
sync
2022-03-14 23:02:08 +08:00
neil
7b935eec5d Merge pull request #3979 from dislazy/dev
fix(notify):remove nofity,move weixin_work.sh to notify
2022-03-11 13:56:53 +08:00
bosong
b209f66654 fix(notify):remove nofity,move weixin_work.sh to notify 2022-03-11 13:41:12 +08:00
neil
b98b4951b4 Merge pull request #3669 from youuy/master
Add Weixin Work notify hook
2022-03-11 12:21:55 +08:00
Nikolaj Brinch Jørgensen
227d62a5dc Fixes Simply.com to use REST API version 2 with Basic Auth 2022-03-10 11:13:38 +01:00
neil
7fae5553a8 Merge pull request #3977 from gabbe/Encode_password
Accept some special characters in password and some error handling
2022-03-10 09:10:17 +08:00
Gabriel Thörnblad
6ead019873 Accept some special characters in password and added a little bit better error handling 2022-03-09 17:12:09 +01:00
neil
e58b00d9a2 Merge pull request #3964 from gabbe/Loopia_API_is_updated
Update dns_loopia.sh
2022-03-07 21:52:03 +08:00
Gabriel Thörnblad
b75e90f8c9 Double quote variables (shellcheck suggestions) 2022-03-07 10:28:09 +01:00
Gabriel Thörnblad
e82f3439c3 Trigger CI 2022-03-07 10:13:45 +01:00
neil
0bc8e3bee5 Merge pull request #3965 from waldner/master
geoscaling DNS API
2022-03-07 09:08:01 +08:00
waldner
13f80acb2d geoscaling DNS API 2022-03-05 19:34:36 +01:00
neil
8fe813acff Merge pull request #3932 from peterlh/master
Added curanet dns support
2022-03-05 18:58:14 +08:00
Gabriel Thörnblad
0ed4fc6a12 Update dns_loopia.sh
Loopia API is now less tolerant so we need another <value> tag surrounding the <struct>
2022-03-04 13:38:05 +01:00
neil
e88442cb46 Merge pull request #3947 from abiessmann/deploy_routeros_fixes
deploy/routeros.sh fixes
2022-02-22 21:52:36 +08:00
neil
930609e875 Merge pull request #3948 from richard-9000/richard-9000-patch-1
dns_opnsense.sh - Fixed the domain parse regex
2022-02-22 21:41:22 +08:00
richard-9000
8752d08ce9 dns_opnsense.sh - Fixed the domain parse regex
Extended the regex to skip the new transferkey and hmac sections of opnsense bind.
2022-02-19 10:52:24 -08:00
Andreas Bießmann
c46ceb06b4 deploy/routeros.sh: change DEPLOY_SCRIPT_CMD
This set the owner of script to ssh user, have the comment line in script
as real comment and removes policy since this is set from current user,
at least for RouterOS 7.x.

Signed-off-by: Andreas Bießmann <andreas@biessmann.org>
2022-02-19 14:13:01 +01:00
Andreas Bießmann
92e4ecce3b deploy/routeros.sh: remove all certificates
As the script is applying the fullchain which includes three certificates,
delete all of them before applying updated certificate.

Signed-off-by: Andreas Bießmann <andreas@biessmann.org>
2022-02-19 14:13:01 +01:00
Andreas Bießmann
8a2f673903 deploy/routeros.sh: make ssh/scp configurable
In order to modify ssh/scp commands make them configurable via
environment variables.

Signed-off-by: Andreas Bießmann <andreas@biessmann.org>
2022-02-19 14:12:59 +01:00
peter
9a677534a7 added more debug info when rm recordid is empty 2022-02-13 14:00:14 +01:00
peter
af08d67fad rem. ; 2022-02-12 23:41:26 +01:00
peter
a2901d61ea check for return values 2022-02-12 23:39:33 +01:00
peter
aaae83efec check for return values 2022-02-12 20:18:08 +01:00
neil
7369298638 Merge pull request #3921 from andischerer/master
Added united-domains Reselling DNS API
2022-02-11 21:24:40 +08:00
neil
a761bd20fa Merge pull request #3934 from mac-zhou/dev
Add environment variables ROUTER_OS_PORT
2022-02-11 21:13:27 +08:00
neilpang
01ace11293 Update dns_ispconfig.sh
fix https://github.com/acmesh-official/acme.sh/issues/3895#issuecomment-1035409954
2022-02-11 21:11:04 +08:00
Mac_Zhou
205e95a246 Add environment variables ROUTER_OS_PORT 2022-02-10 11:29:09 +08:00
neil
2c2a43e1ec Update dns_cf.sh
if CF_Zone_ID is used,  save it to domain conf instead.
2022-02-09 18:08:55 +08:00
peter
0c9a6da623 more specific delete of records 2022-02-08 17:18:48 +01:00
Andreas Scherer
888d91d14a FIX dns_udr api: loop variable 2022-02-08 15:57:19 +01:00
peter
2c0cc87b4c final commit 2022-02-08 13:49:04 +01:00
peter
ee0fadf247 shfmt 2022-02-08 13:34:42 +01:00
peter
9fb89d7fd2 shfmt 2022-02-08 13:33:43 +01:00
peter
af5c36e4ad shfmt' 2022-02-08 13:32:15 +01:00
peter
a5f943e227 removed unused variable 2022-02-08 13:24:31 +01:00
peter
f8532ba812 removed unused variable 2022-02-08 13:21:02 +01:00
peter
fac4e151cc description 2022-02-08 13:19:22 +01:00
Andreas Scherer
f3a0a25380 FIX dns_udr api: ttl, xargs, cleanup 2022-02-08 08:05:48 +01:00
neil
5a237795ea Merge pull request #3928 from johnelliott/missing-oathtool-dep-error
Add err log for missing oathtool in Synology
2022-02-08 14:26:06 +08:00
John Elliott
3a99a77104 Update return statement 2022-02-07 21:55:12 -08:00
John Elliott
5ce8050e46 Update missing oathtool check 2022-02-07 11:58:14 -08:00
John Elliott
5ae3a020bd Add err log for missing oathtool in Synology
Alerts the user that the oathtool is missing and the TOTP can't be
generated.
2022-02-07 11:53:24 -08:00
neilpang
af193291fa Update acme.sh
fix https://github.com/acmesh-official/acme.sh/issues/3127#issuecomment-1030742187
2022-02-06 16:17:04 +08:00
neil
b39df5cef0 Merge pull request #3906 from NerLOR/master
Adapt dns_world4you to new world4you website behaviour
2022-02-06 09:52:45 +08:00
peter
dc61c9e277 description 2022-02-05 22:21:18 +01:00
peter
10a15e1188 nothing 2022-02-05 21:12:36 +01:00
peterlh
a2bb6a4f1f changed gettoken to use _post
changed gettoken to use _post instead of curl+jq
2022-02-05 21:07:04 +01:00
peterlh
38a19fa574 created dns_curanet.sh 2022-02-05 20:54:30 +01:00
neilpang
9ec4b59afb start v3.0.3
start v3.0.3
2022-02-05 21:28:07 +08:00
Lorenz Stechauner
20877146df Merge branch 'acmesh-official:master' into master 2022-02-04 20:36:31 +01:00
neil
2a2d556551 Merge pull request #3927 from acmesh-official/dev
sync
2022-02-04 13:53:40 +08:00
neilpang
0f762d98a4 Update Linux.yml
use centos:7
2022-02-04 13:52:23 +08:00
neilpang
36752cb6a8 Update acme.sh
fix zerossl endpoint
2022-02-04 13:49:58 +08:00
Andreas Scherer
a7f2d89e3f Added united-domains Reselling DNS API 2022-02-01 14:46:20 +01:00
neil
90b65c6618 fix https://github.com/acmesh-official/acme.sh/issues/3898
https://github.com/acmesh-official/acme.sh/issues/3898
2022-01-27 18:00:44 +08:00
Lorenz Stechauner
190ec0c14c Adapt dns_world4you to new world4you website behaviour 2022-01-24 16:47:47 +01:00
michal
7250a300df add managed identity support for azure dns 2022-01-22 13:22:44 +08:00
neil
34bb00450d Merge pull request #3896 from sjtuross/omv
add remote deploy hook for openmediavault 5
2022-01-21 20:39:07 +08:00
neil
63dadd8983 Merge pull request #3901 from tutugreen/tutugreen-patch-2
Fix dns_huaweicloud subshell return
2022-01-21 20:35:47 +08:00
Ross Shen
67c990e8cf omv deploy hook: add usage comments 2022-01-20 17:46:47 +08:00
Ross Shen
0292e20c86 omv deploy hook: support both local and remote deployment 2022-01-20 17:27:11 +08:00
Yuan Ming
9088c8741a Fix dns_huaweicloud subshell return
Replace pipe read with line count loop, fix useless return in subshell.
2022-01-20 14:01:33 +08:00
neilpang
faedea2120 Update dns_ddnss.sh 2022-01-19 22:22:53 +08:00
Vitaly Kireev
e1a0f5706d DNS REGRU utf-list to idn (punycode)
service/get_list returns domains in utf. But if utf, then error Error parsing certificate request: x509: SAN dNSName is malformed

early using my patch by IDN_ITEM="$(echo "${ITEM}" | idn)"

Now replacing by IDN_ITEM="$(_idn "${ITEM}")"
2022-01-19 21:59:48 +08:00
Ross Shen
a78a4e6716 omv deploy hook: shellcheck disable=SC2029 2022-01-19 21:42:17 +08:00
Ross Shen
6bbf927f57 omv deploy hook: separate DEPLOY_OMV_WEBUI_ADMIN and DEPLOY_OMV_SSH_USER 2022-01-19 21:13:02 +08:00
neilpang
4c32bc8e22 Merge branch 'dev' 2022-01-19 20:55:24 +08:00
Ross Shen
df671a77f6 routeros deploy hook: store the env vars within the domainconf
related to #2344 and #2413
2022-01-19 20:46:29 +08:00
Ross Shen
dca9def42c add remote deploy hook for openmediavault 5
based on #3757
2022-01-19 12:36:54 +08:00
Ross Shen
edee7ea284 routeros deploy hook: store the env vars within the domainconf
related to #2344 and #2413
2022-01-16 20:46:09 +08:00
neil
658d09ed84 Merge pull request #3396 from F-Plass/master
deploy scipt for TrueNAS Server using REST API
2022-01-16 08:17:49 +08:00
neil
c41de8f270 Merge pull request #3891 from tutugreen/dev
dns_huaweicloud.sh minor bug fixes
2022-01-15 19:38:22 +08:00
Yuan Ming
9d2ee2127d dns_huaweicloud debug info adjust
_secure_debug for sensitive token.
2022-01-15 19:23:30 +08:00
Yuan Ming
e49ece8793 dns_huaweicloud.sh minor bug fixes
1. Match zone name in response in case multiple items return.
2. Use string '"id"' (single quotation marks added) to check if zone/record exist in _get_zoneid() & _get_recordset_id(). Fix domain can't contain string "id".

(Sensitive _debug Access Token Commented out, For CICD Run)
2022-01-14 22:10:26 +08:00
neil
188274277a fix https://github.com/acmesh-official/acme.sh/issues/3883 2022-01-11 17:16:51 +08:00
neil
c0cb3945f1 Merge pull request #3884 from acmesh-official/dev
sync
2022-01-11 17:09:59 +08:00
neil
e07795e8f0 fix https://github.com/acmesh-official/acme.sh/issues/3883 2022-01-11 16:56:19 +08:00
I Komang Suryadana
bda454fe9c Remove cloud domain record with cloud master zone. (#3507) 2022-01-11 15:25:10 +08:00
neil
856e77053e Merge branch '3870' into dev 2022-01-10 16:29:44 +08:00
Felix Matouschek
2ce145f359 Refactoring amcedns api (second try) (#3231) 2022-01-09 11:11:00 +08:00
Sergey Pashinin
7e7291ace9 Support Vault KV v2 (#3502) 2022-01-09 11:01:38 +08:00
Victor R. Santos
61c853a3c1 Add Gotify notification (#3759) 2022-01-09 10:39:28 +08:00
Bodenhaltung
4346139d65 Add dnsHome.de API (#3823)
Add dnsHome.de API
2022-01-09 10:32:22 +08:00
neil
1476f83ba7 Merge pull request #3879 from acmesh-official/dev
sync
2022-01-08 21:22:18 +08:00
neil
c959d64099 Merge pull request #3807 from dacrystal/topic/synology_dsm-otp_code
Add SYNO_TOTP_SECRET for user with two-factor authentication enabled
2022-01-08 20:03:13 +08:00
neil
e67d26caeb fix https://github.com/acmesh-official/acme.sh/issues/3845#issuecomment-999367478 2022-01-08 19:58:49 +08:00
neil
86c3fa0df0 remove retry for get and post 2022-01-08 19:51:04 +08:00
neil
75ae57e194 report false 2022-01-08 19:19:51 +08:00
neil
d42feae0af fix ecdsa name for stepca 2022-01-07 23:44:19 +08:00
neil
45971b8083 add ip cert test for stepCA 2022-01-07 23:43:08 +08:00
neil
8e9bbd1bb3 fix CI 2022-01-07 23:35:18 +08:00
neil
ec10a3eab4 fix CI 2022-01-07 23:14:46 +08:00
neil
49deb4af24 fix CI 2022-01-07 23:09:56 +08:00
neil
10f171b6e4 fix ci 2022-01-07 23:05:49 +08:00
neil
735db1a12b fix ci 2022-01-07 23:00:34 +08:00
neil
b2f4cc2dc5 add Step-ca to CI
https://github.com/acmesh-official/acme.sh/issues/3871
2022-01-07 22:58:42 +08:00
neil
d43b587d17 fix https://github.com/acmesh-official/acme.sh/issues/3870 2022-01-07 22:06:18 +08:00
neil
6b07a955f2 Merge pull request #3877 from jvandborg/master
Cannot wait for PR #3673 to be completed
2022-01-07 19:09:44 +08:00
Jacob Vandborg
e23c02575d Removed DNS sleep
Users should use command line parameter --dnssleep instead
2022-01-07 08:10:31 +01:00
neil
b1bf634136 Merge pull request #3876 from fraenki/fix_fritz
deploy/fritzbox: allow hook to be used with multiple fritzboxes
2022-01-07 09:48:54 +08:00
jvandborg
459faf4dfb Format to comply with style guide 2022-01-06 22:03:39 +01:00
Jacob Vandborg
8cdceb83b2 Cannot wait for PR #3673 to be completed
PR #3673 Fix simply.com API seems abandoned by maintainer and I need this fixed asap

Changes implemented
* Normalize JSON and fix not handling return code correctly
* Add some information to comments
* Fix trailing slash on URIs
* Add 60 second sleep for zone to be written
* Fix parsing record_data and record_type
2022-01-06 19:21:05 +01:00
Frank Wall
6aa1ec0802 deploy/fritzbox: allow hook to be used with multiple fritzboxes
Previously the deploy hook config was stored in the account config.
This seems odd and adds unnecessary limitations to the hook.
Now we're using the correct _*deployconf() functions to read and
write the deploy hook config.
2022-01-06 16:20:43 +01:00
Joel Pearson
0727f7054b Allow optional "NEW" in CSR header and footer
When generating a CSR in Windows it seems to create a CSR header that looks like "-----BEGIN NEW CERTIFICATE REQUEST-----", but the addition of "NEW" breaks the parsing of the CSR. Making "NEW " optional fixes the problem.

Apparently certbot is tolerant of both forms, see: https://community.letsencrypt.org/t/error-parsing-certificate-request-resolved/40039/6 for more information.
2022-01-06 17:41:42 +08:00
neilpang
37cc611e3f fix gentoo image 2022-01-06 17:41:42 +08:00
neilpang
c39e6c4423 add --info command to show the global configs or domain configs.
https://github.com/acmesh-official/acme.sh/issues/2444
2022-01-06 17:41:42 +08:00
neilpang
1566656af3 fix https://github.com/acmesh-official/acme.sh/issues/3869 2022-01-06 17:41:42 +08:00
neilpang
737eba57bd send notifications for renew command
https://github.com/acmesh-official/acme.sh/issues/3869#issuecomment-1003546762
2022-01-06 17:41:41 +08:00
Viktor G
d32cedd7dc DNS-ISPConfig ISPC_Api_Insecure argument check fix 2022-01-06 17:41:41 +08:00
racitup
2b6aa26703 fix: Neilpang review 2022-01-06 17:41:41 +08:00
racitup
95f1336060 fix: token request body quoting 2022-01-06 17:41:41 +08:00
racitup
f46ee93597 fix: github switch 2022-01-06 17:41:41 +08:00
racitup
56d799f449 fix: debugging 2022-01-06 17:41:41 +08:00
racitup
6251652c93 fix: correct return value 2022-01-06 17:41:41 +08:00
racitup
6a2c9a0dc1 fix: floating token for github 2022-01-06 17:41:41 +08:00
racitup
4dd709b543 feat: Mythic Beasts DNS API script 2022-01-06 17:41:41 +08:00
wacki4
aa9f5b8c4a Update dns_opnsense.sh
Correction when having many zones.
2022-01-06 17:41:41 +08:00
wacki4
f485f3fdb5 Update dns_opnsense.sh
Update for opnsense regards to error in #3735
2022-01-06 17:41:41 +08:00
neilpang
c6a0ec64cb upgrade solaris vm 2022-01-06 17:41:41 +08:00
Christian Burmeister
e0b179e5f3 Update Dockerfile - alpine:3.12 -> alpine:3.15
The support for the base image alpine:3.12 will expire in 4 months (https://endoflife.date/alpine), so it would make sense to upgrade to the current version alpine:3.15. 
I was able to create the acme.sh image with the new alpine:3.15 version without errors and also create and deploy a certificate, but further testing would be useful.
2022-01-06 17:41:41 +08:00
Jens Meißner
dac7a3d272 [dns_knot] Use key command instead of command line argument to transmit dns key data. 2022-01-06 17:41:41 +08:00
neilpang
beed123fb0 fix tunnel version 2022-01-06 17:41:41 +08:00
neilpang
267e582827 add TEST_DNS_NO_SUBDOMAIN 2022-01-06 17:41:40 +08:00
neilpang
69c02cae76 pass TEST_DNS_NO_SUBDOMAIN 2022-01-06 17:41:40 +08:00
neilpang
4f386663e7 fix for OpenBSD7
https://github.com/acmesh-official/acme.sh/issues/3833
2022-01-06 17:41:40 +08:00
neilpang
eaae0547f2 upgrade Solaris 2022-01-06 17:41:40 +08:00
F-Plass
b203f2abaa Merge branch 'acmesh-official:master' into master 2021-12-03 17:18:44 +01:00
neil
5490a2f3ba Merge pull request #3837 from acmesh-official/dev
sync
2021-11-30 22:49:43 +08:00
neil
ba44235471 Update DNS.yml 2021-11-30 13:10:39 +08:00
neil
be556f9e36 Merge pull request #3818 from hguandl/master
Add iOS Bark notify hook
2021-11-21 09:54:55 +08:00
Hao Guan
5e5ba11601 Add iOS Bark notify hook. 2021-11-21 02:39:46 +08:00
neil
e384df30fa Merge pull request #3813 from acmesh-official/dev
fix https://github.com/acmesh-official/acme.sh/issues/3806
2021-11-19 13:35:18 +08:00
Nasser Alansari
4635dacf7f Add SYNO_TOTP_SECRET for user with two-factor authentication 2021-11-13 13:01:38 +03:00
neilpang
18e4d270d9 fix https://github.com/acmesh-official/acme.sh/issues/3806 2021-11-13 15:23:32 +08:00
F-Plass
3bcb91f6ae Update truenas.sh
solved the problem of UI-Restart after 12.0-U3
2021-11-11 23:03:00 +01:00
neil
5e574a355d Merge pull request #3800 from acmesh-official/dev
sync
2021-11-10 09:22:45 +08:00
neil
640c7c5fa3 Merge pull request #3798 from Scre13/patch_mail_sh
removed -- at beginning of subject
2021-11-09 11:49:25 +08:00
neil
eb6395a62c Update mail.sh 2021-11-09 11:48:58 +08:00
Scre13
2b2845aa07 removed -- at beginning of subject 2021-11-09 04:28:30 +01:00
neil
54d8c66f3e Merge pull request #3797 from Scre13/patch_lf_mime_version
Removed newline at the end of subject, added MIME-Version header
2021-11-09 09:32:03 +08:00
neil
95bbf1b190 Update mail.sh 2021-11-09 09:30:36 +08:00
Scre13
ee2dab51f3 removed newline at the end of subject, added MIME-Version header 2021-11-08 22:13:14 +01:00
neil
f63409eed9 fix https://github.com/acmesh-official/acme.sh/issues/1559 2021-11-06 12:27:50 +08:00
neil
ad8940ad73 Merge pull request #3796 from acmesh-official/ip
Ip
2021-11-06 12:00:13 +08:00
neil
b8bfb5a56c fix format 2021-11-06 11:28:11 +08:00
neil
3f58823430 fix ip cert 2021-11-06 11:26:06 +08:00
neil
e488220bfc fix for solaris 2021-11-06 11:16:41 +08:00
neil
e6e0771496 fix for ip cert alpn mode 2021-11-06 11:16:40 +08:00
neil
fe77d43fa0 fix _deactivate for ip cert 2021-11-06 11:16:40 +08:00
neil
737a7a2db2 add test for ipcert 2021-11-06 11:16:12 +08:00
neil
6ae8d10132 support ip cert: rfc https://tools.ietf.org/html/rfc8738 2021-11-06 11:15:10 +08:00
neil
7d249b6d3b start 3.0.2 2021-11-06 09:52:21 +08:00
neil
a532b82771 Merge pull request #3793 from jearton/feature/feishu-notify
Add feishu notification
2021-11-04 09:43:59 +08:00
neil
e8756482aa Update feishu.sh 2021-11-04 09:42:30 +08:00
jearton
35d6da785b add support for feishu notification 2021-11-04 00:41:58 +08:00
neilpang
dbdcbd4b9e add set-default-chain 2021-11-02 20:37:14 +08:00
neil
a2b6f49c5c Merge pull request #2998 from masbicudo/dev
Notify user about a possible problem when using synology_dsm.sh with user that enabled 2fa
2021-11-01 13:42:57 +08:00
Miguel Angelo
a31ed4a723 Notify user about a possible problem when using synology_dsm.sh with 2fa enabled user account 2021-11-01 01:40:14 -03:00
neil
b2fc84c98e Merge pull request #3787 from acmesh-official/dev
sync
2021-10-31 17:31:35 +08:00
neil
927369b06d Merge pull request #3772 from retoo/bugfix/dns-gcloud-fix-format-change
dns_gcloud: allowrecord-sets list output to be separated by 'semicolon'
2021-10-21 22:33:31 +08:00
Reto Schuettel
401fd37e35 dns_gcloud: allowrecord-sets list output to be separated by 'semicolon'
gcloud dns record-sets list used to separate records by comma, with
version 353.0.0 the tool uses semicolons instead.
2021-10-20 18:18:02 +02:00
neil
759cdf10c5 Merge pull request #3745 from NerLOR/master
Fix Word4You dns plugin to work with current api
2021-10-20 23:39:29 +08:00
Lorenz Stechauner
6e7ce1eec1 dns_world4you: fix for freeBSD sed
Signed-off-by: Lorenz Stechauner <lorenz.stechauner@necronda.net>
2021-10-20 14:29:06 +02:00
Lorenz Stechauner
2a65955e88 Merge branch 'acmesh-official:master' into master 2021-10-18 11:20:15 +02:00
neil
5b0d6a1375 Merge pull request #3756 from acmesh-official/dev
sync
2021-10-13 09:04:06 +08:00
neil
0510da0853 fix test chain root name. 2021-10-13 00:28:14 +08:00
neil
365d22d076 add TEST_PREFERRED_CHAIN 2021-10-13 00:03:12 +08:00
neil
1760169ef9 fix Windows test 2021-10-12 23:43:20 +08:00
neil
32ea224933 update versions 2021-10-12 21:31:06 +08:00
neilpang
38a067e203 fix https://github.com/acmesh-official/acme.sh/issues/3752 2021-10-12 20:55:11 +08:00
neil
ab6f1b6df7 Merge pull request #3746 from tuffnatty/patch-1
Don't use global variable as local in recursion context
2021-10-09 21:29:36 +08:00
neil
b36802edff Merge pull request #3728 from arnebjarne/dns_cpanel
Support for cPanel DNS
2021-10-09 10:29:27 +08:00
Bjarne Saltbaek
1d2af0f291 force a re-test. 2021-10-08 20:10:46 +02:00
Phil Krylov
40e8c5e2b0 Don't use global variable as local in recursion context
```nginx
include conf.d/*;
include sites-enabled/*;
```
In this situation, after the first recursive `_checkConf` invocation 4 lines below, `$_c_file` does not contain what you expect anymore, and the second lookup checks for `conf.d/sites-enabled/*` which is obviously wrong.
2021-10-08 18:24:21 +02:00
Bjarne Saltbaek
e11d0d37ee force a re-test. Le servere fails during test 2021-10-07 20:51:18 +02:00
Bjarne Saltbaek
ea4266538a force a re-test 2021-10-07 20:21:51 +02:00
Lorenz Stechauner
aa7bf9169f Fix Word4You dns plugin to work with current api
the value for uniqueFormIdTTL is not available or needed anymore.
values for 'aktivPaket' are not needed by the api.

changed endpoint for deletion from `/deleteRecord` to `/dns/record/delete`
2021-10-06 14:06:44 +02:00
Bjarne Saltbaek
a95e83ab6e Added txtvalue to dns lookup 2021-10-03 18:45:21 +02:00
Bjarne Saltbaek
86daaf4bf2 Added remove entry debug 2021-10-03 18:37:51 +02:00
Bjarne Saltbaek
d5b4f02932 Added proper id lookup with whitespace removed 2021-10-03 18:13:05 +02:00
Bjarne Saltbaek
15deec6c53 Added proper id lookup with missing bracket 2021-10-03 18:11:28 +02:00
Bjarne Saltbaek
17b1875151 Added proper id lookup 2021-10-03 18:08:21 +02:00
Bjarne Saltbaek
bfda8f0b8a First jq rework - 12. redo 2021-10-03 17:53:59 +02:00
Bjarne Saltbaek
7bb0ff986b First jq rework - 11. redo 2021-10-03 17:50:57 +02:00
Bjarne Saltbaek
f3cfef4021 First jq rework - 10. redo 2021-10-03 17:40:01 +02:00
Bjarne Saltbaek
3184c3c21b First jq rework - 9. redo 2021-10-03 17:10:38 +02:00
Bjarne Saltbaek
9264737985 First jq rework - 8. redo 2021-10-03 17:04:49 +02:00
Bjarne Saltbaek
c9b353a689 First jq rework - 8. redo 2021-10-03 17:02:24 +02:00
Bjarne Saltbaek
fda6502f33 First jq rework - 7. redo 2021-10-03 17:00:53 +02:00
Bjarne Saltbaek
0fdac82b93 First jq rework - 6. redo 2021-10-03 16:55:44 +02:00
Bjarne Saltbaek
6b3d6d5211 First jq rework - 5. redo 2021-10-03 16:51:02 +02:00
Bjarne Saltbaek
cb89ee39f5 Merge branch 'acmesh-official:master' into dns_cpanel 2021-10-03 16:49:38 +02:00
Bjarne Saltbaek
be827be742 First jq rework - 4. redo 2021-10-03 16:48:23 +02:00
neil
8fcecd59a0 Merge pull request #3734 from acmesh-official/dev
sync
2021-10-03 22:48:12 +08:00
Bjarne Saltbaek
83b49b23e4 Merge branch 'acmesh-official:master' into dns_cpanel 2021-10-03 16:37:55 +02:00
neil
f5ee618986 Merge pull request #3599 from cirow/dev
Pushbullet Webhook notification
2021-10-03 22:34:21 +08:00
Bjarne Saltbaek
8339b88180 First jq rework - docker fails in Github - not my fault... 2021-10-03 16:34:12 +02:00
neil
f2958818c8 Update pushbullet.sh 2021-10-03 22:33:41 +08:00
Bjarne Saltbaek
608547c62c First jq rework - 3. redo 2021-10-03 16:32:03 +02:00
neil
20f604948f Update pushbullet.sh 2021-10-03 22:31:56 +08:00
neil
f72a4f966d Merge pull request #3664 from shadowlmd/fix-grep-dns-he
Fix grep options processing in dns_he module
2021-10-03 22:25:44 +08:00
Bjarne Saltbaek
bd00db4292 First jq rework - redo 2021-10-03 16:25:21 +02:00
Bjarne Saltbaek
68debc474a First jq rework 2021-10-03 16:20:08 +02:00
Bjarne Saltbaek
6a7f993a9a Forced CI 2021-10-03 15:56:26 +02:00
neil
ae25931b37 Merge pull request #3733 from acmesh-official/dev
sync
2021-10-03 21:30:46 +08:00
neil
84fe6654cc fix for https://github.com/acmesh-official/acme.sh/issues/3717 2021-10-03 20:59:55 +08:00
Bjarne Saltbaek
d2d023cca7 added saving of cPanel_Hostname 2021-10-03 13:35:22 +02:00
neil
64908e0080 fix Windows path 2021-10-03 19:28:30 +08:00
neil
d4e1899747 support "--set-default-chain", fix https://github.com/acmesh-official/acme.sh/issues/3717 2021-10-03 19:02:45 +08:00
Bjarne Saltbaek
7f9b8d68ac Added dns-cpanel.sh as support for cPanel controlled DNS systems 2021-10-02 19:30:07 +02:00
neil
5b1e849bde Merge pull request #3725 from acmesh-official/dev
sync
2021-10-01 23:02:30 +08:00
neil
fba6de76b1 Merge pull request #3687 from gstrauss/use-getdeployconf
use _getdeployconf instead of sourcing DOMAIN_CONF
2021-10-01 12:41:12 +08:00
Glenn Strauss
8419b42e83 use ${ACME_OPENSSL_BIN:-openssl} instead of openssl
(requested by @Neilpang in #3687)
2021-09-30 19:00:39 -04:00
neil
5f38c15b1f Merge pull request #3709 from ToJIka4/add_veesp_api
Add Veesp DNS API
2021-09-25 15:52:04 +08:00
neil
c3b72baa8e Merge pull request #3710 from tcocca/dev
Rackspace changed their API response, fixed the sed matching
2021-09-24 10:25:42 +08:00
Tom Cocca
16d0416f22 trigger GH Actions again 2021-09-23 08:50:20 -04:00
Tom Cocca
b9aa4f4478 trigger a GH actions change 2021-09-23 08:20:50 -04:00
Tom Cocca
8d3ad3a8c1 Rackspace changed their API response, fixed the sed matching 2021-09-23 08:10:17 -04:00
Stephen Pliaskin
5a689ce897 Add Veesp DNS API 2021-09-22 23:17:50 +03:00
neil
35e22703af Merge pull request #3697 from DerVerruckteFuchs/1984-hosting-cookie-fix
1984 hosting cookie fix
2021-09-15 09:27:00 +08:00
DerVerruckteFuchs
41a2d0e06c reduce ttl 2021-09-13 11:44:39 -04:00
DerVerruckteFuchs
4d95e35c06 get response based on $txtvalue 2021-09-12 17:38:27 -04:00
DerVerruckteFuchs
4e553f34ba get TXT entry based on $txtvalue 2021-09-12 17:20:01 -04:00
DerVerruckteFuchs
b910726c43 pick first entry if more than one TXT entry exists 2021-09-12 17:05:36 -04:00
DerVerruckteFuchs
64e3cab6ab add correct number of vars for _get_zone_id 2021-09-12 16:57:32 -04:00
DerVerruckteFuchs
f3196396a2 fix email filtering 2021-09-12 16:49:53 -04:00
DerVerruckteFuchs
148336929d fix formatting 2021-09-12 16:27:40 -04:00
DerVerruckteFuchs
2f3ec3a77f filter out instances where email@domain.com exists 2021-09-12 16:25:21 -04:00
Christophe B Billheimer
8d7a487013 change $@ -> $_domain 2021-09-12 14:10:54 -04:00
Christophe B Billheimer
622464ff5e fix error message for _get_zone_id 2021-09-12 13:49:31 -04:00
Christophe B Billheimer
b45a44e405 fix formatting 2021-09-12 13:33:55 -04:00
Christophe B Billheimer
a196958bd6 add check when getting zone id 2021-09-12 13:13:55 -04:00
Christophe B Billheimer
f101418658 change _url -> url 2021-09-12 13:03:54 -04:00
Christophe B Billheimer
aa05a1e81d make sure _url gets set where it is needed 2021-09-12 13:00:03 -04:00
Christophe B Billheimer
384bc62f25 make _get_zone_id usage consistent 2021-09-12 12:54:42 -04:00
Christophe B Billheimer
46e62f1a9a fix typo 2021-09-12 12:50:03 -04:00
Christophe B Billheimer
c5c2014081 add _get_zone_id to dns_1984hosting_rm to get the zone id 2021-09-12 12:48:27 -04:00
Christophe B Billheimer
c668c603cc add Referer and X-CSRFToken HTTP headers 2021-09-12 12:45:06 -04:00
Christophe B Billheimer
8f3b7c179e put cookies into a format that the 1984 Hosting website expects 2021-09-12 12:37:56 -04:00
Christophe B Billheimer
ea18c47011 move getting zone id code into its own function 2021-09-12 12:35:20 -04:00
Christophe B Billheimer
ced7110a78 remove -o option from grep and use _egrep_o instead 2021-09-10 08:49:38 -04:00
Christophe B Billheimer
92f13eb8bf get both the CSRF token and session ID cookies, as they are both needed for login now 2021-09-10 08:02:13 -04:00
Christophe B Billheimer
1312ef7e50 simplify One984HOSTING_COOKIE grep 2021-09-10 07:25:18 -04:00
Christophe B Billheimer
e992979113 Merge branch 'master' of github.com:DerVerruckteFuchs/acme.sh into 1984-hosting-cookie-fix 2021-09-08 22:49:24 -04:00
Christophe B Billheimer
d317b49940 use head instead of tail so that the sessionid cookie gets set correctly 2021-09-08 22:48:43 -04:00
neil
6be53468c5 Merge pull request #3691 from nookery/patch-1
the type of 'snis' is array
2021-09-07 11:55:44 +08:00
neil
046094bdcb Merge pull request #3696 from TheTyrius/dev
[dns_netcup] Fix variable name
2021-09-07 09:34:12 +08:00
Philipp B
1064c270d9 Fix variable name
Wrong variable name was used in login() and logout(), preventing operation.
2021-09-06 17:01:31 +02:00
Nookery
2447fccf1e name="snis" => name="snis[]"
kong 2.5.x,snis参数是一个数组
2021-09-04 16:59:50 +08:00
Glenn Strauss
c43c711f72 use _getdeployconf instead of sourcing DOMAIN_CONF
(requested by @Neilpang in #3394)

github: closes #3394
2021-09-01 16:37:10 -04:00
Michael Weber
f354e6de69 lighttpd deploy hook
* verbatim copy from haproxy.sh, s/haproxy/lighttpd
* enable issuer
2021-09-01 16:33:24 -04:00
neil
12615c46f8 Merge pull request #3682 from acmesh-official/dev
sync
2021-08-29 22:18:31 +08:00
neil
b335840f97 Merge pull request #3657 from Sp1l/extend_pre_hook
Make domain names available to pre hook
2021-08-22 11:01:02 +08:00
Leo
6d84f59e6b Add Weixin Work notify hook 2021-08-21 04:11:21 +08:00
neilpang
c5efec678e remove clearlinux 2021-08-18 20:59:47 +08:00
Aleksei Faians
83cb89e4f7 treat variable contents as text, don't process switches 2021-08-17 08:58:04 +03:00
neilpang
6bdf689d0f fix https://github.com/acmesh-official/acme.sh/issues/3660 2021-08-15 08:52:55 +08:00
Bernard Spil
e164362069 Make domain names available to pre hook
Export Le_Domains and Le_Alt so your pre-hook script can run additional checks.

Allows running checks on the domain names before the first call to the ACME API. Thereby not counting against the rate-limit when an issue is going to be problematic.

Supersedes:	#3288
2021-08-10 12:36:29 +02:00
neilpang
72e3f33f28 fix docker test 2021-08-08 08:49:15 +08:00
neilpang
ccfd907914 fix https://github.com/acmesh-official/acme.sh/issues/3649 2021-08-07 21:06:05 +08:00
neilpang
5a44e63cad fix nginx mode
https://github.com/acmesh-official/acme.sh/issues/3648#issuecomment-894045613
2021-08-06 21:22:10 +08:00
neil
d96cca3822 Merge pull request #3647 from acmesh-official/dev
sync
2021-08-05 20:14:00 +08:00
neilpang
06580bf0e4 fix https://github.com/acmesh-official/acme.sh/issues/1914#issuecomment-893188476 2021-08-05 20:12:42 +08:00
neil
b21bd64764 Merge pull request #3646 from jonwltn/dev
Minor output formatting changes.
2021-08-05 16:54:53 +08:00
jonwltn
6b97dc6734 Minor output formatting changes. 2021-08-04 10:44:48 -07:00
neil
4e3f328a02 Merge pull request #3644 from acmesh-official/dev
sync
2021-08-04 21:43:40 +08:00
neil
8380ca2fdd Merge pull request #3641 from felixonmars/patch-1
Correct a typo in dns_aws.sh
2021-08-03 11:01:59 +08:00
Felix Yan
ec678bc6d2 Correct a typo in dns_aws.sh 2021-08-03 01:36:59 +08:00
neilpang
2b5e2d4760 fix nginx mode 2021-08-01 15:44:14 +08:00
neilpang
89abad7980 fix https://github.com/acmesh-official/acme.sh/issues/3635 2021-08-01 13:11:52 +08:00
neil
d84da5bdbf Merge pull request #3638 from acmesh-official/dev
fix https://github.com/acmesh-official/acme.sh/issues/3624#issuecomme…
2021-08-01 08:47:41 +08:00
neilpang
5cc1d9521c fix https://github.com/acmesh-official/acme.sh/issues/3624#issuecomment-887689325 2021-07-28 22:14:54 +08:00
neil
a199fc6113 Merge pull request #3621 from acmesh-official/dev
sync
2021-07-24 23:42:34 +08:00
neil
655e34b166 minor, clean links for renewal 2021-07-24 16:23:43 +08:00
neil
5ea3a02d6a Merge pull request #3587 from xpac1985/patch-2
dns_infoblox.sh: Fix Infoblox_View handling + some cleanup
2021-07-24 16:00:55 +08:00
neil
15c68c9594 Merge pull request #3620 from acmesh-official/dev
sync
2021-07-24 15:48:36 +08:00
neil
08438608d1 fix format 2021-07-24 15:46:58 +08:00
neil
2da94e0fdf Merge pull request #3617 from Ivanovitchk/dev
dns_ovh: fix random add/remove txt records failures
2021-07-22 14:00:29 +08:00
Ivanovitch_k
63165764dc dns_ovh: fix random add/remove txt records failures
due to inconsistent curl api response json
2021-07-22 00:24:11 +02:00
neilpang
103810ce20 add info 2021-07-20 21:05:17 +08:00
neil
f59356b96b Merge pull request #3612 from acmesh-official/retry
add retry logic for http requests
2021-07-20 20:59:41 +08:00
ciro
4a8511f680 fix wrong variable name 2021-07-17 13:50:45 -03:00
cirow
cd6698c688 Merge branch 'acmesh-official:dev' into dev 2021-07-15 22:56:26 -03:00
ciro
c7ca9d7e36 fix shfmt issues 2021-07-15 22:55:35 -03:00
neil
d70b759cb9 format 2021-07-15 22:47:20 +08:00
neil
ae3dda0f8f add retry for get() and post() 2021-07-15 22:21:32 +08:00
neil
e229ba5945 Merge pull request #3601 from acmesh-official/3600
fix https://github.com/acmesh-official/acme.sh/issues/3600
2021-07-12 22:27:19 +08:00
neil
dcc50093bb fix https://github.com/acmesh-official/acme.sh/issues/3600 2021-07-12 21:46:08 +08:00
neil
0831690f79 Merge pull request #3595 from stevenzhu25/patch-1
Feature Request: Add sender name for SendGrid notify hook
2021-07-12 09:11:29 +08:00
ciro
98ef51514f added pushbullet functionality 2021-07-11 20:29:44 -03:00
neilpang
ac9993394c update 2021-07-11 21:58:47 +08:00
Steven Zhu
849c3fd9c9 Fix space inconsistency 2021-07-06 22:54:15 -04:00
Steven Zhu
da58fcbfce Add sender name for SendGrid notify hook 2021-07-06 20:51:51 -04:00
neil
fa3cd9736f Merge pull request #3593 from jonwltn/fix-dnspod
Fix the URL for checking DNSPod availability.
2021-07-05 09:27:41 +08:00
jonwltn
a0c5d17539 Fix the URL for checking DNSPod availability. 2021-07-02 09:23:45 -07:00
xpac1985
224cd04673 Shell formatting, again 2021-07-01 22:59:43 +02:00
xpac1985
52243d0870 Clean up formatting (SHFMT) 2021-07-01 22:54:56 +02:00
xpac1985
d519873fa4 Fix Infoblox_View handling + some cleanup
URL is now constructed after possible fallback value for Infoblox_View is being set
Infoblox_View is URLencoded to deal with e.g. spaces
Some cleanup, clearer log messages etc.
2021-07-01 22:25:49 +02:00
neil
a76dcd4ba1 Merge pull request #3581 from acmesh-official/dev
sync
2021-06-28 21:21:04 +08:00
neilpang
2d07185300 use letsencrypt server to renew certs if no server was saved. 2021-06-28 21:16:32 +08:00
neil
518e1df257 sync (#3580)
sync
2021-06-28 21:10:42 +08:00
neilpang
e0def66959 fix for compatiblity 2021-06-27 11:29:51 +08:00
neil
772d970074 fix CI tests (#3574)
fix CI tests
2021-06-25 23:20:40 +08:00
neilpang
ba7d85145a fix env 2021-06-25 23:01:47 +08:00
neilpang
fb73dceab0 fix format 2021-06-25 22:46:55 +08:00
neilpang
13fd83e0ba fix revoke 2021-06-25 22:44:23 +08:00
neilpang
719ba75fcc fix test server 2021-06-25 22:29:40 +08:00
neilpang
13ab98440c fix initapi 2021-06-25 22:23:17 +08:00
neilpang
1752004301 fix deactivate 2021-06-25 22:16:16 +08:00
neilpang
536a5f7cff fix deactivate 2021-06-25 21:59:38 +08:00
neilpang
a69aece23a Use TEST_ACME_Server 2021-06-25 21:28:20 +08:00
neilpang
77d3815baa use TEST_ACME_Server 2021-06-25 21:18:03 +08:00
neilpang
e225e17386 remove unused file 2021-06-25 20:56:46 +08:00
neil
3290208749 Merge pull request #3573 from acmesh-official/dev
Dev
2021-06-25 20:13:06 +08:00
neil
3106187aac Merge pull request #3572 from funzoneq/pdns-fix-content-type
Pdns fix content type
2021-06-25 18:25:19 +08:00
Arnoud Vermeer
eae490b5b1 [dns_pdns] Fix: missing content type in PATCH requests #3454 2021-06-25 10:12:23 +02:00
neilpang
bcce77508a remove buypass test 2021-06-25 00:04:13 +08:00
neilpang
e9bdf02cfc fix filter 2021-06-25 00:01:46 +08:00
neilpang
77f659c9b9 add NO_ECC_384 2021-06-24 23:57:21 +08:00
neilpang
c66e157a14 fix path filter 2021-06-24 23:30:16 +08:00
neilpang
2c927277e2 fix error 2021-06-24 23:23:46 +08:00
neilpang
29fe1c86da fix initapi 2021-06-24 23:21:10 +08:00
neilpang
1ae9c48370 fix error 2021-06-24 22:05:43 +08:00
neilpang
078a8b40e9 add buypass test 2021-06-24 22:03:00 +08:00
neilpang
9daeae1695 remove unnecessary check 2021-06-24 20:45:15 +08:00
neilpang
014e016058 add retry for init api 2021-06-24 20:35:49 +08:00
neil
f41f93af3a Merge pull request #3491 from bgarret/consul-deploy-hook
Consul deploy hooks
2021-06-24 20:25:01 +08:00
neil
51539521b1 Merge pull request #3551 from marcusgrando/dev
Added Azion DNS API
2021-06-24 20:19:52 +08:00
Marcus Grando
522dec34a5 Added Azion DNS API 2021-06-23 08:45:22 -03:00
neil
ea6d76cce6 Merge pull request #3569 from Habetdin/dev
notify/telegram.sh: Fix special characters escaping
2021-06-23 13:27:07 +08:00
Habetdin
7c7d61f61e Fix special characters escaping
To escape characters '_', '*', '`', '[' outside of an entity, prepend the characters '\' before them.
2021-06-23 03:20:07 +03:00
Marcus Grando
184dde92a2 Added Azion DNS API 2021-06-22 14:06:05 -03:00
neil
7e43c794fd Merge pull request #3567 from acmesh-official/dev
support SSL.com
2021-06-22 20:40:43 +08:00
neilpang
c7285967d6 fix for list short name 2021-06-22 20:39:00 +08:00
neilpang
41f4baadb9 minor 2021-06-22 07:59:02 +08:00
neilpang
20082ec9fb update status 2021-06-22 07:55:12 +08:00
neilpang
8dae8c52c0 split in to multiple files, so that it can pass more. 2021-06-22 07:48:37 +08:00
neil
068076c0d5 Merge pull request #3565 from acmesh-official/dev
Dev
2021-06-21 23:42:23 +08:00
neilpang
c0ae44a41b fix format 2021-06-21 22:59:14 +08:00
neilpang
593e8e1f63 move ca key path 2021-06-21 22:47:22 +08:00
neilpang
707cf35f0a fix format 2021-06-21 22:29:14 +08:00
neilpang
30f11d0e16 typo 2021-06-21 21:41:56 +08:00
neilpang
53d6ab6c23 support SSL.com 2021-06-21 21:31:00 +08:00
neilpang
280e44304a fix for compatibility to sslcom 2021-06-21 20:11:15 +08:00
neilpang
79fac4466e minor 2021-06-20 16:58:20 +08:00
neil
0e9f09e582 Merge pull request #3539 from Djelibeybi/dev
Add DNS API plugin for Oracle Cloud Infrastructure DNS Service
2021-06-20 16:05:56 +08:00
Avi Miller
25d0fdf8ff fix: fix a format issue reported by shellfmt
Signed-off-by: Avi Miller <avi.miller@oracle.com>
2021-06-20 17:07:04 +10:00
Avi Miller
1d089d4541 fix: refactor the way the config is read from file and envvars
The plugin will use the following order of precedence:

environment value > file value > default value

See the wiki for details on environment variable names.

Signed-off-by: Avi Miller <avi.miller@oracle.com>
2021-06-20 17:00:53 +10:00
neilpang
1c78663378 exclude test for dns api changes 2021-06-20 12:26:12 +08:00
Avi Miller
7666022840 fix: revert _readini() function to be more generic
Also switched [::space::] with a literal space for better
cross-platform compatibility.

Signed-off-by: Avi Miller <avi.miller@oracle.com>
2021-06-20 13:12:14 +10:00
Avi Miller
946c8b498a feat: enable automatic configuration from an OCI configuration file
The individual parameters can still be overridden via the
corresponding OCI_CLI environment variable.

Signed-off-by: Avi Miller <avi.miller@oracle.com>
2021-06-20 09:10:24 +10:00
Marcus Grando
406ca66c8d Added Azion DNS API 2021-06-19 15:19:56 -03:00
Avi Miller
ed971df93a fix: add missing else/return 1 to if block
Signed-off-by: Avi Miller <avi.miller@oracle.com>
2021-06-19 15:41:34 +10:00
neilpang
74c054b2a5 fix https://github.com/acmesh-official/acme.sh/issues/3563 2021-06-19 11:52:11 +08:00
Avi Miller
017a10189c fix: switch to using functions instead of calling OpenSSL directly
Also reduced the number of environment variables which simplifies
the documentation and requirements. The variable names now match
those used by the OCI CLI.

Signed-off-by: Avi Miller <avi.miller@oracle.com>
2021-06-18 12:00:42 +10:00
neil
f1c361855e Merge pull request #2526 from PeterDaveHello/Refactor_Dockerfile
Refactor Dockerfile
2021-06-17 22:01:27 +08:00
neil
3d72df4666 Merge pull request #2529 from PeterDaveHello/UpdateREADME.md
Remove invalid "Contribute" link in README.md
2021-06-16 23:11:56 +08:00
Peter Dave Hello
6f732a9957 Use COPY instead of ADD in Dockerfile for folder
Ref:
https://docs.docker.com/develop/develop-images/#add-or-copy
2021-06-16 22:47:36 +08:00
Peter Dave Hello
447bf77dfe Simplify apk command in Dockerfile
With apk `--no-cache` parameter, there is no need to run `apk update`
and manually clean up the cache, apk will update automatically without
leaving local cache files to be cleaned up.
2021-06-16 22:47:33 +08:00
Peter Dave Hello
6621ef6a0b Remove invalid "Contribute" link in README.md 2021-06-16 19:44:31 +08:00
Marcus Grando
e327c8758e Merge branch 'acmesh-official:dev' into dev 2021-06-15 17:49:17 -03:00
neil
8a08de5691 Merge pull request #3554 from acmesh-official/dev
add linux tests
2021-06-14 12:25:39 +08:00
neilpang
3d7375be8b update status 2021-06-14 12:00:42 +08:00
neilpang
da754e9a71 fix 2021-06-14 11:52:45 +08:00
neilpang
cc9ec806b2 add all Linux 2021-06-14 11:50:19 +08:00
neil
72cf037c0d Merge pull request #3553 from acmesh-official/dev
fix for solaris
2021-06-13 22:11:27 +08:00
neilpang
8ae08b29e4 fix for solaris 2021-06-13 21:37:26 +08:00
neil
4967fa020f Merge pull request #3552 from acmesh-official/dev
sync
2021-06-13 16:16:11 +08:00
neilpang
54f2640ef2 fix env 2021-06-13 15:52:38 +08:00
neilpang
56246592c7 set ca names in the env 2021-06-13 15:45:33 +08:00
neilpang
1ff5d71e12 fix windows 2021-06-13 15:30:51 +08:00
neilpang
67c42c5911 add zerossl 2021-06-13 15:00:30 +08:00
neilpang
d0b514890a change default ca to zerossl 2021-06-13 14:29:26 +08:00
Marcus Grando
c0285fbc15 Added Azion DNS API 2021-06-11 11:17:26 -03:00
neil
a438c841e1 Merge pull request #3542 from DerVerruckteFuchs/_get_root()-fix
fix _get_root() so that it successfully gets the root domain
2021-06-09 17:50:54 +08:00
neil
19d7c2b336 fix bug 2021-06-06 22:53:39 +08:00
neil
afb6c70909 Merge pull request #3541 from DerVerruckteFuchs/dns_1984hosting_add()-fix
fix dns_1984hosting_add() so checks for HTML responses actually find HTML responses
2021-06-06 22:48:40 +08:00
DerVerruckteFuchs
d9af496b13 Merge branch 'dev' into _get_root()-fix 2021-06-05 23:20:01 -04:00
Christophe B Billheimer
a55cf40b1b fix _get_root() so that it successfully gets the root domain 2021-06-05 23:06:28 -04:00
Christophe B Billheimer
b19008d1b8 fix dns_1984hosting_add() so checks for HTML responses are actually find HTML responses 2021-06-05 22:38:45 -04:00
Avi Miller
6f88c81616 Add DNS API plugin for Oracle Cloud Infrastructure DNS Service
This plugin is has noticeably more required fields than most
other plugins due to the requirement that all requests to
the OCI REST API must be cryptographically signed by the client
using the draft standard proposed in draft-cavage-http-signatures-08[1].

The OCI specific implementation details of the draft standard are
documented in the Developer Guide[2].

NOTE: there is maximum allowed clock skew of five minutes between the
client and the API endpoint. Requests will be denied if the skew is
greater.

This PR also includes a minor tweak to the Solaris job in the DNS
workflow so that it uses the pre-installed GNU tools, curl and OpenSSL 1.1.1.
Without these changes, the signature generation function does not
work on Solaris.

[1]: https://datatracker.ietf.org/doc/html/draft-cavage-http-signatures-08
[2]: https://docs.oracle.com/en-us/iaas/Content/API/Concepts/signingrequests.htm#five

Signed-off-by: Avi Miller <avi.miller@oracle.com>
2021-06-05 21:55:40 +10:00
neil
43cb230f19 Merge pull request #3535 from sparunakian/dev
Fix typo (#3521)
2021-06-02 23:06:36 +08:00
neil
fd6a59202d start 3.0.0 2021-06-02 23:06:12 +08:00
Stéphane Parunakian
e353f66eaa Fix typo 2021-06-02 16:06:08 +02:00
neil
9293bcfb1c Merge pull request #3534 from acmesh-official/dev
sync
2021-06-02 20:53:41 +08:00
neil
d154118600 fix bug 2021-06-01 22:21:17 +08:00
neil
c2273d2c8e add debug info 2021-06-01 22:15:53 +08:00
neil
495ba01d8e Merge pull request #3529 from Haarolean/bugfix/porkbun-fixes
Porkbun DNS API fixes
2021-06-01 21:29:14 +08:00
neil
f627a02886 add error message 2021-06-01 21:24:37 +08:00
neil
5f9daa6640 check initAPI error 2021-06-01 21:23:00 +08:00
neil
9edda556de Merge pull request #3530 from DerVerruckteFuchs/1984-login-fix
1984 login fix
2021-06-01 21:10:52 +08:00
Christophe B Billheimer
3891a52aeb change "$url" -> $url so the value of $url gets passed by reference, and the string "$url" does not erroneously get passed as a variable into _post() 2021-05-31 15:24:41 -04:00
Roman Zabaluev
1e5e3353f3 Fix porkbun issues
See gh-3450
2021-05-30 18:23:13 +03:00
neil
7aa4b8247c upgrade cf-tunnel 2021-05-29 15:17:34 +08:00
neil
37339ddafc Merge pull request #3525 from tresni/synology_dsm
Synology DSM - Make certificate descriptions sed safe
2021-05-27 21:04:24 +08:00
Brian Hartvigsen
dcb51683c5 shellcheck cleanup
shellcheck sees '\\' as trying to escape the trailing quote (see
koalaman/shellcheck#1548 ).
2021-05-26 15:25:58 -06:00
Brian Hartvigsen
74a4a788b1 Make certificate descriptions sed safe
This escapes special characters used in POSIX sed to prevent mismatches.
e.g. `SYNO_Certficiate=*.example.com` would not match a description of
"*.example.com" and would look to match any number of double quotes (the
last character in the sed regex prior to certificate description),
followed by any single character, followed by "example", followed by any
character, followed by "com".

After this change, it will properly match `*.example.com` and not
`""zexamplefcom`.

Additionally we now store the certificate description as base64 encoded
to prevent issues with single quotes.

Tested on DSM 7.0-41222 (VDSM) and DSM 6.2.4-25556 (DS1515+).
2021-05-26 15:25:58 -06:00
neilpang
7909273a21 add debug info 2021-05-25 21:57:15 +08:00
neil
130e8dbd40 Merge pull request #3522 from acmesh-official/dev
sync
2021-05-23 23:55:23 +08:00
neil
40e2ebed95 remove ngrok token 2021-05-23 23:16:04 +08:00
neil
bf9b33acec use cloudflare tunnel to test 2021-05-23 23:12:46 +08:00
neil
7710a33b6c fix format 2021-05-22 23:48:39 +08:00
neil
af3ea2d4fd remove ACME v1 support 2021-05-22 23:45:50 +08:00
neil
52a3255936 Merge pull request #3520 from tresni/synology_dsm
Better fix for Synology DSM setting wrong default
2021-05-20 23:05:34 +08:00
Brian Hartvigsen
5ab9ca1c0d Better fix for Synology DSM setting wrong default
As noted by @buxm, previous fix didn't work for all versions of DSM 6.
The better fix appears to be simply not outputting the "as_default"
parameter unless we are doing something with the default certificate.
2021-05-19 13:21:34 -06:00
neil
461f602992 Merge pull request #3505 from willbrowningme/patch-1
dnsapi/dns_desec.sh remove DEDYN_NAME variable
2021-05-08 21:12:56 +08:00
neilpang
46180435cc minor 2021-05-08 21:09:56 +08:00
neil
7f2699c6da Merge pull request #3511 from acmesh-official/dev
Dev
2021-05-08 21:00:02 +08:00
neilpang
aede5c486b fix https://github.com/acmesh-official/acme.sh/issues/3504
check invalid status first.
2021-05-07 22:02:40 +08:00
neilpang
fb2407386f Merge branch 'dev' of https://github.com/acmesh-official/acme.sh into dev 2021-05-07 21:50:22 +08:00
neilpang
aa59c46c4c fix https://github.com/acmesh-official/acme.sh/issues/3504 2021-05-07 21:49:47 +08:00
Benoit Garret
07afc4953a Fix the shfmt check 2021-05-07 12:12:30 +02:00
Will Browning
c5557fc488 Remove DEDYN_NAME variable from dns_desec.sh 2021-05-06 16:51:43 +01:00
neil
8c14150536 Merge pull request #3350 from temoffey/deploy-gcore_cdn
Deploy gcore_cdn fix
2021-05-05 23:48:37 +08:00
Benoit Garret
c127903127 Add Consul deploy hook 2021-05-05 10:01:09 +02:00
neilpang
0881cf1379 start 2.9.0 2021-05-04 13:32:59 +08:00
neil
d0a16b0ec0 Merge pull request #3499 from acmesh-official/dev
sync
2021-05-03 22:20:20 +08:00
neil
290beb90a7 minor 2021-05-03 17:14:54 +08:00
neil
0a4ef17135 fix nginx relative path issue:
https://github.com/acmesh-official/acme.sh/issues/1743
https://github.com/acmesh-official/acme.sh/issues/1914
2021-05-03 17:11:02 +08:00
neil
e0c32ce700 minor 2021-05-03 16:42:09 +08:00
neil
e65144a105 fix https://github.com/acmesh-official/acme.sh/issues/3487
suppor Ali doh and dnspod doh.
2021-05-03 16:37:13 +08:00
neil
ae40445dba Merge pull request #3498 from tresni/synology_dsm
FIX: Synology sets "default" on wrong certificate
2021-05-03 15:57:09 +08:00
neil
25a8240d12 fix https://github.com/acmesh-official/acme.sh/issues/3421 2021-05-03 15:52:56 +08:00
Brian Hartvigsen
1a4a180e8c FIX: Synology sets "default" on wrong certificate
For some DSM installs, it appears that setting the "default" flag to the
string "false" actually sets it to true.  This causes Synology to set
the last updated certificate to be the default certificate.  Using an
empty string appears to still be accepted as a false-y value for DSMs
where this isn't happening and corrects the behavior in the cases that
it was.

Credit to @Run-King for identifying the fix and @buxm for reporting.
2021-05-02 13:37:59 -06:00
neilpang
aea10a3b93 Merge branch 'dev' of https://github.com/acmesh-official/acme.sh into dev 2021-05-02 22:20:27 +08:00
neilpang
f855862ade upgrade freebsd 2021-05-02 22:20:04 +08:00
neil
91d37c7875 fix compatibility issue 2021-05-01 22:32:44 +08:00
neil
5707b93110 Merge pull request #3493 from goekesmi/master
Pass content via printf string format and argument
2021-05-01 10:16:30 +08:00
Jeff Goeke-Smith
81b2d0732f arguments passed to printf are more generic
On systems that /bin/sh is served by shells other than bash, or 
shells that don't implement the same syntax as the bash printf builtin,
printf -- fails to produce the output necessary for standalone operation.

The test case for this was SmartOS, which uses ksh93 as its /bin/sh.

This change uses the more generic method of passing a format parameter
of a single string, and then the argument to replace it with.
2021-04-29 16:46:32 -04:00
neil
ec0538d251 Merge pull request #3455 from ecm75/notify_fix
fix _exists error message if MAIL_BIN env variable is not set
2021-04-29 22:34:11 +08:00
Eike-Christian Müller
eb0c629fad more simple mail.sh fix
Reverted the original patch and changed it to the obvious simple solution provided by @Neilpang.
2021-04-29 12:53:13 +02:00
neil
509d3f6d30 Merge pull request #3392 from akulumbeg/dev
Adding DNSAPI wrapper for Websupport webhosting (Slovakia)
2021-04-19 09:46:33 +08:00
neil
c576af7c6f Merge pull request #3460 from JaZo/feature/aurora
Add Aurora DNS API
2021-04-17 22:17:35 +08:00
neilpang
f3682f0e8e fix format 2021-04-17 22:09:59 +08:00
Jasper Zonneveld
1c58913eeb Add Aurora DNS API 2021-04-15 08:59:16 +02:00
neilpang
cfbc294832 fix onecom api 2021-04-14 22:18:01 +08:00
neil
64ad8b1dac Merge pull request #3479 from mjbnz/dev
Update Telegram notification
2021-04-09 10:08:48 +08:00
Mike Beattie
fb079f9e50 Update telegram.sh
(fix shellcheck failure)
2021-04-08 16:44:22 +12:00
Mike Beattie
39b09f8f87 Dump _post() call output to /dev/null
Signed-off-by: Mike Beattie <mike@ethernal.org>
2021-04-08 16:38:00 +12:00
Mike Beattie
53d26e5c5c Add debug output of $_data variable to aid diagnosis
Signed-off-by: Mike Beattie <mike@ethernal.org>
2021-04-08 16:37:27 +12:00
Mike Beattie
e21f3e6c73 Escape asterisks in notification content
This messes with markdown parsing

Signed-off-by: Mike Beattie <mike@ethernal.org>
2021-04-08 16:36:42 +12:00
neil
edd46eb3d1 Merge pull request #3478 from acmesh-official/dev
sync
2021-04-07 22:04:08 +08:00
neil
e71238571a Merge pull request #3464 from jpbede/cleverreach-deploy-sublient
CleverReach Deploy Hook: Allow deploy to agency subaccounts
2021-04-04 19:03:33 +08:00
Jan-Philipp Benecke
2867ec509e Make CI happy 2021-03-30 09:18:33 +02:00
Jan-Philipp Benecke
d853a9ebbe Make uploading cert to subaccount possible 2021-03-30 09:13:32 +02:00
neil
e0d2fa98f3 Merge pull request #3463 from c35sys/patch-1
Use 'vault kv put' instead of 'vault write'
2021-03-29 22:27:07 +08:00
Christophe Le Guern
cc90f83463 Use 'vault kv put' instead of 'vault write'
When using vault_cli with a kv2 path, it isn't working. I have the following error:
```
WARNING! The following warnings were returned from Vault:                                                                                                                                                                                     
                                                                                                                                                                                                                                              
  * Invalid path for a versioned K/V secrets engine. See the API docs for the                                                                                                                                                                 
  appropriate API endpoints to use. If using the Vault CLI, use 'vault kv put'                                                                                                                                                                
  for this operation.                                                                                                                                                                                                                         
```
The new way to write data  is to use `vault kv put`, it is compatible with kv1 and kv2.
Ref: https://www.vaultproject.io/docs/commands#reading-and-writing-data
```
The original version of K/V used the common read and write operations. A more advanced K/V Version 2 engine was released in Vault 0.10 and introduced the kv get and kv put commands.
```
2021-03-29 15:10:14 +02:00
neil
9ea1238e1b Merge pull request #3445 from woutd/constellix-wildcard-support
Add wildcard certificate support for dns_constellix
2021-03-27 08:10:59 +08:00
Jan-Philipp Benecke
1530abbd1a Make uploading cert to subaccount possible 2021-03-26 15:37:12 +01:00
wout
3bfcd18a03 Workaround for Solaris, as it does not support non-greedy regex 2021-03-24 13:56:14 +01:00
wout
6b7db22981 Catch the situation when the TXT record is updated with the same value 2021-03-24 09:01:54 +01:00
wout
8adb8a6986 While [0-9]+ is a bit more correct than [0-9]*, the former does not seem to work on Solaris. 2021-03-23 21:20:27 +01:00
emueller
37e3e2f9c2 fixed formating 2021-03-22 15:32:02 +01:00
emueller
3c7be32ef5 fix _exists error message when MAIL_BIN env variable is not set 2021-03-22 15:12:27 +01:00
Alexander Kulumbeg
051775b9b4 String update
Hopefully the last one
2021-03-21 16:25:04 +01:00
neilpang
e0d5b91388 fix freebsd 2021-03-21 16:20:32 +01:00
qkdreyer
4dd2027428 fix: prevent rate limit 2021-03-21 16:20:32 +01:00
Quentin Dreyer
42ab98b830 feat: add dns_porkbun 2021-03-21 16:20:32 +01:00
neil
2b2bce6457 fix format 2021-03-21 16:20:32 +01:00
neil
69ee816541 fix https://github.com/acmesh-official/acme.sh/issues/3312 2021-03-21 16:20:32 +01:00
anom-human
2cbf3f7e15 Update dns_servercow.sh to support wildcard certs
Updated dns_servercow.sh to support txt records with multiple entries. This supports wildcard certificates that require txt records with the same name and different contents.
2021-03-21 16:20:32 +01:00
anom-human
923eece3f5 Update dns_servercow.sh to support wildcard certs
Updated dns_servercow.sh to support txt records with multiple entries. This supports wildcard certificates that require txt records with the same name and different contents.
2021-03-21 16:20:32 +01:00
neilpang
d4fb313ff0 fix format 2021-03-21 16:20:32 +01:00
neilpang
7dce465c06 fix https://github.com/acmesh-official/acme.sh/issues/3019 2021-03-21 16:20:32 +01:00
neilpang
5a30f5c00e fix https://github.com/acmesh-official/acme.sh/issues/3433 2021-03-21 16:20:32 +01:00
Lukas Brocke
fd406af962 dnsapi/ionos: Use POST instead of PATCH for adding TXT record
The API now supports a POST route for adding records. Therefore
checking for already existing records and including them in a PATCH
request is no longer necessary.
2021-03-21 16:20:32 +01:00
neilpang
9e5ae30372 fix https://github.com/acmesh-official/acme.sh/issues/3402 2021-03-21 16:20:32 +01:00
Kristian Johansson
0fe3538331 Adds comment 2021-03-21 16:20:32 +01:00
Kristian Johansson
b0f5ad75ae Fixes response handling and thereby allow issuing of subdomain certs 2021-03-21 16:20:32 +01:00
Geert Hendrickx
a290f63a15 No need to include EC parameters explicitly with the private key.
(they are embedded)
2021-03-21 16:20:32 +01:00
czeming
d078ce794e Update dns_dp.sh
没有encode中文字符会导致提交失败
2021-03-21 16:20:32 +01:00
medmunds
06f51a5c34 Change default SMTP_SECURE to "tls"
Secure by default. Also try to minimize configuration errors.
(Many ESPs/ISPs require STARTTLS, and most support it.)
2021-03-21 16:20:32 +01:00
medmunds
db96778064 Prefer Python to curl when both available 2021-03-21 16:20:32 +01:00
medmunds
d8918ea156 Use email.policy.default in Python 3 implementation
Improves standards compatibility and utf-8 handling
in Python 3.3-3.8. (email.policy.default becomes the
default in Python 3.9.)
2021-03-21 16:20:32 +01:00
medmunds
3503474bb8 Add Date email header in Python implementation 2021-03-21 16:20:32 +01:00
medmunds
eb1606b086 Clarify _readaccountconf_mutable_default 2021-03-21 16:20:32 +01:00
medmunds
1330a092fa Clean email headers and warn on unsupported address format
Just in case, make sure CR or NL don't end up in
an email header.
2021-03-21 16:20:32 +01:00
medmunds
d3c74cfb45 Implement _rfc2822_date helper 2021-03-21 16:20:32 +01:00
medmunds
d044545520 Rework read/save config to not save default values
Add and use _readaccountconf_mutable_default and
_saveaccountconf_mutable_default helpers to capture
common default value handling.

New approach also eliminates need for separate
underscore-prefixed version of each conf var.
2021-03-21 16:20:32 +01:00
medmunds
d1cdc1c6a0 Add _clearaccountconf_mutable() 2021-03-21 16:20:32 +01:00
medmunds
dc8d91ea39 Use PROJECT_NAME and VER for X-Mailer header
Also add X-Mailer header to Python version
2021-03-21 16:20:32 +01:00
neilpang
ae5a6d330d make the fix for rsa key only 2021-03-21 16:20:32 +01:00
neilpang
fe0bee21b0 support openssl 3.0
fix https://github.com/acmesh-official/acme.sh/issues/3399
2021-03-21 16:20:32 +01:00
Easton Man
c090c19bfe fix: fix freebsd and solaris 2021-03-21 16:20:32 +01:00
Easton Man
8fbec785e8 feat: add huaweicloud error handling 2021-03-21 16:20:32 +01:00
Mike Edmunds
06fb3d9476 Fix: Unifi deploy hook support Unifi Cloud Key (#3327)
* fix: unifi deploy hook also update Cloud Key nginx certs

When running on a Unifi Cloud Key device, also deploy to
/etc/ssl/private/cloudkey.{crt,key} and reload nginx. This
makes the new cert available for the Cloud Key management
app running via nginx on port 443 (as well as the port 8443
Unifi Controller app the deploy hook already supported).

Fixes #3326

* Improve settings documentation comments

* Improve Cloud Key pre-flight error messaging

* Fix typo

* Add support for UnifiOS (Cloud Key Gen2)

Since UnifiOS does not use the Java keystore (like a Unifi
Controller or Cloud Key Gen1 deploy), this also reworks
the settings validation and error messaging somewhat.

* PR review fixes

* Detect unsupported Cloud Key java keystore location

* Don't try to restart inactive services

(and remove extra spaces from reload command)

* Clean up error messages and internal variables

* Change to _getdeployconf/_savedeployconf

* Switch from cp to cat to preserve file permissions
2021-03-21 16:20:32 +01:00
medmunds
fe3e8a7bb6 More than one blank line is an abomination, apparently
I will not try to use whitespace to group code visually
2021-03-21 16:20:32 +01:00
medmunds
ce2ff25edd Implement curl version of smtp notify-hook 2021-03-21 16:20:32 +01:00
medmunds
65a1b892e3 Prep for curl or Python; clean up SMTP_* variable usage 2021-03-21 16:20:32 +01:00
medmunds
e272fde95e Add instructions for reporting bugs 2021-03-21 16:20:32 +01:00
medmunds
d48bff0e20 Only save config if send is successful 2021-03-21 16:20:32 +01:00
medmunds
6e61c34f0f Make shfmt happy
(I'm open to better ways of formatting the heredoc
that embeds the Python script.)
2021-03-21 16:20:32 +01:00
medmunds
2d9506eb54 Implement smtp notify hook
Support notifications via direct SMTP server connection.
Uses Python (2.7.x or 3.4+) to communicate with SMTP server.
2021-03-21 16:20:32 +01:00
jerrm
b1988c7b67 duckdns - fix "integer expression expected" errors (#3397)
* fix "integer expression expected" errors

* duckdns fix

* Update dns_duckdns.sh

* Update dns_duckdns.sh
2021-03-21 16:20:32 +01:00
neilpang
fb5d72c29b upgrade freebsd and solaris 2021-03-21 16:20:32 +01:00
neil
ac148ce0e9 Chain (#3408)
* fix https://github.com/acmesh-official/acme.sh/issues/3384
match the issuer to the root CA cert subject

* fix format

* fix https://github.com/acmesh-official/acme.sh/issues/3384

* remove the alt files. https://github.com/acmesh-official/acme.sh/issues/3384
2021-03-21 16:20:32 +01:00
manuel
016dca654e dnsapi/pdns: also normalize json response in detecting root zone 2021-03-21 16:20:32 +01:00
Gnought
6502bdecbe Updated --preferred-chain to issue ISRG properly
To support different openssl crl2pkcs7 help cli format
2021-03-21 16:20:32 +01:00
Vahid Fardi
91a739af6e change name actor 2021-03-21 16:20:32 +01:00
Vahid Fardi
e232565971 change Author name 2021-03-21 16:20:32 +01:00
Vahid Fardi
472488ebe8 change arvan api script 2021-03-21 16:20:32 +01:00
Alexander Kulumbeg
8de3698b23 Revert "Syncing with the original repo (#2)"
This reverts commit c384ed960c.
2021-03-21 16:16:38 +01:00
neilpang
a694b46914 fix freebsd 2021-03-21 22:46:35 +08:00
Alexander Kulumbeg
c384ed960c Syncing with the original repo (#2)
* change arvan api script

* change Author name

* change name actor

* Updated --preferred-chain to issue ISRG properly

To support different openssl crl2pkcs7 help cli format

* dnsapi/pdns: also normalize json response in detecting root zone

* Chain (#3408)

* fix https://github.com/acmesh-official/acme.sh/issues/3384
match the issuer to the root CA cert subject

* fix format

* fix https://github.com/acmesh-official/acme.sh/issues/3384

* remove the alt files. https://github.com/acmesh-official/acme.sh/issues/3384

* upgrade freebsd and solaris

* duckdns - fix "integer expression expected" errors (#3397)

* fix "integer expression expected" errors

* duckdns fix

* Update dns_duckdns.sh

* Update dns_duckdns.sh

* Implement smtp notify hook

Support notifications via direct SMTP server connection.
Uses Python (2.7.x or 3.4+) to communicate with SMTP server.

* Make shfmt happy

(I'm open to better ways of formatting the heredoc
that embeds the Python script.)

* Only save config if send is successful

* Add instructions for reporting bugs

* Prep for curl or Python; clean up SMTP_* variable usage

* Implement curl version of smtp notify-hook

* More than one blank line is an abomination, apparently

I will not try to use whitespace to group code visually

* Fix: Unifi deploy hook support Unifi Cloud Key (#3327)

* fix: unifi deploy hook also update Cloud Key nginx certs

When running on a Unifi Cloud Key device, also deploy to
/etc/ssl/private/cloudkey.{crt,key} and reload nginx. This
makes the new cert available for the Cloud Key management
app running via nginx on port 443 (as well as the port 8443
Unifi Controller app the deploy hook already supported).

Fixes #3326

* Improve settings documentation comments

* Improve Cloud Key pre-flight error messaging

* Fix typo

* Add support for UnifiOS (Cloud Key Gen2)

Since UnifiOS does not use the Java keystore (like a Unifi
Controller or Cloud Key Gen1 deploy), this also reworks
the settings validation and error messaging somewhat.

* PR review fixes

* Detect unsupported Cloud Key java keystore location

* Don't try to restart inactive services

(and remove extra spaces from reload command)

* Clean up error messages and internal variables

* Change to _getdeployconf/_savedeployconf

* Switch from cp to cat to preserve file permissions

* feat: add huaweicloud error handling

* fix: fix freebsd and solaris

* support openssl 3.0
fix https://github.com/acmesh-official/acme.sh/issues/3399

* make the fix for rsa key only

* Use PROJECT_NAME and VER for X-Mailer header

Also add X-Mailer header to Python version

* Add _clearaccountconf_mutable()

* Rework read/save config to not save default values

Add and use _readaccountconf_mutable_default and
_saveaccountconf_mutable_default helpers to capture
common default value handling.

New approach also eliminates need for separate
underscore-prefixed version of each conf var.

* Implement _rfc2822_date helper

* Clean email headers and warn on unsupported address format

Just in case, make sure CR or NL don't end up in
an email header.

* Clarify _readaccountconf_mutable_default

* Add Date email header in Python implementation

* Use email.policy.default in Python 3 implementation

Improves standards compatibility and utf-8 handling
in Python 3.3-3.8. (email.policy.default becomes the
default in Python 3.9.)

* Prefer Python to curl when both available

* Change default SMTP_SECURE to "tls"

Secure by default. Also try to minimize configuration errors.
(Many ESPs/ISPs require STARTTLS, and most support it.)

* Update dns_dp.sh

没有encode中文字符会导致提交失败

* No need to include EC parameters explicitly with the private key.
(they are embedded)

* Fixes response handling and thereby allow issuing of subdomain certs

* Adds comment

* fix https://github.com/acmesh-official/acme.sh/issues/3402

* dnsapi/ionos: Use POST instead of PATCH for adding TXT record

The API now supports a POST route for adding records. Therefore
checking for already existing records and including them in a PATCH
request is no longer necessary.

* fix https://github.com/acmesh-official/acme.sh/issues/3433

* fix https://github.com/acmesh-official/acme.sh/issues/3019

* fix format

* Update dns_servercow.sh to support wildcard certs

Updated dns_servercow.sh to support txt records with multiple entries. This supports wildcard certificates that require txt records with the same name and different contents.

* Update dns_servercow.sh to support wildcard certs

Updated dns_servercow.sh to support txt records with multiple entries. This supports wildcard certificates that require txt records with the same name and different contents.

* fix https://github.com/acmesh-official/acme.sh/issues/3312

* fix format

* feat: add dns_porkbun

* fix: prevent rate limit

Co-authored-by: Vahid Fardi <vahid.fardi@snapp.cab>
Co-authored-by: neil <github@neilpang.com>
Co-authored-by: Gnought <1684105+gnought@users.noreply.github.com>
Co-authored-by: manuel <manuel@mausz.at>
Co-authored-by: jerrm <jerrm@users.noreply.github.com>
Co-authored-by: medmunds <medmunds@gmail.com>
Co-authored-by: Mike Edmunds <github@to.mikeedmunds.com>
Co-authored-by: Easton Man <manyang.me@outlook.com>
Co-authored-by: czeming <loser_wind@163.com>
Co-authored-by: Geert Hendrickx <geert@hendrickx.be>
Co-authored-by: Kristian Johansson <kristian.johansson86@gmail.com>
Co-authored-by: Lukas Brocke <lukas@brocke.net>
Co-authored-by: anom-human <80478363+anom-human@users.noreply.github.com>
Co-authored-by: neil <win10@neilpang.com>
Co-authored-by: Quentin Dreyer <quentin.dreyer@rgsystem.com>
2021-03-20 16:01:09 +01:00
Alexander Kulumbeg
2386d2e299 String change 2021-03-20 15:26:32 +01:00
wout
cc7e1a72c1 Retrigger checks 2021-03-14 15:54:28 +01:00
wout
5cc0fa7c98 Retrigger checks 2021-03-14 15:50:16 +01:00
neil
4ce848ab51 Merge pull request #3448 from qkdreyer/dev
Create dns_porkbun.sh
2021-03-14 09:22:18 +08:00
qkdreyer
2e34e11b02 fix: prevent rate limit 2021-03-13 14:53:43 +01:00
Quentin Dreyer
8eda5f36fb feat: add dns_porkbun 2021-03-13 14:25:05 +01:00
neil
3dbe5d872b fix format 2021-03-13 20:46:12 +08:00
neil
96a95ba9fe fix https://github.com/acmesh-official/acme.sh/issues/3312 2021-03-13 20:43:35 +08:00
neil
f594ed659e Merge pull request #3449 from anom-human/master
Update dns_servercow.sh to support wildcard certs
2021-03-13 20:42:12 +08:00
anom-human
5c4bfbbd95 Update dns_servercow.sh to support wildcard certs
Updated dns_servercow.sh to support txt records with multiple entries. This supports wildcard certificates that require txt records with the same name and different contents.
2021-03-11 20:25:49 +01:00
anom-human
8733635638 Update dns_servercow.sh to support wildcard certs
Updated dns_servercow.sh to support txt records with multiple entries. This supports wildcard certificates that require txt records with the same name and different contents.
2021-03-11 19:11:02 +01:00
wout
928aa74e89 Fix typo 2021-03-10 23:36:34 +01:00
wout
8fdfe673e8 Improve the remove handling so it does not print errors 2021-03-10 23:34:21 +01:00
wout
494a6e6090 Fix checks 2021-03-10 16:32:09 +01:00
wout
89bb7e6b0e Add wildcard certificate support for dns_constellix 2021-03-10 16:18:07 +01:00
neilpang
52cfb9a041 fix format 2021-03-04 21:50:54 +08:00
neilpang
3817ddef41 fix https://github.com/acmesh-official/acme.sh/issues/3019 2021-03-04 21:46:36 +08:00
neilpang
0f494c9dd6 fix https://github.com/acmesh-official/acme.sh/issues/3433 2021-03-01 18:13:50 +08:00
neil
3ff97ecf45 Merge pull request #3430 from lbrocke/dns-api-ionos
dnsapi/ionos: Update API to use POST instead of PATCH for adding TXT records
2021-02-27 11:07:07 +08:00
neil
a10c0b516b Merge pull request #3426 from jakelamotta/master
Fix issue with subdomain certificates in dns_simply
2021-02-26 22:29:48 +08:00
Lukas Brocke
5eb1469dbf dnsapi/ionos: Use POST instead of PATCH for adding TXT record
The API now supports a POST route for adding records. Therefore
checking for already existing records and including them in a PATCH
request is no longer necessary.
2021-02-26 15:27:22 +01:00
neilpang
9a90fe3794 fix https://github.com/acmesh-official/acme.sh/issues/3402 2021-02-25 07:45:36 +08:00
Kristian Johansson
1917c4b04a Adds comment 2021-02-24 17:34:28 +01:00
neil
2b01d4a203 Merge pull request #3423 from ghen2/dev
No need to include EC parameters explicitly with the private key.
2021-02-24 21:46:09 +08:00
Kristian Johansson
c5100219d1 Fixes response handling and thereby allow issuing of subdomain certs 2021-02-24 08:53:35 +01:00
Geert Hendrickx
a730a08161 No need to include EC parameters explicitly with the private key.
(they are embedded)
2021-02-23 10:28:17 +01:00
F-Plass
4bb8e3a121 Update truenas.sh
-error handling
2021-02-21 22:48:31 +01:00
F-Plass
eacc00f786 Update truenas.sh
- check if curl exists
- check if wget exist, then errortext and exit scipt
- _get command "restartUI"  wirh info about curl error 52
2021-02-21 22:42:24 +01:00
czeming
17f5e557ed Update dns_dp.sh
没有encode中文字符会导致提交失败
2021-02-20 17:16:33 +08:00
neil
c33e5bc40f Merge pull request #3416 from acmesh-official/dev
sync
2021-02-19 21:33:44 +08:00
neil
06d1a98ad2 Merge pull request #3330 from medmunds/feature/notify-smtp
Implement smtp notify hook
2021-02-19 09:20:24 +08:00
medmunds
afe6f4030e Change default SMTP_SECURE to "tls"
Secure by default. Also try to minimize configuration errors.
(Many ESPs/ISPs require STARTTLS, and most support it.)
2021-02-17 11:39:16 -08:00
medmunds
6e49c4ffe0 Prefer Python to curl when both available 2021-02-17 11:28:50 -08:00
medmunds
28d9f00610 Use email.policy.default in Python 3 implementation
Improves standards compatibility and utf-8 handling
in Python 3.3-3.8. (email.policy.default becomes the
default in Python 3.9.)
2021-02-17 09:57:44 -08:00
medmunds
8f688e5e13 Add Date email header in Python implementation 2021-02-17 09:46:13 -08:00
medmunds
5a182eddbf Clarify _readaccountconf_mutable_default 2021-02-16 14:41:21 -08:00
medmunds
4b615cb3a9 Clean email headers and warn on unsupported address format
Just in case, make sure CR or NL don't end up in
an email header.
2021-02-16 14:02:09 -08:00
medmunds
b36247a091 Implement _rfc2822_date helper 2021-02-16 13:13:26 -08:00
medmunds
6e77756d6a Rework read/save config to not save default values
Add and use _readaccountconf_mutable_default and
_saveaccountconf_mutable_default helpers to capture
common default value handling.

New approach also eliminates need for separate
underscore-prefixed version of each conf var.
2021-02-16 12:49:27 -08:00
medmunds
585c0c3818 Add _clearaccountconf_mutable() 2021-02-16 09:33:39 -08:00
medmunds
6ff75f9a9f Use PROJECT_NAME and VER for X-Mailer header
Also add X-Mailer header to Python version
2021-02-15 12:23:48 -08:00
neilpang
906ef43c00 make the fix for rsa key only 2021-02-15 21:35:59 +08:00
neilpang
4528957235 support openssl 3.0
fix https://github.com/acmesh-official/acme.sh/issues/3399
2021-02-15 21:25:27 +08:00
neil
9d448a42a7 Merge pull request #3409 from eastonman/master
DNSAPI, Huaweicloud DNS: Add error handling
2021-02-15 20:44:09 +08:00
neil
979e10f9d5 Merge pull request #3410 from acmesh-official/dev
sync
2021-02-15 20:03:32 +08:00
Easton Man
31f65b89bb fix: fix freebsd and solaris 2021-02-15 15:19:18 +08:00
Easton Man
86639dbc02 feat: add huaweicloud error handling 2021-02-15 15:18:49 +08:00
Mike Edmunds
bf8c33703c Fix: Unifi deploy hook support Unifi Cloud Key (#3327)
* fix: unifi deploy hook also update Cloud Key nginx certs

When running on a Unifi Cloud Key device, also deploy to
/etc/ssl/private/cloudkey.{crt,key} and reload nginx. This
makes the new cert available for the Cloud Key management
app running via nginx on port 443 (as well as the port 8443
Unifi Controller app the deploy hook already supported).

Fixes #3326

* Improve settings documentation comments

* Improve Cloud Key pre-flight error messaging

* Fix typo

* Add support for UnifiOS (Cloud Key Gen2)

Since UnifiOS does not use the Java keystore (like a Unifi
Controller or Cloud Key Gen1 deploy), this also reworks
the settings validation and error messaging somewhat.

* PR review fixes

* Detect unsupported Cloud Key java keystore location

* Don't try to restart inactive services

(and remove extra spaces from reload command)

* Clean up error messages and internal variables

* Change to _getdeployconf/_savedeployconf

* Switch from cp to cat to preserve file permissions
2021-02-15 15:01:21 +08:00
medmunds
ffe7ef4764 More than one blank line is an abomination, apparently
I will not try to use whitespace to group code visually
2021-02-14 20:06:07 -08:00
medmunds
30dae70e2b Implement curl version of smtp notify-hook 2021-02-14 19:56:23 -08:00
medmunds
557a747d55 Prep for curl or Python; clean up SMTP_* variable usage 2021-02-14 16:42:25 -08:00
medmunds
fe273b3829 Add instructions for reporting bugs 2021-02-14 13:10:30 -08:00
medmunds
2439bb30e8 Only save config if send is successful 2021-02-14 13:10:30 -08:00
medmunds
e48b6bd22d Make shfmt happy
(I'm open to better ways of formatting the heredoc
that embeds the Python script.)
2021-02-14 13:10:30 -08:00
medmunds
1de9ffacb0 Implement smtp notify hook
Support notifications via direct SMTP server connection.
Uses Python (2.7.x or 3.4+) to communicate with SMTP server.
2021-02-14 13:10:30 -08:00
F-Plass
93fd6170a3 Update truenas.sh 2021-02-13 12:38:57 +01:00
jerrm
b7c3e6099c duckdns - fix "integer expression expected" errors (#3397)
* fix "integer expression expected" errors

* duckdns fix

* Update dns_duckdns.sh

* Update dns_duckdns.sh
2021-02-13 18:58:44 +08:00
neilpang
d8163e9835 upgrade freebsd and solaris 2021-02-13 17:27:22 +08:00
neil
12b1916599 Chain (#3408)
* fix https://github.com/acmesh-official/acme.sh/issues/3384
match the issuer to the root CA cert subject

* fix format

* fix https://github.com/acmesh-official/acme.sh/issues/3384

* remove the alt files. https://github.com/acmesh-official/acme.sh/issues/3384
2021-02-13 16:22:31 +08:00
neil
9d8cdb5976 Merge pull request #3401 from gnought/bugfix/preferred_chain_isrg
Updated --preferred-chain to issue ISRG properly
2021-02-12 14:33:02 +08:00
neil
29a7c1938a Merge pull request #3403 from manuelm/dev
dnsapi/pdns: also normalize json response in detecting root zone
2021-02-12 11:03:38 +08:00
manuel
8636d3139e dnsapi/pdns: also normalize json response in detecting root zone 2021-02-11 11:24:21 +01:00
Gnought
987571ce91 Updated --preferred-chain to issue ISRG properly
To support different openssl crl2pkcs7 help cli format
2021-02-11 01:08:08 +08:00
F-Plass
6f4c5fcc87 Update truenas.sh 2021-02-07 21:25:49 +01:00
F-Plass
a7ca010d4e Update truenas.sh 2021-02-07 21:24:06 +01:00
F-Plass
a836842a7e Update truenas.sh 2021-02-07 21:20:56 +01:00
F-Plass
f8c11a324a Update truenas.sh 2021-02-07 19:19:04 +01:00
F-Plass
052c9be111 Update truenas.sh 2021-02-07 19:12:39 +01:00
F-Plass
854e520528 Update truenas.sh 2021-02-07 19:02:03 +01:00
F-Plass
05737b85eb Update truenas.sh 2021-02-07 18:47:04 +01:00
F-Plass
c8a2308739 Update truenas.sh 2021-02-07 18:42:48 +01:00
F-Plass
ed46a078f9 Update truenas.sh 2021-02-07 16:35:51 +01:00
F-Plass
4f7c2bf8c3 Update truenas.sh 2021-02-07 16:12:24 +01:00
F-Plass
0e341726d2 Edits after DoShellcheck 2021-02-06 23:20:52 +01:00
F-Plass
a4f9746d3a Danksagung an danb35 2021-02-06 23:03:07 +01:00
F-Plass
556c546b2e Deploy Scipt for TrueNAs Server
acme .sh deploy Scipt for TrueNAS Server that uses the REST API from TrueNAS.

- Authentification with API Key
- If HTTP redirect is configured, automatik switch to HTTPS
- If WebDAV Certificate is the same as Web UI Certificate, Webdav Certificate get also an updated
- If FTP Certificate is the same as Web UI Certificate, FTP Certificate get also an updated
2021-02-06 22:48:25 +01:00
Alexander Kulumbeg
aa479948f9 Final try, leaving _hmac as before 2021-02-04 19:03:35 +01:00
Alexander Kulumbeg
fa3cee9d58 Update dns_websupport.sh 2021-02-04 18:38:40 +01:00
Alexander Kulumbeg
0021fb8a33 Changing the _hmac auth back
It only works this way, apparently
2021-02-04 17:27:39 +01:00
Alexander Kulumbeg
c8c727e6c6 added hex param to _hmac
but removed "printf "s%" ...
2021-02-04 17:21:33 +01:00
Alexander Kulumbeg
b8494ab3cc Update dns_websupport.sh 2021-02-04 17:15:22 +01:00
Alexander Kulumbeg
2eda03f5de Changing the _hmac call into Neil's suggestion 2021-02-04 15:32:51 +01:00
Alexander Kulumbeg
3a38358946 Trying the original solution
_hmac sha1 "$(printf "%s" "$WS_ApiSecret" | _hex_dump | tr -d " ")" hex)
2021-02-04 15:22:53 +01:00
neil
e7fc697e57 Merge pull request #3338 from fvahid/master
update arvan api script
2021-02-04 22:20:00 +08:00
Alexander Kulumbeg
6c9845b9f3 adding the hex parameter to _hmac call 2021-02-04 15:18:39 +01:00
Alexander Kulumbeg
9e146a8a5a Typo
Forgot a quotation mark on line 161
2021-02-04 15:15:17 +01:00
Alexander Kulumbeg
433d9bfb02 Implementing/testing Neil's suggestions 2021-02-04 15:11:53 +01:00
Alexander Kulumbeg
94917e315e Testing double 2>/dev/null into _utc_date with sed 2021-02-04 11:18:22 +01:00
Alexander Kulumbeg
ced6852735 2>/dev/null/ to 2>/dev/null
Silly mistake with a "/" -.-
2021-02-04 11:15:13 +01:00
Alexander Kulumbeg
8dc55f417d Extra test - adding date -u -d
Adding this to at least partially prevent the virtually nonexistent possibility of timestamp and _utc_date() mismatch. If the normal date -u -d does not get converted (looking at you Solaris!), the poor man's method with manipulating the _utc_date() string output kicks in.
2021-02-04 10:13:36 +01:00
Alexander Kulumbeg
3d338bba3c Fixing the shebang accident 2021-02-04 00:31:46 +01:00
Alexander Kulumbeg
631398f700 sed workaround for "datez" 2021-02-04 00:21:08 +01:00
Alexander Kulumbeg
7984d8cdfb And again 2021-02-01 20:43:22 +01:00
Alexander Kulumbeg
783a6110ef Yet another Solaris test 2021-02-01 20:31:05 +01:00
Alexander Kulumbeg
5d4d53c3a1 Testing datez change for Solaris 2021-02-01 18:37:17 +01:00
Alexander Kulumbeg
3014955ece Fix comments, error msg and time formatting 2021-02-01 18:16:15 +01:00
Alexander Kulumbeg
0481f20c6b "datez" var and comments 2021-02-01 00:30:36 +01:00
Alexander Kulumbeg
76309601eb Update dns_websupport.sh 2021-01-31 22:25:13 +01:00
Alexander Kulumbeg
84dd864886 Simplified approach for the HMAC method 2021-01-31 22:16:00 +01:00
Alexander Kulumbeg
7924e01b15 Added a forgotten ")" 2021-01-31 22:04:53 +01:00
Alexander Kulumbeg
dadc70630b Testing HMAC 2021-01-31 22:02:11 +01:00
Alexander Kulumbeg
effc37a702 Catching up with the current state of things
Catching up with the current state of things
2021-01-30 11:09:39 +01:00
neil
deac3fc918 Merge pull request #3387 from acmesh-official/dev
fix format
2021-01-30 13:42:43 +08:00
neil
e6dea4c92c fix format 2021-01-30 12:05:23 +08:00
neil
075e992fa0 Merge pull request #3386 from acmesh-official/dev
sync
2021-01-30 11:59:28 +08:00
neil
565ca81b30 update readme 2021-01-30 11:44:42 +08:00
neil
58c4eaaf86 fix online install (#3385) 2021-01-30 11:27:18 +08:00
neil
77e8008752 fix docker build (#3383)
* fix dockerhub

* fix

Co-authored-by: neil <win10@neilpang.com>
2021-01-26 22:10:53 +08:00
neil
2ba10fcbc7 Merge pull request #3381 from dgasaway/patch-1
Change ipconfig.co to ifconfig.co
2021-01-26 19:10:23 +08:00
Alexander Kulumbeg
4956a58026 Update dns_websupport.sh 2021-01-25 22:10:27 +01:00
Alexander Kulumbeg
92332fc385 Update dns_websupport.sh 2021-01-25 22:01:41 +01:00
Alexander Kulumbeg
9366f4b40e Test original implementation by trgosk 2021-01-25 21:55:07 +01:00
dgasaway
f49e8ec5ad Change ipconfig.co to ifconfig.co
URL https://ipconfig.co/ip does not currently work, and since https://ifconfig.co/ip is mentioned on the DNS API wiki page, I assume these messages were a typo.
2021-01-25 11:46:52 -08:00
neil
cd33647087 Merge pull request #3378 from mayswind/master
update dnspod.com api
2021-01-22 09:22:41 +08:00
neil
71ebcac7f2 Merge pull request #3377 from lbrocke/dns-api-ionos
Add IONOS API support
2021-01-22 09:21:25 +08:00
Lukas Brocke
f06aee21eb dnsapi/ionos: Change to root zone finding algorithm 2021-01-21 16:10:10 +01:00
MaysWind
5fbbc17376 update dnspod.com api 2021-01-21 22:15:23 +08:00
Lukas Brocke
a9d8830106 dnsapi/ionos: Fixes for Solaris 2021-01-20 21:08:58 +01:00
Lukas Brocke
d21e6235ad dnsapi/ionos: Add support for v2 wildcard certificates 2021-01-20 19:08:35 +01:00
neil
289f79bbb0 fix format 2021-01-16 23:50:57 +08:00
neil
768e9f4c09 Merge pull request #3365 from pssara/hotfix/dns_ispconfig.sh-3239-2696
Fixed issue 3239 and 2696 with ISP config
2021-01-16 23:36:59 +08:00
neil
62c776d90c Merge pull request #3343 from markchalloner/master
Add Peplink deploy hook
2021-01-16 13:26:43 +08:00
pssara
464022bea2 Fixed issue with ISP config where the Client ID was asumed to be the same as the SYS User ID 2021-01-15 15:12:53 +01:00
Mark Challoner
61549b4a74 Add Peplink deploy hook 2021-01-13 20:37:05 +00:00
neil
18df3dc07a Merge pull request #3333 from mjbnz/patch-1
Add Telegram notify hook
2021-01-12 09:32:07 +08:00
neil
3725724c54 Merge pull request #3352 from senjoo/master
Added RackCorp API Integration
2021-01-11 22:00:45 +08:00
Stephen Dendtler
500a005aac _get_root now does not skip the first label of the domain 2021-01-11 13:03:42 +00:00
Mike Beattie
584cc6de2e Avoid usage of sed -e 2021-01-11 11:27:39 +13:00
Mike Beattie
2e5a6e21cf Correct shebang 2021-01-11 11:21:46 +13:00
Stephen Dendtler
b79f63db78 Added RackCorp API Integration 2021-01-10 11:19:16 +00:00
tyahin
7ed7a57d92 deploy gcore_cdn fix syntax 2021-01-10 12:44:56 +03:00
tyahin
1eaf7c89b7 deploy gcore_cdn fix api 2021-01-10 12:39:20 +03:00
tyahin
1fff8dd306 deploy gcore_cdn fix auth 2021-01-10 12:39:12 +03:00
neil
c3a3d02bea fix https://github.com/acmesh-official/acme.sh/issues/3156 2021-01-10 11:48:12 +08:00
neil
a9261970dd Merge pull request #3347 from JamesTheAwesomeDude/master
Update README to reflect the fact that this is a general-purpose ACME client
2021-01-10 11:06:44 +08:00
neil
b7a3fe05a4 Merge pull request #3349 from acmesh-official/dev
sync
2021-01-10 10:48:51 +08:00
James Edington
ab6b9006b7 This is a general-purpose ACME client. We should be proud of this. 2021-01-08 11:14:39 -07:00
Vahid Fardi
d9a8b057c3 change name actor 2021-01-05 21:31:31 +03:30
Vahid Fardi
2ec6215b1c change Author name 2021-01-05 17:10:41 +03:30
Vahid Fardi
c59a8c9644 change arvan api script 2021-01-05 15:29:08 +03:30
Mike Beattie
10de4b6b7b Add Telegram notification script
Requires:
- API Token for a bot created with the Telegram Bot Father.
- A Chat ID for a user/group that the bot has permission to post to.
2021-01-04 18:41:02 +13:00
neil
0be214e79e Merge pull request #3307 from jimp100/patch-1
Corrected regex for duckdns subdomains
2021-01-02 22:29:54 +08:00
neil
d6083c68fd add libidn 2020-12-28 21:10:22 +08:00
Lukas Brocke
22f7ac22d5 dnsapi/ionos: Run shfmt 2020-12-24 13:40:03 +01:00
Lukas Brocke
a00046f9b2 dnsapi/ionos: Add API support for IONOS DNS API
The IONOS DNS API is in beta state, please read [1] on how to get
started.

PLEASE NOTE: The v2 wildcard certification creation [2] is not yet
supported as the IONOS API doesn't allow the creation of multiple TXT
records with the same domain name.

[1] https://beta.developer.hosting.ionos.de/docs/getstarted
[2] https://github.com/acmesh-official/acme.sh/issues/1261
2020-12-24 12:47:28 +01:00
neil
8a24275ba9 add dns check wiki 2020-12-23 20:45:43 +08:00
neil
ca841252bd Merge pull request #3313 from NerLOR/master
World4You Bugfix unable to parse paketnr
2020-12-22 22:47:01 +08:00
neil
54195b16ad Merge pull request #3299 from tresni/synology_dsm
Add DSM7 support to synology_dsm deployhook
2020-12-22 22:45:22 +08:00
Lorenz Stechauner
cb90167c76 World4You shellcheck 2020-12-21 09:41:05 +01:00
Lorenz Stechauner
ac4ae85a4a World4You code refactor 2020-12-21 09:39:09 +01:00
Lorenz Stechauner
48b2a271cc World4You Bugfix unable to parse paketnr 2020-12-20 20:17:05 +01:00
neil
596807055e Merge pull request #3289 from vanonox/addScaleway
Add scaleway provider
2020-12-17 22:16:22 +08:00
jimp100
cee20c4eb9 Corrected regex for subdomains
A fix to handle subdomains of a duckdns domain.  I.e.  subdomain.mydomain.duckdns.org
Handles n number of subdomains
2020-12-16 10:11:43 +00:00
neil
15fb47cb3d fix https://github.com/acmesh-official/acme.sh/issues/3300 2020-12-10 20:22:14 +08:00
Brian Hartvigsen
2635dfef96 Shellcheck linting
Also removed unused code
2020-12-09 21:01:44 -07:00
Brian Hartvigsen
7d7789ae96 Support DSM 6 and 7
Small changes for DSM 6:

All fields (except enable_syno_token as explained below) must either be in the GET params or the POST params, you can't mix GET and POST params
enable_syno_token=yes must be in both the GET and POST params.
If enable_syno_token=yes is only in the POST fields, then DSM6 returns a synotoken of --------. If enable_syno_token=yes is only in the GET params, then it returns no synotoken at all. It must be in both to work.
Need to use /webapi/auth.cgi instead of /webapi/entry.cgi
Verified with DSM 6.2.3-25426 Update 2 and DSM 7.0-40850
2020-12-09 20:35:50 -07:00
Thijn
cc69285420 Fix synology_dsm deployhook for DSM 7 2020-12-09 19:47:31 -07:00
Brian Hartvigsen
99d3a283ef Use POST for login
This allows us to get the cookie and the token (as it appears to be only in the body in DSM 7.)  HTTP_HEADERS is only guarenteed to be output with POST for both wget and curl.
2020-12-09 19:44:14 -07:00
Van Hau TRAN
9b532584d6 fix: fix delete txt record and error mngtt 2020-12-08 16:32:31 +01:00
neil
7576eb38d9 Merge pull request #3287 from nate1010smith/dev
Correct sed regex
2020-12-08 17:43:10 +08:00
neil
8440d013f8 fix 2020-12-07 22:01:30 +08:00
neil
174c87a192 fix 2020-12-07 21:42:31 +08:00
neil
32b62d6d4f fix 2020-12-07 21:41:08 +08:00
neil
a0c2d312e9 start 2.8.9 2020-12-07 21:31:02 +08:00
Van Hau TRAN
5127a9ae3c fix: shell if 2020-12-06 23:20:41 +01:00
Van Hau TRAN
b5653a1c06 feat: add comment and configure workflow ci test 2020-12-06 23:14:25 +01:00
Van Hau TRAN
671bd1022e feat: add scaleway provider 2020-12-06 22:59:36 +01:00
Nate
94bba4ac9c Correct sed regex
Corrects issue #3285.

The '?' character after a group is not supported in POSIX Basic Regular Expressions. Replacing it with '\{0,1\}' retains the same functionality and also works on non-GNU systems.
2020-12-06 22:45:42 +07:00
neil
fe1136aa95 Merge pull request #3280 from christianbur/patch-7
Update mailcow.sh
2020-12-02 11:55:07 +08:00
neil
8950ffcc5e Merge pull request #3256 from jakelamotta/dev
Adds DNS-API support for Simply.com
2020-12-02 11:00:08 +08:00
Christian Burmeister
2bc627970e Update mailcow.sh
I have modified the following things:

    Originally, "/data/assets/ssl/" is always appended to the varialbe ${_mailcow_path}. Since I use acme.sh as docker container, I only want to include the mailcow-ssl directory in the acem.sh container and not the complete mailcow directory. So now it is checked if the file generate_config.sh is in the directory (then it is the mailcow root directory, see https://github.com/mailcow/mailcow-dockerized) and only then "/data/assets/ssl/" is appended, in all other cases the passed variable is taken over unchanged.

    Because of the RP mailcow/mailcow-dockerized#2443 I have extended the script with ECC certificates.

    I adapted the reboot commands as described in the mailcow manual (https://mailcow.github.io/mailcow-dockerized-docs/firststeps-ssl/#how-to-use-your-own-certificate).
2020-12-01 20:30:56 +01:00
neil
44615c6fa2 Merge pull request #3279 from acmesh-official/dev
sync
2020-12-01 21:43:06 +08:00
neil
00f55ea0bc Merge pull request #3261 from NerLOR/master
Added World4You DNS API
2020-12-01 09:43:14 +08:00
Lorenz Stechauner
be43cebf7d World4You Mac fix 2020-11-30 20:01:43 +01:00
Lorenz Stechauner
f38317d01f World4You Mac debug 2020-11-30 19:56:48 +01:00
Lorenz Stechauner
da839aae66 World4You check response message 2020-11-30 17:57:25 +01:00
jakelamotta
768e00ff1a Merge remote-tracking branch 'upstream/dev' into dev 2020-11-30 11:31:43 +01:00
Lorenz Stechauner
40631f465e World4You updated info strings 2020-11-29 15:22:41 +01:00
Lorenz Stechauner
f665c73bb1 World4You fixed return value 2020-11-29 15:03:54 +01:00
neil
be067466fe Merge pull request #3132 from jpbede/deploy-cleverreach
Add CleverReach Deploy API
2020-11-29 21:47:05 +08:00
Lorenz Stechauner
3c309df6dd World4You shellcheck cleaning 2020-11-29 14:42:55 +01:00
Lorenz Stechauner
b7e6d98647 World4You grep fix 2020-11-29 14:38:04 +01:00
Lorenz Stechauner
48942de75e World4You cleaning 2020-11-29 13:59:33 +01:00
Lorenz Stechauner
fbcbc10174 World4You Shellcheck 2020-11-29 12:03:51 +01:00
Lorenz Stechauner
342b48105f World4You fix for no redirects 2020-11-29 12:02:05 +01:00
Lorenz Stechauner
5f3e7f02cc World4You _head_n fix 2020-11-29 11:55:49 +01:00
Lorenz Stechauner
bfccf29ccf World4You redirect fix 2020-11-29 11:55:22 +01:00
Lorenz Stechauner
1e3bb1f02b World4You head_n 2020-11-29 11:51:59 +01:00
Lorenz Stechauner
0dcf6771e7 World4you grammar 2020-11-29 11:51:16 +01:00
Lorenz Stechauner
062503c523 Merge branch 'master' of github.com:NerLOR/acme.sh 2020-11-29 11:48:33 +01:00
Lorenz Stechauner
c3d7f2f170 World4You removed _ggrep 2020-11-29 11:48:08 +01:00
Lorenz Stechauner
faf6c16717 World4You success on 302 instead of 302 or 200 2020-11-29 11:48:08 +01:00
Lorenz Stechauner
3d79d78134 World4You using /dev/null instead of grep -q 2020-11-29 11:48:08 +01:00
Lorenz Stechauner
35cab4ee73 World4You using _egrep_o instead of grep -E 2020-11-29 11:48:08 +01:00
Lorenz Stechauner
a0edb8f2ad World4You using ggrep more often 2020-11-29 11:48:08 +01:00
Lorenz Stechauner
5cfe5e312b World4You dns root parsing 2020-11-29 11:48:08 +01:00
Lorenz Stechauner
13f6ec04d5 World4You Bugfix 2 2020-11-29 11:48:08 +01:00
Lorenz Stechauner
2edc4a79b9 World4You Bugfix 2020-11-29 11:48:08 +01:00
Lorenz Stechauner
4661185719 World4You grep -q 2020-11-29 11:48:08 +01:00
Lorenz Stechauner
895da5cbf0 World4You Shellcheck 2020-11-29 11:48:08 +01:00
Lorenz Stechauner
ef9147512b World4You posix shell 2020-11-29 11:48:08 +01:00
Lorenz Stechauner
abe05456f7 World4You domain root fix 2020-11-29 11:48:08 +01:00
Lorenz Stechauner
f9dfd3b348 World4You shellcheck 2020-11-29 11:48:08 +01:00
Lorenz Stechauner
9449501537 World4You using ggrep in solaris 2020-11-29 11:48:08 +01:00
Lorenz Stechauner
f3b5d5ab7b World4You using _egrep_o 2020-11-29 11:46:24 +01:00
Lorenz Stechauner
8ee5726e0c Added World4You DNS API 2020-11-29 11:46:24 +01:00
neil
effa7fd57d add ACME_HTTP_NO_REDIRECTS and _resethttp to make http requests not follow redirects 2020-11-29 18:39:11 +08:00
Lorenz Stechauner
6c039d2ad0 World4You removed _ggrep 2020-11-29 10:43:25 +01:00
Lorenz Stechauner
2dd8527566 World4You success on 302 instead of 302 or 200 2020-11-29 10:33:46 +01:00
neil
fe811ce32e Merge pull request #3253 from tsoybe/master
fix: wrong ttl  issue#2925
2020-11-29 17:23:15 +08:00
Lorenz Stechauner
9fee0805c4 World4You using /dev/null instead of grep -q 2020-11-29 09:40:35 +01:00
Lorenz Stechauner
1987c32761 World4You using _egrep_o instead of grep -E 2020-11-29 09:34:52 +01:00
Lorenz Stechauner
0ed2659698 World4You using ggrep more often 2020-11-28 17:27:50 +01:00
neil
9878856dfe Merge pull request #3274 from moritz-h/fritzbox-uconv
uconv as fallback for iconv in fritzbox deploy
2020-11-28 23:11:31 +08:00
Moritz H
ed01fd4edf uconv as fallback for iconv 2020-11-28 15:22:14 +01:00
Lorenz Stechauner
9474933070 World4You dns root parsing 2020-11-28 08:50:47 +01:00
Lorenz Stechauner
f3987b453c World4You Bugfix 2 2020-11-27 22:29:31 +01:00
Lorenz Stechauner
dcb4cb3a1e World4You Bugfix 2020-11-27 22:28:25 +01:00
Lorenz Stechauner
198b840059 World4You grep -q 2020-11-27 22:27:10 +01:00
Lorenz Stechauner
42583cf3bb World4You Shellcheck 2020-11-27 22:25:29 +01:00
Lorenz Stechauner
2e15371d61 World4You posix shell 2020-11-27 22:22:50 +01:00
Lorenz Stechauner
339ff8ca77 World4You domain root fix 2020-11-27 22:12:11 +01:00
Lorenz Stechauner
268eaddad8 World4You shellcheck 2020-11-27 19:35:53 +01:00
Lorenz Stechauner
bb3cc1130b World4You using ggrep in solaris 2020-11-27 19:34:16 +01:00
Lorenz Stechauner
64ae3280e1 Merge branch 'master' of github.com:NerLOR/acme.sh 2020-11-27 17:09:49 +01:00
Lorenz Stechauner
95235d69c2 World4You using _egrep_o 2020-11-27 17:09:31 +01:00
Lorenz Stechauner
d639c7be39 Added World4You DNS API 2020-11-27 17:09:31 +01:00
Lorenz Stechauner
d7cafe25ff World4You using _egrep_o 2020-11-26 13:59:18 +01:00
neilpang
996f53373e fix https://github.com/acmesh-official/acme.sh/issues/3250 2020-11-25 18:07:54 +08:00
neil
6f55370ad4 Merge pull request #3262 from eastonman/master
feat: Add huaweicloud intl dnsapi
2020-11-25 09:57:26 +08:00
Easton Man
fd511966a7 fix: revert adding tr to replace sed 2020-11-24 12:58:16 +08:00
Easton Man
c4ddddd434 refactor: remove dirty debug code
- add tr to replace sed for robusty
- add comments
2020-11-24 10:05:34 +08:00
Easton Man
83a4db3b31 fix: remove sed before grep, but lead to less robusty 2020-11-23 23:46:06 +08:00
Easton Man
e35ef75949 fix: fix solaris sed and grep issue 2020-11-23 22:18:57 +08:00
jakelamotta
d9dec6fe6b Merge branch 'dev' of https://github.com/jakelamotta/acme.sh into dev 2020-11-23 12:53:48 +01:00
jakelamotta
69bdbaed41 Fix comment 2020-11-23 12:53:06 +01:00
jakelamotta
30f359e642 Fix code style problems 2020-11-23 12:53:06 +01:00
jakelamotta
29d0a1714e Fix code style problems 2020-11-23 12:53:06 +01:00
jakelamotta
fcb97f802f Removes tabs and trailing spaces 2020-11-23 12:53:06 +01:00
jakelamotta
9ad05e640d Removed spaces on empty lines 2020-11-23 12:53:06 +01:00
jakelamotta
449f00f960 Add double quotes to variables 2020-11-23 12:53:06 +01:00
jakelamotta
8e64329d05 Fix CI-errors 2020-11-23 12:53:06 +01:00
jakelamotta
4284777556 Fix indentation and added some debug messages 2020-11-23 12:53:06 +01:00
jakelamotta
81c496d96c Fix comments 2020-11-23 12:53:06 +01:00
jakelamotta
65c06da275 Adds dnsapi support for Simply.com 2020-11-23 12:53:06 +01:00
Easton Man
5d0657c49a fix: fix adding record before removing 2020-11-23 14:57:33 +08:00
Easton Man
f6f6550bfb feat: add very tricky method to adapt to non-intuitive huaweicloud api 2020-11-23 14:25:48 +08:00
Easton Man
e01fb50359 feat: add env var check 2020-11-23 00:32:50 +08:00
Easton Man
28ce1c1249 fix: fix wrong debug output 2020-11-23 00:20:57 +08:00
Easton Man
7db592d27a fix: fix failing ci test 2020-11-23 00:20:57 +08:00
Easton Man
b8e5c0d898 feat: Add huaweicloud intl dnsapi 2020-11-23 00:20:57 +08:00
neil
067c1771d0 Merge pull request #3263 from acmesh-official/dev
sync
2020-11-22 23:20:30 +08:00
neil
349429b76e fix solaris badge 2020-11-22 21:55:55 +08:00
neil
cc8f2afce9 fix for Solaris, and add Solaris to Github actions 2020-11-22 21:41:22 +08:00
Lorenz Stechauner
2e97b20f94 Added World4You DNS API 2020-11-22 11:35:24 +01:00
neil
1a163243ec fix https://github.com/acmesh-official/acme.sh/issues/3259 2020-11-22 12:19:52 +08:00
neil
75660e6f21 Merge pull request #3258 from acmesh-official/dev
sync
2020-11-19 21:39:39 +08:00
neil
199ca77c2a fix for PebbleStrict mode test. 2020-11-19 20:14:28 +08:00
jakelamotta
1e2d2abbdf Fix comment 2020-11-18 18:01:02 +01:00
neil
11b980f574 fix set-env 2020-11-18 23:16:36 +08:00
jakelamotta
3274f9f155 Fix code style problems 2020-11-18 15:55:02 +01:00
jakelamotta
f90f8824bb Fix code style problems 2020-11-18 15:52:46 +01:00
jakelamotta
c7116d40ca Removes tabs and trailing spaces 2020-11-18 15:46:16 +01:00
jakelamotta
6ef66399f8 Removed spaces on empty lines 2020-11-18 15:37:26 +01:00
neil
2b8561f27d fix set-env 2020-11-18 22:23:36 +08:00
jakelamotta
b20d8f195b Add double quotes to variables 2020-11-18 15:12:22 +01:00
jakelamotta
6cf0eb9e1d Fix CI-errors 2020-11-18 14:52:32 +01:00
neil
c349e9aabe fix set-env 2020-11-18 21:19:10 +08:00
neil
6ee38ceaba fix https://github.com/acmesh-official/acme.sh/issues/3252 2020-11-17 22:52:05 +08:00
jakelamotta
c60613fbcb Fix indentation and added some debug messages 2020-11-17 14:20:45 +01:00
jakelamotta
bcc1b7b48a Fix comments 2020-11-17 13:49:32 +01:00
jakelamotta
b19cb0805c Adds dnsapi support for Simply.com 2020-11-17 13:19:55 +01:00
tsoybe
7dfc5a78ba Update dns_desec.sh
Deletion to
2020-11-12 22:09:31 +01:00
tsoybe
a077132d82 Update dns_desec.sh
ttl must be greater than or equal 3600, see https://desec.readthedocs.io/en/latest/dns/domains.html#domain-object
2020-11-12 22:04:05 +01:00
neil
8ed6be6307 Merge pull request #3220 from edglynes/dev
Akamai EdgeDNS Support
2020-11-11 11:55:32 +08:00
Ed Lynes
c490dd1563 add quotes to resolve shell check failure 2020-11-09 10:36:12 -05:00
Ed Lynes
d866b3df1f convert key to hex before calling _hmac 2020-11-09 10:16:57 -05:00
Ed Lynes
97f3fb4496 Merge branch 'dev' of https://github.com/acmesh-official/acme.sh into dev 2020-11-09 09:17:33 -05:00
neil
7530266330 remove dependency to md5 and awk 2020-11-09 20:14:22 +08:00
neil
6a53f356d2 Merge pull request #3246 from MaxPeal/MaxPeal-patch-ppc64le-s390x
add linux/ppc64le and linux/s390x
2020-11-05 09:30:15 +08:00
MaxPeal
075dc1e4e9 add linux/ppc64le and linux/s390x 2020-11-05 01:25:07 +01:00
neil
97b87d4ce4 Merge pull request #3111 from pashinin/master
Vault deploy hook (using curl)
2020-11-02 22:37:43 +08:00
Sergey Pashinin
e203e98375 Use _savedeployconf 2020-11-02 16:46:09 +03:00
Sergey Pashinin
9fcd104065 Use _getdeployconf for env vars 2020-11-02 13:35:12 +03:00
neil
178e0ba87c Merge pull request #3237 from ma331/patch-1
Anexia CloudDNS Support
2020-11-02 11:58:40 +08:00
Ed Lynes
cc40110d7e refactored sig timestamp generation 2020-10-30 13:12:45 -04:00
ma331
d58fb2bbc0 Speedup for _get_root function 2020-10-30 14:13:32 +01:00
ma331
812333e9ae Changed comment once more 2020-10-29 14:01:08 +01:00
ma331
92bbdce435 changed comment 2020-10-29 13:35:53 +01:00
ma331
bc62d49fc9 removed empty line to make shfmt happy 2020-10-29 13:04:29 +01:00
ma331
fe54d5b8ae fixed spacing in two lines 2020-10-29 12:51:49 +01:00
ma331
7cc30c268b Script to use with Anexia CloudDNS 2020-10-29 11:14:44 +01:00
Ed Lynes
df60a2248a fix typo 2020-10-28 15:20:24 -04:00
Ed Lynes
aa85d0ffeb trigger commit 2020-10-28 09:05:14 -04:00
Jan-Philipp Benecke
1db963361c Rework based on review from Neilpang 2020-10-28 13:50:40 +01:00
Ed Lynes
8a55b20284 Merge branch 'dev' of https://github.com/edglynes/acme.sh into dev 2020-10-27 14:01:52 -04:00
Ed Lynes
beec349bc5 Merge branch 'dev' of https://github.com/acmesh-official/acme.sh into dev 2020-10-27 13:40:18 -04:00
neil
b025ed6057 Update LetsEncrypt.yml 2020-10-27 13:39:11 -04:00
Adrian Fedoreanu
27a54bcbaa fix dnsapi/dns_1984hosting 2020-10-27 13:39:11 -04:00
Ed Lynes
6b20993d2a fix format 2020-10-27 13:39:11 -04:00
Ed Lynes
9ab16bdbb3 use _digest instead of openssl 2020-10-27 13:39:11 -04:00
neil
23088bc897 Update LetsEncrypt.yml 2020-10-27 13:39:11 -04:00
neil
054a62de60 Update DNS.yml 2020-10-27 13:39:10 -04:00
Ed Lynes
5aff548794 remove uuidgen 2020-10-27 13:39:10 -04:00
Rene Luria
ff8fe7e018 Revert "Fix DNS workflow use variables TEST_DNS_SLEEP and TEST_DNS_NO_WILDCARD"
This reverts commit f864416e39.
2020-10-27 13:39:10 -04:00
Rene Luria
c6617ebc9f Fix DNS workflow use variables TEST_DNS_SLEEP and TEST_DNS_NO_WILDCARD 2020-10-27 13:39:10 -04:00
Rene Luria
15fa0c264f dnsapi/dns_infomaniak.sh: Replace grep by _contains 2020-10-27 13:39:10 -04:00
Rene Luria
25468f55ff Added dnsapi/dns_infomaniak.sh 2020-10-27 13:39:10 -04:00
neil
2340c55d76 update freebsd 2020-10-27 13:39:10 -04:00
neil
13c1f4ab19 update badge 2020-10-27 13:39:10 -04:00
neil
a160b798ca update badge 2020-10-27 13:39:10 -04:00
neil
71f00a9efd minor 2020-10-27 13:39:10 -04:00
neil
967096f01c update freebsd-vm 2020-10-27 13:39:10 -04:00
neil
7616e94fd3 fix message 2020-10-27 13:39:10 -04:00
neil
27ec69fb97 add FreeBSD 2020-10-27 13:39:10 -04:00
neil
182d150eaa add curl to freebsd 2020-10-27 13:39:10 -04:00
neil
098ef976f7 add freebsd 2020-10-27 13:39:10 -04:00
neil
ea724e343b enable for any branches. 2020-10-27 13:39:09 -04:00
neil
85736d697c fix debug info 2020-10-27 13:39:09 -04:00
neil
576a146ed2 add debug info for duckdns 2020-10-27 13:39:09 -04:00
neil
69c5291e52 fix for Windows 2020-10-27 13:39:09 -04:00
neil
4875ef045a support more dns tokens 2020-10-27 13:39:09 -04:00
neil
369cfc2413 use testall target 2020-10-27 13:39:09 -04:00
neil
491842ea34 fix https://github.com/acmesh-official/acme.sh/issues/3159 2020-10-27 13:39:09 -04:00
Ed Lynes
9801876a2f shfmt fixes 2020-10-27 13:39:09 -04:00
Ed Lynes
9c28a04c65 add alt nonce generation logic 2020-10-27 13:39:09 -04:00
Ed Lynes
596a1764ef vetted by shfmt 2020-10-27 13:39:09 -04:00
Ed Lynes
8e09e1b248 debugging and cleanup 2020-10-27 13:39:09 -04:00
Ed Lynes
d5674c85d7 initial commit 2020-10-27 13:39:09 -04:00
Ed Lynes
ed6649b1d3 Merge branch 'dev' of https://github.com/acmesh-official/acme.sh into dev 2020-10-26 10:12:58 -04:00
neil
02baa778c5 Merge pull request #3232 from acmesh-official/dev
sync
2020-10-26 14:35:05 +08:00
neil
5fd0e5add2 Update DNS.yml 2020-10-21 15:07:25 +08:00
neil
23eccb2f20 Update LetsEncrypt.yml 2020-10-21 15:00:33 +08:00
neil
3c523fb824 Merge pull request #3227 from phedoreanu/dns_1984hosting
fix dnsapi/dns_1984hosting
2020-10-20 17:42:26 +08:00
Adrian Fedoreanu
5dbfc2786d fix dnsapi/dns_1984hosting 2020-10-19 22:29:16 +02:00
Ed Lynes
c61495df52 fix format 2020-10-16 10:32:01 -04:00
Ed Lynes
6ad5ea1696 use _digest instead of openssl 2020-10-16 10:16:25 -04:00
neil
39fa27a2dc Merge pull request #3221 from acmesh-official/dev
sync
2020-10-16 19:10:08 +08:00
neil
348bae53fe Update LetsEncrypt.yml 2020-10-16 18:47:27 +08:00
neil
6bc00fc5e5 Update DNS.yml 2020-10-16 18:47:02 +08:00
Ed Lynes
54c0f015f9 Merge branch 'edgedns' into dev 2020-10-14 14:50:52 -04:00
Ed Lynes
ea3e6dae93 remove uuidgen 2020-10-14 14:49:09 -04:00
Ed Lynes
80e52c73b0 Merge branch 'edgedns' into dev 2020-10-14 13:41:51 -04:00
neil
5c893f0f39 Merge pull request #3191 from Infomaniak/dev
Added dnsapi/dns_infomaniak.sh
2020-10-12 09:16:49 +08:00
Rene Luria
e05dc99006 Revert "Fix DNS workflow use variables TEST_DNS_SLEEP and TEST_DNS_NO_WILDCARD"
This reverts commit f864416e39.
2020-10-10 18:20:26 +02:00
Rene Luria
f864416e39 Fix DNS workflow use variables TEST_DNS_SLEEP and TEST_DNS_NO_WILDCARD 2020-10-10 18:19:29 +02:00
Rene Luria
472dbd641c dnsapi/dns_infomaniak.sh: Replace grep by _contains 2020-10-10 18:19:29 +02:00
Rene Luria
05141b4f52 Added dnsapi/dns_infomaniak.sh 2020-10-10 18:19:29 +02:00
neil
784b914e07 update freebsd 2020-10-09 22:33:21 +08:00
neil
4db7f6f59c update badge 2020-10-02 17:17:31 +08:00
neil
edbf8509e1 Merge branch 'dev' of https://github.com/acmesh-official/acme.sh into dev 2020-10-02 17:11:26 +08:00
neil
a017fbadd3 update badge 2020-10-02 17:11:04 +08:00
neil
201f4b7e4a Merge pull request #3203 from neilpangtest/dev
Dev
2020-10-02 17:04:29 +08:00
neil
c9ff536e24 minor 2020-10-02 16:20:27 +08:00
neil
238efb02c6 update freebsd-vm 2020-10-02 16:17:16 +08:00
Jan-Philipp Benecke
f7e12b629f Update CleverReach REST Endpoint 2020-10-01 11:26:29 +02:00
Ed Lynes
7cbca7fc1e Merge branch 'dev' into edgedns 2020-09-28 14:14:58 -04:00
neil
be7b87cda3 fix message 2020-09-28 21:50:20 +08:00
neil
07979a13fb add FreeBSD 2020-09-24 22:57:26 +08:00
neil
9073c4554f add curl to freebsd 2020-09-24 22:18:38 +08:00
neil
8694e0ad19 add freebsd 2020-09-24 21:37:51 +08:00
neil
60fe987a5f enable for any branches. 2020-09-21 19:57:10 +08:00
Ed Lynes
86256162de Merge branch 'dev' into edgedns 2020-09-18 08:43:41 -04:00
neil
db24ca3dc1 fix debug info 2020-09-14 22:29:23 +08:00
neil
5e3aa2db1d add debug info for duckdns 2020-09-14 22:22:36 +08:00
neil
b74a501fac fix for Windows 2020-09-14 21:51:21 +08:00
neil
490a7d4a78 support more dns tokens 2020-09-13 00:16:04 +08:00
neil
b147195189 use testall target 2020-09-12 14:22:18 +08:00
neil
b561666d80 fix https://github.com/acmesh-official/acme.sh/issues/3159 2020-09-12 08:47:46 +08:00
Ed Lynes
a0b5305e3e Merge branch 'dev' into edgedns 2020-09-11 12:47:16 -04:00
neil
e7a6c17260 fix dns check 2020-09-11 23:35:27 +08:00
neil
c8ee9e6447 add dns api check 2020-09-11 23:11:26 +08:00
neil
f2d350002e Merge pull request #3164 from acmesh-official/dev
sync
2020-09-11 09:24:35 +08:00
neil
fabd26f85b check token first 2020-09-08 22:44:43 +08:00
neil
17dcf7d2e5 Merge pull request #2973 from StefanAbl/master
Update dynv6 dns api to allow custom domains
2020-09-07 15:40:17 +08:00
neil
6f62995c96 remove ZeroSSL test 2020-09-06 12:29:23 +08:00
neil
f405f4bbc4 fix zerossl 2020-09-06 12:22:09 +08:00
neil
98124de362 add email for zerossl 2020-09-06 11:31:22 +08:00
neil
1e4ea90021 add zerossl test 2020-09-06 11:26:53 +08:00
neil
053f4a9a2e Merge pull request #3154 from acmesh-official/dev
sync
2020-09-05 20:33:12 +08:00
neilpang
2c7d2230b3 minor 2020-09-04 18:25:00 +08:00
neil
040e0d8387 Merge pull request #3146 from ym/dev
fix misaka.io api: breaking changes introduced by apiv1
2020-09-03 21:50:09 +08:00
Siyuan Miao
b5c382f929 fix misaka.io api: breaking changes introduced by apiv1 2020-09-03 21:46:54 +08:00
neilpang
0c9c1ae673 fix https://github.com/acmesh-official/acme.sh/issues/3140 2020-09-02 18:22:39 +08:00
neil
da0e0bdaec Merge pull request #3141 from acmesh-official/dev
sync
2020-09-01 22:39:33 +08:00
neil
1f5b6a6a35 fix filter to *.yml 2020-09-01 21:39:44 +08:00
neil
d25b2890be split shellcheck 2020-09-01 21:34:44 +08:00
neil
d73438a397 update comments 2020-09-01 21:30:56 +08:00
Ed Lynes
e91538a554 Merge branch 'dev' into edgedns 2020-08-31 13:48:04 -04:00
Ed Lynes
8a3b514372 Merge branch 'master' into edgedns 2020-08-31 13:27:01 -04:00
StefanAbl
7eca955b79 merge second rebase against upstream/master 2020-08-31 09:25:42 +02:00
StefanAbl
4242354c03 fix shfmt error 2020-08-31 09:20:10 +02:00
StefanAbl
8728389c88 formatting 2020-08-31 09:20:10 +02:00
StefanAbl
6651801b3f formatting 2020-08-31 09:17:56 +02:00
StefanAbl
9190ce3701 no supporting HTTP API as well 2020-08-31 09:17:13 +02:00
StefanAbl
90e2064d72 first attempt to make travis happy 2020-08-31 09:16:55 +02:00
StefanAbl
943d419f98 Added support for custom domains 2020-08-31 09:14:47 +02:00
StefanAbl
551316bcb6 formatting 2020-08-31 09:09:10 +02:00
StefanAbl
9dd5089940 formatting 2020-08-31 09:09:10 +02:00
StefanAbl
06e7ebbdeb no supporting HTTP API as well 2020-08-31 09:09:10 +02:00
StefanAbl
a83b16e12a first attempt to make travis happy 2020-08-31 09:09:10 +02:00
StefanAbl
91a8b97cf4 Added support for custom domains 2020-08-31 09:09:10 +02:00
neil
41754c92c3 --preserve-env 2020-08-30 23:26:10 +08:00
neil
e544995b83 Merge pull request #3133 from acmesh-official/dev
Sync
2020-08-29 23:39:43 +08:00
neil
45cf5c4c0f trigger build 2020-08-29 23:23:07 +08:00
neil
900eedfc2e fix checktoken 2020-08-29 23:19:21 +08:00
neil
faaa7bfa3a check token before run 2020-08-29 23:14:18 +08:00
neil
70366a98bd fix if 2020-08-29 14:33:33 +08:00
neil
e88180b4d5 fix if 2020-08-29 14:19:17 +08:00
neil
b639683ac1 don't run if "${{ secrets.NGROK_TOKEN }}" is not set. 2020-08-29 14:11:11 +08:00
neil
918c8f9295 filer events 2020-08-29 13:14:28 +08:00
neil
c2214cd4b5 minor 2020-08-29 13:06:58 +08:00
neil
7d7e5bac12 add comments 2020-08-29 09:54:02 +08:00
StefanAbl
185b558561 fix shfmt error 2020-08-28 19:46:45 +02:00
neil
4632035581 no need to run for PR from dev to master 2020-08-29 01:32:10 +08:00
StefanAbl
d7f81dff23 merged rebase into master 2020-08-28 19:32:01 +02:00
StefanAbl
c849738c6f formatting 2020-08-28 19:20:16 +02:00
StefanAbl
3cd7a2e6d6 formatting 2020-08-28 19:20:16 +02:00
StefanAbl
0d4904f05d no supporting HTTP API as well 2020-08-28 19:19:43 +02:00
StefanAbl
0b539a5977 first attempt to make travis happy 2020-08-28 19:18:42 +02:00
StefanAbl
395fdc9d61 Added support for custom domains 2020-08-28 19:18:18 +02:00
neil
3b3d7eff3c remove \r 2020-08-29 00:35:33 +08:00
neil
763c05313b 80 port of github windows server is already used. 2020-08-28 23:54:39 +08:00
neil
9f80df3fcb add unzip 2020-08-28 23:31:18 +08:00
neil
f170ee9e59 add Windows 2020-08-28 23:18:05 +08:00
Ed Lynes
339218508d shfmt fixes 2020-08-28 09:55:20 -04:00
neil
f0c710b245 Update LetsEncrypt.yml 2020-08-28 20:11:39 +08:00
neil
e66337a1db fix badge 2020-08-28 20:11:39 +08:00
neil
e087bccd33 remove travis 2020-08-28 20:11:39 +08:00
neil
8017774bf3 add token 2020-08-28 20:11:38 +08:00
neil
5f4d08ada5 fix name 2020-08-28 20:11:38 +08:00
neil
1ad450d753 add ubuntu test in github actions 2020-08-28 20:11:38 +08:00
neil
f1692b3436 begin 2.8.8 2020-08-28 20:10:12 +08:00
Jan-Philipp Benecke
2a9c56d9e3 Formatting for CI 2020-08-28 11:30:23 +02:00
Jan-Philipp Benecke
39a5688464 Make CI happy 2020-08-28 11:28:06 +02:00
Jan-Philipp Benecke
e4e6173eff CleverReach Deploy API 2020-08-28 11:21:20 +02:00
Ed Lynes
cf7334eb7d add alt nonce generation logic 2020-08-27 17:40:07 -04:00
neil
fdb96e91f1 match issuer ignoring case 2020-08-27 21:41:18 +08:00
neil
844c5027ea Merge pull request #3131 from acmesh-official/dev
add set-default-ca
2020-08-27 21:20:23 +08:00
neilpang
8d0e485120 add set-default-ca 2020-08-27 18:07:26 +08:00
Ed Lynes
281ee1a853 vetted by shfmt 2020-08-26 18:07:46 -04:00
Ed Lynes
a0bf29e600 Merge branch 'master' into edgedns 2020-08-26 16:13:48 -04:00
Ed Lynes
d66c430e46 debugging and cleanup 2020-08-26 16:11:11 -04:00
Sergey Pashinin
f511a52705 Using _post function 2020-08-24 00:05:21 +03:00
Ed Lynes
a674e410e0 initial commit 2020-08-21 17:15:18 -04:00
neil
fc63445c80 Merge pull request #3126 from acmesh-official/dev
Sync
2020-08-22 00:57:06 +08:00
neil
0c15655574 Merge pull request #3125 from lcts/usage-cleanup
Update individual 'Usage: ...'-messages to match showhelp()
2020-08-22 00:55:44 +08:00
neilpang
328b6d1cc6 add docker hub badge 2020-08-21 18:19:26 +08:00
Christopher Engelhard
b67d663a38 fix wrong options listed in --ecc help entry 2020-08-21 12:19:26 +02:00
Christopher Engelhard
dd6c5c9eea add documentation for --password option 2020-08-21 12:15:45 +02:00
Christopher Engelhard
2e87e64bd1 update individual Usage: messages to match showHelp 2020-08-21 12:12:30 +02:00
neil
08c210d833 Merge pull request #3124 from acmesh-official/dev
sync
2020-08-21 18:11:13 +08:00
neil
a9403013df Merge pull request #3069 from PedroLamas/pedrolamas/multi-arch-build
Fixes #3068 - Adds docker multi-arch support
2020-08-21 18:05:52 +08:00
Pedro Lamas
05477c1a03 Fixes Dockerfile 2020-08-21 11:03:53 +01:00
Pedro Lamas
fcb6198a82 More updated following PR comments 2020-08-21 10:55:07 +01:00
Pedro Lamas
410d0bc125 Updates following PR comments 2020-08-21 10:40:13 +01:00
Pedro Lamas
abc62b9348 more 2020-08-21 10:34:43 +01:00
Pedro Lamas
6fbf33c8f4 More changes 2020-08-21 10:17:54 +01:00
neil
0ceb750dc7 Merge pull request #3119 from lcts/usage-cleanup
Update showhelp() message & add some hyphenated option forms for clarity & consistency
2020-08-21 16:26:02 +08:00
Christopher Engelhard
a48c22d14f add missing blank lines after links to wiki 2020-08-21 09:58:58 +02:00
Christopher Engelhard
1521199e44 add hidden alias --to-pkcs for --to-pkcs12 2020-08-21 09:56:57 +02:00
Christopher Engelhard
2910be82a4 revert change of --no-color option 2020-08-21 09:54:47 +02:00
Christopher Engelhard
07fdb087dc fix typo 2020-08-21 09:53:04 +02:00
Christopher Engelhard
58150f5dcd change --pkcs to --pkcs12 2020-08-21 09:53:04 +02:00
Christopher Engelhard
e7a6ff39f9 fix wrong indentation 2020-08-21 09:53:04 +02:00
Christopher Engelhard
b086afb272 fix some more issues in showhelp() 2020-08-21 09:53:04 +02:00
Christopher Engelhard
7decf76883 group commands logically, rearrange option forms in _process()
Commands have been reordered in showhelp() to a more consistent grouping,
help > version > install > certs > csr > account > cron > other

All option alternatives in _process() case statement have been reordered toshow the canonical variants first, legacy variants after.
2020-08-21 09:53:04 +02:00
Christopher Engelhard
d81369d63a add hyphenated options, fix wrong -ccr in usage() 2020-08-21 09:53:04 +02:00
Christopher Engelhard
c0fbe8237b reformat usage message for consistency & clarity 2020-08-21 09:53:04 +02:00
neil
58923b2846 Merge pull request #3099 from Alexilmarranen/dev
Issue2547 wrong url construction for multiple dns services
2020-08-20 22:10:34 +08:00
neil
d9f9477a52 move badge
move badge
2020-08-20 21:44:37 +08:00
neil
966c744992 minor, just move badge position 2020-08-20 21:41:36 +08:00
neil
ddc91ce7c3 Merge pull request #3122 from acmesh-official/dev
Add pebble strict to CI
2020-08-20 21:34:38 +08:00
neil
7e5107d90f Merge pull request #3121 from acmesh-official/peb
Add pebble strict to CI
2020-08-20 21:33:32 +08:00
neil
c1668c9bdb add pebble badge 2020-08-20 21:26:42 +08:00
neil
7ddc2ccf1a add TEST_CA 2020-08-20 21:06:21 +08:00
neil
3cd85fb395 install socat 2020-08-20 20:54:27 +08:00
neil
b805ea9bf6 fix dir 2020-08-20 20:52:42 +08:00
neil
edd76f595a fix dir 2020-08-20 20:37:23 +08:00
neil
c131b63852 typo 2020-08-20 20:32:22 +08:00
neil
a70f377388 add pebble 2020-08-20 20:18:53 +08:00
neil
50f76446a9 Merge pull request #3118 from acmesh-official/dev
sync
2020-08-20 09:24:02 +08:00
neil
15ce3ec41a Merge pull request #3117 from acmesh-official/fix-preferred-chain-for-renewal
fix preferred chain for renewal
2020-08-20 09:14:48 +08:00
neil
b7b01999d9 fix preferred chain for renewal
fix https://github.com/acmesh-official/acme.sh/issues/3116
2020-08-20 09:13:44 +08:00
Alexilmarranen
956114fc42 Issue2336 Add subdomain (3 and more) support
Fix for issue in https://github.com/acmesh-official/acme.sh/issues/2336#issuecomment-670522738
2020-08-19 00:50:18 +03:00
neil
bb3a986859 Merge branch 'dev' of https://github.com/acmesh-official/acme.sh into dev 2020-08-18 23:28:25 +08:00
neil
50fefc3bb0 minor 2020-08-18 23:28:06 +08:00
neil
c5eea2e7c5 Merge pull request #3113 from acmesh-official/dev
sync
2020-08-18 23:16:05 +08:00
neil
19555a98ed Merge pull request #3112 from olibu/dev
Dev: Fix issue #2833
2020-08-18 22:30:30 +08:00
neil
9021f006f0 update shfmt 2020-08-18 22:22:03 +08:00
Oliver Burgmaier
2d5f14388e Revert "Removed content for clean pull request"
This reverts commit ab47bf6451.
2020-08-18 14:52:23 +02:00
Oliver Burgmaier
ab47bf6451 Removed content for clean pull request 2020-08-18 14:01:02 +02:00
Oliver Burgmaier
d8bd45c2bd Fix issue #2833 with backslash in JSON
Backslash will be removed form JSON responses for each request
and for the initial configuration request
2020-08-18 13:53:48 +02:00
Sergey Pashinin
de692d3dcc Vault deploy hook 2020-08-18 13:14:00 +03:00
neil
4adb525513 Merge pull request #3109 from acmesh-official/dev
Support github actions
2020-08-17 23:17:03 +08:00
neil
72235a5f72 add shellcheck badge 2020-08-17 23:13:00 +08:00
neil
b6508cccec Merge pull request #3108 from acmesh-official/ga
support Github Actions
2020-08-17 22:59:46 +08:00
neil
d9e7cf659e Update ci.yml 2020-08-17 22:52:59 +08:00
neil
cf500cd817 fix 2020-08-17 22:50:19 +08:00
neil
f1338aca84 fix 2020-08-17 22:49:09 +08:00
neil
284de4ac5d add actions 2020-08-17 22:46:52 +08:00
neil
19c4345162 fix shfmt 2020-08-17 22:18:20 +08:00
neil
d5d38b3331 support multiple intermediate CA matching for --preferred-chain 2020-08-17 22:06:02 +08:00
neil
bd04638d27 minor 2020-08-16 17:36:24 +08:00
neil
2f0d0e7c7a Merge pull request #3105 from acmesh-official/dev
sync
2020-08-16 17:12:46 +08:00
neil
0b531e9fbc fix format 2020-08-16 16:59:08 +08:00
neil
e3ebd582ec support "--preferred-chain" to select chain
https://github.com/acmesh-official/acme.sh/wiki/Preferred-Chain
2020-08-16 16:57:06 +08:00
neil
95ef046d0a fix https://github.com/acmesh-official/acme.sh/issues/3103 2020-08-15 12:32:15 +08:00
neil
21fd46d66b Merge pull request #3104 from acmesh-official/dev
sync
2020-08-15 10:35:16 +08:00
neil
b3a801df11 fix test endpoint 2020-08-15 10:33:24 +08:00
neil
a6d22e3b22 1. save the CA url anyway.
2. clear some code.
2020-08-13 23:12:30 +08:00
neil
0415c050a5 remove gitads 2020-08-13 23:04:19 +08:00
neil
014396cf11 Merge pull request #3082 from kappernet/dev
initial kapper.net DNS API support
2020-08-13 17:34:50 +08:00
kapper.net support account
70488f9c56 Merge branch 'dev' of https://github.com/kappernet/acme.sh into dev 2020-08-13 00:24:11 +02:00
kapper.net support account
0052ab7148 more mutable + style-update
more mutable config-read-calls
more details for TXT records info + errors;
typo fixed (create instead of delete)
2020-08-13 00:23:57 +02:00
Harald Kapper
f725040dd5 Merge pull request #6 from acmesh-official/dev
sync upstream
2020-08-12 23:55:25 +02:00
kapper.net support account
f131863642 now with "_saveaccountconf_mutable"
_saveaccountconf_mutable instead of _saveaccountconf now used.

Co-Authored-By: kapper.net support account <33451837+kappernet@users.noreply.github.com>
2020-08-12 23:48:11 +02:00
neil
8791047005 Merge pull request #3101 from acmesh-official/dev
sync
2020-08-12 22:33:55 +08:00
neil
836a293f16 Merge pull request #3100 from acmesh-official/eab
Suppor EAB and Zerossl.com
2020-08-12 22:31:03 +08:00
neil
1177cc3f29 fix format 2020-08-12 22:09:37 +08:00
neil
269847d19d Add CA name to the --list command output. 2020-08-12 21:45:20 +08:00
neil
df22f68088 Add info for set-default-ca 2020-08-12 21:25:35 +08:00
neil
d83d8552b8 Add "--server" wiki 2020-08-12 21:17:15 +08:00
neil
365aa69afd fix format 2020-08-12 20:48:53 +08:00
neil
578c338d40 Display ZeroSSL usage 2020-08-12 20:48:53 +08:00
neil
389518e1b8 1. move email to ca conf
2. get EAB credentials from Zerossl by email automatically
2020-08-12 20:48:53 +08:00
neil
d42ff227f1 fix format 2020-08-12 20:48:53 +08:00
neil
737e9e48ca 1. Support short names for --server parameter, The valid values are: letsencrypt, letsencrypt_test, buypass, buypass_test and zerossl
2. Support Zerossl.com acme protocol.
3. Add "--set-default-ca  --server xxxx" command to set the default CA to use.
2020-08-12 20:48:52 +08:00
neil
f96d91cb6c eab 2020-08-12 20:48:52 +08:00
neil
85503655ab Display ZeroSSL usage 2020-08-12 20:47:17 +08:00
neil
8d811760a9 1. move email to ca conf
2. get EAB credentials from Zerossl by email automatically
2020-08-12 20:43:44 +08:00
Alexilmarranen
4e0de22375 Issue2547 wrong url construction for multiple dns services
Fix for problem in https://github.com/acmesh-official/acme.sh/issues/2547#issuecomment-672830796
2020-08-12 15:17:54 +03:00
neil
7cfbf100eb Merge pull request #3098 from andybotting/dev
Rename openstack to dns_openstack
2020-08-12 10:10:52 +08:00
Andy Botting
edbe026b49 Rename openstack to dns_openstack
Although the DNS API dev guide at https://github.com/acmesh-official/acme.sh/wiki/DNS-API-Dev-Guide
says `The script file name must be myapi.sh`, it should really
be names dns_myapi.sh for consistency.
2020-08-12 11:24:45 +10:00
neil
1e967eceef fix format 2020-08-11 23:45:12 +08:00
neil
7d20db93d3 1. Support short names for --server parameter, The valid values are: letsencrypt, letsencrypt_test, buypass, buypass_test and zerossl
2. Support Zerossl.com acme protocol.
3. Add "--set-default-ca  --server xxxx" command to set the default CA to use.
2020-08-11 23:28:52 +08:00
Harald Kapper
fb05a42d2e Merge pull request #3 from acmesh-official/dev
sync upstream
2020-08-09 04:31:07 +02:00
neil
9490ae1440 Merge pull request #3095 from acmesh-official/dev
fix format
2020-08-09 09:56:00 +08:00
neil
e932be0fb3 eab 2020-08-09 09:53:22 +08:00
neil
70b49980cb fix format 2020-08-09 09:40:22 +08:00
neil
5e6ee5fd48 Merge pull request #3092 from acmesh-official/dev
sync
2020-08-07 12:10:35 +08:00
neil
a2d872a9f0 Merge pull request #3087 from draevin/dev-netlify
Add Netlify API support
2020-08-05 09:21:10 +08:00
Draevin Luke
e8bcde31b7 Add Netlify API support 2020-08-04 16:33:24 -07:00
neil
40cda9220a fix https://github.com/acmesh-official/acme.sh/issues/3077 2020-08-03 21:22:32 +08:00
kapper.net support account
a494683bc8 Merge branch 'dev' of https://github.com/kappernet/acme.sh into dev 2020-08-02 15:59:59 +02:00
kapper.net support account
2ba6a85eca fix multiple txt-records delete + API update
new API version
fix to delete specific TXT records for wildcard-certs with LE

Co-Authored-By: Harald Kapper <hknet@users.noreply.github.com>
2020-08-02 15:59:46 +02:00
kapper.net support account
0e58158a59 Merge pull request #2 from acmesh-official/dev
sync upstream
2020-08-02 13:56:52 +02:00
neil
af740592c9 Merge pull request #3073 from vi9076/dev
Fix failed test in acmetest. Item alpine:latest - test 12
2020-08-02 14:41:40 +08:00
neil
c9452c9f31 Merge pull request #2574 from rewqazxv/master
Fix sudo issue
2020-08-02 14:31:45 +08:00
kapper.net support account
494a1603e4 Update dns_kappernet.sh
add issue-link in sourcecode

Co-Authored-By: Harald Kapper <hknet@users.noreply.github.com>
2020-08-02 01:41:26 +02:00
kapper.net support account
5207e111e1 initial kapper.net DNS API support
hopefully this time we get it right ;)

Co-Authored-By: Harald Kapper <hknet@users.noreply.github.com>
2020-08-02 00:19:28 +02:00
neil
06995fb080 Merge pull request #3075 from jpmens/patch-2
Remove unecessary word from README.md
2020-07-28 09:34:48 +08:00
neil
1f5cafc2d1 Update README.md 2020-07-28 09:32:15 +08:00
JP Mens
f190de39a6 Remove unecessary word from README.md 2020-07-27 14:34:35 +02:00
neil
272ab746a6 Merge pull request #3071 from pdxgf1208/dev
Update dns_dynv6.sh
2020-07-27 15:57:07 +08:00
neil
fce0bf6e59 Merge pull request #3070 from phedoreanu/replace_response_equals_with_contains
replace response equals with contains
2020-07-27 15:54:05 +08:00
neil
5957786b2c Merge pull request #3072 from tresni/synology_dsm
Support for DS218+
2020-07-27 15:52:37 +08:00
Vinton Huang
4f3f4e23e4 Fix failed test in acmetest. Item alpine:latest - test 12: le_test_standandalone_deactivate_v2
- Message of failed test [1]: /root/.acme.sh/acme.sh --deactivate -d testdocker.acme.sh [FAIL]
- Reason of failure: left brace was not escaped. According to the standard [2], if special chars appear first in an ERE, it will produce undefined results.
- egrep from busybox (and thus alpine) take it as an error, but egrep from GNU grep (included in most distros) and *BSD are more tolerant, just ignore it.
- Fix: consider the right brace at the right-hand side of the ERE, the result string will not contain right brace. So the left-hand side should not contain left brace, too.
[1] 446939706e/logs/alpine-latest.out (L119)
[2] 9.4.3 ERE Special Characters, The Open Group Base Specifications. https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html
2020-07-27 03:55:07 +08:00
Brian Hartvigsen
5f5096e1d4 Addressing issues found in DS218+ DSM
DS218+ appears to have a slighly different DSM that sends back headers in lowercase.

Reported by @BartSiwek in #2727
2020-07-25 21:56:18 -06:00
12bbf7608ae1
4b35aef728 Update dns_dynv6.sh
Add support for domains like '*.v6.rocks'
2020-07-25 21:48:11 +08:00
Adrian Fedoreanu
6a0ed51f5e replace response equals with contains 2020-07-24 16:28:34 +02:00
Pedro Lamas
67360e93b8 Correctly labels Docker images per branch 2020-07-24 09:25:58 +01:00
Pedro Lamas
f18f4c69f2 Adds Docker multi-arch build support 2020-07-23 14:57:16 +01:00
neil
41435578d2 Merge pull request #3055 from andybotting/openstack-dns
Add OpenStack Designate DNS API support
2020-07-16 13:45:01 +08:00
neil
7f33ae3bee Merge pull request #3059 from andybotting/dev
Fix CI test failure for deploy/openstack.sh
2020-07-16 13:44:40 +08:00
neil
645135bf56 Merge pull request #3051 from szepeviktor/patch-2
Upgrade Travis image
2020-07-16 13:44:02 +08:00
Viktor Szépe
eb9005ad74 Fix SC2236 2020-07-16 06:18:46 +02:00
Viktor Szépe
14089f8c6a Fix SC2236 2020-07-16 06:18:12 +02:00
Viktor Szépe
49094120d9 Fix SC2236 2020-07-16 06:17:11 +02:00
Viktor Szépe
fe4111a9f5 Fix SC2236 2020-07-16 06:14:50 +02:00
Viktor Szépe
61613bee98 Fix SC2230 2020-07-16 06:13:15 +02:00
Andy Botting
3ce967d8e5 Fix CI test failure for deploy/openstack.sh 2020-07-16 13:53:21 +10:00
Andy Botting
aad9afad59 Add OpenStack Designate DNS API support
This provider relies on the the python-openstackclient and
python-designateclient tools be installed and working, with
either password or application credentials loaded in your env.
2020-07-16 13:25:59 +10:00
neil
8cbbd022fc Merge pull request #3057 from andybotting/openstack-deploy
Add OpenStack Barbican deploy support
2020-07-16 09:24:12 +08:00
Andy Botting
9b23cd6d19 Add OpenStack Barbican deploy support
This provider relies on the the python-openstackclient and
python-designateclient tools be installed and working, with
either password or application credentials loaded in your env.
2020-07-16 09:59:40 +10:00
Viktor Szépe
d94f241d3c Upgrade Travis image 2020-07-15 20:45:11 +02:00
neil
bb7c11adf1 Merge pull request #3049 from acmesh-official/dev
sync
2020-07-15 21:32:07 +08:00
neil
5c295254bf fix format 2020-07-15 21:31:14 +08:00
neil
236e8cc95c add gitads 2020-07-15 21:30:17 +08:00
neil
421973e0d9 Merge pull request #3046 from acmesh-official/dev
sync
2020-07-14 21:56:08 +08:00
neil
e2a5af1cf7 fix format 2020-07-14 21:49:50 +08:00
StefanAbl
65aa7b1084 formatting 2020-07-13 16:01:46 +02:00
StefanAbl
f8c8330258 formatting 2020-07-13 15:49:25 +02:00
StefanAbl
f5411ac9ab no supporting HTTP API as well 2020-07-13 15:42:45 +02:00
neil
f31debc09c fix format 2020-07-13 21:03:57 +08:00
neil
6654d7a919 fix format 2020-07-13 20:56:58 +08:00
neil
44743b5f6f Merge pull request #3043 from robertoetcheverryr/dev
Added check for Authentication failure in dns_dynu module
2020-07-13 14:54:16 +08:00
robertoetcheverryr
f80276584f Added check for Authentication failure in dns_dynu module 2020-07-12 23:43:03 -03:00
neil
cda41debfc Merge pull request #3042 from andrewheberle/patch-2
Use base64 for docker reload command
2020-07-13 09:40:14 +08:00
neil
2c50d01c26 Merge pull request #3039 from vi9076/master
Update "Tested OS" section of README.md
2020-07-13 09:35:51 +08:00
andrewheberle
01ebb6576d Use base64 for reload
Ensure that reload command is encoded with base64 so special characters in command do not wreck config on renewals
2020-07-13 09:31:47 +08:00
Vinton Huang
aaca0b6f76 Update "Tested OS" section of README.md
- Update openSUSE build badge file name (opensuse-leap.svg -> opensuse-leap-latest.svg)
- Update link target of build badge (letest -> acmetest), for item 1-12, 15, 16, 18, 19, 21
- Update Proxmox document link for 5.2 and later
2020-07-11 19:50:16 +08:00
neil
84e1f3649f Merge pull request #3035 from acmesh-official/dev
sync
2020-07-08 23:12:19 +08:00
neil
0ab2cfaf8b Merge pull request #3029 from licaon-kter/patch-2
Fix typo candindates
2020-07-08 22:25:20 +08:00
neil
0545d6f083 Merge pull request #3031 from peterkelm/patch-1
Reflect recent Variomedia API changes
2020-07-08 22:24:14 +08:00
neil
d804228956 fix https://github.com/acmesh-official/acme.sh/issues/3032 2020-07-08 22:22:06 +08:00
neil
f7d70df2ba Merge pull request #3033 from grindsa/ecc_sign
Prepending for ecc signature
2020-07-08 22:10:31 +08:00
neil
4daef52991 Merge pull request #3034 from acmesh-official/dev
sync
2020-07-08 21:30:43 +08:00
grindsa
a329547682 prepending for ecc signature
leftpadding "0" if _ec_s and _ec_r are to short
2020-07-08 11:59:20 +02:00
peterkelm
f02af8d481 Reflect recent Variomedia API changes
Spaces were recently removed from the JSON "response" returned by Variomedia's API.
2020-07-07 22:56:51 +02:00
neil
dd6c067832 fix format 2020-07-07 20:52:00 +08:00
Licaon_Kter
dbc435506c Fix typo candindates 2020-07-07 12:06:37 +00:00
neil
f00e289014 fix format 2020-07-07 20:02:48 +08:00
neil
1dffaba266 fix format 2020-07-07 19:58:02 +08:00
neil
958a2f4274 Merge pull request #3017 from metaquanta/master
dns_duckdns.sh - correctly extract domain
2020-07-05 21:52:26 +08:00
Matthew
21718a69d3 Update dns_duckdns.sh
Don't depend on eregex in sed
2020-07-03 07:48:38 -04:00
neil
c650ae0e19 Merge pull request #3015 from TonyGravagno/dev
Trivial text changes
2020-07-03 16:59:47 +08:00
neil
9ed435d04a Merge pull request #3023 from tomsommer/patch-1
unoeuro.com is now simply.com
2020-07-03 16:42:20 +08:00
neil
fed6a0c24e Merge pull request #3024 from snvad/fix2963-dns_regru
Fix bug in dns_regru.sh (#2963)
2020-07-03 16:41:33 +08:00
snv
44b9a8e7ed fix new line at end of file 2020-07-02 13:18:37 +04:00
snv
c16757b03a add some debug output and fix data in GET request 2020-07-02 12:59:24 +04:00
snv
5d0dde5c15 main changes 2020-07-02 12:23:46 +04:00
Tom Sommer
f60356e8c7 Username not required to contain "UE" 2020-07-02 09:48:05 +02:00
Tom Sommer
cdf8f78962 unoeuro.com is now simply.com
Maintaining the naming of the API (for backwards compatibility), but renaming hostname.
2020-07-02 09:47:05 +02:00
Matthew
4539d236df dns_duckdns.sh - correctly extract domain
$fulldomain could be just 'domain.duckdns.org' if provided with --domain-alias or '_acme-challenge.domain.duckdns.org' otherwise. In the latter case, '_acme-challenge' is thrown away. Correctly extract 'domain' in both cases.
2020-06-30 07:19:41 -04:00
Matthew
8718ac0c4b duckdns doesn't permit subdomains or underscores 2020-06-30 02:22:08 -04:00
Tony Gravagno
94787d537a Issue #2849 Trivial variable name fix from apacheMajer to apacheMajor 2020-06-29 11:51:55 -07:00
Tony Gravagno
bb8cff967e Merge branch 'dev' of https://github.com/TonyGravagno/acme.sh into dev 2020-06-29 11:31:18 -07:00
Tony Gravagno
eca57beec1 Issue #2850 : grammar corrections for "exists" and "exist". 2020-06-29 11:29:10 -07:00
neil
58b4eb04f9 Merge pull request #3002 from msamoylych/dev
dns_hexonet: Fix removing DNS records
2020-06-25 23:15:15 +08:00
msamoylych
a9d46297c4 Update dns_hexonet.sh
Fix removing DNS records
2020-06-24 12:26:11 +03:00
msamoylych
e9edecf34a Update dns_hexonet.sh
Remove useless &
2020-06-24 12:25:23 +03:00
neil
71a5f0e84e Merge pull request #3000 from acmesh-official/dev
sync
2020-06-24 13:38:03 +08:00
neil
fb22ee94d9 Merge pull request #2917 from mdbraber/lexicon_output_fix
Lexicon output fix
2020-06-10 22:45:39 +08:00
Maarten den Braber
f03904ebce change to --output QUIET 2020-06-09 09:57:36 +02:00
StefanAbl
6cc9f49d97 first attempt to make travis happy 2020-05-31 19:09:27 +02:00
StefanAbl
f5f0680ec7 Added support for custom domains 2020-05-31 18:49:39 +02:00
neil
60e04b9065 Merge pull request #2961 from DerVerruckteFuchs/master
Fix broken grep so that One984HOSTING_COOKIE actually gets set, and isn't left empty.
2020-05-26 21:39:47 +08:00
DerVerruckteFuchs
025da92450 Handle case insensitivity for HTTP/1.1 headers. 2020-05-26 02:00:05 -04:00
neil
5de4aa091b Merge pull request #2962 from grindsa/retry-after-fix
retry-timer fix
2020-05-26 09:34:46 +08:00
grindsa
1fe8235a85 Update acme.sh 2020-05-25 20:28:05 +02:00
DerVerruckteFuchs
0ab14399ae Fix broken grep so that One984HOSTING_COOKIE actually gets set, and isn't left empty. 2020-05-25 12:04:26 -04:00
neil
15dded712c fix retry
https://github.com/acmesh-official/acme.sh/issues/2939#issuecomment-632481658
2020-05-24 18:04:47 +08:00
neil
8837f7e6e8 Merge pull request #2929 from PMExtra/dev
Support multiple servers for SSH deployment
2020-05-24 18:02:56 +08:00
neil
e8defd821a update readme 2020-05-23 20:37:06 +08:00
neil
5d6effeff5 Merge pull request #2955 from dandv/patch-2
Fix sloppy English
2020-05-23 20:31:59 +08:00
Dan Dascalescu
427c278012 Fix sloppy English 2020-05-22 10:28:29 -07:00
PM Extra
a78a09f594 Support multiple servers for SSH deployment. 2020-05-22 18:15:38 +08:00
neil
59fd48cfe2 support Retry-After header
https://github.com/acmesh-official/acme.sh/issues/2939
2020-05-21 22:32:19 +08:00
neil
cc78ab4855 Merge pull request #2923 from mdbraber/add-provider-transip
Add TransIP provider
2020-05-21 22:27:50 +08:00
Maarten den Braber
063562261e Fix string truncation for POSIX 2020-05-19 23:09:16 +02:00
Maarten den Braber
70619dd0b7 Remove debugging 2020-05-19 20:07:14 +02:00
Maarten den Braber
63031fb278 bugfixes 2020-05-19 20:04:23 +02:00
neil
7f924a56b3 Merge pull request #2950 from acmesh-official/revoke
fix https://github.com/acmesh-official/acme.sh/issues/2880
2020-05-19 23:32:41 +08:00
neil
114f2a1465 fix https://github.com/acmesh-official/acme.sh/issues/2880 2020-05-19 23:26:58 +08:00
Maarten den Braber
5d2777634a Fix forgotten then 2020-05-19 16:43:39 +02:00
Maarten den Braber
2d5b4a0003 Change if-statement for private keys to more portable version 2020-05-19 16:39:49 +02:00
Maarten den Braber
adfa1704e2 Update nonce calculation to use acme.sh methods instead of openssl
command
2020-05-19 16:38:23 +02:00
neil
ab3fd6be8f Merge pull request #2942 from gassan/dns-hetzner
Added dnsapi/dns_hetzner.sh
2020-05-19 22:18:19 +08:00
neil
47702d075e Merge pull request #2945 from ianw/rax-lookup
dns_rackspace: search for domain
2020-05-19 22:12:45 +08:00
neil
341f000b9c Merge pull request #2947 from kref/patch-1
fix octal escapes for printf %b format
2020-05-19 13:45:42 +08:00
kref
0deea53931 fix octal escapes for printf %b format
Stop it from misinterpreting a following digit as part of the escape sequence
2020-05-19 13:27:00 +08:00
Ian Wienand
8b3d792bec dns_rackspace: search for domain
The current call uses the /domains end-point which lists all domains.
This only returns 100 domains at a time, so for long domain lists you
may not match and find the required ID.

Switch to using the search interface that only returns values matching
the requested domain.  This will avoid missing results.

Reported by @jjamfd.

Closes: #2944
2020-05-18 15:29:31 +10:00
Gassan Gousseinov
b82c48b66f shfmt 2020-05-17 23:09:22 +02:00
Gassan Gousseinov
fa91516dce added dnsapi/dns_hetzner.sh 2020-05-17 21:40:54 +02:00
Maarten den Braber
4954b44d8e Remove default key file (leave it to the user to explicitly specify) 2020-05-16 16:18:05 +02:00
neil
d132e51ac7 Merge pull request #2922 from QDaniel/QDaniel-patch-INWX
INWX fix Domain Limit #1491
2020-05-16 21:43:31 +08:00
neil
243b6ae985 Merge pull request #2931 from dvaerum/dev
Bug fix: DNS TXT entries will now be removed for dns_gdnsdk.sh
2020-05-16 21:39:06 +08:00
neil
8780ba3626 Merge pull request #2935 from tresni/synology_dsm
Update Synology DSM deploy hook
2020-05-16 21:02:32 +08:00
Brian Hartvigsen
694194be2f Shellcheck fix
SYNO_Certificate gets set by _getdeployconf, so this may be an empty string but that's fine
2020-05-16 02:25:53 -06:00
Brian Hartvigsen
c7f61f8b80 Allow rotating the default certificate which has no description
This means, by default, we will rotate the default certificate that comes with the DSM
2020-05-16 02:02:23 -06:00
Brian Hartvigsen
3a7c7fe4e8 Fix shellcheck issues 2020-05-16 00:19:18 -06:00
Brian Hartvigsen
668967a719 If SYNO_Create is not set here, print the nice message 2020-05-16 00:05:35 -06:00
Brian Hartvigsen
d15c14ab93 Fix support for wget
I'm actually not entirely sure why/how this worked with curl but not wget, but it did.  The short answer is that using a GET does not result in the HTTP_HEADER file being written, instead you must pass in the http_headers param ($2) which will return the HTTP headers as a string.  Luckily, the Token is in both the body and the header.  We need it and the id (and smid if 2fa) cookie to proceed.  So now we parrse the response for that instead of the HTTP_HEADER file.

Interesting side note: wget is fine if the URL contains a \r or \n, but curl will barf on it.  So we need to make sure those are stripped from the token as it will be passed in the URL later.
2020-05-15 23:53:00 -06:00
Brian Hartvigsen
52b81608a1 need to _url_encode anything sent in GET requests
Fixes issue raised by @tatablack
2020-05-15 23:48:50 -06:00
Dennis Vestergaard Værum
048f754d83 Bug fix: DNS TXT entries will now be removed for dns_gdnsdk.sh 2020-05-14 23:04:08 +02:00
Ian Epperson
748cb28017 Add Discord notification 2020-05-13 10:39:11 -07:00
Maarten den Braber
d5ef3a3f8c Formatting issues 2020-05-13 17:07:19 +02:00
Maarten den Braber
e768e285ce Remove extra newline 2020-05-13 16:49:42 +02:00
Maarten den Braber
a102d775b2 Formatting issues 2020-05-13 16:49:07 +02:00
Maarten den Braber
65e82b03ad Fix CI errors 2020-05-13 16:11:53 +02:00
Maarten den Braber
80a636bd14 Fix extra space 2020-05-13 16:08:34 +02:00
Maarten den Braber
a4c57ee363 Add TransIP provider 2020-05-13 15:35:51 +02:00
QDaniel
94bf54e7e0 INWX fix Domain Limit #1491 2020-05-13 12:14:27 +02:00
neil
b18ce5ade0 Merge pull request #2872 from honzahommer/feat/notify-teams
Add Microsoft Teams notify
2020-05-10 22:50:15 +08:00
Honza Hommer
99793bb2c4 chore: remove shellcheck disable 2020-05-09 12:26:16 +02:00
neil
093936e594 Merge pull request #2914 from philband/philband-patch-1
Add support for Njalla DNS API
2020-05-08 22:40:31 +08:00
Maarten den Braber
036a37e351 Nullify output from lexicon_cmd to prevent getting wrong return codes 2020-05-07 23:19:02 +02:00
Philipp Bandow
d904df57ca Bugfix error message in rest function 2020-05-07 15:45:47 +02:00
Philipp Bandow
d507979ec1 Make CI happy: Remove extraneous new line 2020-05-07 15:41:09 +02:00
Philipp Bandow
9bbcfead67 Bugfix shell format error 2020-05-07 15:37:59 +02:00
Philipp Bandow
81036894c0 Add new DNS Provider: Njalla 2020-05-07 15:28:00 +02:00
neil
9044adecb5 start 2.8.7 2020-05-04 08:43:47 +08:00
neil
9190fdd42c Merge pull request #2903 from acmesh-official/dev
sync
2020-05-04 08:41:37 +08:00
neil
eab35605e4 remove sudo 2020-05-03 11:01:02 +08:00
neil
28b65a7e7b Merge pull request #2898 from ThiloGa/dyndnsfree
adding support for dyndnsfree.de
2020-05-03 10:50:29 +08:00
neil
5d1d2308b4 Merge pull request #2900 from felixbuenemann/patch-2
Fix HAProxy Deploy Hook OCSP Update
2020-05-03 10:45:56 +08:00
Felix Bünemann
cf5952f508 fix haproxy deploy hook ocsp update
fixes ocsp reponse update failing with `Responder Error: unauthorized (6)`
by removing `-no_nonce` switch from `openssl oscp` command .
2020-05-02 22:14:21 +02:00
ThiloGa
3b0d7bc4ad typo fixing 2020-05-02 08:29:44 +02:00
ThiloGa
22f8ab110e typo fixing 2020-05-02 08:26:26 +02:00
neil
8f2d085d28 Merge pull request #2899 from acmesh-official/dev
sync
2020-05-01 23:55:21 +08:00
neil
c3d7f5b28b build on docker hub 2020-05-01 23:44:56 +08:00
ThiloGa
45e6000619 adding support for dyndnsfree.de 2020-05-01 06:25:19 +02:00
neil
7cd00a6760 Merge pull request #2886 from Ritbit/Fix_openprovider.sh_#2104
#2104 Fix openprovider.sh
2020-04-29 21:19:02 +08:00
neil
cecc53fed3 Merge pull request #2892 from acmesh-official/dev
sync
2020-04-29 10:46:04 +08:00
neil
58c2c70146 fix https://github.com/acmesh-official/acme.sh/issues/2888 2020-04-29 10:42:17 +08:00
neil
ad9f488df6 fix https://github.com/acmesh-official/acme.sh/issues/2888 2020-04-29 10:38:21 +08:00
neil
b19799bc72 fix https://github.com/acmesh-official/acme.sh/issues/2888 2020-04-29 10:19:35 +08:00
neil
1209b9b86e fix https://github.com/acmesh-official/acme.sh/issues/2888 2020-04-29 10:15:13 +08:00
neil
da957a3caf fix https://github.com/acmesh-official/acme.sh/issues/2888 2020-04-29 10:12:29 +08:00
Bas van Ritbergen
1bfd0f0149 Update dns_openprovider.sh
fixed shebang shell to be as suggested
2020-04-27 15:41:50 +02:00
Bas van Ritbergen
3ff48b8559 Update dns_openprovider.sh
#2104  Fix wildcard handling & custom NS config for OpenProvider DNS
2020-04-27 15:34:20 +02:00
neil
6ba1eda96f fix https://github.com/acmesh-official/acme.sh/issues/2883#issuecomment-619215961 2020-04-25 22:44:00 +08:00
neil
dddfe07867 Merge pull request #2879 from blablup/OPNsense_dns
Allow old and new API response for OPNsense Plugin
2020-04-24 22:16:03 +08:00
neil
054f67eeb8 Merge pull request #2877 from vktg/loopia300ttl
DNS Loopia min 300 TTL
2020-04-24 22:13:27 +08:00
neil
65c59c8c30 Merge pull request #2882 from acmesh-official/dev
sync
2020-04-24 22:10:38 +08:00
Honza Hommer
24925a1739 feat: add default colors 2020-04-22 21:13:52 +02:00
Jesai Langenbach
c49b40ee95 Allow old and new API response
CLOSES #2480
2020-04-21 11:43:08 +02:00
Viktor G
c06db30a65 DNS Loopia min 300 TTL 2020-04-20 21:05:40 +03:00
neil
0ed6fef49b Merge pull request #2876 from wurzelpanzer/easydns-updates
easyDNS API out of beta
2020-04-20 21:45:48 +08:00
wurzelpanzer
9bad11ec79 easyDNS API out of beta
Added new links to API docs and API access signup
2020-04-20 08:49:08 +02:00
Honza Hommer
74cdcde449 fix: remove :xdigit: 2020-04-19 23:59:35 +02:00
neil
1613461504 Merge pull request #2869 from wwebers/fix_opnsense
Fix for latest "os-bind" plugin
2020-04-19 20:39:25 +08:00
neil
0043f3558c Merge pull request #2870 from softcat/fix/inwx-api
Fix for INWX DNS API (multiple domains and 2FA enabled failing)
2020-04-19 20:36:47 +08:00
Honza Hommer
a9c4b8dd1a feat: Microsoft Teams notify 2020-04-19 01:03:04 +02:00
Nils Sandmann
5d00edc896 Fix multiple domains with 2FA, reuse session cookie 2020-04-18 18:54:43 +02:00
Nils Sandmann
3bad815982 Better error handling on login, return correct return code 2020-04-18 18:52:08 +02:00
Wolfram Webers
08cc7587ab - Adding fix for latest "os-bind" plugin 2020-04-18 18:11:24 +02:00
neil
458c0db3a8 Merge pull request #2868 from acmesh-official/reason
fix format
2020-04-18 22:35:27 +08:00
neil
a995333081 fix format 2020-04-18 22:34:32 +08:00
neil
8eb608a839 Merge pull request #2866 from acmesh-official/reason
support revoke reason.
2020-04-18 20:16:24 +08:00
neil
1041c9f9fc support revoke reason.
https://github.com/acmesh-official/acme.sh/issues/2856
2020-04-18 20:03:48 +08:00
neil
1564742b76 add comments 2020-04-18 19:38:38 +08:00
neil
b887fd153d Merge pull request #2843 from der-berni/patch-1
Update to work with new one.com procedure
2020-04-18 19:22:47 +08:00
neil
d083674fb1 Merge pull request #2779 from honzahommer/notify/mail.sh
Add msmtp command to notify/mail.sh
2020-04-18 19:00:42 +08:00
neil
ed7a945261 add comment message. 2020-04-18 18:59:33 +08:00
neil
ef5ffa939f Merge pull request #2864 from siwyd/fix-updating-empty-email
Fix: allow removal of email address as contact
2020-04-18 18:55:03 +08:00
neil
d842ccb287 fix format error 2020-04-18 18:51:08 +08:00
neil
233893f122 Merge pull request #2863 from mod242/master
Filter out blank lines
2020-04-18 18:50:22 +08:00
Simon Wydooghe
2febdfc363 Fix: allow removal of email address as contact
It seems the current code doesn't allow for removing the email address
from the contact field. This fixes that. This only removes the email
address if an explicit empty email address is specified on the command
line or in the account.conf file. If it is left unspecified on the
command line it still just uses whatever was configured in the
account.conf.
2020-04-17 15:53:15 +02:00
mod242
2c971a2598 Filter out blank lines
Response from the provider has changed so that there are blank lines at the end, which leads to the result can not be parsed correctly
2020-04-16 20:03:34 +02:00
neil
b4c3c20e5e Merge pull request #2797 from EAliakbar/arvandns
Adding Arvan Dns Api
2020-04-12 14:09:54 +08:00
neil
b6fbb012ad Merge pull request #2749 from dkerr64/ssh-deploy
Updates to ssh_deploy hook
2020-04-12 13:58:44 +08:00
neil
7f4db5a731 Merge pull request #2855 from maidmeow4/master
Fix a typo in dns_he.sh on line 27
2020-04-12 13:47:24 +08:00
喵喵喵喵四
4dfdfa0b7d Fix typo on line 27 2020-04-12 12:28:07 +08:00
neil
dbf659c575 Merge pull request #2854 from acmesh-official/dev
sync
2020-04-12 12:11:11 +08:00
neil
cd8e04471c Merge branch 'dev' of https://github.com/acmesh-official/acme.sh into dev 2020-04-12 11:48:43 +08:00
neil
93de1e4903 un-escape json chars
fix https://github.com/acmesh-official/acme.sh/issues/2833
2020-04-12 11:48:24 +08:00
neil
2df43c9e2b Merge pull request #2847 from woutd/fix-constellix-api-domain-search
Constellix made changes to their API.
2020-04-12 10:49:35 +08:00
neil
5ace44493a fix comments 2020-04-12 10:47:41 +08:00
neil
a57ba3d81c update comments 2020-04-12 10:38:31 +08:00
neil
6298112531 Merge pull request #2852 from phedoreanu/dns_1984hosting
add dns_1984hosting.sh
2020-04-12 10:15:52 +08:00
neil
25afca55f6 Merge pull request #2853 from scottw/master
show response when unable to retrieve DNS records for a zone
2020-04-12 09:41:00 +08:00
Scott Wiersdorf
52a16c917f show response when unable to retrieve DNS records for a zone 2020-04-11 11:24:30 -06:00
Adrian Fedoreanu
eef9a60037 add dns_1984hosting dns api 2020-04-10 23:34:00 +02:00
Wout
e158b5ccf6 Constellix made changes to their API. They added more search capabilities, but the changes are not backwards compatible. We need to use the exact parameter instead of name now. 2020-04-09 19:15:32 +02:00
neil
f03d7efb5e Merge pull request #2845 from woutd/fix-constellix-domain-id
Fixes getting the correct domain id using Contellix API.
2020-04-09 20:21:50 +08:00
der-berni
da7b1fb014 cleanup according to styleguide / ShellCheck 2020-04-09 12:17:08 +02:00
Wout
62378d063e Fixes getting the correct domain id using Contellix API. 2020-04-07 22:34:05 +02:00
der-berni
5fac282ee0 Update to work with new one.com procedure
Since some Months, its no longer possible to add TXT Records with the Name "_acme-challenge" to the base domain.
To override the fallback value, you must use a CNAME and proxy it.
For example.
CNAME _acme-challenge.yourdomain.com => proxy_acme-challenge.yourdomain.com
The TXT Records have to be created on proxy_acme-challenge.yourdomain.com

Since the default CNAME TTL is 3600 seconds, it is recommended to leave the CNAME record.
But if you would like to use the build-in SSL (for your web-site etc.) from one.com, you have to delete the record.

A new variable "ONECOM_KeepCnameProxy" you can set in the account.conf is used to keep the CNAME record.
By default the CNAME record will be removed.

For ex.: SAVED_ONECOM_KeepCnameProxy='1'
to keep the CNAME Record and speedup the process.
2020-04-07 19:25:39 +02:00
neil
6eff873a07 Merge pull request #2783 from Blfrg/dns_me
dns_me id parse using only sed
2020-04-06 10:32:09 +08:00
neil
1fb306c9d3 Merge pull request #2841 from aattww/master
Add support for Joker.com
2020-04-06 10:29:55 +08:00
aattww
c064b3896a Change command check to fully pass shellcheck 2020-04-06 01:13:59 +03:00
aattww
8400d1e60e Add bugs report link 2020-04-05 22:07:20 +03:00
aattww
5530e74382 Initial release 2020-04-05 21:57:37 +03:00
neil
47a38a8977 Merge pull request #2839 from acmesh-official/dev
sync
2020-04-05 13:47:08 +08:00
neil
47883a94a6 support auto-comment 2020-04-05 13:46:02 +08:00
neil
ca19bbd366 Merge pull request #2831 from olibu/dev
Dev
2020-04-04 11:36:48 +08:00
Oliver Burgmaier
7595808d26 fix #2828 mailto compliant to RFC6068
This fix removes the space between "mailto:" and the email address to
make the contact attribute compliant to RFC6068.
2020-04-01 20:35:07 +02:00
Oliver Burgmaier
37d22a144a fix #2830 Autorization segment typo fixed
This fixes the parsing of the authorization segment in the response of
an order. Without this fix the start of the array is not found
correctly and therefore the finalize URL is part of the authorization
segment. Changing the regex to *\[[^\[]*\] fix this. Seems to be a typo
which has not been recognized so far. This can be only recognized if
the response is in a single line.
2020-04-01 20:31:06 +02:00
Oliver Burgmaier
dc697a6862 fix #2830 Autorization segment typo fixed
This fixes the parsing of the authorization segment in the response of
an order. Without this fix the start of the array is not found
correctly and therefore the finalize URL is part of the authorization
segment. Changing the regex to *\[[^\[]*\] fix this. Seems to be a typo
which has not been recognized so far. This can be only recognized if
the response is in a single line.
2020-04-01 20:24:40 +02:00
neil
5398bac533 Merge pull request #2823 from acmesh-official/dev
sync
2020-03-31 21:36:26 +08:00
neil
9984a168cb Merge pull request #2822 from xiaohuilam/patch-1
Try incrementing cert issuing waiting counter.
2020-03-31 21:15:30 +08:00
neil
286f3713b0 Merge pull request #2816 from netpok/patch-2
Fix invalid domain error on dns_cf update
2020-03-31 21:08:59 +08:00
Xiaohui Lam
ff9be30f86 resolved #2818 2020-03-31 03:10:12 +08:00
netpok
34cebe8c0c Fix invalid domain error on dns_cf update
When dns_cf used with Zone ID it fails on removal of the entry.

This pull request adds the missing CF_Zone_ID loading.
2020-03-29 23:45:52 +02:00
Ehsan Aliakbar
200cd5972a fix shellcheck errors in Arvan Dns Api 2020-03-28 21:50:58 +04:30
neil
808d1af578 Merge pull request #2777 from ThiloGa/dev
add support for namemaster.de
2020-03-28 19:06:25 +08:00
neil
d0995665a3 Merge pull request #2808 from ucando/dev
enable qiniu deploy hook to deploy more than one domain
2020-03-28 16:46:13 +08:00
ucando
6132af8ecb enable qiniu to deploy more than one domain 2020-03-26 14:59:23 +08:00
neil
2e9c4914a8 Merge pull request #2807 from acmesh-official/dev
sync
2020-03-26 09:10:18 +08:00
neil
bf0d513e5b Merge pull request #2798 from oliverblaha/dev
add support for upgrade from tag
2020-03-25 19:50:05 +08:00
neil
2be435ff32 Merge pull request #2802 from luoch/patch-1
update dns_dp.sh
2020-03-25 14:49:03 +08:00
罗诚
20ba820253 Update dns_dp.sh
https://dnsapi.cn has change the default language to cn other then en. So the api call need to add `lang=en` to url params for getting the english messages.
And, They also change the susccess message from "Action completed successful" to "Operation successful". Simply use "successful" as keyword will be fine.
2020-03-25 14:39:52 +08:00
neil
44fd332965 Merge pull request #2799 from PaloAltoNetworks/fix-panos-data-format
fix(deploy/panos): data format improvements
2020-03-25 11:11:57 +08:00
Brian Torres-Gil
0453d656d6 fix(deploy/panos): data format improvements
It was discovered in testing that PAN-OS < 9.0 has slightly different
requirements for the multipart/form-data format and requires the `type`
parameter to be passed in the URL. These corrections should work for all
PAN-OS versions.
2020-03-24 20:01:51 -07:00
Oliver Blaha
cb7e38577d add support for upgrade from tag 2020-03-24 14:44:35 +01:00
Ehsan Aliakbar
4fa59ea04e Adding Arvan Dns Api 2020-03-24 17:56:50 +04:30
ThiloGa
bc2ed602e7 deleted txt entry routine by request of namemaster.de, entry is deleted automatically 2020-03-21 21:18:25 +01:00
ThiloGa
a1c4d159dd further shellcheck fixes 2020-03-21 19:48:17 +01:00
ThiloGa
598f29b78e doing shellcheck staff 2020-03-21 19:41:46 +01:00
ThiloGa
f61f2d6e5e adaptations to the new api functions
_get_root fully functional due to the extended api
2020-03-21 19:28:16 +01:00
dkerr64
f38df4df11 Make remote backup directory path user configurable. 2020-03-14 21:51:21 -04:00
neil
1e34ccbe2e Merge pull request #2782 from lippertmarkus/feature-deployhook-synology-otp
Add OTP support to Synology DSM deployhook
2020-03-14 16:05:05 +08:00
Honza Hommer
2a8746f6b0 Feat: add msmtp command 2020-03-11 22:32:37 +01:00
dkerr64
554e083f3d For MULTI_CALL default to undefined, deleting entry in config file if set to "no" 2020-03-11 10:58:36 -04:00
Jeremiah
5d881a8b0f use more compatible regex flag 2020-03-09 11:34:50 -06:00
neil
3d81641139 fix format 2020-03-09 19:04:32 +08:00
Jeremiah
c25b4ba099 dns_me id parse using only sed 2020-03-08 15:39:18 -06:00
Markus Lippert
fd64c20807 store device ID 2020-03-08 20:22:31 +01:00
Markus Lippert
80f1034dd6 add OTP support 2020-03-08 19:49:46 +01:00
Honza Hommer
15b841da06 Feat: simplify conditions for bin and command 2020-03-08 04:47:55 +01:00
neil
902c08e9c9 Merge branch 'dev' of https://github.com/acmesh-official/acme.sh into dev 2020-03-08 10:17:41 +08:00
neil
ea652c023e fix https://github.com/acmesh-official/acme.sh/issues/2778 2020-03-08 10:17:21 +08:00
ThiloGa
3c79bb77db fixing travis-ci warnings SC2086: Double quote to prevent globbing and word splitting. 2020-03-07 21:21:39 +01:00
ThiloGa
d8dbb85946 small fixes 2020-03-07 21:11:08 +01:00
ThiloGa
20702d26ec fixing https://github.com/koalaman/shellcheck/wiki/SC2181 problems 2020-03-07 21:05:42 +01:00
ThiloGa
7d7e9501fa fixing https://github.com/koalaman/shellcheck/wiki/SC2181 problems 2020-03-07 20:37:29 +01:00
ThiloGa
efef76d9cf fixed typo 2020-03-07 19:34:57 +01:00
ThiloGa
e1e1ee31f0 Dont use $? directly anymore 2020-03-07 16:00:52 +01:00
ThiloGa
142ca58d38 removed some unused Vars 2020-03-07 15:45:41 +01:00
ThiloGa
3b01bf7bda removed the probably last blank line 2020-03-07 15:33:21 +01:00
ThiloGa
30416f54d1 Fixes for Travis CI
-removing some blanks etc.
2020-03-07 15:18:25 +01:00
ThiloGa
f21ef0d2e9 add support for namemaster.de 2020-03-07 14:55:09 +01:00
neil
39ced21a6f Merge pull request #2198 from pipedrive/Add-AWS_API-slowrate
Add aws api slowrate
2020-03-07 19:59:20 +08:00
neil
0f24417cb3 Merge pull request #2769 from ianw/update-account-json
Update account.json on account update
2020-03-07 19:50:17 +08:00
neil
f84a87f2a2 remove DEFAULT_DNS_SLEEP.
fix https://github.com/acmesh-official/acme.sh/issues/2773
2020-03-07 18:26:22 +08:00
David Kerr
dada57e5c4 Merge branch 'ssh-deploy' of https://github.com/dkerr64/acme.sh into ssh-deploy 2020-03-05 16:22:59 -05:00
neil
d437d6fde9 Merge pull request #2770 from acmesh-official/dev
add clearlinux
2020-03-04 09:53:51 +08:00
neil
69b11575e3 add clearlinux
fix https://github.com/acmesh-official/acme.sh/issues/2768
2020-03-04 09:51:16 +08:00
Ian Wienand
72e1a1b2e9 Update account.json on account update
When running --updateaccount, the ca/<ca>/account.json file isn't
updated with the new response showing the updated account details.
This can be a bit confusing if you add an email to the account but
then you're not sure if it actually applied looking at this file.

Write out the new response on successful account updates.
2020-03-04 12:28:21 +11:00
dkerr64
8ba573d196 Change variable name to MULTI_CALL so default can be "no" 2020-03-03 13:40:33 -05:00
David Kerr
4593231049 Merge branch 'ssh-deploy' of https://github.com/dkerr64/acme.sh into ssh-deploy
# Conflicts:
#	deploy/ssh.sh
2020-02-28 08:37:25 -05:00
neil
de9eac760b Merge pull request #2754 from acmesh-official/dev
sync
2020-02-25 21:46:42 +08:00
neil
12ad8d52ae Merge pull request #2753 from nobbs/fix_docker_deploy
Fix error on docker deploy command with spaces.
2020-02-25 21:34:07 +08:00
alex
22f9a3b467 Fix error on docker deploy command with spaces.
This adds quotes to the last eval in _getdeployconf which is reponsible
for loading and exporting saved environment variables back into the
acme.sh process. This caused some errors if used with the docker
deploy-hook and the example nginx "service nginx force-reload" command
as it contains spaces.
2020-02-25 12:37:46 +01:00
Stephane Moser
b64f0ba83f Update usage of AWS_DNS_SLOWRATE 2020-02-24 23:14:40 +00:00
dkerr64
f73a494407 Remove spaces on blank line to fix travis error 2020-02-22 22:09:28 -05:00
dkerr64
46ee74ed16 Remove variable from info/error printout that could potentially expose login credentials. 2020-02-22 22:05:06 -05:00
dkerr64
806b746fc0 Fix bug where backup and batch_mode yes/no values could not be changed.
Once set to "no" then they could never be set back to "yes"
2020-02-22 21:23:59 -05:00
dkerr64
cc820e97c6 Add support for DEPLOY_SSH_BATCH_MODE with default of yes.
Before this update all remote commands were bunched together and
sent to the remote host in a single SSH command.  This could result
in a very long sequence of commands that might be rejected by a
remote host (example is VMware ESXi that uses busybox sh).
With this update you can set DEPLOY_SSH_BATCH_MODE="no" and
each remote command is sent as a separate SSH call so now we
do not have big long sequence of commands.  Defaults to same
behaviour as before this update.
2020-02-22 21:10:42 -05:00
dkerr64
283b04df73 Move cleanup of backup directory to first step in the function. 2020-02-22 20:43:28 -05:00
dkerr64
6420d1239f Move call to remote system into separate function 2020-02-22 20:31:52 -05:00
dkerr64
04771e5a4a Move call to remote system into separate function 2020-02-22 20:16:36 -05:00
dkerr64
3d9608faa0 Move -T parameter into default ssh command variable 2020-02-22 20:09:24 -05:00
David Kerr
b7b4ae4262 Merge branch 'dev' of https://github.com/acmesh-official/acme.sh into ssh-deploy 2020-02-22 20:01:41 -05:00
neil
b73b078705 Merge pull request #2719 from qwqVictor/dev
Add support for CQHTTP QQ bot API
2020-02-22 17:44:15 +08:00
neil
887fa8649b Merge pull request #2670 from sreyemnayr/fix-pfsense-linode
Fix pfsense linode
2020-02-22 13:41:19 +08:00
neil
f6172d7273 Merge pull request #2690 from nstepa/dns_yandex
Fix dns records removing after usage.
2020-02-22 13:39:04 +08:00
neil
c70681712d Merge pull request #2746 from acmesh-official/dev
sync
2020-02-22 13:34:01 +08:00
neil
80ca6de531 Merge pull request #2728 from artooro/master
add support for using a Zone ID
2020-02-22 13:28:37 +08:00
neil
c6c395cd0f Merge pull request #2737 from xpac1985/patch-3
Make socat debug output show version + features instead of help text
2020-02-22 12:10:22 +08:00
neil
4831064623 Merge pull request #2744 from xpac1985/patch-2
haproxy deploy script now compatible with OpenSSL v1.1+
2020-02-21 23:20:34 +08:00
neil
d4660a23c0 Merge pull request #2742 from adrian5/patch-3
Fix phrasing in README
2020-02-21 22:34:18 +08:00
xpac1985
e184a1b9e6 haproxy deploy script now compatible with OpenSSL v1.1+
haproxy deploy script now compatible with OpenSSL v1.1+

The OpenSSL OCSP request for haproxy deployment breaks from OpenSSL v1.1.0 on.
The format of the `-header` option has been changed and does now contain a `=` instead of a whitespace.
Other projects have hit the same issue:
https://github.com/nghttp2/nghttp2/issues/742

This commit determines the OpenSSL/LibreSSL version and then adjusts the request accordingly.
Also removed the duplicate command line and added some more debug output.
2020-02-20 23:28:55 +01:00
adrian5
f8662c9bc2 Fix phrasing in README 2020-02-20 18:43:08 +01:00
xpac1985
463df9e4ba Make socat debug output show version + features instead of help text 2020-02-18 16:26:15 +01:00
neil
c768581829 Merge pull request #2735 from acmesh-official/dev
sync
2020-02-15 21:56:03 +08:00
neil
754f7a7891 Merge pull request #2614 from PaloAltoNetworks/deploy-panos
Adding abillity to deploy cert to Palo Alto Networks Firewall via API.
2020-02-15 20:46:59 +08:00
Paul Nguyen
21450a08c2 Fixed 6 character requirement. 2020-02-13 18:01:27 -08:00
Paul Nguyen
c355b25bb1 Fixed line formatting 2020-02-12 15:00:23 -08:00
Paul Nguyen
1fe3d80838 Updated to use saveconf function and base64encode. 2020-02-12 14:57:31 -08:00
Paul Nguyen
930e16b64a fix gitdiff 2020-02-11 22:50:05 -08:00
Paul Nguyen
2077a70d03 Fixing gitdiff 2020-02-11 22:44:51 -08:00
Paul Nguyen
cbdb8bd9b9 Fixing gitdiff 2020-02-11 22:34:55 -08:00
Paul Nguyen
5dcb417676 ShellCheck fixes 2020-02-11 22:26:48 -08:00
Paul Nguyen
71bc993e3d Fixed Shellchecks 2020-02-11 22:23:10 -08:00
Paul Nguyen
c2812896f8 Update deployer 2020-02-11 18:15:10 -08:00
Arthur Wiebe
d43227ede4 fix shellcheck issues 2020-02-11 13:07:10 -05:00
neil
8554ae38ed Merge pull request #2369 from tresni/synology_dsm
Initial support for Synology DSM deployhook
2020-02-11 20:12:47 +08:00
neil
da656caf1e Merge pull request #2726 from Blfrg/dns_me
fix #2031 dns_me id parse
2020-02-11 19:09:38 +08:00
neil
51fc853228 Merge pull request #1341 from phlegx/all-inkl-kasserver-dns-script
All inkl kasserver dns script
2020-02-11 19:08:31 +08:00
neil
7a30cb9de7 Merge branch 'dev' into all-inkl-kasserver-dns-script 2020-02-11 19:07:20 +08:00
Brian Hartvigsen
1b475cf9f3 Remove -q from greps 2020-02-10 21:02:27 -07:00
Arthur Wiebe
719b690451 add support for using a Zone ID 2020-02-10 10:22:55 -05:00
neil
3cdc523dec Merge pull request #2628 from woutd/master
Add DNS API support for Constellix
2020-02-10 22:27:05 +08:00
Blfrg
eb49127b9e improve id parse
Locate only the outer most "id" property
2020-02-09 14:50:29 -06:00
Brian Hartvigsen
d07172a528 Replace disabled linter with variable substituion 2020-02-09 12:06:13 -08:00
Brian Hartvigsen
79637097ba Use _utc_date 2020-02-09 11:50:50 -08:00
Brian Hartvigsen
1259341095 Use deployconf properly 2020-02-09 03:10:11 -08:00
Brian Hartvigsen
5d3bc95ac5 Fix some debug output 2020-02-09 02:50:29 -08:00
Brian Hartvigsen
de25232a73 Allow creating new certificates when certificate is not found 2020-02-09 02:26:55 -08:00
Brian Hartvigsen
95769de464 Fix shfmt/shellcheck issues 2020-02-09 02:01:26 -08:00
Brian Hartvigsen
52a168b961 Stop using jq/curl directly
This is a lot more fragile then the previous code due to treating JSON as just a string
2020-02-09 01:49:20 -08:00
Brian Hartvigsen
b3b00b6700 Using domainconf instead of account 2020-02-09 01:49:20 -08:00
Brian Hartvigsen
8e8cda132c Remove boilerplate from what I used for template 2020-02-09 01:49:20 -08:00
Brian Hartvigsen
6459ccb185 Cleanup shfmt warnings 2020-02-09 01:49:20 -08:00
Brian Hartvigsen
548f83c3ad Cleanup shellcheck errors 2020-02-09 01:49:19 -08:00
Brian Hartvigsen
555e0de9e4 Initial support for Synology DSM
This allows you to update a key on a Synology DSM using the existing API.
Handles restarting the necessary services the certificate is attached to and all other internal stuff (copying the certificate around, etc.)

This is way less error prone than most articles I've found on how to update a Synology DSM certificate.
2020-02-09 01:49:19 -08:00
Wout
cc4bce283f Merge branch 'master' of git://github.com/acmesh-official/acme.sh 2020-02-09 10:13:17 +01:00
Blfrg
8189a34d14 fix dns_me id parse
The API seems to have changed and the ID is no longer in the same location.
2020-02-08 16:43:23 -06:00
Victor Huang
5d88ad554f Improved token processing method and misc bugfixes
Replace '_err' to '_debug' in the final error report.
Removed redundancy code.
2020-02-08 23:24:45 +08:00
Wout
2cc50a2b65 Cosmetic fixes. 2020-02-08 12:27:19 +01:00
Victor Huang
33670a5bd0 CQHTTP: Change shebang to "/usr/bin/env sh" 2020-02-06 11:26:56 +08:00
Victor Huang
64f8a222cb Add support for CQHTTP QQ bot API 2020-02-06 11:12:14 +08:00
Paul Nguyen
d9a9695fe0 Deploy certificates to Palo Alto Network Firewalls 2020-02-05 14:29:01 -08:00
neil
8e6c4e1aca Merge pull request #2481 from blablup/OPNsense_dns
Add OPNsense Bind API Support
2020-01-31 16:37:31 +08:00
neil
490fbfc13e Merge pull request #2701 from xpac1985/patch-1
Updated/fixed some entries in --help output
2020-01-31 16:32:13 +08:00
neil
4b45973361 Merge pull request #2470 from StefanAbl/master
DNS Api for dynv6
2020-01-31 16:30:51 +08:00
neil
4c27e08e3d Merge pull request #2692 from helbgd/patch-7
fix for ddnss.de updates
2020-01-31 16:29:16 +08:00
neil
94eb80597b Merge pull request #2712 from acmesh-official/dev
update repo name
2020-01-30 12:44:47 +08:00
neilpang
d610eb15d8 update repo name 2020-01-30 12:44:02 +08:00
neil
4f53cd1704 Merge pull request #2711 from acmesh-official/dev
update repo name
2020-01-30 12:08:21 +08:00
neilpang
d795fac37a update repo name 2020-01-30 12:06:39 +08:00
neil
ce6b71a58b Merge pull request #2710 from acmesh-official/dev
start v2.8.6, change the repo name
2020-01-30 10:51:51 +08:00
neilpang
09f74a9af8 start v2.8.6, change the repo name 2020-01-30 10:50:39 +08:00
neil
552a49a680 Merge pull request #2707 from Neilpang/2695
fix 2695
2020-01-27 23:56:33 +08:00
neilpang
97741398fb minor 2020-01-27 23:40:51 +08:00
neilpang
f8b225e70e fix format 2020-01-27 23:30:36 +08:00
neil
57b4eda014 Merge pull request #2706 from Neilpang/dev
sync
2020-01-27 23:09:30 +08:00
neilpang
fc3a181779 move the error message 2020-01-27 23:07:10 +08:00
neilpang
9541ea6a9f fix bug https://github.com/Neilpang/acme.sh/issues/2695
If a domain was already verified by http-01 method,  when we try to issue a cert for them same domain with dns-01 method, we just get only one challenge object of type http-01 with "valid" status, from the authz-v3 url. So, we report error that we are not able the validate the domain, because of that we don't find dns-01 challenge.
This behavior is not the same as before. I believe it was changed by the letsencrypt CA.
2020-01-27 23:07:10 +08:00
neilpang
f716f6060e minor check update hash for branch name 2020-01-27 23:02:09 +08:00
neilpang
dc0cca8c83 move the error message 2020-01-27 22:22:25 +08:00
neilpang
4f303de00c fix bug https://github.com/Neilpang/acme.sh/issues/2695
If a domain was already verified by http-01 method,  when we try to issue a cert for them same domain with dns-01 method, we just get only one challenge object of type http-01 with "valid" status, from the authz-v3 url. So, we report error that we are not able the validate the domain, because of that we don't find dns-01 challenge.
This behavior is not the same as before. I believe it was changed by the letsencrypt CA.
2020-01-27 22:12:21 +08:00
neilpang
05aa26e619 minor, remove space key 2020-01-27 21:22:42 +08:00
Phlegx Systems OG
1c4b831922 Merge pull request #7 from Marco4223/Fix-issues-and-reslolve-zone-and-record-name
Update dns_kas.sh
2020-01-24 09:01:04 +01:00
Marco4223
6613ae57b0 Update dns_kas.sh
sleep 10 to _sleep 10
2020-01-23 19:20:44 +01:00
xpac1985
b6552aff75 Added maximum account key length to --help output 2020-01-22 21:21:38 +01:00
xpac1985
3c98fae4f2 Updated/fixed some entries in --help output 2020-01-22 20:00:04 +01:00
neil
2028e4c8ad Merge pull request #2700 from radek-sprta/clouddns
Support for CloudDNS API
2020-01-22 22:20:30 +08:00
Radek SPRTA
5c7feba77b Format with shfmt 2020-01-22 05:33:46 +01:00
Radek SPRTA
23f2677052 Do not print HTTP responses to stdout 2020-01-22 02:53:50 +01:00
Radek SPRTA
6b67511748 Disable check 2020-01-22 02:03:11 +01:00
Radek SPRTA
36e0feea43 Clean up comments 2020-01-22 01:59:40 +01:00
Radek SPRTA
69392f67e8 Correctly handle .co.uk type domains 2020-01-22 01:33:15 +01:00
Radek SPRTA
e7d130cc11 Add support for CloudDNS API 2020-01-21 06:36:31 +01:00
StefanAbl
6e3ba3ca45 travis 2020-01-18 13:53:26 +01:00
StefanAbl
0f54cf83f4 fixed dynv6 dns validation 2020-01-18 13:48:29 +01:00
Phlegx Systems OG
fb209cdfde Merge pull request #6 from Marco4223/Fix-issues-and-reslolve-zone-and-record-name
delete spaces in empty lines
2020-01-15 19:47:26 +01:00
Marco4223
431c53efcf Update dns_kas.sh
Removing spaces in empty lines
2020-01-15 17:48:30 +01:00
rewqazxv
79ad0ff56b Simplify code 2020-01-15 22:11:34 +08:00
neil
d4dad58b0d Merge pull request #2694 from Neilpang/dev
sync
2020-01-15 22:08:17 +08:00
neilpang
baff032e3b Merge branch 'up' into dev 2020-01-15 22:05:37 +08:00
neilpang
26309f51e3 start 2.8.5 2020-01-15 22:04:49 +08:00
neilpang
f8f53a6bd9 debug 2020-01-15 22:01:34 +08:00
neilpang
ac3667c765 fix https://github.com/Neilpang/acme.sh/issues/2693 2020-01-15 21:43:49 +08:00
Phlegx Systems OG
96180e7555 Merge pull request #5 from Marco4223/Fix-issues-and-reslolve-zone-and-record-name
Update dns_kas.sh
2020-01-15 14:01:04 +01:00
Marco4223
024619676b Update dns_kas.sh
fixing 4 Travis style
2020-01-15 13:56:01 +01:00
neil
5aa0f547cf Merge pull request #2691 from astorath/fix/dns_gcloud_private_zone
fix: added public dns zones filter
2020-01-14 22:28:17 +08:00
helbgd
b1ce6ffcc7 www is incorrect as well
use ip4 and not www, if you use www it deletes the ip4 address of the host and updates only the ip6 address
2020-01-14 15:27:35 +01:00
helbgd
f01936ca4f Server Name not correct
the servername of the server that has the upd.php file was not correct
2020-01-14 15:19:37 +01:00
Andrey Tuzhilin
70fdb1042f fix: added public dns zones filter 2020-01-14 15:55:44 +03:00
Phlegx Systems OG
58cfc0d0cf Merge pull request #4 from Marco4223/Fix-issues-and-reslolve-zone-and-record-name
Update dns_kas.sh
2020-01-14 10:10:39 +01:00
Nick Stepa
4eff3b6a24 Change error to info in case record already exists. 2020-01-12 15:16:48 +01:00
Nick Stepa
e5f69f0815 Fix indentation. 2020-01-12 14:07:49 +01:00
Nick Stepa
ef7b51beb7 Remove local keyword. 2020-01-12 13:54:18 +01:00
Nick Stepa
8494ac8f3d Fix dns records removing after usage. 2020-01-12 13:29:09 +01:00
neil
8dea519235 Merge pull request #2689 from Neilpang/dev
sync
2020-01-12 13:57:14 +08:00
neil
0712e98904 fix https://github.com/Neilpang/acme.sh/pull/2559 2020-01-12 13:36:24 +08:00
neil
c7ccddbcb9 Merge pull request #2678 from Sergey-Zorin/issue2547-throw-nic_token
Issue2547 throw nic token
2020-01-09 22:06:55 +08:00
Sergey Zorin
efd3e8067b remove -F option 2020-01-09 17:05:18 +03:00
neil
c6f7b7f35f Merge pull request #2671 from Rayzilt/master
dns_lexicon.sh: Add extra variable _API_KEY
2020-01-07 09:10:39 +08:00
Sergey Zorin
f3dd1603db fix CI warnings v3 2020-01-07 01:11:43 +03:00
Sergey Zorin
be7688a4df fix CI warnings SC2039 v2 2020-01-07 01:05:50 +03:00
Sergey Zorin
8e2f11389d fix CI warnings SC2039 2020-01-07 00:49:13 +03:00
Sergey Zorin
346454c21b fix CI warnings 2020-01-07 00:26:44 +03:00
Sergey Zorin
c822870cf8 comment cleaning 2020-01-06 23:52:11 +03:00
Sergey Zorin
9666cf680e #2547 fix multiply _service selection 2020-01-06 23:42:08 +03:00
Sergey Zorin
a88622c1be #2547 replace NIC_Token to NIC_ClientID&NIC_ClientSecret with backward compatibility 2020-01-06 23:39:15 +03:00
neilpang
c3fbc36ce7 fix https://github.com/Neilpang/acme.sh/issues/2547#issuecomment-570963981 2020-01-06 20:57:12 +08:00
Silvan Raijer
f174d7dd39 dns_lexicon.sh: Add extra variable _API_KEY 2020-01-05 15:27:04 +01:00
Ryan Meyers
38a8721a91 Escape opening brackets 2020-01-04 10:52:52 -06:00
Ryan Meyers
8aedf26a87 Replace \s with hard space 2020-01-04 10:51:32 -06:00
neil
b2ff9240ac Merge pull request #2662 from tambetliiv/zone-root-check
zone.eu dns api: use different method to get root
2020-01-03 21:44:08 +08:00
neilpang
7a3c61b744 check upgrade hash
https://github.com/Neilpang/acme.sh/issues/2667
2020-01-03 21:38:47 +08:00
Marco4223
8dd1df71cc Update dns_kas.sh
tested and works now
2020-01-02 17:10:36 +01:00
Tambet Liiv
b59b0f0386 use different method to get root 2020-01-02 14:55:36 +02:00
neil
f59f484c01 Merge pull request #2657 from gildea/master
Return failure when falling through limiting loop
2020-01-01 18:28:30 +08:00
gildea
a44ea0ddf0 Return failure when falling through limiting loop
In _send_signed_request and _check_dns_entries, return 1 when the
timeout (or number of retries) has been exhausted.  This allows
the calling function to correctly handle the error.
2019-12-31 20:22:08 -08:00
Marco4223
2214507db0 Revert "Update dns_kas.sh"
This reverts commit 99c47dd50a.
2019-12-29 10:59:28 +01:00
Marco4223
a138425417 Update dns_kas.sh
sorry for this commit.  ;)
Fix NewBeMistakes
2019-12-28 23:42:46 +01:00
Marco4223
99c47dd50a Update dns_kas.sh
only bash needed
2019-12-28 22:42:51 +01:00
Marco4223
594b83e7a6 Update dns_kas.sh
remove "rev" command
fix "Error removing txt for domain:_acme-challenge.foo"
2019-12-28 11:58:21 +01:00
neil
76d0ef0851 Merge pull request #2650 from wurzelpanzer/master
Add easyDNS support
2019-12-24 18:31:43 +08:00
wurzelpanzer
549ebbb462 Add easyDNS support 2019-12-21 20:19:02 +01:00
neil
341656ddb9 Merge pull request #2631 from misakaio/add-misaka-support
add acme.sh support for misaka.io dns service
2019-12-19 21:48:16 +08:00
neil
5a3c3b4876 Merge pull request #2604 from cngarrison/master
Added trailing slash to end of each line of DEPLOY_SCRIPT_CMD
2019-12-19 21:35:37 +08:00
Siyuan Miao
375b8dceb7 use append mode to update recordsets 2019-12-14 10:44:57 +08:00
Siyuan Miao
f37546e173 add acme.sh support for misaka.io dns service 2019-12-13 18:46:09 +08:00
Martin Kammerlander
239d53426a Merge remote-tracking branch 'upstream/dev' into all-inkl-kasserver-dns-script 2019-12-12 16:36:41 +01:00
Martin Kammerlander
3ccac629bc Change the loop for sh. 2019-12-12 16:23:42 +01:00
Wout
e8e6feeb0f Use different e-mail. 2019-12-11 17:15:35 +01:00
Wout
c22705a593 Add DNS API support for Constellix. 2019-12-11 17:13:11 +01:00
neil
ec7889dfa8 Merge pull request #2621 from kolargol/master
Fix case sensitive detection of domain in the response request #2617
2019-12-08 10:15:30 +08:00
neil
563d59526f Merge pull request #2623 from GustavGenberg/patch-1
Fix dns_unoeuro add record error
2019-12-08 10:14:54 +08:00
Gustav Genberg
0ffd5de6fc Fix add record error 2019-12-08 00:13:30 +01:00
Zbyszek Żółkiewski
5014f83b86 Fix case sensitive detection of domain in the response request 2019-12-06 09:59:35 +01:00
Martin Kammerlander
953a9b1768 Remove obsolete blank. 2019-11-29 22:51:23 +01:00
Martin Kammerlander
c641b61b26 Fix a few snytax issues 2019-11-29 22:46:44 +01:00
Martin Kammerlander
d87e507865 Merge remote-tracking branch 'upstream/dev' into all-inkl-kasserver-dns-script 2019-11-29 22:27:11 +01:00
Martin Kammerlander
ec1f9841b2 Replace grep -A. 2019-11-29 22:22:26 +01:00
Charlie Garrison
84b0f29d87 Merge branch 'dev' into master 2019-11-26 20:44:48 +11:00
Charlie Garrison
b23e05dbc5 Added trailing slash to end of each line of DEPLOY_SCRIPT_CMD 2019-11-26 20:39:08 +11:00
Stephane Moser
37978b4fe5 Merge branch 'dev' into Add-AWS_API-slowrate 2019-11-22 10:20:25 +00:00
neil
ef15e55947 Merge pull request #2596 from Neilpang/dev
Dev
2019-11-19 22:50:36 +08:00
neilpang
c282dd086f minor 2019-11-16 08:06:21 +08:00
neil
aac9f089d9 Merge pull request #2583 from JohnVillalovos/dev
debug_bash_helper: Use eval as busybox systems have problems
2019-11-15 22:23:07 +08:00
John L. Villalovos
adce8f52e8 debug_bash_helper: Use eval as busybox systems have problems
In _debug_bash_helper use eval as we are seeing issues with busybox
systems having issues with array access. Even though they aren't
actually running the code they appear to be parsing it and failing.

Also older versions of busybox have a bug with eval and double quotes,
so make sure to use single quotes when using eval.

Resolves: #2579
2019-11-13 14:30:19 -08:00
neil
20b64c8900 Merge pull request #2580 from vitaliytv/patch-1
DOCS: typo in notify/mailgun.sh  (sandbox)
2019-11-13 18:09:58 +08:00
neil
66d781a226 Merge pull request #2584 from kolbma/issue1586
Issue1586 - Fix callhook error in manual mode
2019-11-13 18:07:10 +08:00
arlecchino
867ec010ab Fix callhook error in manual mode
Fixes #1586  
Check force manual switch before causing error about it.
2019-11-12 19:58:36 +01:00
neil
ce0c6da9fa Merge pull request #2562 from stilez/master
Create DNS 01 module for Plesk XML API
2019-11-12 15:38:45 +08:00
Martin Kammerlander
e22c5ea800 Merge with Neilpang dev repo. 2019-11-10 17:39:56 +01:00
Phlegx Systems OG
16bfb1727f Merge pull request #3 from dojo90/all-inkl-kasserver-dns-script
support to delete multiple entries
2019-11-10 17:15:01 +01:00
Vitalii Tverdokhlib
f1f14040b8 DOCS: typo 2019-11-09 12:12:30 +02:00
Jesai Langenbach
9cb328966c typo 2019-11-08 08:58:51 +01:00
Jesai Langenbach
0c76890572 whitespace fix 2019-11-08 08:52:10 +01:00
Jesai Langenbach
18fc42e63b typos and integrate suggestions from stilez 2019-11-07 22:06:32 +01:00
Jesai Langenbach
fc8d9df516 fix newline 2019-11-07 14:33:38 +01:00
Jesai Langenbach
afdf8a78c0 fix space 2019-11-07 14:18:09 +01:00
Jesai Langenbach
0b3ae1f972 Add suggestions 2019-11-07 14:10:30 +01:00
rewqazxv
6a5ee72722 format code style 2019-11-06 20:27:12 +08:00
rewqazxv
c6ec8bc0d9 fix sudo issue 2019-11-06 18:57:05 +08:00
stilez
51cfd996eb rmv space 2019-11-05 23:29:51 +00:00
stilez
6d0e4bed4b remove \n in output messages 2019-11-05 23:26:05 +00:00
stilez
05247dc4a4 fix 2019-11-05 21:09:14 +00:00
stilez
43011f3bfa enhance 2019-11-05 21:04:10 +00:00
stilez
38854bd876 bugfix 2019-11-05 21:00:34 +00:00
stilez
a9726bd52f bugfix 2019-11-05 20:58:51 +00:00
stilez
4216c9e8f7 rmv spaces 2019-11-05 19:19:08 +00:00
stilez
a8d670fc0d Rest of sed -r 2019-11-05 19:01:32 +00:00
stilez
cbacc779fc Fix some sed -r, and clean up some variable references ("$1" -> "$varname") 2019-11-05 18:50:39 +00:00
stilez
896778cead Grep fixes and minor improvements 2019-11-05 17:56:20 +00:00
stilez
04b0c62bf9 basic regex's to use \+
Maybe BRE aren't as basic as they sound. But I'm sure `man grep` didn't list the extra syntax of "preceded by backslash" :)  So let's use it
2019-11-04 19:05:44 +00:00
stilez
63a779baa8 remove unnecessary \ 2019-11-04 18:44:14 +00:00
stilez
2d1a776db7 Replace egrep -> basic regex grep
(( ... isn't it annoying that basic regex has * but not + ..... ))
2019-11-04 18:40:12 +00:00
neil
3d2df3ba93 Merge pull request #2571 from Neilpang/dev
sync
2019-11-03 19:42:34 +08:00
neil
eb6238781d Merge pull request #2546 from JohnVillalovos/master
Improve debug capabilities when using bash
2019-11-03 19:41:51 +08:00
neil
6140a3c26b Merge pull request #1925 from kuk/master
Fix Vscale hostedzone
2019-11-03 19:38:35 +08:00
Kukushkin Alexander
6eaf2d67b7 Fix Vscale 2019-11-03 07:21:16 +03:00
neilpang
35b34c43ed fix format 2019-11-02 19:44:43 +08:00
neil
f67a9d2de1 Merge pull request #2569 from johannrichard/patch-1
Add openssh package for ssh.sh deploy support
2019-11-02 14:21:45 +08:00
Johann Richard
05acf28e0d Update Dockerfile 2019-11-02 07:10:50 +01:00
neilpang
5698bec621 fix https://github.com/Neilpang/acme.sh/issues/2566 2019-11-02 09:48:41 +08:00
neil
3ec495225f Merge pull request #2563 from peterkelm/peterkelm-variomedia-dns
Variomedia DNS API
2019-11-02 08:32:02 +08:00
Johann Richard
fee9baca89 Add openssh package
* `acme.sh`'s `ssh.sh` is probably one of the hooks that's most versatile
* By default, it's not installed on `alpine` docker images and therefore is lacking in the `acme.sh` docker image
* This change adds the `openssh` package and therefore the `ssh` and associated commands
2019-11-01 17:59:40 +01:00
peterkelm
bec26ce754 Shellcheck'd 2019-10-31 09:03:35 +01:00
stilez
343d7df57c shellcheck directive 2019-10-30 22:11:16 +00:00
peterkelm
dca6a4bbd5 minor formatting changes 2019-10-30 20:51:16 +01:00
stilez
a32b95544b [[:space:]] -> " " 2019-10-30 17:06:03 +00:00
stilez
2422e0b481 grep -E and sed -E 2019-10-30 17:01:06 +00:00
stilez
3441bd0e7c improve _err message and remove a dubious _debug message. 2019-10-30 10:22:04 +00:00
stilez
05ced9fbc4 edit a comment 2019-10-30 09:53:40 +00:00
stilez
b7c3df455e travis fix 2019-10-30 09:38:03 +00:00
stilez
d7affad059 various small improves 2019-10-29 10:30:00 +00:00
neil
34c3da9117 Merge pull request #2560 from scottkof/aws-dns-avoid-throttle
Avoid API throttling errors in AWS DNS plugin
2019-10-28 22:42:21 +08:00
scottkof
a22d3b2390 Switch from sleep to _sleep 2019-10-28 06:32:08 -07:00
stilez
7c09bdc6e0 renamed 2019-10-27 16:58:58 +00:00
stilez
bc291141b1 fix filename 2019-10-27 16:58:22 +00:00
peterkelm
c1b089d1c3 unused code removed 2019-10-27 16:58:36 +01:00
peterkelm
1271f97b66 fixed dns_variomedia_rm for wildcard certs
fixed dns_variomedia_rm to respect the txtvalue supplied as function parameter
2019-10-27 16:52:51 +01:00
peterkelm
582c77805c variomedia dns api
initial commit for the variomedia dns api implementation
2019-10-27 13:13:22 +01:00
stilez
9eb5f65b8f edit comments 2019-10-27 07:38:22 +00:00
neilpang
00f01a9889 Merge branch 'dev' of github.com:Neilpang/acme.sh into dev 2019-10-27 11:44:22 +08:00
neilpang
671edc33e1 fix background color 2019-10-27 11:43:40 +08:00
stilez
1253357a39 edits to comments 2019-10-27 01:48:02 +00:00
stilez
6df31eb7f5 travis 2019-10-27 01:13:15 +00:00
stilez
9299a83b17 Travis fixes 2019-10-27 01:10:03 +00:00
stilez
a6614abd24 Formatting fixes for Travis 2019-10-27 01:00:59 +00:00
stilez
4c9d99040c Fix (revert) edited .md file 2019-10-27 01:31:17 +01:00
stilez
6ef8adc863 Merge branch 'dev' into master 2019-10-27 01:26:06 +01:00
stilez
a00300f88a revert changes to this file 2019-10-27 01:23:14 +01:00
stilez
274393ac64 Create DNS 01 module for Plesk XML API 2019-10-27 01:09:50 +01:00
stilez
1339b9422d Update for dns pleskxml 2019-10-27 01:04:08 +01:00
stilez
ed9e196bf6 Update list of DNS providers for Plesk XML API 2019-10-27 00:58:33 +01:00
John L. Villalovos
bba5376a36 Improve debug capabilities when using bash
When calling the _debug3() function will print the filename, function
name, and line number when running under bash
2019-10-26 09:07:22 -07:00
scottkof
df3575217a Avoid API throttling errors in AWS DNS plugin 2019-10-25 12:05:15 -07:00
neil
c504506455 Merge pull request #2455 from RolphH/leaseweb-api
Added Leaseweb API for dns-01 verification
2019-10-25 22:41:23 +08:00
neilpang
2a28772312 fix https://github.com/Neilpang/acme.sh/pull/2553#issuecomment-546173277 2019-10-25 22:34:33 +08:00
neilpang
d04c6dd3ac fix https://github.com/Neilpang/acme.sh/issues/2557 and https://github.com/Neilpang/acme.sh/issues/2544 2019-10-25 22:31:36 +08:00
Rolph Haspers
e48daffad9 Fixed error 2019-10-25 13:46:10 +02:00
Rolph Haspers
58642286c9 Fix for SC2039/SC2086 2019-10-25 13:22:19 +02:00
Rolph Haspers
6d62ae226a Small fix 2019-10-25 12:14:53 +02:00
Rolph Haspers
14f6f9ec94 Fixed wrong assignement of var 2019-10-25 11:56:27 +02:00
Rolph Haspers
e10f447b5b Fixed some bugs, tested and working 2019-10-25 11:42:15 +02:00
Rolph Haspers
1d1f61613c Check for root domain via API 2019-10-25 09:25:29 +02:00
Jesai Langenbach
b85c1a8861 Fix additional line 2019-10-25 08:22:15 +02:00
Jesai Langenbach
430956d304 Fix whitespaces 2019-10-25 08:13:35 +02:00
Jesai Langenbach
c0449a3ed2 Only save Attributes if it is set 2019-10-25 08:04:20 +02:00
neil
18ad01533b add space.
fix https://github.com/Neilpang/acme.sh/pull/2553
2019-10-24 09:19:18 +08:00
neil
288049dc95 Merge pull request #2553 from master-nevi/dev
Use more widely supported options for the "tr" command line utility b…y removing the use of the character class representation option. [:space:] => "\t\r\n\v\f"
2019-10-23 22:47:54 +08:00
David Robles
573c8f3b13 Use more widely supported options for the "tr" command line utility by removing the use of the character class representation option. [:space:] => "\t\r\n\v\f" 2019-10-23 07:20:01 -07:00
neil
e85d7a7be5 Merge pull request #2534 from billgertz/patch-2
dnsapi/dns_miab.sh MIAB DNS-01 Validation
2019-10-23 22:07:20 +08:00
neil
7015215f26 Merge pull request #2548 from rserpent/dns_nic
nic.ru dnsapi
2019-10-20 17:02:30 +08:00
rserpent
ffa5472b31 fix whitespaces 2019-10-16 16:25:38 +05:00
rserpent
e00f0b4cf1 Update dns_nic.sh 2019-10-16 15:31:50 +05:00
rserpent
dc5c220e8f dns_nic init 2019-10-16 15:12:21 +05:00
Bill Gertz
933d49b0b0 Style space change
Extra space on empty line 27.
2019-10-14 00:06:08 +02:00
Bill Gertz
9af85f5a7e Updated to use _H1 Authorization: Basic
Updated to use suggested export _H1 env var to supply Authorization Basic credentials. This undocumented support for Basic Authorization, ContentType, etc. needs to be documented in DNSAPI Dev Guide. Removed two stray debugging lines.
2019-10-14 00:01:25 +02:00
Bill Gertz
7ec52145e8 Space style changes.
Local copy of shellcheck somehow missed these, odd.
2019-10-13 20:02:03 +02:00
Bill Gertz
aa6112482d Rewrite to conform to Dev guide
Created _get_root() that tests the requested host is a subdomain to the domains hosted on MailinaBox (MIAB) DNS Server. Created common _miab_rest() used with dns_miab_add(), dns_miab_rm() and _get_root(). Also created barbaric _is_json() to test the response given by the MIAB Custom DNS API at least looks like a JSON file. We should add a hint to use _normalizeJson with JSON responses so _startswith, _endswith won't perplexingly fail.
2019-10-13 19:56:04 +02:00
neil
d035cdcff9 Merge pull request #2537 from master-nevi/master
Use more widely supported options for the "tr" command line utility in dns_freedns.sh
2019-10-10 10:38:17 +08:00
neil
7ad3ddef2a Merge pull request #2539 from temoffey/gcore_cdn
Gcore cdn
2019-10-10 10:35:22 +08:00
neil
38e08bb91f Merge pull request #2434 from dkerr64/FreeDNS
Work around bug in _egrep_o() function
2019-10-10 10:34:26 +08:00
temoffey
252a21e2ae fixed json parse regex for support api gcore_cdn 2019-10-10 00:36:34 +03:00
David Robles
ba7db3edda Use more widely supported options for the "tr" command line utility by removing the use of the character class representation option. Fixes #2536 2019-10-09 08:24:24 -07:00
Bill Gertz
f64b061a28 Style issue
Spaces on blank line on line 133.
2019-10-08 18:46:35 +02:00
Bill Gertz
f323ced4ca Style issues and orphan _postContentType debug fix
Fixed spacing and removed unneeded debug for _postContenetType
2019-10-08 18:24:14 +02:00
Bill Gertz
c06ec7c6ba Removed parameters and unused code for _miab_post
Ok, should have noticed earlier that the calls to the private function _miab_post() never used the _needbase64_ or the __postContentType parameters. Parameters and code to handle them has been factored out.
2019-10-08 18:15:16 +02:00
Bill Gertz
835f9aad91 Um that's a wee bit of nit pick.
'Errant' space removed on blank line on line 147.
2019-10-08 16:47:32 +02:00
Bill Gertz
a4ec9f8b44 Fixed weird spacing on line 180
Um, fixed.
2019-10-08 16:34:56 +02:00
Bill Gertz
47c33d0344 Cleanup/ removed private function _get_root
Function _get_root() copied from acme.sh and is not needed here. Other cleanup as recommended by acme.sh test bot.
2019-10-08 16:29:23 +02:00
Bill Gertz
f500c7abcb dnsapi/dns_miab.sh MIAB DNS-01 Validation
Know I'm new to contorting to this project. I i've broke conventions please let me know what I've screwed up and I'll set it right as quickly as possible.

Propose this as a new DNS-01 validation script to dynamically add challenge DNS records to MailinaBox (MIAB) DNS. MIAB uses a custom DNS API to manage external DNS records.

The script was originally written by Darven Dissek and can be found in his repository: https://framagit.org/DarvenDissek/acme.sh-MIAB-DNS-API/). This has been forked and some slight cleanup applied and change shebang to UNIx shell. The forked repository can be found here: https://github.com/billgertz/MIAB_dns_api.

Wrote to Darven but received no reply. Support for this script has been submitted to the OPNsense project via this pull request: https://github.com/opnsense/plugins/pull/1531
2019-10-08 15:47:39 +02:00
neil
95dd7b5323 Merge pull request #2531 from moose-kazan/master
Fix for dns_vultr.sh
2019-10-06 20:13:19 +08:00
MooSE
65c950e1a4 Update README.md 2019-10-06 15:02:48 +03:00
Vadim Kalinnikov
e484f32b1a - Return shell detect via env 2019-10-06 14:40:57 +03:00
Vadim Kalinnikov
bc396e7a90 Small fix in dns_vultr.sh 2019-10-06 14:38:26 +03:00
neil
ce182f43db Merge pull request #2527 from PeterDaveHello/RemoveTrailingSpaces
Remove trailing spaces in text files
2019-10-05 21:31:46 +08:00
neil
9382d52d55 Merge pull request #2528 from PeterDaveHello/ImproveTravisCI
Use shallow clone to speed up git clone on Travis CI
2019-10-05 21:23:30 +08:00
Peter Dave Hello
dd156d0689 Use shallow clone to speed up git clone on Travis CI
Shallow clone is faster than a normal one, there is no need to clone the
whole history of a repository when we only needs its latest or certain
state of commit.
2019-10-05 21:13:28 +08:00
Peter Dave Hello
ac9f6e3a41 Remove trailing spaces in text files
This issue in the shell scripts will also be detected in the stable
version of shfmt(we are currently using an ancient pre-release of shfmt)
2019-10-05 21:09:24 +08:00
neilpang
1e7534b9d7 fix https://github.com/Neilpang/acme.sh/issues/2518#issuecomment-538474232 2019-10-05 11:59:04 +08:00
Michael Braunoeder
72d800ed10 [DNSAPI] add dns_rcode0.sh - Support for https://my.rcodezero.at/api-doc (#2489)
* first version dns_rcode0.sh

* fixed URLs for ACME calls

* fixed challenge remove

* read & write Token/URL at rm too

* make info messages debug

* typos fixed

* update rrset only if existing challenge is found

* polish error messages and make "detect root zone" scaleable

* fixed formating issues

* code cleanup, remove some unneeded functions

* removed empty lines

* save rcode0 url only if not default
2019-10-05 11:47:57 +08:00
neil
54143ae6d4 sync (#2523)
sync
2019-10-03 21:15:32 +08:00
neilpang
8ef5daa807 minor, update link 2019-10-03 21:14:11 +08:00
neilpang
fa47ea4196 Merge remote-tracking branch 'remotes/origin/master' into dev 2019-10-03 21:12:52 +08:00
jess
683592fa86 Added financial contributors to the README (#2513) 2019-10-03 21:01:05 +08:00
neil
477a04760c support google public dns (#2522)
* support google dns

* let's start 2.8.4
2019-10-03 21:00:30 +08:00
neilpang
b4a62bfa30 let's start 2.8.4 2019-10-03 20:51:06 +08:00
neilpang
10eec7d48c support google dns 2019-10-03 20:37:46 +08:00
neil
b8cc10ab5d Merge pull request #2512 from Neilpang/dev
fix list() performance
2019-09-28 10:56:50 +08:00
neilpang
be0df07dfb fix list() performance
https://github.com/Neilpang/acme.sh/issues/2296
2019-09-28 10:54:31 +08:00
neil
5244097e2d Merge pull request #2504 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/2503
2019-09-24 22:11:59 +08:00
neilpang
1ba4ab2bd1 fix https://github.com/Neilpang/acme.sh/issues/2503 2019-09-24 22:10:36 +08:00
neil
2e855f8983 Merge pull request #2502 from Neilpang/dev
fix HEAD request against the new LE CDN.
2019-09-24 20:54:25 +08:00
neilpang
51b4a9e350 fix HEAD request against the new LE CDN.
wget is fixed
2019-09-24 20:50:24 +08:00
neil
237d28cf83 Merge pull request #2501 from Neilpang/dev
fix HEAD request against the new LE CDN.
2019-09-24 20:02:25 +08:00
neilpang
5723fd112f fix HEAD request against the new LE CDN.
curl is fixed
2019-09-24 20:00:21 +08:00
neil
73b89c554e Merge pull request #2486 from Neilpang/dev
sync
2019-09-17 22:18:30 +08:00
Boot Lee
950d024a11 fix grep error when txt value begin with - char (#2471) 2019-09-14 23:06:25 +08:00
neilpang
815a3be48b fix https://github.com/Neilpang/acme.sh/issues/2478
support `sudo -i` and `sudo -s`
2019-09-14 11:21:55 +08:00
Jesai Langenbach
bfa6e52470 another whitespace 2019-09-12 20:50:20 +02:00
Jesai Langenbach
ec654d2355 More space removing 2019-09-12 17:24:00 +02:00
Jesai Langenbach
dfb4883c93 Some fixes 2019-09-12 17:17:32 +02:00
Jesai Langenbach
4bf1f579f5 Add OPNsense Bind API Support 2019-09-12 16:28:57 +02:00
fgma
b9994e52eb Notify xmpp (#2407)
* notify via xmpp (using sendxmpp)

* fix formatting in notify/xmpp.sh

* minor cleanup
2019-09-05 22:28:47 +08:00
Kent Varmedal
80d63dbb7c Add support for Domeneshop DNS API (#2458)
* Add support for Domeneshop DNS API

* Fix double quotes after build fail

* Fixing formating errors
2019-09-05 22:26:28 +08:00
Phil Porada
6b817d4563 Set TXT record TTL to minimum possible value (#2465) 2019-09-05 22:15:28 +08:00
neilpang
1081d98bf9 support to specify the nginx or site conf for nginx mode.
https://github.com/Neilpang/acme.sh/issues/2469
2019-09-05 22:05:54 +08:00
neilpang
91d82da497 Merge remote-tracking branch 'remotes/origin/master' into dev 2019-09-05 21:48:30 +08:00
neil
0ca46774ac Create FUNDING.yml 2019-09-02 10:36:10 +08:00
Rolph Haspers
f0d6d46766 Added link to API docs 2019-08-19 17:27:19 +02:00
Rolph Haspers
4a81205e04 Styling, trailing space 2019-08-19 16:22:48 +02:00
Rolph Haspers
0ac37981cb Styling, newline removed 2019-08-19 16:04:16 +02:00
Rolph Haspers
400c31d031 Fixed another styling issue (trailing spaces) 2019-08-19 16:01:51 +02:00
Rolph Haspers
54b38086e5 Fix style issues 2019-08-19 15:39:19 +02:00
Rolph Haspers
e0deca33d0 Added Leaseweb API for dns-01 verification 2019-08-19 14:27:23 +02:00
David Kerr
0b2b8b960b Replace grep -o with sed 2019-08-16 22:56:22 -04:00
Sky Chen
9b173dcd71 fixed #2441: dns_namesilo.sh _get_root (#2442)
fixed #2441: dns_namesilo.sh _get_root (#2442)
2019-08-15 14:23:12 +08:00
neil
a3361806ab sync (#2437)
* fix https://github.com/Neilpang/acme.sh/issues/2409 (#2430)

* Add variable exports for Successful Post Hook and Renew Hook calls (#2431)

* fixed json parse regex for support api gcore_cdn (#2381)

* start 2.8.3 Forbidden sudo
2019-08-11 22:43:07 +08:00
neilpang
5bdfdfefbe start 2.8.3 Forbidden sudo 2019-08-11 14:07:36 +08:00
neil
ee38cccad8 sync (#2436)
* fix https://github.com/Neilpang/acme.sh/issues/2409 (#2430)

* Add variable exports for Successful Post Hook and Renew Hook calls (#2431)

* fixed json parse regex for support api gcore_cdn (#2381)
2019-08-11 11:56:59 +08:00
Тимур Яхин
f82ff90f06 fixed json parse regex for support api gcore_cdn (#2381) 2019-08-11 11:41:57 +08:00
David Kerr
9826b8ae69 Merge branch 'dev' of https://github.com/Neilpang/acme.sh into FreeDNS 2019-08-09 21:05:08 -04:00
mleo2003
c7849a43e1 Add variable exports for Successful Post Hook and Renew Hook calls (#2431) 2019-08-06 21:41:12 +08:00
neil
874bd093cb fix https://github.com/Neilpang/acme.sh/issues/2409 (#2430) 2019-08-05 22:35:40 +08:00
neilpang
2cbc04e04d sync 2019-08-05 22:33:51 +08:00
neilpang
143eac092c fix notify message 2019-08-05 22:03:56 +08:00
lcdtyph
d74dfb1f5c IFTTT Webhooks Notification (#2416)
* IFTTT webhooks Notification

* use sh instead of bash

* don't save value that is not set
2019-08-05 21:38:32 +08:00
James Qian
d42cf6daeb dnsapi: fix typo in dns_desec.sh (#2427)
Signed-off-by: James Qian <sotux82@gmail.com>
2019-08-05 21:35:03 +08:00
neilpang
75191e7187 fix https://github.com/Neilpang/acme.sh/issues/2417 2019-07-31 23:22:07 +08:00
neilpang
b9b2cd278b fix https://github.com/Neilpang/acme.sh/pull/2275 2019-07-29 21:12:19 +08:00
neil
55dea4ee9d sync (#2404)
* support jdcloud.com

* fix format

* ttl 3000

* Escape slashes (#2375)

* Change 1.1.1.1 to 1.0.0.1 to probe compatibility (#2330)

As we can see, 1.1.1.1 is not routed or routed to an Intranet devices due to historical reason. Change 1.1.1.1 to 1.0.0.1 will have a better compatibility. I found this problem on my Tencent Cloud server.

* check empty id

* fix error

* Add dnsapi for Vultr (#2370)

* Add Vultr dns api

* PushOver notifications (#2325)

* PushOver notifications, using AppToken, UserKey, and optional sounds

* fix errors

* added dns api support for hexonet (#1776)

* update

* minor

* support new Cloudflare Token format
fix https://github.com/Neilpang/acme.sh/issues/2398

* fix wildcard domain name

* add more info

* fix https://github.com/Neilpang/acme.sh/issues/2377

* fix format

* fix format
2019-07-27 11:48:29 +08:00
neilpang
41c951811e fix format 2019-07-27 11:09:13 +08:00
neilpang
72e7eb6777 fix format 2019-07-27 10:49:11 +08:00
neilpang
9a733a57e7 fix https://github.com/Neilpang/acme.sh/issues/2377 2019-07-24 21:49:26 +08:00
neilpang
45e8bb03e4 add more info 2019-07-23 21:43:00 +08:00
neilpang
54e189616c fix wildcard domain name 2019-07-23 21:36:42 +08:00
neilpang
c25947d544 support new Cloudflare Token format
fix https://github.com/Neilpang/acme.sh/issues/2398
2019-07-22 22:25:50 +08:00
neilpang
80af3d6ada minor 2019-07-22 21:26:47 +08:00
neilpang
93d29a9733 update 2019-07-20 17:09:36 +08:00
Szilárd Pfeiffer
ccc2142b45 added dns api support for hexonet (#1776) 2019-07-20 16:00:38 +08:00
neilpang
28c153a0a2 fix errors 2019-07-20 12:36:28 +08:00
tdk1069
b8e6287774 PushOver notifications (#2325)
* PushOver notifications, using AppToken, UserKey, and optional sounds
2019-07-20 12:30:56 +08:00
Yuri S
8d393ff137 Add dnsapi for Vultr (#2370)
* Add Vultr dns api
2019-07-20 12:26:23 +08:00
neilpang
5c09788ec4 fix error 2019-07-18 22:20:51 +08:00
neilpang
5e970cdca4 Merge branch 'dev' of github.com:Neilpang/acme.sh into dev 2019-07-18 21:07:34 +08:00
neilpang
28cadc5e06 check empty id 2019-07-18 21:05:59 +08:00
Jeff Wang
3cdfa4051d Change 1.1.1.1 to 1.0.0.1 to probe compatibility (#2330)
As we can see, 1.1.1.1 is not routed or routed to an Intranet devices due to historical reason. Change 1.1.1.1 to 1.0.0.1 will have a better compatibility. I found this problem on my Tencent Cloud server.
2019-07-13 23:05:30 +08:00
Honza Hommer
28a9df669d Escape slashes (#2375) 2019-07-13 20:35:09 +08:00
neil
5f94474330 support jdcloud.com (#2390)
fix https://github.com/Neilpang/acme.sh/pull/2390
2019-07-13 20:01:06 +08:00
neilpang
42497028c4 ttl 3000 2019-07-13 19:35:55 +08:00
neilpang
57b16e3ac2 fix format 2019-07-13 17:42:01 +08:00
neilpang
bd9af86de1 support jdcloud.com 2019-07-13 17:33:04 +08:00
David Kerr
2ce9fb9760 Work around bug in _egrep_o() function
_egrep_o() function accepts extended regex and on systems that do not have egrep uses sed to emulate egrep.
This is failing on the specific regex I was using before my last commit... ae66c6f0b4
The problem is that I fixed it by passing in non-extended regex which then fails on systems that do have egrep.  So I am no longer using _egrep_o.
2019-07-11 18:06:56 -04:00
David Kerr
ae66c6f0b4 Fix bug (in egrep regex) reported by @maks2018 in issue 2305
Fix bug reported by @maks2018 in issue https://github.com/Neilpang/acme.sh/issues/2305 by updating the regex in egrep of the subdomain html page.
2019-07-11 15:46:17 -04:00
neil
fe5f34231b Merge pull request #2367 from Neilpang/dev
update
2019-06-30 10:49:38 +08:00
neilpang
d694ee8651 update 2019-06-30 10:48:21 +08:00
neil
89c0b67b8c Merge pull request #2366 from Neilpang/dev
Dev
2019-06-30 10:39:12 +08:00
neil
0e9fbf3c5a Merge pull request #2365 from Neilpang/master
sync
2019-06-30 10:38:36 +08:00
neil
ec40807c54 Merge pull request #2364 from Raphux/master
dns_azure : Multiple domains with same ending bug
2019-06-30 10:37:13 +08:00
Raphaël Berlamont
971a85a6f8 dns_azure : Multiple domains with same ending bug
We have a few domains that ends the same. For example :
  iperfony.com
  perfony.com

The problem was in the _get_root functions, when getting the domain_id :
only the first result "iperfony.com" was returned, because "perfony.com"
is contained in the "iperfony.com" string.

The correction consist of being strict in the regex, adding a slash (/)
so that it will only match on ".*/(perfony.com).*" and not
".*(perfony.com).*".
2019-06-29 18:14:34 +02:00
neil
8e36695bc4 Merge pull request #2182 from maxemann96/oath
Added oathtool to Dockerfile
2019-06-22 23:44:18 +08:00
maxemann96
2e2e056198 Merge branch 'dev' into oath 2019-06-21 23:52:10 +02:00
Maximilian Hippler
e0d4115ed7 Finally added oathtool 2019-06-21 23:43:32 +02:00
neil
6ff3f5d1ff Merge pull request #2346 from Neilpang/dev
sync
2019-06-19 21:51:51 +08:00
neilpang
a2738e8599 minor, add debug info 2019-06-19 21:50:41 +08:00
neilpang
468edfa6cc Merge branch 'dev' of github.com:Neilpang/acme.sh into dev 2019-06-19 21:50:08 +08:00
neilpang
c83f2f98bd fix https://github.com/Neilpang/acme.sh/issues/2300 2019-06-19 21:49:42 +08:00
neil
06f860c8ea Merge pull request #2292 from cngarrison/master
change to routeros native script rather than bash multiline commands
2019-06-19 21:27:32 +08:00
neil
24e574ee09 Merge pull request #2324 from deflorator1980/dns-api-regru
Dns api regru
2019-06-17 22:05:41 +08:00
neil
803b67af9f Merge pull request #2342 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/2341
2019-06-15 08:33:54 +08:00
neilpang
f803c6c0bf fix https://github.com/Neilpang/acme.sh/issues/2341 2019-06-15 08:33:16 +08:00
neil
254feecf21 Merge pull request #2339 from Neilpang/dev
fix  https://github.com/Neilpang/acme.sh/issues/2321
2019-06-14 23:56:50 +08:00
neilpang
c6b6855131 fix https://github.com/Neilpang/acme.sh/issues/2321
https://github.com/Neilpang/acme.sh/issues/2291
2019-06-14 23:55:59 +08:00
neil
9bc45563ee Merge pull request #2338 from Neilpang/dev
Dev
2019-06-14 23:07:43 +08:00
neilpang
882ac74a0c fix issue: clear Le_Vlist earlier 2019-06-14 22:41:28 +08:00
AndreyIsakov
d883a870e1 dnsapi for regru: remove debug info 2019-06-13 19:56:40 +03:00
AndreyIsakov
f2c6e3f65b dnsapi for regru: replace echo by _info() 2019-06-13 19:31:44 +03:00
neil
1ff3dcf138 Merge pull request #2332 from endreszabo/patch-1
Help text suggests bad practice.
2019-06-13 19:30:30 +08:00
Endre Szabo
9b564431b0 Help text suggests bad practice.
Please remove the phrase `No news is good news.` as it suggests to decide to go on with a bad operational habit.

Why I am stating this is because that `no news` also could mean that:
- your `cron` daemon stopped working,
- your MTA has issues (in case or mail notifications of course),
- anything in between the host running `acme.sh` and your client went wrong.

(... and probably you will not notice in time if `acme.sh` would otherwise send an error notification (if it runs anyway))

If you expect a daily mail (using `--notify-level 3`) you can always be sure that `acme.sh` has ran successfully before. You can also tick the `acme.sh` checkbox in the daily operational report of your enterprise. ;)
2019-06-13 12:39:38 +02:00
neil
65058db89f Merge pull request #2071 from awalgarg/dns_maradns
Add support for MaraDNS
2019-06-12 19:34:53 +08:00
AndreyIsakov
487d2a9221 dnsapi for regru: CI linter remove empty line 2019-06-11 20:13:48 +03:00
AndreyIsakov
6151debeab dnsapi for regru: CI linter ok 2019-06-11 19:59:02 +03:00
AndreyIsakov
e05ef230a7 test CI error 2019-06-11 19:37:39 +03:00
neil
685755fe64 Merge pull request #2320 from Neilpang/dev
sync
2019-06-10 22:41:19 +08:00
neilpang
465ece5d25 fix format 2019-06-10 22:40:14 +08:00
neilpang
10d1361a2c add guide link 2019-06-10 22:35:55 +08:00
neil
34617270a5 Merge pull request #2319 from Neilpang/dev
sync
2019-06-10 22:02:02 +08:00
neil
29aa370aa6 Merge pull request #2313 from Neilpang/docker
support deploy docker
2019-06-07 18:19:00 +08:00
Dominic Jonas
1ef7fd3659 support to delete multiple entries 2019-06-05 11:38:41 +02:00
neil
6650072fe6 Merge pull request #2276 from der-berni/dev
updated to work with one.com
2019-06-04 20:53:23 +08:00
neilpang
951bd3a517 minor, check for mkdir 2019-06-03 21:03:03 +08:00
neilpang
2e3ddd3a61 trim quotation marks 2019-06-03 20:55:22 +08:00
neil
dd628514c6 Merge pull request #2308 from honzahommer/feat/notify-postmark
Add notify postmark
2019-06-03 20:11:42 +08:00
neil
c74686a197 Merge pull request #2285 from dkerr64/FreeDNS
Fixes to dns_freedns.sh for multi-part top level domain names
2019-06-03 20:08:10 +08:00
Charlie Garrison
c42dbbfec8 reformatted RouterOS script for shfmt checks 2019-06-03 11:38:39 +10:00
Honza Hommer
ea3678f8c7 Merge branch 'dev' into feat/notify-postmark 2019-06-03 01:56:14 +02:00
Honza Hommer
51099bf148 Add postmark notify 2019-06-03 01:54:04 +02:00
David Kerr
924e0261f9 Update dns_freedns.sh 2019-06-02 13:09:57 -04:00
neilpang
dc5eda7ebb fix savedeployconf 2019-06-02 20:04:36 +08:00
neilpang
aec6636205 add _getdeployconf 2019-06-02 19:36:11 +08:00
neilpang
a18c3ff07d use sh -c 2019-06-02 15:21:08 +08:00
neilpang
64928b28bc trim quotation marks 2019-06-02 11:11:34 +08:00
neilpang
0bbaa51945 fix format 2019-06-02 10:05:24 +08:00
neilpang
561803c0a7 add deploy hook to docker containers 2019-06-01 22:30:25 +08:00
der-berni
1a5279bd6e cleanup according to styleguide 2019-05-31 08:55:21 +02:00
der-berni
534ddf01db try to remove errors in travis-ci
No newline at end of file
2019-05-31 08:34:33 +02:00
der-berni
937d5b5472 try to remove errors in travis-ci 2019-05-31 08:26:48 +02:00
Charlie Garrison
03a407d4df Added additional shellcheck ignores for client-side evaluation warning
Should pass CI tests now
2019-05-29 14:05:20 +10:00
neil
3508e1e6d5 Merge pull request #2298 from kroepke/gcloud-bsd-support
Make dns_gcloud.sh BSD compatible
2019-05-28 20:47:00 +08:00
Kay Roepke
145b1f4fb3 Improve compatibility with *BSD xargs
The --no-run-if-empty option is a GNU extension and the long version isn't supported by *BSD variants.
Instead use the short version (-r) which is present, but ignored as it is the default behavior, in at least FreeBSD: https://www.freebsd.org/cgi/man.cgi?xargs
2019-05-28 13:46:19 +02:00
neil
09bce5e6d6 sync (#2297)
* Create LICENSE.md

* remove _hostingde_parse_no_strip_whitespace function as this breaks API requests

* Fix sessionid parsing on BSD

* Make travis happy. (SC2020)

* fix for https://github.com/Neilpang/acme.sh/issues/2286

* Notify mail update (#2293)

* feat: disable e-mail validation if MAIL_NOVALIDATE is set

* fix: expose _MAIL_BIN variable

* fix: call _mail_body and _mail_cmnd directly to make sure that all used variables are exposed

* fix: update notify/mail.sh

Co-Authored-By: Matej Mihevc <zuexo@users.noreply.github.com>

* fix: remove useless echo, quote eval
2019-05-28 08:47:33 +08:00
Honza Hommer
51447961cb Notify mail update (#2293)
* feat: disable e-mail validation if MAIL_NOVALIDATE is set

* fix: expose _MAIL_BIN variable

* fix: call _mail_body and _mail_cmnd directly to make sure that all used variables are exposed

* fix: update notify/mail.sh

Co-Authored-By: Matej Mihevc <zuexo@users.noreply.github.com>

* fix: remove useless echo, quote eval
2019-05-27 22:45:44 +08:00
der-berni
89e73594eb fixed error in CI 2019-05-25 17:35:40 +02:00
Charlie Garrison
0cddc8a154 change to routeros native script rather than bash multiline commands 2019-05-26 01:32:13 +10:00
Awal Garg
8152309435 Add support for MaraDNS
MaraDNS is a lightweight self-hosting DNS server. This patch adds
support for adding records to zone files stored on the server in the
format expected by MaraDNS. Path to the file should be exported in
MARA_ZONE_FILE environment variable. To reload the configuration
automatically, the user must provide path to the pid file of duende (the
daemonization tool that ships with MaraDNS) in MARA_DUENDE_PID_PATH
(--pid argument to duende).
2019-05-25 16:55:09 +05:30
der-berni
a3089a719f Updated to work with curl
Now works with curl.
Check the root domain.
2019-05-24 09:44:13 +02:00
David Kerr
2cb0b00e3a replace _read_conf() with _readaccountconf() 2019-05-23 18:11:25 -04:00
neil
2aa219e150 Merge pull request #2288 from andreasschulze/master
fix for https://github.com/Neilpang/acme.sh/issues/2286
2019-05-23 22:43:36 +08:00
andreasschulze
93740c997c fix for https://github.com/Neilpang/acme.sh/issues/2286 2019-05-23 16:19:08 +02:00
neil
264ec5bab7 Merge pull request #2284 from devNan0/fix_netcup_parsing_on_bsd
dnsapi: netcup: Fix sessionid parsing on BSD
2019-05-23 21:30:22 +08:00
der-berni
e340593ad1 Revert parameter changes
Revert ONECOM_PASSWORD back to ONECOM_Password
and ONECOM_USER back to ONECOM_User
2019-05-23 09:39:54 +02:00
devNan0
05b6afcd17 Make travis happy. (SC2020) 2019-05-23 08:15:03 +02:00
David Kerr
10994d65be Even blank lines (with spaces) give Travis heartache. Sigh. 2019-05-22 23:01:23 -04:00
David Kerr
a18ce275ab Another Travis CI warning fixed. 2019-05-22 22:54:56 -04:00
David Kerr
66c39a953a Fix warnings from Travis build 2019-05-22 22:50:26 -04:00
David Kerr
09fb9dcd92 Fix bug preventing multipart TLD names to work. And simplify/cleanup the code. 2019-05-22 22:16:46 -04:00
David Kerr
eb5c2e9823 Merge branch 'dev' of https://github.com/Neilpang/acme.sh into dev 2019-05-22 22:05:49 -04:00
devNan0
50d5c4b9ca Fix sessionid parsing on BSD 2019-05-22 17:01:11 +02:00
neil
54708c6131 Merge pull request #2283 from hosting-de/feature/fix-pr2207
remove _hostingde_parse_no_strip_whitespace function as this breaks A…
2019-05-22 22:35:14 +08:00
Oliver Dick
0e9ba9a004 remove _hostingde_parse_no_strip_whitespace function as this breaks API requests 2019-05-22 16:20:28 +02:00
neil
08f10d3cea Merge pull request #2282 from Neilpang/add-license-1
Add license
2019-05-22 22:01:11 +08:00
neil
c2dd7e0f6e Create LICENSE.md 2019-05-22 22:00:39 +08:00
neil
57fc5d28a9 Merge pull request #2272 from Neilpang/dev
sync
2019-05-22 12:58:12 +08:00
Maximilian Hippler
49bdcad4b6 Updated oathtoolkit from edge/testing to edge/community 2019-05-21 18:50:12 +02:00
neil
ef7d259bb7 Merge pull request #2277 from mjthompson/patch-1
Fix typo
2019-05-21 23:04:54 +08:00
mjthompson
688fe131c9 Fix typo 2019-05-21 18:21:54 +08:00
der-berni
68b42a00e0 updated to work with one.com
rev command not found on OpenWrt
CURL does not work, using wget
JSESSIONID replaced with OneSIDCrmAdmin
CSRF_G_TOKEN not needed
2019-05-20 17:40:43 +02:00
David Kerr
7368a790a3 Merge branch 'dev' of https://github.com/Neilpang/acme.sh into dev 2019-05-19 17:11:58 -04:00
neil
527e1b8a16 Merge pull request #2273 from MilanPala/active24_fix_token
Fix saving token for DNS Active24
2019-05-19 18:28:17 +08:00
Milan Pála
f6d6658de7 Fix saving token for DNS Active24 2019-05-19 11:47:19 +02:00
neil
6a929d6a1a Merge pull request #2264 from honzahommer/notify-slack
Add slack notify
2019-05-19 08:29:23 +08:00
neil
ae380cb21e Merge pull request #2259 from honzahommer/notify-sendmail
Add mail notify
2019-05-19 08:28:43 +08:00
neilpang
cf4c603362 fix format 2019-05-19 08:05:40 +08:00
Honza Hommer
d83c9da830 add clearaccountconf MAIL_BIN 2019-05-18 18:21:19 +02:00
Honza Hommer
9a7c9e8d98 remove unset 2019-05-18 18:20:16 +02:00
neilpang
ace947e6b3 add dns_durabledns.sh 2019-05-18 21:00:39 +08:00
neil
5f9378569b Merge pull request #2268 from Neilpang/dev
sync
2019-05-17 22:53:20 +08:00
neilpang
a180b95cca add more debug info 2019-05-17 20:16:26 +08:00
Honza Hommer
73bbe25d26 add slack notify 2019-05-13 19:49:16 +02:00
Honza Hommer
fc5e3a0aec remove echo command 2019-05-13 18:59:58 +02:00
Honza Hommer
7625d66259 wip 2019-05-13 18:58:28 +02:00
Honza Hommer
30f2c2bd77 prevent _MAIL_BIN modification 2019-05-13 18:11:44 +02:00
Honza Hommer
e3052c8c57 expose MAIL_BIN variable 2019-05-13 17:44:04 +02:00
Honza Hommer
7b6ebc5c98 try to use ACCOUNT_MAIL if MAIL_FROM is not set 2019-05-13 17:42:07 +02:00
neilpang
0093dc3d32 fix https://github.com/Neilpang/acme.sh/issues/2256 2019-05-13 23:30:31 +08:00
neil
ccefd3be02 Merge pull request #2255 from mdbraber/update-acmeproxy
dns_acmeproxy: Username/password no longer required
2019-05-13 22:47:18 +08:00
Honza Hommer
d509ef7581 make MAIL_FROM not required 2019-05-13 16:06:24 +02:00
Maarten den Braber
5e165819a1 Update authentication logic / info 2019-05-13 08:45:57 +02:00
Honza Hommer
d180f01b45 typos 2019-05-12 22:28:37 +02:00
Honza Hommer
91c09dd0a0 ssmtp 2019-05-12 20:26:31 +02:00
Honza Hommer
f6ca92337b remove unsupported options from mail and mutt command 2019-05-12 20:24:02 +02:00
neil
ade9d662db Merge pull request #2210 from chasefox/dev
Fix gcloud most-specific zone match
2019-05-12 21:58:44 +08:00
neil
baca196da6 Merge pull request #1878 from Ne-Lexa/dev
Added dns api support for internet.bs
2019-05-12 20:35:51 +08:00
Honza Hommer
10801bfb25 use mutt if installed 2019-05-12 13:06:45 +02:00
Honza Hommer
a89a62071b cleanup, lint 2019-05-12 13:03:01 +02:00
wapplay
657051e4b6 Merge branch 'dev' of https://github.com/Neilpang/acme.sh into dev
# Conflicts:
#	README.md
#	dnsapi/README.md
2019-05-12 13:36:01 +03:00
Honza Hommer
f6f6d89e06 move sendmail notify to mail notify 2019-05-12 10:41:32 +02:00
neil
1a6af5d896 Merge pull request #1582 from v0s/pddfixes
Multiple fixes to Yandex DNSAPI plugin
2019-05-12 15:40:17 +08:00
neilpang
a4b83895a3 fix https://github.com/Neilpang/acme.sh/issues/2258 2019-05-12 15:34:58 +08:00
Honza Hommer
4f03548608 typos 2019-05-12 00:35:47 +02:00
Honza Hommer
773e1d4e05 use hostname function instead of HOSTNAME env variable 2019-05-12 00:34:46 +02:00
Honza Hommer
d9ef8c1779 add sendmail notify 2019-05-12 00:25:36 +02:00
Maarten den Braber
f9e3a2132f Username/password no longer required 2019-05-09 21:14:26 +02:00
neil
9ab318cafc Merge pull request #2250 from mdbraber/add-acmeproxy-provider
Add acmeproxy provider
2019-05-08 22:17:34 +08:00
neilpang
1a126b700f fix https://github.com/Neilpang/acme.sh/issues/2252 2019-05-08 22:13:33 +08:00
neil
92dd5e1610 Merge pull request #2253 from Neilpang/dev
sync
2019-05-08 22:09:35 +08:00
neilpang
11ecbd27be fix punycode domain 2019-05-08 22:07:27 +08:00
Maarten den Braber
585ef998d0 Fixed CI errors 2019-05-07 16:47:23 +02:00
Maarten den Braber
c297aff99b Improved logging description 2019-05-06 18:31:58 +02:00
Maarten den Braber
68142c9835 Update description 2019-05-06 17:14:31 +02:00
Maarten den Braber
b8f4fa359c Add acmeproxy provider 2019-05-06 17:12:50 +02:00
neilpang
2b765fdedb add set-notify 2019-05-04 11:54:59 +08:00
neil
0accdb9e34 Merge pull request #2248 from Neilpang/dev
add notifications
2019-05-04 11:08:25 +08:00
neilpang
5d468f7ca5 add notifications 2019-05-04 11:06:25 +08:00
neilpang
83768f0531 reduce info message 2019-05-04 11:02:10 +08:00
neilpang
acae0ac2a6 fix RENEW_SKIP code 2019-05-04 10:59:00 +08:00
neilpang
0f86651089 fix idn 2019-05-04 10:43:39 +08:00
neilpang
a77f2fa424 remove test file 2019-05-04 10:32:01 +08:00
neilpang
6198e43fe6 fix idn 2019-05-04 10:21:15 +08:00
neilpang
621d4745b4 fix idn 2019-05-04 10:18:42 +08:00
neilpang
dac75a1dda rename 2019-05-03 20:50:42 +08:00
neilpang
f1c0f3d45f Merge branch 'dev' of https://github.com/Neilpang/acme.sh into dev 2019-05-03 20:49:02 +08:00
neil
08b6a2c36d Merge pull request #2098 from diseq/dev
one.com dns api
2019-05-03 20:48:27 +08:00
neil
130b67821c Merge branch 'dev' into dev 2019-05-03 20:46:16 +08:00
neil
b902769fa8 Merge pull request #2242 from plantroon/master
Add NLnetLabs NSD
2019-05-03 20:38:20 +08:00
neil
7503a58d1f Merge pull request #2243 from mod242/master
New API for Schlundtech.de
2019-05-03 20:35:34 +08:00
mod242
096ce1a207 Create DNS API for Schlundtech 2019-05-02 12:18:16 +02:00
Jakub Filo
d1ef039e39 Removed trailing line 2019-05-01 12:25:46 +02:00
Jakub Filo
040ca5320d Fixed style to match upstream 2019-05-01 12:17:54 +02:00
neil
625c85291d Merge pull request #2236 from mod242/master
Correct parsing error in sed
2019-05-01 15:14:14 +08:00
neil
b28835a604 Update haproxy deploy hook (#1591)
* implement basic haproxy deploy

HAProxy requires the certificate chain and key to be concatenated and placed somewhere (can be anywhere). This script expects a single environment variable with the path where the concatenated PEM file should be written

* add docs for HAProxy deployment

* Add conditional check to ensure path is provided

* remove whitespace

* remove more whitespace (trying to get TravisCI working)

* add reload

* update for POSIX compliance

* add documentation for reload command

* Update haproxy deploy hook

Add functionality to add OCSP stapling info (.ocsp file), issuer (.issuer file) and multi-cert bundles (suffix on pem file based on key type).

This also corrects the order of key, certificate and intermediate in the PEM file, which although HAProxy does not seem to care, was incorrect in the prior version.

* Document updated haproxy deploy hook

* Fix variable name

* whitespace fixes

* Support HAPROXY_DEPLOY_PEM_PATH

Adds compatibility to original haproxy deploy hook while still allowing custom PEM file name (via HAPROXY_DEPLOY_PEM_NAME)

* update for new haproxy deploy vars

* Fix return from reload

* Fix Le_Keylength case

* Update cert suffix for bundles .ocsp generation

* Whitepspace

* Change default for reload

* Readme update

* Actually set reload default

* Fix README.md confict
2019-05-01 15:13:42 +08:00
Тимур Яхин
6340704173 fixed line breaks for support api gcore_cdn (#2237) 2019-05-01 15:11:39 +08:00
Jakub Filo
522b7c51f7 Adding NLnetLabs NSD API 2019-05-01 01:53:51 +02:00
neilpang
388ff75260 --- Auto-Git Commit --- 2019-04-30 20:43:10 +08:00
andrewheberle
37ef0a0cb6 Fix README.md confict 2019-04-30 15:32:36 +08:00
mod242
d7be2c5b8a Remove from Master Branch 2019-04-29 16:17:24 +02:00
neil
b50e701cae Add notification (#2241)
* add cron notify

* fix format

* fix format
2019-04-29 22:13:54 +08:00
neilpang
b7a0443091 lets start 2.8.2 2019-04-29 22:11:25 +08:00
neil
a8f0fd1fff Merge pull request #2240 from Neilpang/dev
use mutable
2019-04-29 21:59:42 +08:00
neilpang
a89d50d34e use mutable 2019-04-29 21:52:22 +08:00
neil
6489cfbce6 Merge pull request #2239 from Neilpang/dev
sync
2019-04-29 21:46:10 +08:00
neilpang
d10f40f109 fix idn issue. 2019-04-29 21:44:25 +08:00
mod242
175b56b43c Update dns_schlundtech.sh 2019-04-29 12:18:05 +02:00
mod242
9b68a3ef4a Update dns_schlundtech.sh 2019-04-29 12:13:40 +02:00
mod242
345d6c5687 Update dns_schlundtech.sh 2019-04-29 10:44:23 +02:00
mod242
5b1b5cc8f2 Create dns_schlundtech.sh 2019-04-29 10:43:16 +02:00
mod242
1b062ab929 Correct sed parsing error 2019-04-28 15:58:08 +02:00
neilpang
a7420ca3d4 typo 2019-04-27 09:17:26 +08:00
neil
4dcd1f3e65 Merge pull request #2233 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/2195
2019-04-26 23:59:32 +08:00
neilpang
e46b392a8d Merge branch 'dev' of https://github.com/Neilpang/acme.sh into dev 2019-04-26 23:58:09 +08:00
neilpang
47ff768b70 fix https://github.com/Neilpang/acme.sh/issues/2195 2019-04-26 23:57:40 +08:00
neil
ba4bd3ed55 Merge pull request #2232 from Neilpang/dev
sync
2019-04-26 23:52:01 +08:00
neil
68428a5d5e Merge pull request #2205 from kirpichiki/dns_cf_invalid_domain
CloudFlare dns invalid domain
2019-04-26 23:50:50 +08:00
neil
28694e8afb Merge pull request #2207 from Kimmax/dns_hostingde_missing_templateValues
dns_hostingde.sh zoneConfig missing templateValues object
2019-04-26 23:49:41 +08:00
neil
c420a0ae2b Merge pull request #2222 from dim0x69/master
Implement Update Account Information for ACMEv2
2019-04-26 23:49:10 +08:00
neil
a85e50f465 Merge pull request #2229 from mod242/master
Create DDNSS API based on the work of helbgd
2019-04-26 23:47:19 +08:00
neilpang
4962cc3da8 fix idn issues 2019-04-26 23:44:25 +08:00
mod242
bb703281a2 Update dns_ddnss.sh 2019-04-25 16:18:52 +02:00
neilpang
52f5564122 fix image links 2019-04-25 20:58:13 +08:00
neil
1dc420ce51 Merge pull request #2139 from loonies/dns-loopia-api-endpoint
Make the Loopia API endpoint configurable
2019-04-25 20:52:38 +08:00
mod242
20af1ceb7d Cleanup comment 2019-04-24 19:38:07 +02:00
mod242
ec982ccacb Cleanup according to styleguide 2019-04-24 16:15:01 +02:00
mod242
a97e74b2d4 Update dns_ddnss.sh 2019-04-24 16:05:44 +02:00
mod242
fecc5b09f8 Removed -e and changed tail to funktion 2019-04-24 14:57:48 +02:00
mod242
d1030eb0b2 Create DDNSS API based on the work of helbgd 2019-04-24 14:03:54 +02:00
David Kerr
fb749dc526 Merge branch 'dev' of https://github.com/Neilpang/acme.sh into dev 2019-04-21 10:12:51 -04:00
neilpang
e6df1828d9 fix https://github.com/Neilpang/acme.sh/issues/2192 2019-04-21 12:37:26 +08:00
neilpang
9ff53fea98 Merge branch 'dev' of https://github.com/Neilpang/acme.sh into dev 2019-04-21 12:23:57 +08:00
neilpang
4f1888d2ea fix https://github.com/Neilpang/acme.sh/issues/2192 2019-04-21 12:23:06 +08:00
neil
53dcd0dee9 Merge pull request #2224 from honzahommer/feat-install-noprofile
Add `--noprofile` option to `install` command
2019-04-20 13:19:27 +08:00
neil
e291ada371 Merge pull request #2226 from Neilpang/dev
sync
2019-04-20 13:09:38 +08:00
neilpang
9c9fed749a fix https://github.com/Neilpang/acme.sh/issues/2225
make NSUPDATE_SERVER can be overwritten
2019-04-20 12:49:51 +08:00
Honza Hommer
61556a54e2 feat: add --noprofile option to install command 2019-04-19 17:27:32 +02:00
dim0x69
79e2f8a2e5 implement account update for acmev2 2019-04-17 14:51:07 +02:00
neil
d1f39e6217 Merge pull request #706 from palhaland/dev
Shell script for deploying changes to a routeros server.
2019-04-10 20:49:05 +08:00
chasefox
4aa488f48b Formatting - indentation
I think this is what CI wants....
2019-04-08 07:51:39 -04:00
chasefox
2d72b25c43 CI wanted double-quote 2019-04-08 07:44:41 -04:00
chasefox
f23b0aacd7 Remove here string
CI doesn't want here strings
2019-04-08 07:11:08 -04:00
Matthew R Chase
98d27c4a6a Fix most-specific zone match
Most specific zone selected by deepest sub-domain (how many '.' in the domain)
rather than seemingly irrelevant count of the number of characters within the zone.
2019-04-07 15:04:03 -04:00
neil
d01ab227b8 Merge pull request #2209 from Neilpang/dev
sync
2019-04-06 23:06:36 +08:00
neilpang
0cfeee4ded fix format 2019-04-06 16:48:17 +08:00
neilpang
c97e43dcd6 fix format 2019-04-06 16:45:58 +08:00
neilpang
eda321954d fix https://github.com/Neilpang/acme.sh/issues/2208 2019-04-06 16:05:08 +08:00
Kimmax
64e5392788 Zone delete also needs new "templateValues" field 2019-04-02 23:29:58 +00:00
Kimmax
987f95221c Added missing "templateValues" object to "zoneConfig" on "_hostingde_getZoneConfig" 2019-04-02 23:08:39 +00:00
Gorbachev
6e917d156c Trim double quotes for email and key
Currently dns_cf generates headers like this: 'X-Auth-Email: "sample@mail.com"'. Cloudflare API responses 400 BadRequest for quoted headers with message "Invalid format for X-Auth-Email header".
2019-04-02 18:05:52 +03:00
Stephane Moser
aeed287122 Add Double quote to slowrateslepp 2019-04-02 10:27:22 +01:00
neilpang
36e697b344 Merge branch 'dev' of https://github.com/Neilpang/acme.sh into dev 2019-03-31 21:46:45 +08:00
neilpang
c2d0d4d28c root domain as dns alias mode 2019-03-31 21:46:14 +08:00
Stephane Moser
ea6a3c0963 Use AWS_DNS_SLOWRATE env variable instead of arg 2019-03-29 14:39:32 +00:00
Stephane Moser
8902a5c5cd Revert "Add --dnsslowrate arg"
This reverts commit 16db9a7337.
2019-03-29 14:33:15 +00:00
Stephane Moser
3021c5cfad Use dnsslowrate arg 2019-03-29 14:12:50 +00:00
Stephane Moser
16db9a7337 Add --dnsslowrate arg 2019-03-29 14:12:34 +00:00
Miodrag Tokić
aec9c3c9a4 Double quote unquoted variables
Double quote unquoted variables to prevent globbing and word splitting.
2019-03-28 16:34:13 +01:00
Miodrag Tokić
0daa225e26 Make the Loopia API endpoint configurable
Loopia provides hosting in several countries. Each hosting location has
it's own API endpoint, such as "https://api.loopia.<TLD>/RPCSERV", where
<TLD> is one of: com, no, rs, se.

The current LOOPIA_Api variable is hard-coded to ".se". This prevents
using the Loopia DNS API on other hosting locations.

This commit makes the LOOPIA_Api variable configurable and it falls back
to ".se" TLD if LOOPIA_Api is not set.

References:

 - https://www.loopia.com/api/authentication/
 - https://www.loopia.no/api/authentication/
 - https://www.loopia.rs/api/authentication/
 - https://www.loopia.se/api/authentication/
2019-03-27 13:58:23 +01:00
Miodrag Tokić
85be2b85fd Fix error message language 2019-03-27 13:58:23 +01:00
Miodrag Tokić
a7d6146169 Extract configuration saving code to function 2019-03-27 13:58:23 +01:00
Miodrag Tokić
978ec91107 Extract configuration loading code to function 2019-03-27 13:58:23 +01:00
neil
297859c5bc Merge pull request #2191 from temoffey/gcore_cdn_deploy
fix gcore_cdn_deploy
2019-03-23 21:46:40 +08:00
temoffey
bea52aa743 remove use grep -E 2019-03-23 16:29:33 +03:00
neil
54f1be69c7 Merge pull request #2190 from Neilpang/dev
sync
2019-03-23 16:51:40 +08:00
neil
a4cc9ef2cc Merge pull request #2178 from temoffey/gcore_cdn_deploy
Gcore cdn deploy
2019-03-23 11:06:16 +08:00
neil
4f47594b6d Merge pull request #2189 from scj643/master
Fixed Digital Ocean dns api
2019-03-23 10:57:39 +08:00
Charles Surett
189a7766d4 Made dns_dgon.sh use _lower_case
Fixed private function which breaks on embedded systems before.
2019-03-22 18:43:06 -04:00
temoffey
df9174577a remove check jq 2019-03-22 23:00:47 +03:00
temoffey
bd1bb7a71b fix syntax 2019-03-22 20:08:35 +03:00
temoffey
4b6e7e6c37 remove use while, [[ ]], array 2019-03-22 20:02:59 +03:00
temoffey
8896642e25 fix syntax 2019-03-22 20:01:39 +03:00
temoffey
0ecb5a3fec fix syntax 2019-03-22 04:31:58 +03:00
temoffey
d289b0b450 fix syntax 2019-03-22 04:21:41 +03:00
temoffey
b8489464b3 remove use awk, jq, curl 2019-03-22 03:41:26 +03:00
Pål Håland
ebaa3f39e4 Merge remote-tracking branch 'origin/dev' into dev 2019-03-21 15:54:02 +01:00
Pål Håland
e19753dcde Moved documentation from deploy/README.md to deploy/routeros.sh 2019-03-21 15:53:11 +01:00
neil
13255a3762 Merge pull request #2185 from Neilpang/dev
syc
2019-03-21 22:26:24 +08:00
neil
15ce2a3d67 Merge pull request #2161 from sotux/dev
dnsapi: add deSEC.io api support
2019-03-21 20:02:24 +08:00
James Qian
3bb97b81de dnsapi: add deSEC.io api support
Signed-off-by: James Qian <sotux82@gmail.com>
2019-03-21 10:58:13 +08:00
Maximilian Hippler
9247780073 Added oathtool to Dockerfile 2019-03-20 22:34:50 +01:00
neil
37161d3017 Merge pull request #2105 from TheLastProject/feature/dns-openprovider
Add OpenProvider support
2019-03-20 23:18:43 +08:00
Sylvia van Os
4532037e4f Merge branch 'dev' into feature/dns-openprovider 2019-03-20 16:12:57 +01:00
Sylvia van Os
0fe08e1b33 Merge branch 'dev' into feature/dns-openprovider 2019-03-20 16:12:08 +01:00
neilpang
236acbd6e8 move to wiki 2019-03-20 23:11:13 +08:00
temoffey
16b0704acc remove readme 2019-03-20 18:10:53 +03:00
neilpang
61bcd67a5d move to wiki 2019-03-20 23:03:49 +08:00
neilpang
0629c2a086 move to wiki 2019-03-20 23:01:24 +08:00
neilpang
fbdc5a0eb5 fix https://github.com/Neilpang/acme.sh/issues/2179 2019-03-20 22:52:40 +08:00
neil
68a8d81b6a Merge pull request #2177 from vbrandl/feature/deploy-mailcow
Add deploy hook for mailcow
2019-03-20 21:13:26 +08:00
neil
a368301dbf Merge pull request #2176 from bz-heilig/patch-1
Update README.md
2019-03-20 20:40:49 +08:00
temoffey
89989adcad fix syntax 2019-03-20 14:05:18 +03:00
temoffey
95cdb4b2bc fix syntax 2019-03-20 14:02:11 +03:00
temoffey
228c835466 gcore_cdn_deploy 2019-03-20 03:03:10 +03:00
Valentin Brandl
d604166194 Fix formatting 2019-03-19 19:15:31 +01:00
Valentin Brandl
d643a2ff13 Check if mailcow path is set and fix directory check 2019-03-19 19:09:25 +01:00
Valentin Brandl
b581a171f0 Add documentation for mailcow deploy hook 2019-03-19 18:43:07 +01:00
Valentin Brandl
307336cfc4 Add deploy hook for mailcow
This hook will copy the key and certificate chain to the specified
mailcow installation (as described in
https://mailcow.github.io/mailcow-dockerized-docs/firststeps-ssl/#use-own-certificates)
and restarts the containers, that are using the certificates.

The hook has 2 parameters:

* `DEPLOY_MAILCOW_PATH`: The path to the mailcow installation (required)
* `DEPLOY_MAILCOW_RELOAD`: The reload command, defaults to `docker-compose restart postfix-mailcow dovecot-mailcow nginx-mailcow`
2019-03-19 18:42:47 +01:00
neil
fc30171725 Merge pull request #2175 from loial/dns_gdnsdk_fix
dns_gdnsdk: Fixed stupid regex error, want literal "-", not a range
2019-03-19 22:20:15 +08:00
bz-heilig
34be7e99f0 Update README.md
Added links for do.de API token creation and documentation of API.
2019-03-19 15:04:37 +01:00
Herman Sletteng
7679df062c dns_gdnsdk: Fixed stupid regex error, want literal "-", not a range 2019-03-19 14:16:13 +01:00
Sylvia van Os
71cfd874ae Fix SC2116 2019-03-18 16:10:58 +01:00
Sylvia van Os
08be0c374a Merge branch 'feature/dns-openprovider' of https://github.com/TheLastProject/acme.sh into feature/dns-openprovider 2019-03-18 15:59:08 +01:00
Sylvia van Os
7decce9718 Resolve comments on pull request 2019-03-18 15:43:52 +01:00
Sylvia van Os
22bab90a90 Merge branch 'dev' into feature/dns-openprovider 2019-03-18 12:54:19 +01:00
neil
02882fb327 Merge pull request #2168 from Neilpang/dev
sync
2019-03-17 23:33:02 +08:00
neilpang
c74d597c84 add debug info 2019-03-16 18:34:44 +08:00
neilpang
653c77e852 update 2019-03-16 15:09:49 +08:00
neilpang
2b36f4f57f update 2019-03-16 15:07:34 +08:00
neilpang
82b0ebb787 minor, remove dns records only when it's added success 2019-03-16 14:53:02 +08:00
neilpang
3f35006c26 fix error message 2019-03-16 14:35:33 +08:00
neilpang
2ffd8637e1 fix standalone content 2019-03-16 14:28:24 +08:00
neil
44c1572b8f Merge pull request #2166 from Neilpang/dev
sync
2019-03-16 14:18:49 +08:00
neilpang
d0d749074e fix for solaris 2019-03-16 14:00:15 +08:00
neilpang
dbc44c08df fix for solaris 2019-03-16 13:38:17 +08:00
Steven M. Miano
46fbd7f1e1 support ultradns.com api (#2117)
support ultradns.com api (#2117)
2019-03-14 20:41:13 +08:00
tambetliiv
5048c6c22a Add zone.ee (zone.eu) DNS API (#2151)
* add zone.ee (zone.eu) dns api
2019-03-14 20:20:39 +08:00
neil
709d82e764 sync
sync
2019-03-13 21:32:10 +08:00
neil
9d64b35ed8 Merge pull request #2157 from hosting-de/fix/read-endpoint
hosting.de: reading endpoint
2019-03-13 21:29:59 +08:00
neil
0f00862e5e support windows scheduler (#2158)
* support Windows scheduler. fix https://github.com/Neilpang/acme.sh/issues/2145
2019-03-13 21:28:30 +08:00
Oliver Dick
532e79c7d0 Fix reading endpoint 2019-03-13 14:14:40 +01:00
neilpang
4ebad10557 fix format 2019-03-13 21:11:59 +08:00
neilpang
0b04a7f17f fix format 2019-03-13 20:49:26 +08:00
neilpang
77f96b386e support Windows scheduler. fix https://github.com/Neilpang/acme.sh/issues/2145 2019-03-13 20:42:02 +08:00
Sylvia van Os
ea86ddc693 Merge branch 'dev' into feature/dns-openprovider 2019-03-13 10:22:40 +01:00
neil
e3e43d0ba0 Merge pull request #2155 from Neilpang/dev
sync
2019-03-12 22:20:00 +08:00
neil
b10929fe23 Merge pull request #2154 from Neilpang/vv
use acme v2 as default
2019-03-12 22:17:35 +08:00
neil
f512cb8e35 Merge pull request #2081 from nederhost/master
Add support for NederHost DNS API
2019-03-12 22:06:47 +08:00
Sebastiaan Hoogeveen
4f240f538d Merge branch 'master' of https://github.com/nederhost/acme.sh 2019-03-12 14:39:26 +01:00
Sebastiaan Hoogeveen
db6db6a4e9 Removed overwriting of the HTTP header file before sending a request. 2019-03-12 14:36:42 +01:00
neilpang
f2add8de94 use acme v2 as default 2019-03-12 21:16:15 +08:00
Sebastiaan Hoogeveen
88c6621cfe Merge branch 'dev' into master 2019-03-12 11:59:13 +01:00
neil
c152b6f0ad Merge pull request #2152 from Neilpang/dev
sync
2019-03-11 21:32:28 +08:00
neilpang
53c0188248 fix https://github.com/Neilpang/acme.sh/issues/2150 2019-03-11 21:30:24 +08:00
neilpang
725addafda fix format 2019-03-09 09:13:49 +08:00
Sylvia van Os
19628c4732 Merge branch 'dev' into feature/dns-openprovider 2019-03-08 16:44:36 +01:00
Sylvia van Os
04eaf7f175 Add OpenProvider support 2019-03-08 16:42:52 +01:00
neilpang
f5850d0c08 fix format 2019-03-08 22:20:56 +08:00
neil
855eb8355a Merge pull request #2143 from 5ll/core-networks-support
Adding Support for Core-Networks API
2019-03-08 22:14:41 +08:00
neil
fdbb7fd30f Merge pull request #2144 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/2141
2019-03-08 22:09:12 +08:00
5ll
30d0ac0784 Updated README with Core-Networks support 2019-03-08 10:48:06 +01:00
5ll
3d5c75420a Changed Order 2019-03-08 10:46:35 +01:00
5ll
1d5967d143 Updated README with Core-Networks support 2019-03-08 10:45:36 +01:00
5ll
110a41d18d initial commit
DNS API for acme.sh for Core-Networks (https://beta.api.core-networks.de/doc/)
2019-03-08 10:33:09 +01:00
neil
a3d8b9935a fix https://github.com/Neilpang/acme.sh/issues/2141 2019-03-08 14:31:11 +08:00
neil
08357e3cb0 Merge pull request #2137 from Neilpang/dev
Dev
2019-03-05 21:50:47 +08:00
neil
162a445a50 Merge pull request #2136 from Neilpang/cmd
Cmd
2019-03-05 21:47:50 +08:00
neilpang
c7257bcf46 base64 hooks, fix https://github.com/Neilpang/acme.sh/issues/1969 2019-03-05 21:44:34 +08:00
neilpang
dfca8c09e0 fix format 2019-03-05 21:22:03 +08:00
neilpang
7690f73e81 base64 encode reloadcmd.
fix https://github.com/Neilpang/acme.sh/issues/2134
2019-03-05 21:05:10 +08:00
Pål Håland
86fbb5952e Use env sh 2019-03-02 16:39:41 +01:00
Sebastiaan Hoogeveen
78c92642e4 Merge branch 'dev' into master 2019-03-02 13:58:56 +01:00
neilpang
b3f6129718 fix https://github.com/Neilpang/acme.sh/issues/2122 2019-03-02 20:44:08 +08:00
neil
2a52603b7e Merge pull request #2128 from the729/fix-qiniu-base64
fix deploy/qiniu.sh base64
2019-03-01 22:44:23 +08:00
neil
e6f9f258ec Merge pull request #2129 from the729/fix-qiniu-doc
fix doc of qiniu deploy script
2019-03-01 22:40:45 +08:00
tianji
22e7b4c911 fix doc of qiniu deploy script
A leading dot should be included when updating wildcard domains.
2019-02-28 23:51:43 +08:00
tianji
af5f7a7779 fix deploy/qiniu.sh base64
According to the doc (https://developer.qiniu.com/kodo/manual/1231/appendix#1), we should use URL-safe base64 instead of plain base64 for token calculation.
2019-02-28 23:43:58 +08:00
neil
693d692a47 sync (#2127)
* Support for MyDevil.net (#2076)

support mydevil

* Fix verification for namecheap domains not *owned* by the calling user (#2106)

* Peb (#2126)

* support pebble
* support async finalize order

* add Pebble
2019-02-27 20:41:50 +08:00
neilpang
81f0189d23 add Pebble 2019-02-27 20:40:10 +08:00
neil
e7f7e96d58 Peb (#2126)
* support pebble
* support async finalize order
2019-02-27 20:36:13 +08:00
Pål Håland
1dab2ac7d3 Updated with latest changes from Neilpang/dev 2019-02-26 17:41:24 +01:00
Timothy Nelson
ec54074392 Fix verification for namecheap domains not *owned* by the calling user (#2106) 2019-02-25 19:19:36 +08:00
dsc
23b4c9c667 add docs for one.com 2019-02-21 08:43:09 +01:00
diseq
472ed721a3 fix format 2019-02-20 21:51:59 +01:00
diseq
ed3f2646f0 fix format 2019-02-20 11:54:48 +01:00
diseq
0499d2b5c4 remove line break 2019-02-20 11:51:06 +01:00
diseq
81ba629b56 allow set-cookie as well as Set-Cookie 2019-02-20 11:27:49 +01:00
diseq
0bb746ba39 Update dns_one.sh 2019-02-20 09:44:25 +01:00
Marcin Konicki
16a0f40ac2 Support for MyDevil.net (#2076)
support mydevil
2019-02-20 09:40:36 +08:00
neil
f84103918a Merge pull request #2101 from Neilpang/dev
Doh (#2100)
2019-02-19 22:01:39 +08:00
neil
b5ca9bbab2 Doh (#2100)
support doh to poll dns status
fix https://github.com/Neilpang/acme.sh/issues/2015
2019-02-19 21:39:06 +08:00
neil
ff38d2bba6 Merge pull request #2099 from Neilpang/dev
Dev
2019-02-18 21:20:35 +08:00
neil
8f2a8a0051 Merge pull request #1357 from martgras/patch-1
avoid side effects in _printargs
2019-02-18 21:16:14 +08:00
neilpang
97147b594b fix https://github.com/Neilpang/acme.sh/issues/2096 2019-02-18 20:57:13 +08:00
dsc
9ff6d6e7b5 initial commit 2019-02-17 23:20:17 +01:00
neilpang
a0ec5b18e7 fx format 2019-02-17 14:26:27 +08:00
neilpang
f2acdd27fd fix tr err for Mac 2019-02-17 14:19:14 +08:00
neil
4ade446b55 Merge pull request #2095 from Augustin-FL/dev
Add online.net DNS API
2019-02-15 22:30:26 +08:00
Augustin-FL
ec6569fbea fix travis 2019-02-15 08:56:09 +00:00
Augustin-FL
1ad6742dbc fix travis 2019-02-15 08:43:07 +00:00
Augustin-FL
63ea3e8d27 acme.sh does not follow Location: headers when using wget 2019-02-15 08:29:44 +00:00
Augustin-FL
9ace7db216 simplify online_rest 2019-02-15 08:08:32 +00:00
Augustin-FL
841513501a update get_root 2019-02-15 08:08:32 +00:00
Augustin-FL
5c94147603 use read/saveconf_mutable, not readconf from OVH 2019-02-15 08:08:10 +00:00
Augustin-FL
02f6d4cb66 use read/saveconf_mutable, not readconf from OVH 2019-02-15 07:56:13 +00:00
Augustin-FL
ec5fad433c Add online.net DNS API 2019-02-14 08:34:21 +01:00
neil
b4fa97fd54 Merge pull request #2090 from ianw/rackdns
Rackspace Cloud DNS
2019-02-13 09:24:35 +08:00
Tom Cocca
d30b441ede Rackspace Cloud DNS
Support Rackspace Cloud DNS

This commit is based on the original pull request by tcocca
  https://github.com/Neilpang/acme.sh/pull/1297

Addtional cleanup was provided by senseisimple in
  https://github.com/Neilpang/acme.sh/pull/1999

This pull request has squashed the changes for review, fixed a minor
(but breaking) problem with the field ordering in the response, and
added documenation per the API guide.

Co-Author: Chris <chris@chrisnovoa.com>
Co-Author: Ian Wienand <ian@wienand.org>
2019-02-13 12:00:05 +11:00
neil
dda29f7e2f Merge pull request #2082 from laszlof/nw_dns_api
Add support for Thermo, Nexcess, and Futurehosting DNS APIs
2019-02-11 23:00:14 +08:00
neil
952e281993 Merge pull request #2077 from hosting-de/fix/better-parsing-of-responses
hosting.de: better parsing of json responses
2019-02-11 22:47:08 +08:00
Oliver Dick
1fa026b9c7 using ' ' instead of '[:space:]' for tr 2019-02-11 11:47:48 +01:00
neil
e8c91e6e12 Merge pull request #2083 from siwyd/ns1-dns-ttl
Set NS1 DNS record TTL to 0
2019-02-10 23:03:07 +08:00
neil
41425f7f74 Merge pull request #2086 from christianbur/patch-3
Update Dockerfile (apline 3.9 and tzdata)
2019-02-10 23:02:19 +08:00
Christian Burmeister
2cf01c23a2 Update Dockerfile 2019-02-09 19:38:32 +01:00
Ne-Lexa
412f85b665 Merge branch 'dev' of https://github.com/Neilpang/acme.sh into dev
# Conflicts:
#	README.md
#	dnsapi/README.md
2019-02-08 12:31:01 +03:00
Simon Wydooghe
ebc90f6ab8 Set NS1 DNS record TTL to 0
Default of a zone might be high, which is annoying when testing
with the ACME staging API. I think setting the TTL to 0 makes sense
as acme.sh is the only one checking this, so having an always up
to date response seems desirable.
2019-02-06 21:49:17 +01:00
Frank Laszlo
84d80e93bc Add support for Thermo, Nexcess, and Futurehosting DNS APIs 2019-02-06 10:42:11 -05:00
Sebastiaan Hoogeveen
b7e92dbced Documentation update. 2019-02-06 14:27:26 +01:00
Sebastiaan Hoogeveen
44dcb0d0a9 Make Travis happy; fixed formatting of return statements. 2019-02-06 11:46:47 +01:00
Sebastiaan Hoogeveen
b3e3e080a9 Cleaned up some of the comments from shellcheck. 2019-02-05 16:37:08 +01:00
Sebastiaan Hoogeveen
1167cdcaec Added DNS API support for NederHost (https://www.nederhost.nl/) 2019-02-05 16:32:41 +01:00
Oliver Dick
4eda39a31d making shellcheck happy 2019-02-04 15:40:45 +01:00
Oliver Dick
759b75ca48 better parsing of json responses
fixes an error if customer does not have access to dns-groups
2019-02-04 11:27:04 +01:00
neil
55e862a4a4 Merge pull request #2068 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/pull/1979
2019-01-30 20:14:10 +08:00
neilpang
227547f826 fix https://github.com/Neilpang/acme.sh/pull/1979 2019-01-30 20:13:23 +08:00
neil
7c41dd5e31 Merge pull request #2064 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/1364#issuecomment-4580…
2019-01-28 19:24:09 +08:00
neilpang
a964646803 fix https://github.com/Neilpang/acme.sh/issues/1364#issuecomment-458035330 2019-01-28 19:11:45 +08:00
neil
9dac02ba5d Merge pull request #2063 from Neilpang/dev
sync
2019-01-27 13:42:50 +08:00
neilpang
43877d2647 fix rm method to urlencode the existing txt records.
fix https://github.com/Neilpang/acme.sh/issues/2052
2019-01-26 20:27:53 +08:00
neilpang
cc6159b39b urlencode the existing txt record value
fix https://github.com/Neilpang/acme.sh/issues/2052
2019-01-26 19:15:13 +08:00
neilpang
43ff787b04 remove tls-sni 2019-01-26 18:32:11 +08:00
neilpang
3633598462 Lets start 2.8.1 2019-01-25 22:39:22 +08:00
neil
94922f2df6 Merge pull request #2053 from Manawyrm/dev
Added dns_doapi.sh
2019-01-25 22:38:11 +08:00
Tobias Mädel
75fe022f96 Changed order in readme, added do.de 2019-01-25 15:26:41 +01:00
Tobias Mädel
bc839569fb Merge branch 'dev' into dev 2019-01-25 14:38:35 +01:00
neil
f62a4a0c0c Merge pull request #2056 from Neilpang/dev
sync
2019-01-25 21:35:29 +08:00
neil
8dacd51abb Merge pull request #1997 from MilanPala/master
Add support for Active24.cz
2019-01-25 21:33:42 +08:00
neil
06302871bc Merge pull request #1543 from Rid/patch-2
Fix DNSimple when zone has > 100 records
2019-01-25 17:31:06 +08:00
Grant Millar
c1ec2afeca Changed records per page to 5000 2019-01-25 09:27:30 +00:00
Tobias Mädel
e2f1338f94 Added documentation 2019-01-24 17:05:01 +01:00
Tobias Mädel
5f9b57d300 Cleaned up dns_doapi.sh 2019-01-24 17:00:37 +01:00
Tobias Mädel
ddf77f10e9 Cleaned up dns_doapi.sh 2019-01-24 16:59:36 +01:00
Tobias Mädel
127532c226 Added dns_doapi.sh 2019-01-24 16:53:03 +01:00
Milan Pála
572adbaad2 Add support for Active24.cz 2019-01-23 14:27:13 +01:00
neil
f4c7822bc9 Merge pull request #2046 from hosting-de/fix/update-to-latest-dns-api
Update hosting.de Plugin to latest API Changes
2019-01-22 11:33:07 +08:00
neil
89561b8d45 Merge pull request #2027 from shonenada/deploy-qiniu
Qiniu deployment support
2019-01-22 11:24:02 +08:00
Oliver Dick
b0775f7a58 making shftm really happy 2019-01-21 16:32:45 +01:00
Oliver Dick
2dc50e6633 making shfmt happy 2019-01-21 15:45:32 +01:00
neil
ad2a3d603e Merge pull request #2047 from Neilpang/dev
sync
2019-01-21 22:32:30 +08:00
neilpang
545f23551f trigger validation before cleanup
fix https://github.com/Neilpang/acme.sh/issues/2037
2019-01-21 22:25:23 +08:00
neilpang
b15c1ffedc clean TXT records when error happens.
https://github.com/Neilpang/acme.sh/issues/2037
2019-01-21 22:09:13 +08:00
Oliver Dick
56d70e4ea7 Update to latest API Changes 2019-01-21 15:02:09 +01:00
neil
0b934232fd Merge pull request #2023 from jim-p/acme-fix-2022
Use cross-platform grep pattern for Namecheap API. Fixes #2022
2019-01-21 19:38:40 +08:00
shonenada
a4a53e1355 Move docs into README.md from README_zh.md 2019-01-21 17:33:09 +08:00
shonenada
c445e70cff fix indent 2019-01-21 14:33:15 +08:00
shonenada
e8eec2cb41 add chinese readme 2019-01-21 00:11:06 +08:00
shonenada
dd6fa4af00 Save QINIU_CDN_DOMAIN only when defined 2019-01-20 23:58:10 +08:00
shonenada
afdb9a63ff chore: replece Le_Deploy_Qiniu_* with QINIU_* 2019-01-19 23:58:55 +08:00
jim-p
10ba2cd312 Use a literal space instead of an escaped space. Fixes #2022 2019-01-14 16:26:22 -05:00
shonenada
4c1fa9c242 save CDN Domain with _savedomainconf 2019-01-14 22:55:05 +08:00
shonenada
3c6b707353 add QINIU_CDN_DOMAIN for wildcard certificate 2019-01-13 12:25:03 +08:00
shonenada
96efc8c7f0 lint codes 2019-01-12 23:11:19 +08:00
shonenada
0cd6afde6f Add guidance to deploying cert to qiniu.com 2019-01-12 21:15:16 +08:00
shonenada
82b11da4ca replace awk with sed and tr 2019-01-12 21:07:22 +08:00
shonenada
4ec39ab707 replace with functions defined in acme.sh 2019-01-12 20:16:28 +08:00
shonenada
d2a60f3ca4 lint code 2019-01-12 15:54:42 +08:00
shonenada
3bc6628227 Update Qiniu's domain settings after uploading certificate 2019-01-12 15:25:36 +08:00
neil
27579e0701 Merge pull request #2012 from bremensaki/pointhq-api
Native PointHQ API
2019-01-12 11:01:14 +08:00
neil
f91bcfeb4b Merge pull request #2021 from krufab/feature/2020-improve-verification-log-readability
Feature/2020 improve verification log readability
2019-01-12 11:00:15 +08:00
shonenada
e19809d5b5 Add deployment for qiniu cdn
Upload certificate and privkey to Qiniu's CDN service with https://developer.qiniu.com/fusion/api/4248/certificate
2019-01-11 18:47:01 +08:00
Fabio Kruger
dd068467de 2020 Added a space to improve log readability 2019-01-10 19:33:25 +01:00
Mike Barnes
3099c799b2 Added PointHQ to supported API list 2019-01-09 10:24:28 +11:00
Mike Barnes
cd3ef8fa5a Correct edits to README.md this time 2019-01-08 15:59:29 +11:00
Mike Barnes
72ce37704b Native PointHQ support 2019-01-08 15:59:29 +11:00
neil
4420d073bb Merge pull request #1889 from apollo13/fix_inwx
Fix inwx account without Mobile TAN
2019-01-07 22:57:09 +08:00
neil
9cc9f519fc Merge pull request #2010 from Neilpang/dev
Support Post as Get
2019-01-06 21:30:57 +08:00
neil
0483d841e3 Support Post as Get (#2009)
* Support POST as GET
https://community.letsencrypt.org/t/acme-v2-scheduled-deprecation-of-unauthenticated-resource-gets/74380

* fix PAG,
The newline '\n' in response is removed by _send_signed_request(), to keep it, we just use needbase64

* fix PAG, the cert is muti line

* fix format

* PAG is only for v2
2019-01-06 21:05:33 +08:00
neil
5546120312 Merge pull request #2006 from Neilpang/dev
sync
2019-01-04 22:54:03 +08:00
neilpang
ad613e2437 fix alpn oid.
https://github.com/Neilpang/acme.sh/issues/2005
2019-01-04 22:40:59 +08:00
neil
c544759d36 Merge pull request #2002 from Ivru/feature/exoscale
Exoscale DNS API
2019-01-03 21:42:42 +08:00
neil
20503d3c58 Merge pull request #2004 from hebbet/patch-4
add link to profile of Cloudflare
2019-01-03 21:27:13 +08:00
Ivru
3fb17c5de8 Merge branch 'dev' into feature/exoscale 2019-01-03 14:25:50 +01:00
Ivru
a5e4bf16d3 Merge pull request #2 from Neilpang/dev
Merging develop
2019-01-03 14:23:16 +01:00
hebbet
68d9aad3a2 add link to profile of Cloudflare
follow-up for #1893
2019-01-03 14:19:55 +01:00
neil
0aba1b4ad3 Merge pull request #1839 from sunflowerit/digitalocean-fix
Fixes on DigitalOcean implementation
2019-01-03 21:14:54 +08:00
neil
e12c7c8d27 Merge pull request #1890 from LLeny/master
Fixes Neilpang/acme.sh#1888
2019-01-03 21:09:45 +08:00
neil
83a040722e Merge pull request #1994 from drott/add_rm_multiple_gandi
[dnsapi] Support adding / removing multiple TXT values for Gandi
2019-01-03 21:03:55 +08:00
neil
b7b504d43a Merge pull request #1996 from Tigger2014/dev
dnsapi update dynu for api v2
2019-01-03 20:55:46 +08:00
neil
b18804f57f Merge pull request #2001 from hosting-de/fix-issue-2000
hosting.de API: waiting for API zoneStatus active
2019-01-03 20:54:55 +08:00
neil
550a5fb4c0 Merge pull request #2003 from martonsz/msz-dns-loopia-fix-wildcard
fix dns_loopia wildcard certificate
2019-01-03 20:53:09 +08:00
Marton Szucs
40f0238bb7 fix dns_loopia wildcard certificate
Checks if a subdomain already exists before creating one. The loopia API clears all records for a subdomain when adding it again.

Adding TXT-records instead of updating the existing record when using the add method. Wildcard certificates require multiple TXT-records for the same subdomain. 

Now you can create wildcard certificates using:
 `acme.sh  --issue -d example.com  -d '*.example.com'  --dns dns_loopia`
Double quoting variables
2019-01-03 11:32:43 +01:00
Oliver Dick
089823785e Using _sleep() instead of sleep 2019-01-03 10:32:59 +01:00
Ivru
ecf7dded07 Fix typo 2019-01-03 08:39:51 +01:00
Ivru
909aba27d1 Merge pull request #1 from Neilpang/master
Merging master
2019-01-03 08:35:54 +01:00
Oliver Dick
cd4f29135b waiting for API zoneStatus active 2019-01-02 16:44:11 +01:00
Ben Edmunds
68c5c366f4 dnsapi update dynu for api v2 2018-12-30 03:21:16 +00:00
Dominik Röttsches
29a5311ae0 [dnsapi] Support adding / removing multiple TXT values for Gandi
Gandi supports setting multiple entries by setting multiple array items
for the rrset_values field in their API. Modify the dns_gandi_livedns.sh
script so that it checks for existing entries, appends new ones if
needed, and removes existing ones individually. This enabled wildcard
certificate support on Gandi.

Fixes the dns_gandi_livedns part of #1261.

Tested for creating a multidomain, multiple wild-card certificate on
Gandi and using a test script executing only the dns_gandi_livedns_add
and dns_gandi_livedns_rm functions.
2018-12-29 10:54:21 +02:00
neil
62d774a548 Merge pull request #1993 from Neilpang/dev
add tls-alpn mode
2018-12-28 23:32:33 +08:00
neilpang
c9baca7910 add tls-alpn mode 2018-12-28 23:12:16 +08:00
neil
86366ae157 Merge pull request #1992 from Neilpang/dev
sync
2018-12-28 23:07:01 +08:00
neilpang
c4094c68ee Support BuyPass.com CA 2018-12-28 23:04:40 +08:00
neilpang
ec67a1b2c1 Do not limit the renew days to 60, it's just a default value.
buypass support 180 days.
2018-12-28 22:52:40 +08:00
neilpang
7ba9a5972d revert fix for https://github.com/Neilpang/acme.sh/issues/1941
1. fix https://github.com/Neilpang/acme.sh/issues/1977
2. The cache is too long to as a line to save in the conf
2018-12-28 22:45:40 +08:00
neilpang
b32071ad04 remove unused code 2018-12-28 22:12:54 +08:00
neil
b38c4e1a28 Merge pull request #1989 from mysteq/buypass-support
Added fixes so BuyPass Go ACME server can be used
2018-12-28 21:32:37 +08:00
neil
a13b2b4018 Merge pull request #1991 from Neilpang/dev
sync
2018-12-28 21:31:20 +08:00
Ketil
65a2f789dc Removing BUYPASS_CA variable 2018-12-28 13:26:20 +01:00
Ketil
8bd12ed040 Rewrite to remove BuyPass spesific fixes and adapt ACME v1 2018-12-28 09:22:31 +01:00
neil
6914662dd8 Merge pull request #1988 from mysteq/spellfix
Fixed spelling of 'tigger' to 'Trigger'
2018-12-28 09:14:39 +08:00
neil
bcb11d9b7e Merge pull request #1987 from mysteq/cloudflare-fix
Bugfix for allowing '+' character in CloudFlare email
2018-12-28 09:13:59 +08:00
Ketil
920cab6f12 Added fixes to also use BuyPass Go ACME server 2018-12-27 16:06:41 +01:00
Ketil
9756adb933 Fixed spelling of 'tigger' to 'Trigger'. 2018-12-27 15:45:19 +01:00
Ketil
2671af13cd Bugfix for allowing '+' character in CloudFlare email 2018-12-27 15:17:19 +01:00
Ne-Lexa
b7b94e38ac support change account conf from env 2018-12-24 14:59:14 +03:00
neil
37792e9b38 Merge pull request #1983 from Neilpang/dev
Dev
2018-12-24 19:33:05 +08:00
Ne-Lexa
f90bf756fb Merge branch 'dev' of https://github.com/Neilpang/acme.sh into dev 2018-12-24 13:42:42 +03:00
Ne-Lexa
0b363a5c98 removed the _clearaccountconf() call for erroneous requests 2018-12-24 13:33:25 +03:00
neil
ebb1a8af1b Merge pull request #1978 from Ivru/feature/exoscale
Feature/exoscale
2018-12-22 10:55:25 +08:00
neil
f4ba7fcaf4 Merge pull request #1979 from titanofold/linode-v4-api-fix
Linode v4 API Fix
2018-12-22 10:52:51 +08:00
neil
13964ac726 Merge pull request #1981 from Neilpang/alpn
Alpn
2018-12-21 20:59:12 +08:00
Aaron W. Swenson
c8c1140f15 Linode API v4 Redo
The Cloud and Classic Manager work with different APIs, and so require
a separate module, which we introduce here.

The README has also been modified to state that the two are separate
and incompatible, and provides instructions on using either.
2018-12-20 11:01:34 -05:00
Aaron W. Swenson
9a473640fb Revert "Update Linode API to v4"
This reverts commit 9a27b38976.

Turns out, the Cloud Manager is not backward compatible, nor is the
Classic Manager forward compatible.
2018-12-20 11:00:10 -05:00
Ivru
405173a0b4 Remove extraneous blank lines 2018-12-20 16:37:11 +01:00
Ivru
8e43b86f06 Export header _H3 2018-12-20 16:30:02 +01:00
Ivru
eea9aaf940 Fix typos 2018-12-20 16:24:08 +01:00
Ivru
67d3e8d049 Add Exoscape API support for DNSAPI 2018-12-20 16:07:05 +01:00
neilpang
f99ca918db fix format 2018-12-18 20:33:33 +08:00
neilpang
79a0a66f1f support --tlsport 2018-12-18 20:18:18 +08:00
neilpang
08681f4a8b support tls-alpn-01 https://github.com/Neilpang/acme.sh/issues/1675#issuecomment-447857756 2018-12-18 19:28:38 +08:00
neil
a58ef94a9c Merge pull request #1972 from Neilpang/dev
sync
2018-12-17 23:03:16 +08:00
neilpang
2b9ebd6662 fix showcsr https://github.com/Neilpang/acme.sh/issues/1968 2018-12-17 23:02:02 +08:00
neil
6fdd2f40ed Merge pull request #1963 from cshoredaniel/pr-allow-dyn-standard-dns
Allow dyn standard dns and debug nsupdate
2018-12-17 10:08:00 +08:00
neilpang
238990a285 add more debug info
https://github.com/Neilpang/acme.sh/issues/1932
2018-12-16 21:10:22 +08:00
Daniel F. Dickinson
1a77490969 dnsapi: Add option to set zone for nsupdate
Some DNS servers for which dns_nsupdate.sh is applicable (such
as dyn.com's 'Standard DNS' TSIG update mechanism), require that
the zone be set during the nsupdate transaction.  Therefore we
add a new environment variable NSUPDATE_ZONE which is used to
set the zone for the DNS TSIG transaction.

Signed-off-by: Daniel F. Dickinson <cshored@thecshore.com>
2018-12-13 01:55:43 -05:00
Daniel F. Dickinson
5431d05168 dnsapi nsupdate: Add nsupdate debug option
When debug is enabled, also use nsupdate's debug logging
so that the user can see potential issues with the nsupdate
transaction.

Signed-off-by: Daniel F. Dickinson <cshored@thecshore.com>
2018-12-13 01:55:00 -05:00
neil
eb97cdc33a Merge pull request #1961 from Neilpang/dev
Dev
2018-12-11 21:42:45 +08:00
neil
b54d6589c3 Merge pull request #1957 from pashinin/master
Write certs in Vault for Fabio load balancer
2018-12-11 21:27:45 +08:00
neil
463768fcf7 Merge pull request #1960 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/1959
2018-12-11 19:19:48 +08:00
neil
a43545c6ea fix https://github.com/Neilpang/acme.sh/issues/1959 2018-12-11 19:11:56 +08:00
Sergey Pashinin
9f067d7f56 Deploy to Hashicorp Vault docs 2018-12-10 18:17:18 +03:00
neil
8907e2d850 Merge pull request #1958 from Neilpang/dev
sync
2018-12-10 22:41:34 +08:00
Sergey Pashinin
c84466b131 Write certs in Vault for Fabio load balancer 2018-12-10 16:55:21 +03:00
neilpang
f62b956e74 Merge branch 'dev' of https://github.com/Neilpang/acme.sh into dev 2018-12-06 22:06:15 +08:00
neilpang
9841063df9 fix nginx mode 2018-12-06 22:05:26 +08:00
neil
803c8177d3 Merge pull request #1949 from felixonmars/patch-1
Arch Linux package acme.sh is now in [community]
2018-12-05 13:15:24 +08:00
Felix Yan
7ff525468f Arch Linux package acme.sh is now in [community] 2018-12-05 03:01:50 +08:00
neil
7c1c36f043 Merge pull request #1944 from titanofold/dev
Update Linode API to v4
2018-12-04 21:44:46 +08:00
neil
565e3f75c7 Merge pull request #1947 from aalmenar/master
Neodigit.net DNS API
2018-12-04 21:40:37 +08:00
Adrian Almenar
842f030355 Revert change 2018-12-04 14:36:28 +01:00
Adrian Almenar
f4ad42bb84 Changes requested on commit review 2018-12-04 14:33:00 +01:00
Adrian Almenar
fb08b53f0b Add Neodigit.net DNS API 2018-12-03 18:42:33 +01:00
neilpang
598becf619 minor, fix format 2018-12-03 20:31:20 +08:00
Aaron W. Swenson
9a27b38976 Update Linode API to v4
Linode API has made breaking changes that are resolved by this
update. No user action is required.

Additionally, related README.md entry updated to include new cloud
manager interface.
2018-12-02 12:10:10 -05:00
neilpang
7917aa2a7c fix https://github.com/Neilpang/acme.sh/issues/1941
cache dns zones response
2018-12-02 19:37:35 +08:00
neil
d0c97a589b Merge pull request #1939 from Neilpang/dev
sync
2018-11-29 22:32:17 +08:00
neil
8ec1ea7b7a Merge pull request #1921 from nakermann1973/patch-1
Add missing bind-tools package
2018-11-29 09:54:48 +08:00
neil
71cb6d2bce Merge pull request #1759 from hosting-de/feature/hosting.de-plugin
added hosting.de DNS Plugin
2018-11-28 22:25:57 +08:00
Oliver Dick
ee258f1425 Merge branch 'dev' into feature/hosting.de-plugin 2018-11-28 14:34:09 +01:00
neil
50278674f0 Merge pull request #1934 from epgdatacapbon/master
Increase security using https for MyDNS.JP API
2018-11-26 09:11:12 +08:00
epgdatacapbon
be5085f205 Increase security using https for MyDNS.JP API 2018-11-25 18:14:52 +09:00
neil
ca9476f72a Merge pull request #1931 from epgdatacapbon/master
Add DNS API support for MyDNS.JP
2018-11-24 20:52:59 +08:00
epgdatacapbon
d55c64c838 Update README.md 2018-11-24 14:07:50 +09:00
neil
563de2cc90 Merge pull request #1926 from Rohlik/patch-1
Fix dot
2018-11-24 10:32:39 +08:00
epgdatacapbon
6afe3ccc3b Merge branch 'master' of https://github.com/epgdatacapbon/acme.sh 2018-11-24 02:03:23 +09:00
epgdatacapbon
14ad5955b5 Add DNS API support for MyDNS.JP 2018-11-24 02:02:53 +09:00
epgdatacapbon
a6f2110141 Add DNS API support for MyDNS.JP 2018-11-24 01:58:46 +09:00
neil
393d8b9ded Merge pull request #1929 from Neilpang/dev
sync
2018-11-23 23:11:52 +08:00
neilpang
137dc1eac0 fix https://github.com/Neilpang/acme.sh/issues/1912 2018-11-23 22:53:02 +08:00
Thomas Rohlik
5fee82ce39 Fix dot
Very important commit 🥇
2018-11-19 16:09:32 +01:00
nakermann1973
552710ac2a Add missing bind-tools package
The bind_tools package is required for dns_nsupdate to work
2018-11-13 10:15:38 +01:00
neil
0a9a11636a Merge pull request #1892 from hebbet/patch-2
add link to cloudflare profile for api key
2018-11-10 21:32:48 +08:00
neil
e550631275 Merge pull request #1886 from philr/skip_alias_when_already_verified
Skip aliases of already verified domains
2018-11-10 21:32:05 +08:00
neil
87d2f7f27a Merge pull request #1910 from joakimlemb/master
Increase Azure DNS Zone Limit from 100 to 500
2018-11-10 21:10:47 +08:00
neil
a40cd2b46f Merge pull request #1916 from pavelaks/patch-1
Fix for VSCALE example
2018-11-10 21:09:59 +08:00
pavelaks
4b581f3720 Update README.md
Fix VSCALE example (add export before VSCALE_API_KEY)
2018-11-10 12:10:06 +03:00
Joakim Lemb
12956679e7 Added top URI parameter 2018-11-05 14:52:26 +01:00
neilpang
7903fcb48c fix typo 2018-10-30 22:50:44 +08:00
neilpang
9672c6b885 fix https://github.com/Neilpang/acme.sh/issues/1905 2018-10-30 22:14:49 +08:00
neil
55369d30a6 Merge pull request #1867 from evoadmin/patch-1
Update dns_he.sh
2018-10-30 22:10:21 +08:00
Ne-Lexa
a207199879 fixed _get_root() function 2018-10-29 15:18:43 +03:00
hebbet
a894b7cc9b add link to cloudflare profil for api key 2018-10-24 16:33:02 +02:00
LLeny
46b3a9158c Fixes Neilpang/acme.sh#1888 2018-10-21 18:17:23 +08:00
Jan-Otto Kröpke
26421684dc Fix inwx account without Mobile TAN 2018-10-19 16:08:00 +02:00
Phil Ross
fd536d373e Skip aliases of already verified domains.
When issuing a two-domain certificate using a different alias for each
domain, if the first domain is already verified, verification for the
second domain would be attempted (unsuccessfully) using the alias of the
first domain.

Increment the alias index when skipping verified domains so that the
correct alias will be used for subsequent domains.
2018-10-18 17:57:15 +01:00
neil
4f59a821d3 Merge pull request #1883 from Neilpang/dev
Dev
2018-10-17 22:38:18 +08:00
neil
b29e21efa8 Merge pull request #1881 from ephen/patch-1
cloudxns.net
2018-10-17 22:33:54 +08:00
Ne-Lexa
a63dc75b43 Added documentation on using dns api internet.bs 2018-10-15 18:20:26 +03:00
Ephen
9f6f721a13 cloudxns.net
cloudxns.net is the main domain.
2018-10-15 17:11:25 +08:00
Ne-Lexa
fdb9d93b12 formatted 2018-10-12 19:27:41 +03:00
Ne-Lexa
475e6e28eb Added dns api support for internet.bs 2018-10-12 19:04:18 +03:00
evoadmin
4c1f70af4b Update dns_he.sh
If you have a password with special char it will fail at Remove record
2018-10-02 10:43:25 +03:00
andrewheberle
454c90820d Actually set reload default 2018-09-28 08:57:13 +08:00
andrewheberle
0a4e61c1dd Readme update 2018-09-28 08:46:39 +08:00
andrewheberle
31d9ba7e02 Change default for reload 2018-09-28 08:45:18 +08:00
neilpang
6a81b0f807 Merge branch 'dev' of https://github.com/Neilpang/acme.sh into dev 2018-09-25 23:42:14 +08:00
neilpang
3322630732 minor, debug msg 2018-09-25 23:42:04 +08:00
Oliver Dick
d8885984ab Merge branch 'dev' into feature/hosting.de-plugin 2018-09-12 10:04:45 +02:00
Tom Blauwendraat
4a18c45e4f fixup! [FIX] Delete all occurrences of TXT key, dont fail if there is more than one, [FIX] Respect pagination on domain listing, before only the first page was loaded 2018-09-12 05:46:51 +02:00
Tom Blauwendraat
5b7cac1002 [FIX] Delete all occurrences of TXT key, dont fail if there is more than one, [FIX] Respect pagination on domain listing, before only the first page was loaded 2018-09-12 05:34:56 +02:00
neil
5aef9266cb Merge pull request #1833 from cbrandel/master
use perl instead of iconv, if iconv is not available
2018-09-10 13:13:33 +08:00
Christian Brandel
80b40c02b4 use perl instead of iconv, if iconv is not available 2018-09-10 01:24:20 +02:00
neil
56d6079c4a Merge pull request #1831 from LLeny/master
Namecheap API
2018-09-09 21:14:10 +08:00
LLeny
3975792bf1 shfmt 2018-09-08 08:06:35 +08:00
LLeny
697e694de6 Indentation 2018-09-08 07:28:56 +08:00
LLeny
828d8eaadb NC API warning 2018-09-08 07:06:35 +08:00
LLeny
30ee00ff50 RM TXT check 2018-09-08 07:06:16 +08:00
LLeny
7e130c2618 README fixes 2018-09-08 07:05:44 +08:00
LLeny
b859dd660c dns_rm support 2018-09-07 20:53:21 +08:00
LLeny
8868783476 Staging 2018-09-07 20:52:49 +08:00
LLeny
dc0dd6588c Support list 2018-09-07 20:52:34 +08:00
LLeny
f7e7e885a9 Usage 2018-09-07 20:52:10 +08:00
LLeny
d813be1f48 WIP 2018-09-05 21:29:42 +08:00
LLeny
0d03309c2f Namecheap initial 2018-09-02 21:25:44 +08:00
Oliver Dick
1dab353fdb Merge branch 'dev' into feature/hosting.de-plugin 2018-08-30 14:28:50 +02:00
neil
8eb4efaddb Merge pull request #1819 from loial/dns_gdnsdk_fix
Gratisdns.dk: Fix typo in url, also added note recommending --dnsslee…
2018-08-29 13:43:37 +08:00
Herman Sletteng
12c900ea7d Gratisdns.dk: Fix typo in url, also added note recommending --dnssleep 300 2018-08-29 00:46:54 +02:00
neil
c31db83b26 Merge pull request #1817 from Neilpang/dev
Dev
2018-08-27 23:05:59 +08:00
neil
98ce8f4c2f Merge pull request #1620 from loial/dns_gratisdns.dk
DNS plugin for Danish service gratisdns.dk
2018-08-27 23:05:15 +08:00
Herman Sletteng
1f25b4a8a9 Replacing "grep -o -P" with "_egrep_o" and sed 2018-08-24 13:27:16 +02:00
Herman Sletteng
1756bbff84 DNS plugin for Danish service gratisdns.dk
Currently only supports primary domains. My use case does not involve
secondary domains so I'm not sure how it behaves, and cannot test it.
Might be as simple as turning all "primary"-references into a variable
that's either "primary" or "secondary", and make an extra check for this
in _get_domain...

Cookie handling heavily inspired by freedns plugin, including caching
the cookie in the config file, so we can rm without re-authenticating
2018-08-24 02:12:33 +02:00
neil
21b2ffa42e Merge pull request #1796 from ybizeul/deploy-gitlab
Gitlab deploy option
2018-08-23 13:36:57 +08:00
neil
b6efdac1db Merge pull request #1605 from linux-insideDE/dev
Added netcup DNS API
2018-08-23 13:25:54 +08:00
linux-insideDE
fc9d321ebe Merge branch 'dev' into dev 2018-08-22 21:07:05 +02:00
Yann Bizeul
68a290c347 revert dns_inwx.sh to dev 2018-08-22 19:08:33 +02:00
neil
9133de50e9 Merge pull request #1756 from crazyhacks/conoha
Add support ConoHa DNS API
2018-08-22 22:48:33 +08:00
KUDO Takashi
73d04b976e avoid "SC2046: Quote this to prevent word splitting." Travis CI error. 2018-08-22 23:25:55 +09:00
KUDO Takashi
a35d271669 cleanup 2018-08-22 23:25:55 +09:00
KUDO Takashi
72a7f932c6 fix indent 2018-08-22 23:25:55 +09:00
KUDO Takashi
2e74df2583 Add support ConoHa DNS API 2018-08-22 23:25:55 +09:00
linux-insideDE
4fffb3c816 make shfmt happy 2018-08-21 21:55:44 +02:00
linux-insideDE
840b3a34cb changed some chars 2018-08-21 21:47:40 +02:00
linux-insideDE
dc267663a7 Merge branch 'dev' into dev 2018-08-21 21:15:53 +02:00
Yann Bizeul
8d6443b25d Fix Syntax 2018-08-21 16:41:45 +02:00
Yann Bizeul
e3c7fc8077 Fix Syntax 2018-08-21 16:35:39 +02:00
Yann Bizeul
bbf2a15f27 Fix Syntax 2018-08-21 16:30:33 +02:00
Yann Bizeul
5a326b82bd Fix Syntax 2018-08-21 16:24:57 +02:00
Yann Bizeul
f1b0dd7836 Fix Syntax 2018-08-21 16:22:08 +02:00
Yann Bizeul
c205777542 Better integration with acme.sh utils 2018-08-21 16:18:00 +02:00
neil
329a1e6f16 Merge pull request #1623 from lenartj/dev
Added support for Google Cloud DNS API (dns_gcloud)
2018-08-21 21:38:19 +08:00
Janos Lenart
9c39121e99 Merge branch 'dev' of https://github.com/Neilpang/acme.sh into dev 2018-08-21 13:32:29 +00:00
Yann Bizeul
e5e57e684e Merge branch 'deploy-gitlab' of github.com:ybizeul/acme.sh into deploy-gitlab 2018-08-21 15:28:52 +02:00
neil
659a60aeec Merge pull request #1772 from gliljas/patch-2
Spelling in dns_aws.sh
2018-08-21 21:06:36 +08:00
neil
b0268adad9 Merge pull request #1782 from omegazeng/dev
add dns api support for dnspod.com
2018-08-21 21:05:43 +08:00
neil
71e4bbfc99 Merge pull request #1804 from ctron/feature/add_lexicon_opts_1
Add support for additional Lexicon options
2018-08-21 21:01:28 +08:00
neil
c6bd004d63 Merge pull request #1806 from Aarup/dev
Update dns api to support v2 wildcard cert #1261
2018-08-21 20:58:26 +08:00
Aarup
8b6986ba18 Fix file formatting 2018-08-21 12:32:30 +02:00
Jens Reimann
b23718f3ad Add support for additional Lexicon options 2018-08-21 11:51:26 +02:00
Aarup
8113548920 Update dns api to support v2 wildcard cert #1261 2018-08-21 11:44:36 +02:00
Yann Bizeul
b401dbbf65 Fix Syntax 2018-08-15 19:17:24 +02:00
Yann Bizeul
75dd0a770f Fix Syntax 2018-08-15 19:10:31 +02:00
Yann Bizeul
6d8292cdd8 Syntax fix 2018-08-15 19:00:08 +02:00
Yann Bizeul
0575eb671a Fix double quote around URL 2018-08-15 18:44:24 +02:00
Yann Bizeul
d06eea53ef Add deploy plugin for Gitlab pages 2018-08-15 18:36:34 +02:00
Yann Bizeul
9e96a93172 Updated README with Gitlab help 2018-08-15 18:36:24 +02:00
Janos Lenart
441f8f3ce8 Replied to PR comments 2018-08-15 12:05:57 +01:00
Janos Lenart
1d4dec5510 Moved dns_gcloud to 47. 2018-08-15 12:05:57 +01:00
Janos Lenart
167758003c Fixed shfmt (dns_gcloud) 2018-08-15 12:03:38 +01:00
Janos Lenart
0a3ac1f5c3 Added support for Google Cloud DNS API (dns_gcloud) 2018-08-15 12:03:38 +01:00
neil
9173140ddf Merge pull request #1788 from ghostwheel42/dev
createDomainKey: fix exitcode for creating new key
2018-08-15 13:27:04 +08:00
Alexander Graf
7aeb113c62 createDomainKey: fix exitcode for creating new key
when running acme.sh headless (without terminal) to create a new key
createDomainKey returns a non-zero exit-code.
explicitly returning zero avoids this.
2018-08-14 10:04:14 +02:00
Hitoshi
22cd408efb add dns api support for dnspod.com 2018-08-12 18:15:20 +08:00
Gunnar Liljas
4fbd21da57 Spelling 2018-08-07 13:35:08 +02:00
Martin Kammerlander
68f66ca101 Add default delay for the calls to KAS api since they are very restrictive with that. 2018-08-02 16:20:48 +02:00
Oliver Dick
ed95509a4f hosting.de API keys can contain special chars, so using simple quotes 2018-08-02 15:47:02 +02:00
Oliver Dick
4162975f9f added hosting.de API to README's 2018-08-02 15:43:40 +02:00
neil
ac0cdcf70b Merge pull request #1760 from lf-zbw/dev
Fix key leakage in SSH deploy log.
2018-08-02 21:25:26 +08:00
little-fat
63134fafec Fix key leakage in SSH deploy log 2018-08-02 20:57:27 +08:00
Oliver Dick
5494e88e08 making shfmt happy 2018-08-01 17:00:22 +02:00
Oliver Dick
86276ad17b added hosting.de DNS Plugin
* can be used with API of hosting.de
 * can also be used with ICANN registrar http.net
 * needs just API key and endpoint
 * support wildcard certificates
2018-08-01 16:48:00 +02:00
neil
c883ec40d7 Merge pull request #1750 from jkroepke/fix_inwx_tfa
Fix inwx account without Mobile TAN
2018-07-29 19:16:11 +08:00
neil
d19bc328f3 Merge pull request #1745 from oldium/add-lexicon-rm
Added dns_lexicon_rm command
2018-07-29 19:13:29 +08:00
neil
f286f904dc Merge pull request #1753 from Neilpang/dev
Dev
2018-07-28 22:40:42 +08:00
neil
150029a5e2 Merge pull request #1752 from Neilpang/badnonce
add more retry for badnonce error
2018-07-28 22:14:16 +08:00
neilpang
709a3fb06f add more retry for badnonce error 2018-07-28 22:02:03 +08:00
Jan-Otto Kröpke
d3c9d0b331 Fix inwx account without Mobile TAN 2018-07-26 21:32:35 +02:00
neilpang
cc2d59468d use json content type for both v1 and v2 2018-07-26 21:57:22 +08:00
neil
91391fba5d Merge pull request #1749 from Neilpang/dev
Dev
2018-07-26 21:56:39 +08:00
Oldřich Jedlička
4369402855 Cleaned-up shellcheck warnings. 2018-07-25 10:40:57 +02:00
neil
0bc556618f Merge pull request #1746 from j-c-m/time2str-dev
BSD fix _time2str()
2018-07-25 12:10:39 +08:00
Jesse Miller
cb11580981 BSD fix _time2str()
date -u -d@"12345" does not produce an error on *BSD and outputs the
current date in UTC, which is not the expected output from _time2str()

Fix, reorder _time2str() to attempt BSD style date first, which
errors on Linux, so cascade style OS detection works correctly.
2018-07-24 22:41:01 -05:00
Old?ich Jedli?ka
0366e8758c Added reading of stored config. 2018-07-24 22:41:43 +02:00
Old?ich Jedli?ka
8d230dd798 Added dns_lexicon_rm command.
Remove created TXT record when finished. Works with lexicon version 2.3.0
and later.
2018-07-24 16:30:47 +02:00
neilpang
411b342a27 request a new nonce for invalid anti-replay nonce error 2018-07-18 22:00:09 +08:00
neilpang
b9b7032386 lets start v2.8.0 2018-07-18 00:33:07 +08:00
neil
c38ef9023b Merge pull request #1738 from Neilpang/dev
sync
2018-07-18 00:30:47 +08:00
neil
9cecd525e2 fix JWS has an invalid anti-replay nonce https://github.com/Neilpang/acme.sh/issues/1630 2018-07-18 00:26:21 +08:00
neil
4f5995abc0 Merge pull request #1717 from initit/master
added dnsapi for euserv.eu
2018-07-10 09:18:58 +08:00
Michael
2945b230e4 replaced tail/head with _tail_n/_head_n and printf with echo 2018-07-09 22:54:34 +02:00
Michael
261cc448f7 fixed shfmt related errors in dns_euserv.sh and modified README.md 2018-07-08 23:00:26 +02:00
Michael
616b0b6baa fixed shfmt related errors in dns_euserv.sh and modified README.md 2018-07-08 22:50:52 +02:00
Michael
d99968ee6d Modified dnsapi/README.md 2018-07-08 16:25:35 +02:00
Michael
4a65ff6ae2 Merge https://www.github.com/initit/acme.sh 2018-07-08 16:20:09 +02:00
Michael
94f91ae687 initial version with Euserv.eu DNS API Support
- added dnsapi/dns_euserv.sh
 - modified dnsapi/README.md
2018-07-08 16:17:57 +02:00
Michael
28e4bcf67f initial version with Euserv.eu DNS API Support 2018-07-08 16:04:18 +02:00
neil
884461f1a6 Merge pull request #1705 from war59312/patch-2
Update README.md - HTTPS For centminmod.com Link
2018-07-02 09:53:37 +08:00
Will
26c669e42d Update README.md - HTTPS For centminmod.com Link
Update README.md - HTTPS For centminmod.com Link
2018-07-01 18:53:47 -04:00
neil
f60dde4138 Merge pull request #1698 from Neilpang/dev
Dev
2018-06-29 20:12:57 +08:00
neilpang
9c545059ae fix warning 2018-06-28 22:21:22 +08:00
neilpang
05dea7b22a fix warning 2018-06-28 20:34:29 +08:00
neil
5b3f915d90 Merge pull request #1697 from santerikannisto/patch-6
Issue #1328 bug fix v3
2018-06-28 15:39:30 +08:00
Santeri Kannisto
d987d61ea9 Issue #1328 bug fix v3
Eliminated php dependency with a private function for urlencode using sed. Php had failed on godaddy due to multiple php instances and naturally cron using the one without the necessary -r option. Compared to previous PR the sed code is now POSIX and should work on all environments.
2018-06-28 09:38:14 +02:00
neil
dedb56d295 Merge pull request #1563 from kordianbruck/dev
Increase serial when adding txt records
2018-06-27 10:51:31 +08:00
neil
8697972d5d Merge pull request #1669 from Neilpang/dev
check UNABLE_TO_AUTHENTICATE
2018-06-12 21:23:33 +08:00
neilpang
f90a2ae195 check UNABLE_TO_AUTHENTICATE 2018-06-12 21:19:27 +08:00
Martin Kammerlander
c34aadfbf7 Merge with latest dev branch. 2018-06-08 10:35:17 +02:00
neil
084de9d8e0 Merge pull request #1635 from Neilpang/dev
Dev
2018-05-29 23:37:48 +08:00
linux-insideDE
69b780ee32 Update dns_netcup.sh 2018-05-29 17:24:53 +02:00
linux-insideDE
c7b904501c make shfmt happy 2018-05-29 16:56:07 +02:00
neilpang
206be3c161 fix https://github.com/Neilpang/acme.sh/issues/1633 2018-05-29 22:38:52 +08:00
linux-insideDE
48e8022095 improved handling for third level domains 2018-05-29 16:23:28 +02:00
linux-insideDE
4715a1a5e0 satisfy shellcheck 2018-05-16 22:07:44 +02:00
linux-insideDE
ed2ba6bc3a removed jq dependencies 2018-05-15 16:22:40 +02:00
linux-insideDE
ca1d62bec0 removed jq dependencies 2018-05-15 16:21:57 +02:00
linux-insideDE
6a4aad1aa8 replaced increment/decrement with _math function 2018-05-15 14:38:29 +02:00
linux-insideDE
3f0462b68b Merge pull request #1 from linux-insideDE/netcup-api
added netcup api
2018-05-15 13:26:00 +02:00
linux-insideDE
f3a622d1a7 added netcup dns api 2018-05-15 13:22:55 +02:00
linux-insideDE
3cd5b9ca2e added netcup dns api 2018-05-15 13:21:25 +02:00
linux-insideDE
e9782c3219 Create dns_netcup.sh 2018-05-15 13:18:50 +02:00
andrewheberle
8d348954a7 Whitepspace 2018-05-14 13:22:46 +08:00
andrewheberle
7d19d784df Update cert suffix for bundles .ocsp generation 2018-05-14 13:16:56 +08:00
andrewheberle
733b4e0a34 Fix Le_Keylength case 2018-05-14 11:26:03 +08:00
andrewheberle
08d29a8342 Fix return from reload 2018-05-14 10:58:46 +08:00
andrewheberle
675e2d25d6 update for new haproxy deploy vars 2018-05-10 15:28:54 +08:00
andrewheberle
ba20af48d3 Support HAPROXY_DEPLOY_PEM_PATH
Adds compatibility to original haproxy deploy hook while still allowing custom PEM file name (via HAPROXY_DEPLOY_PEM_NAME)
2018-05-10 15:25:28 +08:00
andrewheberle
707e053949 whitespace fixes 2018-05-10 12:18:03 +08:00
andrewheberle
c47e67e52c Fix variable name 2018-05-10 12:06:25 +08:00
andrewheberle
3a95bfb699 Document updated haproxy deploy hook 2018-05-10 12:02:58 +08:00
andrewheberle
6567bb4c12 Update haproxy deploy hook
Add functionality to add OCSP stapling info (.ocsp file), issuer (.issuer file) and multi-cert bundles (suffix on pem file based on key type).

This also corrects the order of key, certificate and intermediate in the PEM file, which although HAProxy does not seem to care, was incorrect in the prior version.
2018-05-10 11:51:59 +08:00
neil
39ba697e19 Merge pull request #1584 from dwatrous/patch-1
Add HAProxy deploy implementation and documentation
2018-05-08 22:06:41 +08:00
Daniel Watrous
c9818ea2c4 add documentation for reload command 2018-05-04 13:03:27 -05:00
Daniel Watrous
afe5cb588d update for POSIX compliance 2018-05-04 10:25:54 -05:00
Daniel Watrous
e9e999542d add reload 2018-05-04 10:14:31 -05:00
neil
d9db90752e Merge pull request #1579 from par-pa/support-tele3
Support tele3
2018-05-04 22:29:10 +08:00
neil
f7c3f52817 Merge pull request #1585 from Neilpang/dev
Dev
2018-05-04 22:24:52 +08:00
neilpang
681e3785ef add dns alias mode 2018-05-04 22:23:56 +08:00
Daniel Watrous
5f593994c7 remove more whitespace (trying to get TravisCI working) 2018-05-03 12:25:11 -05:00
Daniel Watrous
ec73aeba16 remove whitespace 2018-05-03 12:17:26 -05:00
Daniel Watrous
7573e560b6 Add conditional check to ensure path is provided 2018-05-03 10:06:05 -05:00
Daniel Watrous
c8bc155cfe Merge pull request #1 from dwatrous/patch-2
add docs for HAProxy deployment
2018-05-03 01:38:33 -05:00
Daniel Watrous
1eae73105a add docs for HAProxy deployment 2018-05-03 01:33:06 -05:00
Daniel Watrous
360dc140ea implement basic haproxy deploy
HAProxy requires the certificate chain and key to be concatenated and placed somewhere (can be anywhere). This script expects a single environment variable with the path where the concatenated PEM file should be written
2018-05-03 01:28:56 -05:00
Vlad Roskov
f85348ba94 fix delete multiple records 2018-05-03 01:01:14 +03:00
Vlad Roskov
2f15ad4be0 fix authentication 2018-05-03 01:00:51 +03:00
Vlad Roskov
f254bb39a5 bail out on no access 2018-05-03 00:58:25 +03:00
Vlad Roskov
c58465d630 fix comparison on empty var 2018-05-03 00:57:50 +03:00
Kordian Bruck
03a1386902 Update serial also when deleting the token 2018-05-02 23:01:52 +02:00
Roman Bližík
70b56eb527 remove whitespace 2018-05-02 11:13:10 +02:00
Roman Bližík
4e05062def add tele3-dns plugin 2018-04-30 15:09:51 +02:00
neil
266333468b Merge pull request #1566 from steffenbusch/dev
Added --force-color to enforce the use of ANSI Color. Issue #1557
2018-04-27 23:26:53 +08:00
Steffen Busch
e32b3aac22 Added --force-color to enforce the use of ANSI Color. Issue #1557 2018-04-26 21:02:37 +02:00
Kordian Bruck
676402d918 Increase serial when adding txt records 2018-04-26 11:40:17 +02:00
neil
edb4d066a9 Merge pull request #1555 from Neilpang/dev
sync
2018-04-24 19:53:07 +08:00
neil
03f4518da9 Merge pull request #1553 from OlegRakovitch/patch-2
Add missing package to docker image
2018-04-23 23:39:56 +08:00
Oleg Rakovitch
8259e82787 Add missing package to docker image
Issue #1552
2018-04-23 18:34:15 +03:00
neil
838d3ddc17 Merge pull request #1550 from Neilpang/dev
sync
2018-04-22 16:04:38 +08:00
neilpang
66686de4e4 add --branch 2018-04-21 13:21:56 +08:00
neilpang
ce8dca7afe move renewhook after installcert
fix https://github.com/Neilpang/acme.sh/issues/1547
2018-04-21 13:15:17 +08:00
neil
9f5ef4c1cb Merge pull request #1546 from Neilpang/dev
fix shfmt
2018-04-21 10:53:32 +08:00
neilpang
f0a87da375 fix shfmt 2018-04-20 23:32:42 +08:00
neil
263e30d25d Merge pull request #1545 from Neilpang/dev
Dev
2018-04-20 23:26:48 +08:00
neilpang
15ffc30d88 Merge branch 'dev' of https://github.com/Neilpang/acme.sh into dev 2018-04-20 23:23:11 +08:00
neilpang
8a5c4979ad fix shellcheck 2018-04-20 23:22:25 +08:00
Grant Millar
e36fbd6af5 Fix DNSimple when zone has > 100 records
The _get_records function currently returns the first 100 records. As our TXT is added most recently, if you have > 100 records it will not be returned.

I've changed the function to sort by ID DESC, so it will always return the latest 100 records.
2018-04-20 09:41:07 +01:00
neil
3216806fae Merge pull request #1540 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/1539
2018-04-20 14:05:44 +08:00
neil
f8526f027c fix https://github.com/Neilpang/acme.sh/issues/1539 2018-04-20 14:05:09 +08:00
neil
ed3066aae7 Merge pull request #1515 from Neilpang/dev
sync
2018-04-13 22:33:53 +08:00
neilpang
98a7e72f0a fix https://github.com/Neilpang/acme.sh/issues/1512#issuecomment-381121303 2018-04-13 21:28:13 +08:00
neil
a2259865b3 Merge pull request #1501 from jkroepke/inwx_mtan
Add Support for inwx.de mobile tan
2018-04-12 20:54:53 +08:00
Jan-Otto Kröpke
63f3283591 Add Support for inwx mobile tan 2018-04-10 20:02:57 +02:00
neil
d670ea4f59 Merge pull request #1497 from Neilpang/dev
sync
2018-04-07 11:52:53 +08:00
neil
d0d10bc6e7 Merge pull request #1490 from AlexeyStolyarov/master
#issue with nsupdate on Ubuntu 14.04.1 LTS
2018-04-07 11:52:05 +08:00
neil
4fea06c9fa Merge pull request #1393 from webner/acme-dns
add acme-dns plugin
2018-04-07 11:50:33 +08:00
neil
09fed60dec Merge pull request #1494 from Neilpang/dev
sync
2018-04-06 11:37:22 +08:00
AlexeyStolyarov
75b9c39b0e Update dns_nsupdate.sh 2018-04-05 14:50:55 +05:00
AlexeyStolyarov
5957a1068f Update dns_nsupdate.sh 2018-04-05 14:45:15 +05:00
AlexeyStolyarov
df5229c7c8 Merge pull request #1 from AlexeyStolyarov/AlexeyStolyarov-patch-1
#issue with nsupdate on  Ubuntu 14.04.1 LTS
2018-04-05 14:19:34 +05:00
AlexeyStolyarov
ed817c81de #issue with nsupdate on Ubuntu 14.04.1 LTS
on  Ubuntu 14.04.1 LTS if nsupdate runs without port number given it treated argument following server name as port number.
and throws error: 
```
port 'update' is not numeric
syntax error
```
2018-04-05 14:18:53 +05:00
Wolfgang Ebner
dd72f7638d add acme-dns plugin 2018-04-03 10:18:54 +02:00
neil
a77e4aa6fa Merge pull request #1482 from martgras/dev
Fixes dns_he Issue #1476
2018-04-03 09:14:16 +08:00
martgras
792f3775ce Fixes dns_he Issue #1476
username / password has to be urlencoded
2018-04-02 18:32:28 +02:00
neil
4c7700ec3b Merge pull request #1480 from Neilpang/master
sync
2018-04-02 13:31:21 +08:00
neil
eee296c4c2 Merge pull request #1475 from pandiloko/patch-1
False case in variable name for dreamhost api
2018-04-02 13:17:29 +08:00
pandiloko
499f745732 False case in variable name for dreamhost api 2018-04-01 14:41:35 +02:00
neil
446388e0ba Merge pull request #1378 from ivarmedi/master
Add dns_loopia
2018-04-01 09:51:22 +08:00
neil
e1628bcdd8 Merge pull request #1429 from softcat/dev
Fixed DNSAPI for PowerDNS to support wildcard certificates
2018-04-01 09:50:33 +08:00
neil
6d5874fc45 Merge pull request #1448 from martgras/patch-3
dns_azure  add support for validation record at domain apex
2018-04-01 09:49:28 +08:00
neil
3d563dea87 Merge pull request #1444 from adrum/patch-1
Fixed Dreamhost ENV var name in dnsapi/README.md
2018-04-01 09:48:48 +08:00
neilpang
09304c33c1 start 2.7.9 2018-03-29 21:51:33 +08:00
neil
521d8c4b1f Merge pull request #1464 from Neilpang/dev
sync
2018-03-29 21:39:09 +08:00
Ivar Larsson
b7d573a4b8 Merge branch 'dev' of github.com:Neilpang/acme.sh 2018-03-28 22:05:39 -04:00
neil
4a62385dcc Merge pull request #1460 from Habetdin/patch-1
Update Zilore API description
2018-03-29 09:33:50 +08:00
Habetdin
98e15f658e Update Zilore API description 2018-03-29 04:31:46 +03:00
neil
0a3fa35c5d Merge pull request #1451 from Habetdin/dev
Adding support of Zilore API
2018-03-29 09:09:45 +08:00
neil
02e095bec2 Merge pull request #1459 from rbelnap/vault_deploy_chain_Fix
add chain cert
2018-03-29 09:08:45 +08:00
Ivar Larsson
696d9c6bd3 remove merge chars 2018-03-28 17:15:31 -04:00
Ivar Larsson
50dee5d464 Merge branch 'master' of github.com:Neilpang/acme.sh 2018-03-28 16:25:38 -04:00
Bob Belnap
87a8dda955 add chain cert 2018-03-28 12:40:31 -04:00
Habetdin
d7c73f590c Merge branch 'patch-2' into dev 2018-03-28 18:29:54 +03:00
Habetdin
d1b197e339 Merge branch 'patch-1' into dev 2018-03-28 18:29:48 +03:00
Habetdin
8f5ee989ba Update README.md 2018-03-28 18:26:34 +03:00
Habetdin
ce9c227425 Update README.md 2018-03-28 18:25:52 +03:00
Habetdin
e32c2b84ee Revert "Update README #1"
This reverts commit 6b0333e919.
2018-03-28 18:22:38 +03:00
Habetdin
ce9f77afed Revert "Update README #2"
This reverts commit 882e1db1d6.
2018-03-28 18:22:36 +03:00
Habetdin
2bc38b2063 Revert "Update README.md"
This reverts commit b4f4c28871.
2018-03-28 18:22:33 +03:00
Habetdin
b4f4c28871 Update README.md 2018-03-28 18:17:22 +03:00
Habetdin
b14ef537e1 head => _head_n 2018-03-28 18:14:45 +03:00
neil
84ac386481 Merge pull request #1437 from james-gibson/remove-line-wraps-on-basic-auth
Disable line wrapping on base64 conversion to prevent auth failure
2018-03-28 22:00:44 +08:00
neil
f0365d32aa Merge pull request #1457 from Neilpang/dev
sync
2018-03-28 21:37:58 +08:00
neil
795764f22f Merge pull request #1420 from kinghost/master
Add dns_kinghost.sh
2018-03-28 21:26:44 +08:00
Felipe Braz
986f61ac92 deleted wrog file 2018-03-28 10:18:43 -03:00
neil
09576f2f4f Merge pull request #1445 from martgras/patch-2
dns_he - proposed fix for #1438
2018-03-28 21:08:32 +08:00
neil
bba474dc6b Merge pull request #1447 from itssimple/dev
Fixes DNSimple for Wildcard certificates
2018-03-28 20:17:51 +08:00
Habetdin
fde971fe81 Fix formatting 2018-03-27 06:31:25 +03:00
Habetdin
882e1db1d6 Update README #2 2018-03-27 06:23:15 +03:00
Habetdin
6b0333e919 Update README #1 2018-03-27 06:21:10 +03:00
Habetdin
914808b867 Adding Zilore API support 2018-03-27 06:16:39 +03:00
Pål Håland
8d38cf4d1f Use allchain instead of ca an cert, add documentation after review 2018-03-26 22:00:01 +02:00
Felipe Braz
2d1d512d0f removed redundant api call 2018-03-26 14:28:52 -03:00
Felipe Braz
37bc099d39 removed redundant api call 2018-03-26 14:27:21 -03:00
martgras
9e3c931b34 dns_azure add support for validation record at domain apex
Prevent the issue described in #1442
Fix [SC1117] Backslash is literal in "\[".
2018-03-26 17:45:16 +02:00
Felipe Braz
f8fb0e67b4 fix dnsapi/dns_kinghost.sh with shfmt utility 2018-03-26 12:17:10 -03:00
Felipe Braz
86ef6e6987 fixes on dnsapi/dns_kinghost.sh and dnsapi/README.md 2018-03-26 11:21:12 -03:00
Felipe Braz
e8fd373e6c removed blank space at ending of dnsapi/dns_kinghost.sh 2018-03-26 10:58:56 -03:00
Felipe Braz
7efa546665 removed local .gitignore file 2018-03-26 10:58:22 -03:00
Felipe Braz
4d2a0697ed fix identation dnsapi/dns_kinghost.sh 2018-03-26 10:49:34 -03:00
Felipe Braz
c6023782a4 Merge branch 'dev' of github.com:Neilpang/acme.sh 2018-03-26 10:39:58 -03:00
Chris
30283282d2 Fixing code style according to Travis 2018-03-26 09:40:33 +02:00
Chris
7588fc0989 Fixes DNSimple for Wildcard certificates 2018-03-26 09:32:41 +02:00
Pål Håland
d698c1093a remove spaces around assignment 2018-03-26 08:24:04 +02:00
Pål Håland
7b327d47c0 Fix documentation 2018-03-26 08:21:31 +02:00
Pål Håland
e629985cf4 Use _cdomain if ROUTER_OS_HOST is missing 2018-03-26 07:41:56 +02:00
Pål Håland
aa875f1147 Merge branch 'master' into dev 2018-03-25 22:50:58 +02:00
martgras
fe843bc466 dns_he - proposed fix for #1438
if you have more than one zone of a domain (e.g.  example.com and subdomain.example.com) _find_zone fails. 
This fix removes partials matches.
2018-03-25 14:32:51 +02:00
Austin Drummond
5b355c6ca7 Fixed Dreamhost ENV var name in dnsapi/README.md 2018-03-24 18:57:22 -04:00
Nils Sandmann
a3f7ff90e3 Used e_grep_o instead grep -Po, dns_pdns_rm() now deletes only entry with matching txt value 2018-03-24 18:46:04 +01:00
Nils Sandmann
1f3f8a5073 Merge remote-tracking branch 'upstream/master' into dev 2018-03-24 18:43:21 +01:00
James Gibson
9c88971bc1 Use internal base64 util instead of PATH bin/ 2018-03-23 14:46:54 -06:00
neilpang
aad309ee4f fix https://github.com/Neilpang/acme.sh/issues/1430 2018-03-24 00:06:39 +08:00
Felipe Braz
e80ca4ddbc Merge branch 'dev' of github.com:Neilpang/acme.sh 2018-03-23 12:06:07 -03:00
neil
28ccad28c2 Merge pull request #1436 from james-gibson/patch-1
Clarified the language around the Name.com steps
2018-03-23 20:35:58 +08:00
James Gibson
ba9e7fbf64 Clarified the language around the Name.com steps
Name.com has simplified the process to obtain API tokens, this clarifies the language around requesting a key.
2018-03-22 22:52:30 -06:00
neil
28c85cf8e7 Merge pull request #1432 from pyriand3r/master
Added additional information for do.de users
2018-03-23 09:25:19 +08:00
neil
526b5a8d25 Merge pull request #1435 from ATLief/patch-1
Patch 1
2018-03-23 09:10:46 +08:00
Alex
6b15cf3f72 Remove template text 2018-03-22 13:45:43 -04:00
pyriand3r
fbd8ab47ea only reseller can use do.de's reseller interface 2018-03-22 11:23:16 +01:00
Nils Sandmann
893917a25d Fix travis errors 2018-03-22 11:13:46 +01:00
Nils Sandmann
af5ff2bb93 Modified DNSAPI for PowerDNS to support wildcard certificates 2018-03-21 16:43:42 +01:00
Ivar Larsson
8995d3434f _contains instead of echo 2018-03-21 11:19:22 -04:00
Ivar Larsson
5f9b0675e2 loopia -> loopia.se 2018-03-21 11:18:26 -04:00
neilpang
46ac97a3ff update doc 2018-03-21 20:57:48 +08:00
neil
db3264ab8c Merge pull request #1427 from Neilpang/dev
sync
2018-03-21 20:40:59 +08:00
neilpang
a0923622ae fix https://github.com/Neilpang/acme.sh/issues/1029
https://github.com/Neilpang/acme.sh/wiki/dns-manual-mode
2018-03-21 20:30:52 +08:00
Felipe Braz
aa9975ad0d dns_kinghost.sh :: changed printf to echo 2018-03-20 10:08:52 -03:00
Felipe Braz
6787c81abe renamed KINGHOST_username => KINGHOST_Username 2018-03-20 09:58:10 -03:00
Felipe Braz
72205176e1 Merge branch 'dev' of github.com:Neilpang/acme.sh 2018-03-19 18:04:46 -03:00
Felipe Braz
480742cc15 Merge branch 'master' of github.com:Neilpang/acme.sh 2018-03-19 13:52:49 -03:00
Felipe Braz
48bdfa2377 added doc header to dns_kinghost.sh 2018-03-19 13:49:58 -03:00
Felipe Braz
2ff6f4d3cf updated docs for dns_kinghost api usage 2018-03-19 12:26:54 -03:00
Felipe Braz
ae32938531 added dnsapi/dns_kinghost.sh 2018-03-19 12:17:47 -03:00
neil
d3da603292 Merge pull request #1418 from itssimple/patch-1
Patch for #1192
2018-03-19 19:47:30 +08:00
Chris Gårdenberg
912bcf9487 Fixed HTTPS-url with regard to #1192 2018-03-19 11:15:25 +01:00
Ivar Larsson
413f071861 use echo 2018-03-18 10:00:10 -04:00
neilpang
668c43abf3 add more debug info 2018-03-18 21:06:37 +08:00
neil
43e9553ebc Merge pull request #1413 from Neilpang/dev
sync
2018-03-18 20:06:19 +08:00
neilpang
e8b54a5087 fix ACCOUNT_URL 2018-03-18 19:32:45 +08:00
neilpang
39852662a6 fix content type 2018-03-18 19:29:02 +08:00
neilpang
6a66ba8a21 fix https://github.com/Neilpang/acme.sh/issues/1411 2018-03-18 18:57:56 +08:00
neilpang
36a7a84080 fix https://github.com/Neilpang/acme.sh/issues/1411 2018-03-18 18:34:35 +08:00
neilpang
7e0b334b38 fix empty ACCOUNT_URL for v2 for the first time use 2018-03-18 18:20:29 +08:00
neilpang
5d8d217a13 add more debug info 2018-03-18 11:36:04 +08:00
neilpang
f2aa5c0235 update doc 2018-03-18 11:18:37 +08:00
neilpang
323febe8c7 add more debug log 2018-03-18 11:14:03 +08:00
neilpang
32d8f349c9 add debug info 2018-03-18 11:04:14 +08:00
neil
3910495cce Merge pull request #1394 from rafaelgieschke/pdns-root
dns_pdns.sh: Allow "." as root zone
2018-03-17 22:02:51 +08:00
neil
fe69afdefb Merge pull request #1401 from casperklein/patch-1
Updated --accountemail help
2018-03-17 22:01:50 +08:00
Casper
9082862b9d Updated --accountemail help
https://github.com/Neilpang/acme.sh/issues/1074#issuecomment-337672763
2018-03-17 14:45:49 +01:00
Martin Kammerlander
cb4a2cf029 remove debug output 2018-03-16 16:47:47 +01:00
Martin Kammerlander
26b5180bf7 Rename full_domain and txt_value variables. 2018-03-16 15:49:40 +01:00
Martin Kammerlander
11bfb1e5fd Fix return values of some functions. 2018-03-16 15:02:47 +01:00
Martin Kammerlander
e431df06ab Only create entry. Remove update. 2018-03-16 14:54:08 +01:00
Martin Kammerlander
cbf0ceacd5 Update dnsapi Readme. 2018-03-16 14:51:16 +01:00
Martin Kammerlander
8c634d8323 Merge branch 'dev' into all-inkl-kasserver-dns-script 2018-03-16 14:49:02 +01:00
Rafael Gieschke
4ae108009c dns_pdns.sh: Allow "." as root zone 2018-03-16 14:32:05 +01:00
neilpang
a5c1c30368 update doc 2018-03-16 21:29:38 +08:00
neil
8cd3086be0 Merge pull request #1350 from martgras/dev
Fix missing success return value from dns_azure_add/rm
2018-03-16 20:29:03 +08:00
neil
dd37ae26a5 Merge pull request #1388 from Rid/dev
Fixed grammatical errors in CF api
2018-03-16 19:58:37 +08:00
neil
fdaebc7365 Merge pull request #1392 from cfstras/patch-1
DNS-Manual: better documentation in script
2018-03-16 18:29:24 +08:00
Claus F. Strasburger
a8b62261f6 Documentation: what to do when using dns-manual
Change the hint that tells you how to use DNS manual (second run needs to be --renew)
2018-03-16 11:21:03 +01:00
neil
47eb913c22 Merge pull request #1142 from maomihz/dev
Fix problem that digitalocean api failed to remove record
2018-03-16 17:16:48 +08:00
Ivar Larsson
7a46293f7a loopia documentation 2018-03-15 10:55:31 -04:00
Rid
6b26d2b62d Fixed grammatical errors 2018-03-15 09:50:54 +00:00
Ivar Larsson
cac3b3ea35 add dns_loopia 2018-03-14 12:32:02 -04:00
neil
dff4d03bd4 Merge pull request #1376 from Neilpang/dev
sync
2018-03-14 22:12:11 +08:00
neilpang
28d83d42e2 remove tls mode from doc
https://github.com/Neilpang/acme.sh/issues/1322
2018-03-14 22:09:34 +08:00
neilpang
38f1b4d205 fix wildcard interpretation 2018-03-14 22:03:58 +08:00
neilpang
931d19eece fix for wildcard domain interpretation 2018-03-14 21:56:40 +08:00
neilpang
88bbe55b85 fix wrong wildcard domain interpretation 2018-03-14 21:54:32 +08:00
neilpang
dd17124ec6 fix error 2018-03-14 21:45:16 +08:00
neilpang
674b50889e fix wildcard domains 2018-03-14 21:42:12 +08:00
neilpang
263c38caec add more debug info 2018-03-14 21:27:29 +08:00
neilpang
3881f22192 fix https://github.com/Neilpang/acme.sh/issues/1375
add more info
2018-03-14 21:20:27 +08:00
neilpang
664446631f add debug info 2018-03-14 20:52:18 +08:00
neilpang
c5f1cca3a0 fix https://github.com/Neilpang/acme.sh/issues/1372 2018-03-14 20:30:51 +08:00
neil
a7407097e1 Merge pull request #1374 from Neilpang/master
sync
2018-03-14 20:13:14 +08:00
neil
14bb60c61f Merge pull request #1370 from anabis/patch-1
fix syntax error missing space
2018-03-14 20:11:55 +08:00
neilpang
749c0e51e6 start 2.7.8 2018-03-14 19:42:02 +08:00
anabis
0f120c41f1 fix syntax error missing space 2018-03-14 11:05:57 +01:00
martgras
65a7d56957 remove local keyword 2018-03-14 09:52:58 +01:00
neil
8ab8a6eefb Merge pull request #1362 from Neilpang/dev
sync
2018-03-14 09:41:03 +08:00
martgras
52351d7dc8 avoid side effects in _printargs
A possible fix for https://github.com/Neilpang/acme.sh/issues/1356
2018-03-13 12:43:07 +01:00
martgras
224e0c298a Fix missing success return value from dns_azure_add/rm 2018-03-12 11:50:28 +01:00
neilpang
a5a0e564dd fix https://github.com/Neilpang/acme.sh/issues/1322 2018-03-10 10:33:33 +08:00
neil
b8c94fc7cf Merge pull request #1343 from dkerr64/Support-acme-v2-in-freedns
Adding support for API v2 (multiple TXT records)
2018-03-10 08:59:20 +08:00
David Kerr
62dd3a5380 Fix Travis CI errors. 2018-03-09 16:54:42 -05:00
David Kerr
e3ddb677e1 Adding support for API v2 (multiple TXT records) 2018-03-09 16:39:08 -05:00
Martin Kammerlander
32d7bd5ab1 Add own github repository URL. 2018-03-09 16:33:35 +01:00
Martin Kammerlander
861df49670 Add All-inkl kasserver script. 2018-03-09 16:29:47 +01:00
neilpang
716f727753 fix https://github.com/Neilpang/acme.sh/issues/1105 2018-03-09 20:14:41 +08:00
neilpang
7e381f8e5d fix format 2018-03-09 08:09:32 +08:00
neilpang
183063a244 add more safe check 2018-03-09 08:06:42 +08:00
neilpang
ef871775b7 fix https://github.com/Neilpang/acme.sh/issues/1336 for wget 2018-03-08 21:27:52 +08:00
neilpang
45e386b26d fix https://github.com/Neilpang/acme.sh/issues/1336 2018-03-08 19:49:53 +08:00
neilpang
e1db5db8ac fix https://github.com/Neilpang/acme.sh/issues/1105 2018-03-07 21:25:07 +08:00
neil
c3a289cebc Merge pull request #1332 from Neilpang/dev
sync
2018-03-07 09:38:54 +08:00
neil
20e51f0b4d Merge pull request #1319 from TigerP/master
Add support for DirectAdmin
2018-03-07 09:34:36 +08:00
neil
464dc93751 Merge pull request #1331 from jim-p/acme-fix-1330
Test ACME v2 before copying certificate to fullchain (again)
2018-03-07 09:33:39 +08:00
jim-p
7445a3be59 Add ACME v2 test around cert copy. Fixes #1330
Without this, the work done a few lines above is clobbered, leaving
the fullchain.cer containing only the certificate, not the CA and
certificate chain.
2018-03-06 17:00:57 -05:00
TigerP
2bbc25c1eb Add DirectAdmin to the main README 2018-03-06 17:00:19 +01:00
neil
fd56fe6eb2 Merge pull request #1318 from raidenii/master
New DNS plugin for name.com for new API.
2018-03-06 20:25:29 +08:00
neil
92dfa8becc Merge pull request #1324 from jwilk-forks/spelling
Fix typos
2018-03-05 09:44:57 +08:00
neil
ae8f9561ad Merge pull request #1248 from skid9000/patch-1
Fix the command to generate tsig key for knot api
2018-03-05 09:36:42 +08:00
raidenii
3052ba433a Fix an obvious stupidity. 2018-03-04 17:27:34 -05:00
raidenii
508012342d Make sure the removal of DNS record is the desired one (i.e., by txtvalue) 2018-03-04 17:22:13 -05:00
raidenii
9fa207e613 Move code to fit DNS API dev guide. 2018-03-04 14:13:14 -05:00
Jakub Wilk
2d7b9817cb Fix typos 2018-03-03 16:27:17 +01:00
TigerP
e8d808d708 Remove empty line at the end 2018-03-03 14:40:23 +01:00
neil
d71595fc75 Merge pull request #1320 from Neilpang/dev
sync
2018-03-02 09:02:36 +08:00
TigerP
399d6592b8 Fix some quotes and a check 2018-03-01 21:25:24 +01:00
raidenii
628a6ffa07 Tried to fix some weird problems 2018-03-01 15:03:28 -05:00
raidenii
3e1a94cbcd Yet another fix. 2018-03-01 14:43:08 -05:00
raidenii
a6c2d4b0e2 Another fix. 2018-03-01 14:38:49 -05:00
raidenii
19277aec87 Use printf instead of echo, hopefully fix SC2039. 2018-03-01 14:29:14 -05:00
TigerP
14c2755436 Add support for DirectAdmin 2018-03-01 20:19:55 +01:00
raidenii
50a9145386 Rewrote to adapt the new name.com v4 API. 2018-03-01 14:19:43 -05:00
raidenii
9046509b95 Merge remote-tracking branch 'upstream/master' 2018-03-01 14:09:36 -05:00
neil
61eaa44cf8 Merge pull request #1316 from Neilpang/alias
Alias
2018-03-01 22:38:05 +08:00
neilpang
2d1e9abb60 Merge branch 'dev' of https://github.com/Neilpang/acme.sh into dev 2018-03-01 22:01:11 +08:00
neilpang
d064260bf1 fix https://github.com/Neilpang/acme.sh/issues/1315 2018-03-01 21:59:46 +08:00
neil
a19ad3fd1d Merge pull request #1305 from justmwa/master
DNSMadeEasy ACMEv2 support
2018-02-27 13:43:05 +08:00
nytral
3bc59a0327 first attempt to fix CI errors 2018-02-26 21:47:51 +01:00
nytral
5a883889a2 fixes 2018-02-26 14:53:31 +01:00
neil
fbaa7a4d67 Merge pull request #586 from dkerr64/ssh-deploy
Ssh deploy
2018-02-25 22:56:09 +08:00
nytral
6baa6d488b Merge remote-tracking branch 'upstream/master' 2018-02-24 09:09:00 +01:00
nytral
e26f9b8095 DNSMadeEasy ACMEv2 support 2018-02-24 09:08:44 +01:00
neil
f92fae7625 Merge pull request #1291 from ClouDNS/master
Update dns api to support v2 wildcard cert #1261
2018-02-23 20:05:00 +08:00
neil
3d0e269241 Merge pull request #1287 from martgras/dev
Azure DNS API- support for ACME v2
2018-02-23 20:02:57 +08:00
neil
c17c47f18a Merge pull request #1300 from mal/aws-use-container-role
Pull AWS creds from container role
2018-02-23 19:56:01 +08:00
David Kerr
98b8bfb3fa Merge branch 'dev' of https://github.com/Neilpang/acme.sh into ssh-deploy 2018-02-22 11:46:34 -05:00
martgras
83b1a98db1 Azure DNS API - support for ACME v2 and reliability improvments
support adding 2 txt records
Adding retry logic for REST API calls
Reusing bearer token removes 50% of required REST calls
2018-02-22 12:32:42 +01:00
Mal Graty
f49f55f4a5 Pull AWS creds from container role
Extend the AWS DNS API driver to support ECS container metadata by using
the special environment variable ECS sets in containers.
2018-02-21 11:49:03 +00:00
neil
e58d19b420 Merge pull request #1299 from hebbet/patch-2
small typo
2018-02-21 16:13:15 +08:00
hebbet
58f753136a small typo 2018-02-21 09:01:56 +01:00
neil
22d827adf1 Merge pull request #1292 from mal/aws-use-instance-role
Let AWS DNS API driver pull creds from instance metadata
2018-02-21 10:20:35 +08:00
neil
d3de50e0f9 Merge pull request #1270 from rbelnap/vault-deploy
Vault deploy
2018-02-21 10:17:27 +08:00
neil
432037d20d Merge pull request #1298 from Neilpang/dev
sync
2018-02-21 10:08:17 +08:00
neilpang
86ef0a2609 fix https://github.com/Neilpang/acme.sh/issues/1295 2018-02-21 10:05:27 +08:00
neilpang
bae50da799 fix https://github.com/Neilpang/acme.sh/issues/1266 2018-02-21 09:45:36 +08:00
Bob Belnap
2c45f27356 rename deploy hook vault to vault_cli 2018-02-20 09:11:45 -05:00
Mal Graty
759f4f2c62 Make the instance metadata fetcher self-contained
This is to provide a clean path to future extension work such as adding
a _use_container_role function to offer similar support for ECS
containers.

The $_using_role flag has also been made generic so that future role
providers can also make use of it.
2018-02-20 12:40:24 +00:00
Boyan Peychev
28355335f8 Update dns api to support v2 wildcard cert #1261 2018-02-20 11:22:06 +02:00
Boyan Peychev
9f6832d636 Update dns api to support v2 wildcard cert #1261 2018-02-20 11:16:42 +02:00
Boyan Peychev
5309afc347 Update dns api to support v2 wildcard cert #1261 2018-02-20 11:09:37 +02:00
Mal Graty
693627a858 Emulate Boto when using role metadata
Use the behavior established in the botocore python library to inform
how and when instance metadata is fetched in an attempt to acquire valid
AWS credentials.

- Use it as a fallback when no other credentials are provided
- Set the timeout of metadata requests to 1 second
2018-02-20 00:34:55 +00:00
Mal Graty
48eaa0e5bf Let AWS DNS API code pull creds from instance role
Add option (AWS_USE_INSTANCE_ROLE) to have the AWS DNS API driver pull
the necessary credentials from the AWS EC2 instance metadata endpoint
when required.

This is a non-breaking change as it only takes effect when explicitly
turned on via the environment variable, and fails safe back to the
normal code path.
2018-02-19 19:03:29 +00:00
neilpang
9ad7ac632a fix https://github.com/Neilpang/acme.sh/issues/1284#issuecomment-366616855 2018-02-19 21:07:01 +08:00
Boyan Peychev
41e3ecad46 Update dns api to support v2 wildcard cert #1261 2018-02-19 14:14:08 +02:00
neilpang
d6f8d63742 fix https://github.com/Neilpang/acme.sh/issues/1286 2018-02-19 12:43:56 +08:00
neil
28b0929554 Merge pull request #1283 from justmwa/master
Fixes
2018-02-19 12:34:18 +08:00
nytral
55787ff7b9 other fixes 2018-02-17 15:12:19 +01:00
nytral
b00919c692 various fixes 2018-02-17 15:08:13 +01:00
neil
d43392628b Merge pull request #1273 from jlduran/add-strongswan-freebsd
Add support for strongSwan deploys in FreeBSD
2018-02-17 11:43:42 +08:00
neil
aa831fee5b Merge pull request #1279 from Neilpang/1277
https://github.com/Neilpang/acme.sh/issues/1277
2018-02-17 10:45:44 +08:00
neilpang
5c568d6999 https://github.com/Neilpang/acme.sh/issues/1277 2018-02-17 10:31:34 +08:00
Boyan Peychev
94b925f5ef Merge branch 'dev' of https://github.com/Neilpang/acme.sh 2018-02-16 16:36:32 +02:00
Bob Belnap
c86755f1ab format fix 2018-02-16 09:19:47 -05:00
Bob Belnap
b8418ced44 syntax fixes 2018-02-16 09:01:26 -05:00
Jose Luis Duran
fac0beaa0a Add support for strongSwan deploys in FreeBSD
Related to 8ea800205c
2018-02-16 11:29:10 -02:00
Bob Belnap
90e587a974 add vault deploy hook script 2018-02-15 15:34:47 -05:00
neil
4a6b31fbe2 Merge pull request #1268 from Neilpang/dev
fix format
2018-02-15 21:16:41 +08:00
neil
47359c1a3b Merge pull request #1267 from Neilpang/dev
sync
2018-02-15 20:37:15 +08:00
neil
5c6af92a0d Merge pull request #1264 from Neilpang/dev
sync
2018-02-14 22:56:13 +08:00
Boyan Peychev
520c454f22 Merge branch 'dev' of https://github.com/Neilpang/acme.sh 2018-02-14 13:29:36 +02:00
neilpang
1f7df33e28 fix format 2018-02-13 22:26:36 +08:00
neilpang
64821ad4f5 support "--domain-alias" 2018-02-12 21:49:22 +08:00
neil
de2970d7ef Merge pull request #1259 from Neilpang/dev
sync
2018-02-12 20:07:57 +08:00
neilpang
875625b147 Support domain alias mode 2018-02-10 10:45:29 +08:00
Skid
7f59d7ea48 Fix the command to generate tsig key for knot api 2018-02-07 14:07:14 +01:00
MaomiHz
c1f8ffa386 Use [0-9] instead 2018-01-17 21:39:13 -06:00
MaomiHz
9c4f7aa688 check for env var exist in DigitalOcean API 2017-12-11 16:33:44 -06:00
MaomiHz
e75b56073b Fix digitalocean api not remove record 2017-12-11 16:33:42 -06:00
David Kerr
c7becddb78 Merge branch 'master' of https://github.com/Neilpang/acme.sh into ssh-deploy 2017-11-11 12:52:53 -05:00
David Kerr
c809b33161 Merge branch 'master' of https://github.com/Neilpang/acme.sh into ssh-deploy 2017-10-29 21:03:05 -04:00
David Kerr
94e9844179 Merge remote-tracking branch 'upstream/master' into ssh-deploy 2017-08-06 11:13:06 -04:00
raidenii
4964e075df Merge remote-tracking branch 'upstream/master' 2017-07-03 11:40:32 -04:00
dkerr64
19aa2ccf4d Merge remote-tracking branch 'upstream/master' into ssh-deploy 2017-06-24 12:18:07 -04:00
dkerr64
6093a4f9f8 Merge remote-tracking branch 'upstream/master' into ssh-deploy 2017-05-19 21:25:39 -04:00
Pål Håland
8c56356459 Merge remote-tracking branch 'upstream/dev' into dev 2017-05-03 21:49:55 +02:00
David Kerr
21f728f0ea Merge remote-tracking branch 'upstream/master' into ssh-deploy 2017-05-03 11:15:46 -04:00
David Kerr
3a439063a6 Merge remote-tracking branch 'upstream/master' into ssh-deploy 2017-04-22 11:45:03 -04:00
David Kerr
9964e6eba3 Merge remote-tracking branch 'upstream/master' into ssh-deploy 2017-04-17 15:28:36 -04:00
David Kerr
fd1598017a Merge remote-tracking branch 'upstream/master' into ssh-deploy 2017-04-05 16:47:56 -04:00
David Kerr
89f66ebf6d Merge remote-tracking branch 'upstream/master' into ssh-deploy 2017-03-24 10:55:42 -04:00
David Kerr
688973fa44 Merge remote-tracking branch 'upstream/master' into ssh-deploy 2017-03-21 16:30:46 -04:00
Pål Håland
400661d432 Merge remote-tracking branch 'upstream/dev' into dev 2017-03-21 20:14:31 +01:00
Pål Håland
e4e60ed654 Merge remote-tracking branch 'upstream/dev' into dev 2017-03-19 21:17:21 +01:00
David Kerr
070a141601 Merge remote-tracking branch 'upstream/master' into ssh-deploy 2017-03-15 18:37:46 -04:00
Pål Håland
ff90a5d321 Merge branch 'dev' of github.com:Neilpang/acme.sh into dev 2017-03-14 20:20:36 +01:00
palhaland
cee0ab87fc Merge branch 'dev' into dev 2017-03-08 15:06:23 +01:00
David Kerr
158abf5c6c Remove line from README.md that I mistakenly added during
merge with master.
2017-03-07 12:09:07 -05:00
David Kerr
b30c1daf72 Merge remote-tracking branch 'upstream/master' into ssh-deploy 2017-03-07 12:04:35 -05:00
David Kerr
0649206796 remove _ACME prefix from all exported variables. 2017-03-07 11:57:03 -05:00
Pål Håland
8a604bd2a1 Fixing syntax for schell script checking 2017-03-06 19:39:55 +01:00
Pål Håland
b8a8e2280d Added deploy script to deploy to the routeros system 2017-03-05 13:43:01 +01:00
David Kerr
e0b00ee11a Merge remote-tracking branch 'upstream/master' into ssh-deploy 2017-02-20 15:27:10 -05:00
David Kerr
fa9afb0860 Merge remote-tracking branch 'upstream/master' into ssh-deploy 2017-02-18 23:45:36 -05:00
David Kerr
712b895170 Merge remote-tracking branch 'upstream/master' into ssh-deploy 2017-02-18 23:38:59 -05:00
David Kerr
710ce7c2e9 Merge remote-tracking branch 'upstream/master' into ssh-deploy 2017-02-17 14:28:50 -05:00
David Kerr
68a35155e4 Improve documentation in readme 2017-02-13 20:32:12 -05:00
David Kerr
d04ccb7a3f fix spelling error in readme 2017-02-12 18:20:43 -05:00
David Kerr
76c1ed6628 Additional documentation for the unifi example. 2017-02-12 18:08:17 -05:00
David Kerr
6f4abe95cb update markdown examples. 2017-02-12 11:24:00 -05:00
David Kerr
e35e313240 Fix error in Unifi example 2017-02-12 11:20:16 -05:00
David Kerr
3a77a6eded cleanup documentation and suppress some remote messages. 2017-02-12 11:17:23 -05:00
David Kerr
0a7a1b9bfb Merge remote-tracking branch 'upstream/master' into ssh-deploy 2017-02-12 10:45:51 -05:00
David Kerr
18a90734d9 Alternate backup cleanup after 180 days method. 2017-02-11 17:55:05 -05:00
David Kerr
a4b2cebef6 Make backup of certs on remote server optional. Defaults to yes. 2017-02-11 16:42:44 -05:00
David Kerr
68d708e56d Reduce and simplify number of exported variables. Also allow any cert file to
append to previous file.
2017-02-11 16:11:27 -05:00
David Kerr
e925ab0999 Merge remote-tracking branch 'upstream/master' into ssh-deploy 2017-02-11 14:37:02 -05:00
David Kerr
e3feac3fd8 Documentation updates 2017-02-08 21:13:00 -05:00
David Kerr
1a5989350f Some documentation in README 2017-02-08 21:02:00 -05:00
David Kerr
3365df7778 Make certificate domain name part of the backup directory name. 2017-02-08 10:15:39 -05:00
David Kerr
3be5a68e12 Rename sshdeploy.sh to ssh.sh 2017-02-07 13:05:22 -05:00
David Kerr
f158caa2eb Updates from code review 2017-02-06 21:49:20 -05:00
David Kerr
e02c94eb00 Merge remote-tracking branch 'upstream/master' into ssh-deploy 2017-02-06 21:31:55 -05:00
David Kerr
9507b121ac More selective pruning of certificate backup directories. 2017-02-05 15:34:03 -05:00
David Kerr
3812b275e9 Moving on to the next batch of travis errors. 2017-02-05 15:26:55 -05:00
David Kerr
6c1561f415 Grasping at straws now !! 2017-02-05 15:20:06 -05:00
David Kerr
9ab6353d73 Trying again. 2017-02-05 15:16:05 -05:00
David Kerr
ff60dc4d24 More Travis issues !!! 2017-02-05 15:12:23 -05:00
David Kerr
62e7d904b4 Travis errors 2017-02-05 15:02:59 -05:00
David Kerr
5d3de4b670 Additional info messages for backup management 2017-02-05 14:39:25 -05:00
David Kerr
7d75ad4c56 Backup old certificates before overwriting. Add userid export parameter.
And generate error if nothing to do at remote server.
2017-02-05 14:35:05 -05:00
David Kerr
989651c23b Initial version 2017-02-04 23:17:24 -05:00
192 changed files with 28451 additions and 3919 deletions

12
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,12 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: acmesh
ko_fi: neilpang
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

View File

@@ -1,6 +1,8 @@
<!--
请确保已经更新到最新的代码, 然后贴上来 `--debug 2` 的调试输出. 没有调试输出,我帮不了你.
如何调试 https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh
我很忙, 每天可能只有 几秒钟 时间看你的 issue, 如果不按照我的要求写 issue, 你可能不会得到任何回复, 石沉大海.
请确保已经更新到最新的代码, 然后贴上来 `--debug 2` 的调试输出. 没有调试信息. 我做不了什么.
如何调试 https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh
If it is a bug report:
- make sure you are able to repro it on the latest released version.
@@ -8,7 +10,7 @@ You can install the latest version by: `acme.sh --upgrade`
- Search the existing issues.
- Refer to the [WIKI](https://wiki.acme.sh).
- Debug info [Debug](https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh).
- Debug info [Debug](https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh).
-->

View File

@@ -1,9 +1,9 @@
<!--
Do NOT send pull request to `master` branch.
1. Do NOT send pull request to `master` branch.
Please send to `dev` branch instead.
Any PR to `master` branch will NOT be merged.
2. For dns api support, read this guide first: https://github.com/acmesh-official/acme.sh/wiki/DNS-API-Dev-Guide
You will NOT get any review without passing this guide. You also need to fix the CI errors.
-->

254
.github/workflows/DNS.yml vendored Normal file
View File

@@ -0,0 +1,254 @@
name: DNS
on:
push:
paths:
- 'dnsapi/*.sh'
- '.github/workflows/DNS.yml'
pull_request:
branches:
- 'dev'
paths:
- 'dnsapi/*.sh'
- '.github/workflows/DNS.yml'
jobs:
CheckToken:
runs-on: ubuntu-latest
outputs:
hasToken: ${{ steps.step_one.outputs.hasToken }}
steps:
- name: Set the value
id: step_one
run: |
if [ "${{secrets.TokenName1}}" ] ; then
echo "::set-output name=hasToken::true"
else
echo "::set-output name=hasToken::false"
fi
- name: Check the value
run: echo ${{ steps.step_one.outputs.hasToken }}
Fail:
runs-on: ubuntu-latest
needs: CheckToken
if: "contains(needs.CheckToken.outputs.hasToken, 'false')"
steps:
- name: "Read this: https://github.com/acmesh-official/acme.sh/wiki/DNS-API-Test"
run: |
echo "Read this: https://github.com/acmesh-official/acme.sh/wiki/DNS-API-Test"
if [ "${{github.repository_owner}}" != "acmesh-official" ]; then
false
fi
Docker:
runs-on: ubuntu-latest
needs: CheckToken
if: "contains(needs.CheckToken.outputs.hasToken, 'true')"
env:
TEST_DNS : ${{ secrets.TEST_DNS }}
TestingDomain: ${{ secrets.TestingDomain }}
TEST_DNS_NO_WILDCARD: ${{ secrets.TEST_DNS_NO_WILDCARD }}
TEST_DNS_NO_SUBDOMAIN: ${{ secrets.TEST_DNS_NO_SUBDOMAIN }}
TEST_DNS_SLEEP: ${{ secrets.TEST_DNS_SLEEP }}
CASE: le_test_dnsapi
TEST_LOCAL: 1
DEBUG: 1
steps:
- uses: actions/checkout@v2
- name: Clone acmetest
run: cd .. && git clone https://github.com/acmesh-official/acmetest.git && cp -r acme.sh acmetest/
- name: Set env file
run: |
cd ../acmetest
if [ "${{ secrets.TokenName1}}" ] ; then
echo "${{ secrets.TokenName1}}=${{ secrets.TokenValue1}}" >> docker.env
fi
if [ "${{ secrets.TokenName2}}" ] ; then
echo "${{ secrets.TokenName2}}=${{ secrets.TokenValue2}}" >> docker.env
fi
if [ "${{ secrets.TokenName3}}" ] ; then
echo "${{ secrets.TokenName3}}=${{ secrets.TokenValue3}}" >> docker.env
fi
if [ "${{ secrets.TokenName4}}" ] ; then
echo "${{ secrets.TokenName4}}=${{ secrets.TokenValue4}}" >> docker.env
fi
if [ "${{ secrets.TokenName5}}" ] ; then
echo "${{ secrets.TokenName5}}=${{ secrets.TokenValue5}}" >> docker.env
fi
echo "TEST_DNS_NO_WILDCARD" >> docker.env
echo "TEST_DNS_SLEEP" >> docker.env
- name: Run acmetest
run: cd ../acmetest && ./rundocker.sh testall
MacOS:
runs-on: macos-latest
needs: Docker
env:
TEST_DNS : ${{ secrets.TEST_DNS }}
TestingDomain: ${{ secrets.TestingDomain }}
TEST_DNS_NO_WILDCARD: ${{ secrets.TEST_DNS_NO_WILDCARD }}
TEST_DNS_NO_SUBDOMAIN: ${{ secrets.TEST_DNS_NO_SUBDOMAIN }}
TEST_DNS_SLEEP: ${{ secrets.TEST_DNS_SLEEP }}
CASE: le_test_dnsapi
TEST_LOCAL: 1
DEBUG: 1
steps:
- uses: actions/checkout@v2
- name: Install tools
run: brew install socat
- name: Clone acmetest
run: cd .. && git clone https://github.com/acmesh-official/acmetest.git && cp -r acme.sh acmetest/
- name: Run acmetest
run: |
if [ "${{ secrets.TokenName1}}" ] ; then
export ${{ secrets.TokenName1}}=${{ secrets.TokenValue1}}
fi
if [ "${{ secrets.TokenName2}}" ] ; then
export ${{ secrets.TokenName2}}=${{ secrets.TokenValue2}}
fi
if [ "${{ secrets.TokenName3}}" ] ; then
export ${{ secrets.TokenName3}}=${{ secrets.TokenValue3}}
fi
if [ "${{ secrets.TokenName4}}" ] ; then
export ${{ secrets.TokenName4}}=${{ secrets.TokenValue4}}
fi
if [ "${{ secrets.TokenName5}}" ] ; then
export ${{ secrets.TokenName5}}=${{ secrets.TokenValue5}}
fi
cd ../acmetest
./letest.sh
Windows:
runs-on: windows-latest
needs: MacOS
env:
TEST_DNS : ${{ secrets.TEST_DNS }}
TestingDomain: ${{ secrets.TestingDomain }}
TEST_DNS_NO_WILDCARD: ${{ secrets.TEST_DNS_NO_WILDCARD }}
TEST_DNS_NO_SUBDOMAIN: ${{ secrets.TEST_DNS_NO_SUBDOMAIN }}
TEST_DNS_SLEEP: ${{ secrets.TEST_DNS_SLEEP }}
CASE: le_test_dnsapi
TEST_LOCAL: 1
DEBUG: 1
steps:
- name: Set git to use LF
run: |
git config --global core.autocrlf false
- uses: actions/checkout@v2
- name: Install cygwin base packages with chocolatey
run: |
choco config get cacheLocation
choco install --no-progress cygwin
shell: cmd
- name: Install cygwin additional packages
run: |
C:\tools\cygwin\cygwinsetup.exe -qgnNdO -R C:/tools/cygwin -s http://mirrors.kernel.org/sourceware/cygwin/ -P socat,curl,cron,unzip,git
shell: cmd
- name: Set ENV
shell: cmd
run: |
echo PATH=C:\tools\cygwin\bin;C:\tools\cygwin\usr\bin >> %GITHUB_ENV%
- name: Clone acmetest
run: cd .. && git clone https://github.com/acmesh-official/acmetest.git && cp -r acme.sh acmetest/
- name: Run acmetest
shell: bash
run: |
if [ "${{ secrets.TokenName1}}" ] ; then
export ${{ secrets.TokenName1}}=${{ secrets.TokenValue1}}
fi
if [ "${{ secrets.TokenName2}}" ] ; then
export ${{ secrets.TokenName2}}=${{ secrets.TokenValue2}}
fi
if [ "${{ secrets.TokenName3}}" ] ; then
export ${{ secrets.TokenName3}}=${{ secrets.TokenValue3}}
fi
if [ "${{ secrets.TokenName4}}" ] ; then
export ${{ secrets.TokenName4}}=${{ secrets.TokenValue4}}
fi
if [ "${{ secrets.TokenName5}}" ] ; then
export ${{ secrets.TokenName5}}=${{ secrets.TokenValue5}}
fi
cd ../acmetest
./letest.sh
FreeBSD:
runs-on: macos-10.15
needs: Windows
env:
TEST_DNS : ${{ secrets.TEST_DNS }}
TestingDomain: ${{ secrets.TestingDomain }}
TEST_DNS_NO_WILDCARD: ${{ secrets.TEST_DNS_NO_WILDCARD }}
TEST_DNS_NO_SUBDOMAIN: ${{ secrets.TEST_DNS_NO_SUBDOMAIN }}
TEST_DNS_SLEEP: ${{ secrets.TEST_DNS_SLEEP }}
CASE: le_test_dnsapi
TEST_LOCAL: 1
DEBUG: 1
steps:
- uses: actions/checkout@v2
- name: Clone acmetest
run: cd .. && git clone https://github.com/acmesh-official/acmetest.git && cp -r acme.sh acmetest/
- uses: vmactions/freebsd-vm@v0.1.4
with:
envs: 'TEST_DNS TestingDomain TEST_DNS_NO_WILDCARD TEST_DNS_NO_SUBDOMAIN TEST_DNS_SLEEP CASE TEST_LOCAL DEBUG ${{ secrets.TokenName1}} ${{ secrets.TokenName2}} ${{ secrets.TokenName3}} ${{ secrets.TokenName4}} ${{ secrets.TokenName5}}'
prepare: pkg install -y socat curl
usesh: true
run: |
if [ "${{ secrets.TokenName1}}" ] ; then
export ${{ secrets.TokenName1}}=${{ secrets.TokenValue1}}
fi
if [ "${{ secrets.TokenName2}}" ] ; then
export ${{ secrets.TokenName2}}=${{ secrets.TokenValue2}}
fi
if [ "${{ secrets.TokenName3}}" ] ; then
export ${{ secrets.TokenName3}}=${{ secrets.TokenValue3}}
fi
if [ "${{ secrets.TokenName4}}" ] ; then
export ${{ secrets.TokenName4}}=${{ secrets.TokenValue4}}
fi
if [ "${{ secrets.TokenName5}}" ] ; then
export ${{ secrets.TokenName5}}=${{ secrets.TokenValue5}}
fi
cd ../acmetest
./letest.sh
Solaris:
runs-on: macos-10.15
needs: FreeBSD
env:
TEST_DNS : ${{ secrets.TEST_DNS }}
TestingDomain: ${{ secrets.TestingDomain }}
TEST_DNS_NO_WILDCARD: ${{ secrets.TEST_DNS_NO_WILDCARD }}
TEST_DNS_NO_SUBDOMAIN: ${{ secrets.TEST_DNS_NO_SUBDOMAIN }}
TEST_DNS_SLEEP: ${{ secrets.TEST_DNS_SLEEP }}
CASE: le_test_dnsapi
TEST_LOCAL: 1
DEBUG: 1
steps:
- uses: actions/checkout@v2
- name: Clone acmetest
run: cd .. && git clone https://github.com/acmesh-official/acmetest.git && cp -r acme.sh acmetest/
- uses: vmactions/solaris-vm@v0.0.5
with:
envs: 'TEST_DNS TestingDomain TEST_DNS_NO_WILDCARD TEST_DNS_NO_SUBDOMAIN TEST_DNS_SLEEP CASE TEST_LOCAL DEBUG ${{ secrets.TokenName1}} ${{ secrets.TokenName2}} ${{ secrets.TokenName3}} ${{ secrets.TokenName4}} ${{ secrets.TokenName5}}'
prepare: pkgutil -y -i socat
run: |
pkg set-mediator -v -I default@1.1 openssl
export PATH=/usr/gnu/bin:$PATH
if [ "${{ secrets.TokenName1}}" ] ; then
export ${{ secrets.TokenName1}}=${{ secrets.TokenValue1}}
fi
if [ "${{ secrets.TokenName2}}" ] ; then
export ${{ secrets.TokenName2}}=${{ secrets.TokenValue2}}
fi
if [ "${{ secrets.TokenName3}}" ] ; then
export ${{ secrets.TokenName3}}=${{ secrets.TokenValue3}}
fi
if [ "${{ secrets.TokenName4}}" ] ; then
export ${{ secrets.TokenName4}}=${{ secrets.TokenValue4}}
fi
if [ "${{ secrets.TokenName5}}" ] ; then
export ${{ secrets.TokenName5}}=${{ secrets.TokenValue5}}
fi
cd ../acmetest
./letest.sh

63
.github/workflows/FreeBSD.yml vendored Normal file
View File

@@ -0,0 +1,63 @@
name: FreeBSD
on:
push:
branches:
- '*'
paths:
- '*.sh'
- '.github/workflows/FreeBSD.yml'
pull_request:
branches:
- dev
paths:
- '*.sh'
- '.github/workflows/FreeBSD.yml'
jobs:
FreeBSD:
strategy:
matrix:
include:
- TEST_ACME_Server: "LetsEncrypt.org_test"
CA_ECDSA: ""
CA: ""
CA_EMAIL: ""
TEST_PREFERRED_CHAIN: (STAGING) Pretend Pear X1
#- TEST_ACME_Server: "ZeroSSL.com"
# CA_ECDSA: "ZeroSSL ECC Domain Secure Site CA"
# CA: "ZeroSSL RSA Domain Secure Site CA"
# CA_EMAIL: "githubtest@acme.sh"
# TEST_PREFERRED_CHAIN: ""
runs-on: macos-10.15
env:
TEST_LOCAL: 1
TEST_ACME_Server: ${{ matrix.TEST_ACME_Server }}
CA_ECDSA: ${{ matrix.CA_ECDSA }}
CA: ${{ matrix.CA }}
CA_EMAIL: ${{ matrix.CA_EMAIL }}
TEST_PREFERRED_CHAIN: ${{ matrix.TEST_PREFERRED_CHAIN }}
steps:
- uses: actions/checkout@v2
- uses: vmactions/cf-tunnel@v0.0.3
id: tunnel
with:
protocol: http
port: 8080
- name: Set envs
run: echo "TestingDomain=${{steps.tunnel.outputs.server}}" >> $GITHUB_ENV
- name: Clone acmetest
run: cd .. && git clone https://github.com/acmesh-official/acmetest.git && cp -r acme.sh acmetest/
- uses: vmactions/freebsd-vm@v0.1.5
with:
envs: 'TEST_LOCAL TestingDomain TEST_ACME_Server CA_ECDSA CA CA_EMAIL TEST_PREFERRED_CHAIN'
nat: |
"8080": "80"
prepare: pkg install -y socat curl
usesh: true
run: |
cd ../acmetest \
&& ./letest.sh

41
.github/workflows/Linux.yml vendored Normal file
View File

@@ -0,0 +1,41 @@
name: Linux
on:
push:
branches:
- '*'
paths:
- '*.sh'
- '.github/workflows/Linux.yml'
pull_request:
branches:
- dev
paths:
- '*.sh'
- '.github/workflows/Linux.yml'
jobs:
Linux:
strategy:
matrix:
os: ["ubuntu:latest", "debian:latest", "almalinux:latest", "fedora:latest", "centos:7", "opensuse/leap:latest", "alpine:latest", "oraclelinux:8", "kalilinux/kali", "archlinux:latest", "mageia", "gentoo/stage3"]
runs-on: ubuntu-latest
env:
TEST_LOCAL: 1
TEST_PREFERRED_CHAIN: (STAGING) Pretend Pear X1
steps:
- uses: actions/checkout@v2
- name: Clone acmetest
run: |
cd .. \
&& git clone https://github.com/acmesh-official/acmetest.git \
&& cp -r acme.sh acmetest/
- name: Run acmetest
run: |
cd ../acmetest \
&& ./rundocker.sh testplat ${{ matrix.os }}

55
.github/workflows/MacOS.yml vendored Normal file
View File

@@ -0,0 +1,55 @@
name: MacOS
on:
push:
branches:
- '*'
paths:
- '*.sh'
- '.github/workflows/MacOS.yml'
pull_request:
branches:
- dev
paths:
- '*.sh'
- '.github/workflows/MacOS.yml'
jobs:
MacOS:
strategy:
matrix:
include:
- TEST_ACME_Server: "LetsEncrypt.org_test"
CA_ECDSA: ""
CA: ""
CA_EMAIL: ""
TEST_PREFERRED_CHAIN: (STAGING) Pretend Pear X1
#- TEST_ACME_Server: "ZeroSSL.com"
# CA_ECDSA: "ZeroSSL ECC Domain Secure Site CA"
# CA: "ZeroSSL RSA Domain Secure Site CA"
# CA_EMAIL: "githubtest@acme.sh"
# TEST_PREFERRED_CHAIN: ""
runs-on: macos-latest
env:
TEST_LOCAL: 1
TEST_ACME_Server: ${{ matrix.TEST_ACME_Server }}
CA_ECDSA: ${{ matrix.CA_ECDSA }}
CA: ${{ matrix.CA }}
CA_EMAIL: ${{ matrix.CA_EMAIL }}
TEST_PREFERRED_CHAIN: ${{ matrix.TEST_PREFERRED_CHAIN }}
steps:
- uses: actions/checkout@v2
- name: Install tools
run: brew install socat
- name: Clone acmetest
run: |
cd .. \
&& git clone https://github.com/acmesh-official/acmetest.git \
&& cp -r acme.sh acmetest/
- name: Run acmetest
run: |
cd ../acmetest \
&& sudo --preserve-env ./letest.sh

62
.github/workflows/PebbleStrict.yml vendored Normal file
View File

@@ -0,0 +1,62 @@
name: PebbleStrict
on:
push:
branches:
- '*'
paths:
- '*.sh'
- '.github/workflows/PebbleStrict.yml'
pull_request:
branches:
- dev
paths:
- '*.sh'
- '.github/workflows/PebbleStrict.yml'
jobs:
PebbleStrict:
runs-on: ubuntu-latest
env:
TestingDomain: example.com
TestingAltDomains: www.example.com
TEST_ACME_Server: https://localhost:14000/dir
HTTPS_INSECURE: 1
Le_HTTPPort: 5002
TEST_LOCAL: 1
TEST_CA: "Pebble Intermediate CA"
steps:
- uses: actions/checkout@v2
- name: Install tools
run: sudo apt-get install -y socat
- name: Run Pebble
run: cd .. && curl https://raw.githubusercontent.com/letsencrypt/pebble/master/docker-compose.yml >docker-compose.yml && docker-compose up -d
- name: Set up Pebble
run: curl --request POST --data '{"ip":"10.30.50.1"}' http://localhost:8055/set-default-ipv4
- name: Clone acmetest
run: cd .. && git clone https://github.com/acmesh-official/acmetest.git && cp -r acme.sh acmetest/
- name: Run acmetest
run: cd ../acmetest && ./letest.sh
PebbleStrict_IPCert:
runs-on: ubuntu-latest
env:
TestingDomain: 10.30.50.1
ACME_DIRECTORY: https://localhost:14000/dir
HTTPS_INSECURE: 1
Le_HTTPPort: 5002
Le_TLSPort: 5001
TEST_LOCAL: 1
TEST_CA: "Pebble Intermediate CA"
TEST_IPCERT: 1
steps:
- uses: actions/checkout@v2
- name: Install tools
run: sudo apt-get install -y socat
- name: Run Pebble
run: cd .. && curl https://raw.githubusercontent.com/letsencrypt/pebble/master/docker-compose.yml >docker-compose.yml && docker-compose up -d
- name: Clone acmetest
run: cd .. && git clone https://github.com/acmesh-official/acmetest.git && cp -r acme.sh acmetest/
- name: Run acmetest
run: cd ../acmetest && ./letest.sh

61
.github/workflows/Solaris.yml vendored Normal file
View File

@@ -0,0 +1,61 @@
name: Solaris
on:
push:
branches:
- '*'
paths:
- '*.sh'
- '.github/workflows/Solaris.yml'
pull_request:
branches:
- dev
paths:
- '*.sh'
- '.github/workflows/Solaris.yml'
jobs:
Solaris:
strategy:
matrix:
include:
- TEST_ACME_Server: "LetsEncrypt.org_test"
CA_ECDSA: ""
CA: ""
CA_EMAIL: ""
TEST_PREFERRED_CHAIN: (STAGING) Pretend Pear X1
#- TEST_ACME_Server: "ZeroSSL.com"
# CA_ECDSA: "ZeroSSL ECC Domain Secure Site CA"
# CA: "ZeroSSL RSA Domain Secure Site CA"
# CA_EMAIL: "githubtest@acme.sh"
# TEST_PREFERRED_CHAIN: ""
runs-on: macos-10.15
env:
TEST_LOCAL: 1
TEST_ACME_Server: ${{ matrix.TEST_ACME_Server }}
CA_ECDSA: ${{ matrix.CA_ECDSA }}
CA: ${{ matrix.CA }}
CA_EMAIL: ${{ matrix.CA_EMAIL }}
TEST_PREFERRED_CHAIN: ${{ matrix.TEST_PREFERRED_CHAIN }}
steps:
- uses: actions/checkout@v2
- uses: vmactions/cf-tunnel@v0.0.3
id: tunnel
with:
protocol: http
port: 8080
- name: Set envs
run: echo "TestingDomain=${{steps.tunnel.outputs.server}}" >> $GITHUB_ENV
- name: Clone acmetest
run: cd .. && git clone https://github.com/acmesh-official/acmetest.git && cp -r acme.sh acmetest/
- uses: vmactions/solaris-vm@v0.0.5
with:
envs: 'TEST_LOCAL TestingDomain TEST_ACME_Server CA_ECDSA CA CA_EMAIL TEST_PREFERRED_CHAIN'
nat: |
"8080": "80"
prepare: pkgutil -y -i socat curl
run: |
cd ../acmetest \
&& ./letest.sh

86
.github/workflows/Ubuntu.yml vendored Normal file
View File

@@ -0,0 +1,86 @@
name: Ubuntu
on:
push:
branches:
- '*'
paths:
- '*.sh'
- '.github/workflows/Ubuntu.yml'
pull_request:
branches:
- dev
paths:
- '*.sh'
- '.github/workflows/Ubuntu.yml'
jobs:
Ubuntu:
strategy:
matrix:
include:
- TEST_ACME_Server: "LetsEncrypt.org_test"
CA_ECDSA: ""
CA: ""
CA_EMAIL: ""
TEST_PREFERRED_CHAIN: (STAGING) Pretend Pear X1
- TEST_ACME_Server: "ZeroSSL.com"
CA_ECDSA: "ZeroSSL ECC Domain Secure Site CA"
CA: "ZeroSSL RSA Domain Secure Site CA"
CA_EMAIL: "githubtest@acme.sh"
TEST_PREFERRED_CHAIN: ""
- TEST_ACME_Server: "https://localhost:9000/acme/acme/directory"
CA_ECDSA: "Smallstep Intermediate CA"
CA: "Smallstep Intermediate CA"
CA_EMAIL: ""
TEST_PREFERRED_CHAIN: ""
NO_REVOKE: 1
- TEST_ACME_Server: "https://localhost:9000/acme/acme/directory"
CA_ECDSA: "Smallstep Intermediate CA"
CA: "Smallstep Intermediate CA"
CA_EMAIL: ""
TEST_PREFERRED_CHAIN: ""
NO_REVOKE: 1
TEST_IPCERT: 1
TestingDomain: "172.17.0.1"
runs-on: ubuntu-latest
env:
TEST_LOCAL: 1
TEST_ACME_Server: ${{ matrix.TEST_ACME_Server }}
CA_ECDSA: ${{ matrix.CA_ECDSA }}
CA: ${{ matrix.CA }}
CA_EMAIL: ${{ matrix.CA_EMAIL }}
NO_ECC_384: ${{ matrix.NO_ECC_384 }}
TEST_PREFERRED_CHAIN: ${{ matrix.TEST_PREFERRED_CHAIN }}
NO_REVOKE: ${{ matrix.NO_REVOKE }}
TEST_IPCERT: ${{ matrix.TEST_IPCERT }}
TestingDomain: ${{ matrix.TestingDomain }}
steps:
- uses: actions/checkout@v2
- name: Install tools
run: sudo apt-get install -y socat
- name: Start StepCA
if: ${{ matrix.TEST_ACME_Server=='https://localhost:9000/acme/acme/directory' }}
run: |
docker run --rm -d \
-p 9000:9000 \
-e "DOCKER_STEPCA_INIT_NAME=Smallstep" \
-e "DOCKER_STEPCA_INIT_DNS_NAMES=localhost,$(hostname -f)" \
--name stepca \
smallstep/step-ca \
&& sleep 5 && docker exec stepca step ca provisioner add acme --type ACME \
&& docker exec stepca kill -1 1 \
&& docker exec stepca cat /home/step/certs/root_ca.crt | sudo bash -c "cat - >>/etc/ssl/certs/ca-certificates.crt"
- name: Clone acmetest
run: |
cd .. \
&& git clone https://github.com/acmesh-official/acmetest.git \
&& cp -r acme.sh acmetest/
- name: Run acmetest
run: |
cd ../acmetest \
&& sudo --preserve-env ./letest.sh

73
.github/workflows/Windows.yml vendored Normal file
View File

@@ -0,0 +1,73 @@
name: Windows
on:
push:
branches:
- '*'
paths:
- '*.sh'
- '.github/workflows/Windows.yml'
pull_request:
branches:
- dev
paths:
- '*.sh'
- '.github/workflows/Windows.yml'
jobs:
Windows:
strategy:
matrix:
include:
- TEST_ACME_Server: "LetsEncrypt.org_test"
CA_ECDSA: ""
CA: ""
CA_EMAIL: ""
TEST_PREFERRED_CHAIN: (STAGING) Pretend Pear X1
#- TEST_ACME_Server: "ZeroSSL.com"
# CA_ECDSA: "ZeroSSL ECC Domain Secure Site CA"
# CA: "ZeroSSL RSA Domain Secure Site CA"
# CA_EMAIL: "githubtest@acme.sh"
# TEST_PREFERRED_CHAIN: ""
runs-on: windows-latest
env:
TEST_ACME_Server: ${{ matrix.TEST_ACME_Server }}
CA_ECDSA: ${{ matrix.CA_ECDSA }}
CA: ${{ matrix.CA }}
CA_EMAIL: ${{ matrix.CA_EMAIL }}
TEST_LOCAL: 1
#The 80 port is used by Windows server, we have to use a custom port, tunnel will also use this port.
Le_HTTPPort: 8888
TEST_PREFERRED_CHAIN: ${{ matrix.TEST_PREFERRED_CHAIN }}
steps:
- name: Set git to use LF
run: |
git config --global core.autocrlf false
- uses: actions/checkout@v2
- name: Install cygwin base packages with chocolatey
run: |
choco config get cacheLocation
choco install --no-progress cygwin
shell: cmd
- name: Install cygwin additional packages
run: |
C:\tools\cygwin\cygwinsetup.exe -qgnNdO -R C:/tools/cygwin -s http://mirrors.kernel.org/sourceware/cygwin/ -P socat,curl,cron,unzip,git,xxd
shell: cmd
- name: Set ENV
shell: cmd
run: |
echo PATH=C:\tools\cygwin\bin;C:\tools\cygwin\usr\bin;%PATH% >> %GITHUB_ENV%
- name: Check ENV
shell: cmd
run: |
echo "PATH=%PATH%"
- name: Clone acmetest
shell: cmd
run: cd .. && git clone https://github.com/acmesh-official/acmetest.git && cp -r acme.sh acmetest/
- name: Run acmetest
shell: cmd
run: cd ../acmetest && bash.exe -c ./letest.sh

69
.github/workflows/dockerhub.yml vendored Normal file
View File

@@ -0,0 +1,69 @@
name: Build DockerHub
on:
push:
branches:
- '*'
tags:
- '*'
paths:
- '**.sh'
- "Dockerfile"
- '.github/workflows/dockerhub.yml'
jobs:
CheckToken:
runs-on: ubuntu-latest
outputs:
hasToken: ${{ steps.step_one.outputs.hasToken }}
env:
DOCKER_PASSWORD : ${{ secrets.DOCKER_PASSWORD }}
steps:
- name: Set the value
id: step_one
run: |
if [ "$DOCKER_PASSWORD" ] ; then
echo "::set-output name=hasToken::true"
else
echo "::set-output name=hasToken::false"
fi
- name: Check the value
run: echo ${{ steps.step_one.outputs.hasToken }}
build:
runs-on: ubuntu-latest
needs: CheckToken
if: "contains(needs.CheckToken.outputs.hasToken, 'true')"
steps:
- name: checkout code
uses: actions/checkout@v2
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: login to docker hub
run: |
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
- name: build and push the image
run: |
DOCKER_IMAGE=neilpang/acme.sh
if [[ $GITHUB_REF == refs/tags/* ]]; then
DOCKER_IMAGE_TAG=${GITHUB_REF#refs/tags/}
fi
if [[ $GITHUB_REF == refs/heads/* ]]; then
DOCKER_IMAGE_TAG=${GITHUB_REF#refs/heads/}
if [[ $DOCKER_IMAGE_TAG == master ]]; then
DOCKER_IMAGE_TAG=latest
AUTO_UPGRADE=1
fi
fi
docker buildx build \
--tag ${DOCKER_IMAGE}:${DOCKER_IMAGE_TAG} \
--output "type=image,push=true" \
--build-arg AUTO_UPGRADE=${AUTO_UPGRADE} \
--platform linux/arm64/v8,linux/amd64,linux/arm/v6,linux/arm/v7,linux/386,linux/ppc64le,linux/s390x .

33
.github/workflows/shellcheck.yml vendored Normal file
View File

@@ -0,0 +1,33 @@
name: Shellcheck
on:
push:
branches:
- '*'
paths:
- '**.sh'
- '.github/workflows/shellcheck.yml'
pull_request:
branches:
- dev
paths:
- '**.sh'
- '.github/workflows/shellcheck.yml'
jobs:
ShellCheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install Shellcheck
run: sudo apt-get install -y shellcheck
- name: DoShellcheck
run: shellcheck -V && shellcheck -e SC2181 **/*.sh && echo "shellcheck OK"
shfmt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install shfmt
run: curl -sSL https://github.com/mvdan/sh/releases/download/v3.1.2/shfmt_v3.1.2_linux_amd64 -o ~/shfmt && chmod +x ~/shfmt
- name: shfmt
run: ~/shfmt -l -w -i 2 . ; git diff --exit-code && echo "shfmt OK"

View File

@@ -1,47 +0,0 @@
language: shell
sudo: required
dist: trusty
os:
- linux
- osx
services:
- docker
env:
global:
- SHFMT_URL=https://github.com/mvdan/sh/releases/download/v0.4.0/shfmt_v0.4.0_linux_amd64
addons:
apt:
sources:
- debian-sid # Grab shellcheck from the Debian repo (o_O)
packages:
- shellcheck
install:
- if [ "$TRAVIS_OS_NAME" = 'osx' ]; then
brew update && brew install socat;
export PATH="/usr/local/opt/openssl@1.1/bin:$PATH" ;
fi
script:
- echo "NGROK_TOKEN=$(echo "$NGROK_TOKEN" | wc -c)"
- command -V openssl && openssl version
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then curl -sSL $SHFMT_URL -o ~/shfmt ; fi
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then chmod +x ~/shfmt ; fi
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then ~/shfmt -l -w -i 2 . ; fi
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then git diff --exit-code && echo "shfmt OK" ; fi
- 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
- 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
matrix:
fast_finish: true

View File

@@ -1,18 +1,27 @@
FROM alpine:3.6
FROM alpine:3.15
RUN apk update -f \
&& apk --no-cache add -f \
RUN apk --no-cache add -f \
openssl \
openssh-client \
coreutils \
bind-tools \
curl \
sed \
socat \
&& rm -rf /var/cache/apk/*
tzdata \
oath-toolkit-oathtool \
tar \
libidn \
jq
ENV LE_CONFIG_HOME /acme.sh
ENV AUTO_UPGRADE 1
ARG AUTO_UPGRADE=1
ENV AUTO_UPGRADE $AUTO_UPGRADE
#Install
ADD ./ /install_acme.sh/
COPY ./ /install_acme.sh/
RUN cd /install_acme.sh && ([ -f /install_acme.sh/acme.sh ] && /install_acme.sh/acme.sh --install || curl https://get.acme.sh | sh) && rm -rf /install_acme.sh/
@@ -32,6 +41,7 @@ RUN for verb in help \
revoke \
remove \
list \
info \
showcsr \
install-cronjob \
uninstall-cronjob \
@@ -45,6 +55,9 @@ RUN for verb in help \
createCSR \
deactivate \
deactivate-account \
set-notify \
set-default-ca \
set-default-chain \
; do \
printf -- "%b" "#!/usr/bin/env sh\n/root/.acme.sh/acme.sh --${verb} --config-home /acme.sh \"\$@\"" >/usr/local/bin/--${verb} && chmod +x /usr/local/bin/--${verb} \
; done
@@ -52,7 +65,8 @@ RUN for verb in help \
RUN printf "%b" '#!'"/usr/bin/env sh\n \
if [ \"\$1\" = \"daemon\" ]; then \n \
trap \"echo stop && killall crond && exit 0\" SIGTERM SIGINT \n \
crond && while true; do sleep 1; done;\n \
crond && sleep infinity &\n \
wait \n \
else \n \
exec -- \"\$@\"\n \
fi" >/entry.sh && chmod +x /entry.sh

674
LICENSE.md Normal file
View File

@@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

260
README.md
View File

@@ -1,98 +1,130 @@
# An ACME Shell script: acme.sh [![Build Status](https://travis-ci.org/Neilpang/acme.sh.svg?branch=master)](https://travis-ci.org/Neilpang/acme.sh)
# An ACME Shell script: acme.sh
[![FreeBSD](https://github.com/acmesh-official/acme.sh/actions/workflows/FreeBSD.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/FreeBSD.yml)
[![MacOS](https://github.com/acmesh-official/acme.sh/actions/workflows/MacOS.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/MacOS.yml)
[![Ubuntu](https://github.com/acmesh-official/acme.sh/actions/workflows/Ubuntu.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Ubuntu.yml)
[![Windows](https://github.com/acmesh-official/acme.sh/actions/workflows/Windows.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Windows.yml)
[![Solaris](https://github.com/acmesh-official/acme.sh/actions/workflows/Solaris.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Solaris.yml)
![Shellcheck](https://github.com/acmesh-official/acme.sh/workflows/Shellcheck/badge.svg)
![PebbleStrict](https://github.com/acmesh-official/acme.sh/workflows/PebbleStrict/badge.svg)
![DockerHub](https://github.com/acmesh-official/acme.sh/workflows/Build%20DockerHub/badge.svg)
<a href="https://opencollective.com/acmesh" alt="Financial Contributors on Open Collective"><img src="https://opencollective.com/acmesh/all/badge.svg?label=financial+contributors" /></a>
[![Join the chat at https://gitter.im/acme-sh/Lobby](https://badges.gitter.im/acme-sh/Lobby.svg)](https://gitter.im/acme-sh/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[![Docker stars](https://img.shields.io/docker/stars/neilpang/acme.sh.svg)](https://hub.docker.com/r/neilpang/acme.sh "Click to view the image on Docker Hub")
[![Docker pulls](https://img.shields.io/docker/pulls/neilpang/acme.sh.svg)](https://hub.docker.com/r/neilpang/acme.sh "Click to view the image on Docker Hub")
- An ACME protocol client written purely in Shell (Unix shell) language.
- Full ACME protocol implementation.
- Support ACME v1 and ACME v2
- Support ACME v2 wildcard certs
- Support ECDSA certs
- Support SAN and wildcard certs
- Simple, powerful and very easy to use. You only need 3 minutes to learn it.
- Bash, dash and sh compatible.
- Simplest shell script for Let's Encrypt free certificate client.
- Purely written in Shell with no dependencies on python or the official Let's Encrypt client.
- Purely written in Shell with no dependencies on python.
- Just one script to issue, renew and install your certificates automatically.
- DOES NOT require `root/sudoer` access.
- Docker friendly
- IPv6 support
- Docker ready
- IPv6 ready
- Cron job notifications for renewal or error etc.
It's probably the `easiest & smartest` shell script to automatically issue & renew the free certificates from Let's Encrypt.
It's probably the `easiest & smartest` shell script to automatically issue & renew the free certificates.
Wiki: https://github.com/Neilpang/acme.sh/wiki
Wiki: https://github.com/acmesh-official/acme.sh/wiki
For Docker Fans: [acme.sh :two_hearts: Docker ](https://github.com/Neilpang/acme.sh/wiki/Run-acme.sh-in-docker)
For Docker Fans: [acme.sh :two_hearts: Docker ](https://github.com/acmesh-official/acme.sh/wiki/Run-acme.sh-in-docker)
Twitter: [@neilpangxa](https://twitter.com/neilpangxa)
# [中文说明](https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E)
# [中文说明](https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E)
# Who are using **acme.sh**
# Who:
- [FreeBSD.org](https://blog.crashed.org/letsencrypt-in-freebsd-org/)
- [ruby-china.org](https://ruby-china.org/topics/31983)
- [Proxmox](https://pve.proxmox.com/wiki/HTTPS_Certificate_Configuration_(Version_4.x_and_newer))
- [Proxmox](https://pve.proxmox.com/wiki/Certificate_Management)
- [pfsense](https://github.com/pfsense/FreeBSD-ports/pull/89)
- [webfaction](https://community.webfaction.com/questions/19988/using-letsencrypt)
- [Loadbalancer.org](https://www.loadbalancer.org/blog/loadbalancer-org-with-lets-encrypt-quick-and-dirty)
- [discourse.org](https://meta.discourse.org/t/setting-up-lets-encrypt/40709)
- [Centminmod](http://centminmod.com/letsencrypt-acmetool-https.html)
- [Centminmod](https://centminmod.com/letsencrypt-acmetool-https.html)
- [splynx](https://forum.splynx.com/t/free-ssl-cert-for-splynx-lets-encrypt/297)
- [archlinux](https://aur.archlinux.org/packages/acme.sh-git/)
- [archlinux](https://www.archlinux.org/packages/community/any/acme.sh)
- [opnsense.org](https://github.com/opnsense/plugins/tree/master/security/acme-client/src/opnsense/scripts/OPNsense/AcmeClient)
- [more...](https://github.com/Neilpang/acme.sh/wiki/Blogs-and-tutorials)
- [CentOS Web Panel](http://centos-webpanel.com/)
- [lnmp.org](https://lnmp.org/)
- [more...](https://github.com/acmesh-official/acme.sh/wiki/Blogs-and-tutorials)
# Tested OS
| NO | Status| Platform|
|----|-------|---------|
|1|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/ubuntu-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)| Ubuntu
|2|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/debian-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)| Debian
|3|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/centos-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|CentOS
|4|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/windows-cygwin.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Windows (cygwin with curl, openssl and crontab included)
|5|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/freebsd.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|FreeBSD
|6|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/pfsense.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|pfsense
|7|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/opensuse-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|openSUSE
|8|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/alpine-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Alpine Linux (with curl)
|9|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/base-archlinux.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Archlinux
|10|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/fedora-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|fedora
|11|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/kalilinux-kali-linux-docker.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Kali Linux
|12|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/oraclelinux-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Oracle Linux
|13|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/proxmox.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)| Proxmox https://pve.proxmox.com/wiki/HTTPSCertificateConfiguration#Let.27s_Encrypt_using_acme.sh
|14|-----| Cloud Linux https://github.com/Neilpang/le/issues/111
|15|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/openbsd.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|OpenBSD
|16|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/mageia.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Mageia
|17|-----| OpenWRT: Tested and working. See [wiki page](https://github.com/Neilpang/acme.sh/wiki/How-to-run-on-OpenWRT)
|18|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/solaris.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|SunOS/Solaris
|19|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/gentoo-stage3-amd64.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Gentoo Linux
|20|[![Build Status](https://travis-ci.org/Neilpang/acme.sh.svg?branch=master)](https://travis-ci.org/Neilpang/acme.sh)|Mac OSX
|1|[![MacOS](https://github.com/acmesh-official/acme.sh/actions/workflows/MacOS.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/MacOS.yml)|Mac OSX
|2|[![Windows](https://github.com/acmesh-official/acme.sh/actions/workflows/Windows.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Windows.yml)|Windows (cygwin with curl, openssl and crontab included)
|3|[![FreeBSD](https://github.com/acmesh-official/acme.sh/actions/workflows/FreeBSD.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/FreeBSD.yml)|FreeBSD
|4|[![Solaris](https://github.com/acmesh-official/acme.sh/actions/workflows/Solaris.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Solaris.yml)|Solaris
|5|[![Ubuntu](https://github.com/acmesh-official/acme.sh/actions/workflows/Ubuntu.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Ubuntu.yml)| Ubuntu
|6|NA|pfsense
|7|NA|OpenBSD
|8|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)| Debian
|9|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)|CentOS
|10|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)|openSUSE
|11|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)|Alpine Linux (with curl)
|12|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)|Archlinux
|13|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)|fedora
|14|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)|Kali Linux
|15|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)|Oracle Linux
|16|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)|Mageia
|17|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)|Gentoo Linux
|18|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)|ClearLinux
|19|-----| Cloud Linux https://github.com/acmesh-official/acme.sh/issues/111
|20|-----| OpenWRT: Tested and working. See [wiki page](https://github.com/acmesh-official/acme.sh/wiki/How-to-run-on-OpenWRT)
|21|[![](https://acmesh-official.github.io/acmetest/status/proxmox.svg)](https://github.com/acmesh-official/letest#here-are-the-latest-status)| Proxmox: See Proxmox VE Wiki. Version [4.x, 5.0, 5.1](https://pve.proxmox.com/wiki/HTTPS_Certificate_Configuration_(Version_4.x,_5.0_and_5.1)#Let.27s_Encrypt_using_acme.sh), version [5.2 and up](https://pve.proxmox.com/wiki/Certificate_Management)
For all build statuses, check our [weekly build project](https://github.com/Neilpang/acmetest):
https://github.com/Neilpang/acmetest
Check our [testing project](https://github.com/acmesh-official/acmetest):
https://github.com/acmesh-official/acmetest
# Supported CA
- [ZeroSSL.com CA](https://github.com/acmesh-official/acme.sh/wiki/ZeroSSL.com-CA)(default)
- Letsencrypt.org CA
- [BuyPass.com CA](https://github.com/acmesh-official/acme.sh/wiki/BuyPass.com-CA)
- [SSL.com CA](https://github.com/acmesh-official/acme.sh/wiki/SSL.com-CA)
- [Google.com Public CA](https://github.com/acmesh-official/acme.sh/wiki/Google-Public-CA)
- [Pebble strict Mode](https://github.com/letsencrypt/pebble)
- Any other [RFC8555](https://tools.ietf.org/html/rfc8555)-compliant CA
# Supported modes
- Webroot mode
- Standalone mode
- Standalone tls-alpn mode
- Apache mode
- Nginx mode
- DNS mode
- [Stateless mode](https://github.com/Neilpang/acme.sh/wiki/Stateless-Mode)
- [DNS alias mode](https://github.com/acmesh-official/acme.sh/wiki/DNS-alias-mode)
- [Stateless mode](https://github.com/acmesh-official/acme.sh/wiki/Stateless-Mode)
# 1. How to install
### 1. Install online
Check this project: https://github.com/Neilpang/get.acme.sh
Check this project: https://github.com/acmesh-official/get.acme.sh
```bash
curl https://get.acme.sh | sh
curl https://get.acme.sh | sh -s email=my@example.com
```
Or:
```bash
wget -O - https://get.acme.sh | sh
wget -O - https://get.acme.sh | sh -s email=my@example.com
```
@@ -101,14 +133,14 @@ wget -O - https://get.acme.sh | sh
Clone this project and launch installation:
```bash
git clone https://github.com/Neilpang/acme.sh.git
git clone https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
./acme.sh --install
./acme.sh --install -m my@example.com
```
You `don't have to be root` then, although `it is recommended`.
Advanced Installation: https://github.com/Neilpang/acme.sh/wiki/How-to-install
Advanced Installation: https://github.com/acmesh-official/acme.sh/wiki/How-to-install
The installer will perform 3 actions:
@@ -170,7 +202,7 @@ The certs will be placed in `~/.acme.sh/example.com/`
The certs will be renewed automatically every **60** days.
More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
More examples: https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert
# 3. Install the cert to Apache/Nginx etc.
@@ -204,6 +236,8 @@ Install/copy the cert/key to the production Apache or Nginx path.
The cert will be renewed every **60** days by default (which is configurable). Once the cert is renewed, the Apache/Nginx service will be reloaded automatically by the command: `service apache2 force-reload` or `service nginx force-reload`.
**Please take care: The reloadcmd is very important. The cert can be automatically renewed, but, without a correct 'reloadcmd' the cert may not be flushed to your server(like nginx or apache), then your website will not be able to show renewed cert in 60 days.**
# 4. Use Standalone server to issue cert
**(requires you to be root/sudoer or have permission to listen on port 80 (TCP))**
@@ -214,29 +248,26 @@ Port `80` (TCP) **MUST** be free to listen on, otherwise you will be prompted to
acme.sh --issue --standalone -d example.com -d www.example.com -d cp.example.com
```
More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
More examples: https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert
# 5. Use Standalone TLS server to issue cert
# 5. Use Standalone ssl server to issue cert
**(requires you to be root/sudoer or have permission to listen on port 443 (TCP))**
acme.sh supports `tls-sni-01` validation.
Port `443` (TCP) **MUST** be free to listen on, otherwise you will be prompted to free it and try again.
```bash
acme.sh --issue --tls -d example.com -d www.example.com -d cp.example.com
acme.sh --issue --alpn -d example.com -d www.example.com -d cp.example.com
```
More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
More examples: https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert
# 6. Use Apache mode
**(requires you to be root/sudoer, since it is required to interact with Apache server)**
If you are running a web server, Apache or Nginx, it is recommended to use the `Webroot mode`.
If you are running a web server, it is recommended to use the `Webroot mode`.
Particularly, if you are running an Apache server, you can use Apache mode instead. This mode doesn't write any files to your web root folder.
@@ -248,15 +279,15 @@ acme.sh --issue --apache -d example.com -d www.example.com -d cp.example.com
**This apache mode is only to issue the cert, it will not change your apache config files.
You will need to configure your website config files to use the cert by yourself.
We don't want to mess your apache server, don't worry.**
We don't want to mess with your apache server, don't worry.**
More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
More examples: https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert
# 7. Use Nginx mode
**(requires you to be root/sudoer, since it is required to interact with Nginx server)**
If you are running a web server, Apache or Nginx, it is recommended to use the `Webroot mode`.
If you are running a web server, it is recommended to use the `Webroot mode`.
Particularly, if you are running an nginx server, you can use nginx mode instead. This mode doesn't write any files to your web root folder.
@@ -272,9 +303,9 @@ acme.sh --issue --nginx -d example.com -d www.example.com -d cp.example.com
**This nginx mode is only to issue the cert, it will not change your nginx config files.
You will need to configure your website config files to use the cert by yourself.
We don't want to mess your nginx server, don't worry.**
We don't want to mess with your nginx server, don't worry.**
More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
More examples: https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert
# 8. Automatic DNS API integration
@@ -282,65 +313,15 @@ If your DNS provider supports API access, we can use that API to automatically i
You don't have to do anything manually!
### Currently acme.sh supports:
### Currently acme.sh supports most of the dns providers:
1. CloudFlare.com API
1. DNSPod.cn API
1. CloudXNS.com API
1. GoDaddy.com API
1. PowerDNS.com API
1. OVH, kimsufi, soyoustart and runabove API
1. nsupdate API
1. LuaDNS.com API
1. DNSMadeEasy.com API
1. AWS Route 53
1. aliyun.com(阿里云) API
1. ISPConfig 3.1 API
1. Alwaysdata.com API
1. Linode.com API
1. FreeDNS (https://freedns.afraid.org/)
1. cyon.ch
1. Domain-Offensive/Resellerinterface/Domainrobot API
1. Gandi LiveDNS API
1. Knot DNS API
1. DigitalOcean API (native)
1. ClouDNS.net API
1. Infoblox NIOS API (https://www.infoblox.com/)
1. VSCALE (https://vscale.io/)
1. Dynu API (https://www.dynu.com)
1. DNSimple API
1. NS1.com API
1. DuckDNS.org API
1. Name.com API
1. Dyn Managed DNS API
1. Yandex PDD API (https://pdd.yandex.ru)
1. Hurricane Electric DNS service (https://dns.he.net)
1. UnoEuro API (https://www.unoeuro.com/)
1. INWX (https://www.inwx.de/)
1. Servercow (https://servercow.de)
1. Namesilo (https://www.namesilo.com)
1. InternetX autoDNS API (https://internetx.com)
1. Azure DNS
1. selectel.com(selectel.ru) DNS API
1. zonomi.com DNS API
1. DreamHost.com API
And:
**lexicon DNS API: https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api
(DigitalOcean, DNSimple, DNSMadeEasy, DNSPark, EasyDNS, Namesilo, NS1, PointHQ, Rage4 and Vultr etc.)**
**More APIs coming soon...**
If your DNS provider is not on the supported list above, you can write your own DNS API script easily. If you do, please consider submitting a [Pull Request](https://github.com/Neilpang/acme.sh/pulls) and contribute it to the project.
For more details: [How to use DNS API](dnsapi)
https://github.com/acmesh-official/acme.sh/wiki/dnsapi
# 9. Use DNS manual mode:
If your dns provider doesn't support any api access, you can add the txt record by your hand.
See: https://github.com/acmesh-official/acme.sh/wiki/dns-manual-mode first.
If your dns provider doesn't support any api access, you can add the txt record by hand.
```bash
acme.sh --issue --dns -d example.com -d www.example.com -d cp.example.com
@@ -409,7 +390,7 @@ Valid values are:
It's simple, just give a wildcard domain as the `-d` parameter.
```sh
acme.sh --issue -d example.com -d *.example.com --dns dns_cf
acme.sh --issue -d example.com -d '*.example.com' --dns dns_cf
```
@@ -471,34 +452,69 @@ acme.sh --upgrade --auto-upgrade 0
# 15. Issue a cert from an existing CSR
https://github.com/Neilpang/acme.sh/wiki/Issue-a-cert-from-existing-CSR
https://github.com/acmesh-official/acme.sh/wiki/Issue-a-cert-from-existing-CSR
# 16. Under the Hood
# 16. Send notifications in cronjob
https://github.com/acmesh-official/acme.sh/wiki/notify
# 17. Under the Hood
Speak ACME language using shell, directly to "Let's Encrypt".
TODO:
# 17. Acknowledgments
# 18. Acknowledgments
1. Acme-tiny: https://github.com/diafygi/acme-tiny
2. ACME protocol: https://github.com/ietf-wg-acme/acme
# 18. License & Others
## Contributors
### Code Contributors
This project exists thanks to all the people who contribute.
<a href="https://github.com/acmesh-official/acme.sh/graphs/contributors"><img src="https://opencollective.com/acmesh/contributors.svg?width=890&button=false" /></a>
### Financial Contributors
Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/acmesh/contribute)]
#### Individuals
<a href="https://opencollective.com/acmesh"><img src="https://opencollective.com/acmesh/individuals.svg?width=890"></a>
#### Organizations
Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/acmesh/contribute)]
<a href="https://opencollective.com/acmesh/organization/0/website"><img src="https://opencollective.com/acmesh/organization/0/avatar.svg"></a>
<a href="https://opencollective.com/acmesh/organization/1/website"><img src="https://opencollective.com/acmesh/organization/1/avatar.svg"></a>
<a href="https://opencollective.com/acmesh/organization/2/website"><img src="https://opencollective.com/acmesh/organization/2/avatar.svg"></a>
<a href="https://opencollective.com/acmesh/organization/3/website"><img src="https://opencollective.com/acmesh/organization/3/avatar.svg"></a>
<a href="https://opencollective.com/acmesh/organization/4/website"><img src="https://opencollective.com/acmesh/organization/4/avatar.svg"></a>
<a href="https://opencollective.com/acmesh/organization/5/website"><img src="https://opencollective.com/acmesh/organization/5/avatar.svg"></a>
<a href="https://opencollective.com/acmesh/organization/6/website"><img src="https://opencollective.com/acmesh/organization/6/avatar.svg"></a>
<a href="https://opencollective.com/acmesh/organization/7/website"><img src="https://opencollective.com/acmesh/organization/7/avatar.svg"></a>
<a href="https://opencollective.com/acmesh/organization/8/website"><img src="https://opencollective.com/acmesh/organization/8/avatar.svg"></a>
<a href="https://opencollective.com/acmesh/organization/9/website"><img src="https://opencollective.com/acmesh/organization/9/avatar.svg"></a>
# 19. License & Others
License is GPLv3
Please Star and Fork me.
[Issues](https://github.com/Neilpang/acme.sh/issues) and [pull requests](https://github.com/Neilpang/acme.sh/pulls) are welcome.
[Issues](https://github.com/acmesh-official/acme.sh/issues) and [pull requests](https://github.com/acmesh-official/acme.sh/pulls) are welcome.
# 19. Donate
# 20. Donate
Your donation makes **acme.sh** better:
1. PayPal/Alipay(支付宝)/Wechat(微信): [https://donate.acme.sh/](https://donate.acme.sh/)
[Donate List](https://github.com/Neilpang/acme.sh/wiki/Donate-list)
[Donate List](https://github.com/acmesh-official/acme.sh/wiki/Donate-list)

3339
acme.sh

File diff suppressed because it is too large Load Diff

View File

@@ -1,118 +1,6 @@
# Using deploy api
Before you can deploy your cert, you must [issue the cert first](https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert).
deploy hook usage:
Here are the scripts to deploy the certs/key to the server/services.
https://github.com/acmesh-official/acme.sh/wiki/deployhooks
## 1. Deploy the certs to your cpanel host
If you want to deploy using cpanel UAPI see 7.
(cpanel deploy hook is not finished yet, this is just an example.)
Then you can deploy now:
```sh
export DEPLOY_CPANEL_USER=myusername
export DEPLOY_CPANEL_PASSWORD=PASSWORD
acme.sh --deploy -d example.com --deploy-hook cpanel
```
## 2. Deploy ssl cert on kong proxy engine based on api
Before you can deploy your cert, you must [issue the cert first](https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert).
Currently supports Kong-v0.10.x.
```sh
acme.sh --deploy -d ftp.example.com --deploy-hook kong
```
## 3. Deploy the cert to remote server through SSH access
(TODO)
## 4. Deploy the cert to local vsftpd server
```sh
acme.sh --deploy -d ftp.example.com --deploy-hook vsftpd
```
The default vsftpd conf file is `/etc/vsftpd.conf`, if your vsftpd conf is not in the default location, you can specify one:
```sh
export DEPLOY_VSFTPD_CONF="/etc/vsftpd.conf"
acme.sh --deploy -d ftp.example.com --deploy-hook vsftpd
```
The default command to restart vsftpd server is `service vsftpd restart`, if it doesn't work, you can specify one:
```sh
export DEPLOY_VSFTPD_RELOAD="/etc/init.d/vsftpd restart"
acme.sh --deploy -d ftp.example.com --deploy-hook vsftpd
```
## 5. Deploy the cert to local exim4 server
```sh
acme.sh --deploy -d ftp.example.com --deploy-hook exim4
```
The default exim4 conf file is `/etc/exim/exim.conf`, if your exim4 conf is not in the default location, you can specify one:
```sh
export DEPLOY_EXIM4_CONF="/etc/exim4/exim4.conf.template"
acme.sh --deploy -d ftp.example.com --deploy-hook exim4
```
The default command to restart exim4 server is `service exim4 restart`, if it doesn't work, you can specify one:
```sh
export DEPLOY_EXIM4_RELOAD="/etc/init.d/exim4 restart"
acme.sh --deploy -d ftp.example.com --deploy-hook exim4
```
## 6. Deploy the cert to OSX Keychain
```sh
acme.sh --deploy -d ftp.example.com --deploy-hook keychain
```
## 7. Deploy to cpanel host using UAPI
This hook is using UAPI and works in cPanel & WHM version 56 or newer.
```
acme.sh --deploy -d example.com --deploy-hook cpanel_uapi
```
DEPLOY_CPANEL_USER is required only if you run the script as root and it should contain cpanel username.
```sh
export DEPLOY_CPANEL_USER=username
acme.sh --deploy -d example.com --deploy-hook cpanel_uapi
```
Please note, that the cpanel_uapi hook will deploy only the first domain when your certificate will automatically renew. Therefore you should issue a separete certificate for each domain.
## 8. Deploy the cert to your FRITZ!Box router
You must specify the credentials that have administrative privileges on the FRITZ!Box in order to deploy the certificate, plus the URL of your FRITZ!Box, through the following environment variables:
```sh
$ export DEPLOY_FRITZBOX_USERNAME=my_username
$ export DEPLOY_FRITZBOX_PASSWORD=the_password
$ export DEPLOY_FRITZBOX_URL=https://fritzbox.example.com
```
After the first deployment, these values will be stored in your $HOME/.acme.sh/account.conf. You may now deploy the certificate like this:
```sh
acme.sh --deploy -d fritzbox.example.com --deploy-hook fritzbox
```
## 9. Deploy the cert to strongswan
```sh
acme.sh --deploy -d ftp.example.com --deploy-hook strongswan
```

92
deploy/cleverreach.sh Normal file
View File

@@ -0,0 +1,92 @@
#!/usr/bin/env sh
# Here is the script to deploy the cert to your CleverReach Account using the CleverReach REST API.
# Your OAuth needs the right scope, please contact CleverReach support for that.
#
# Written by Jan-Philipp Benecke <github@bnck.me>
# Public domain, 2020
#
# Following environment variables must be set:
#
#export DEPLOY_CLEVERREACH_CLIENT_ID=myid
#export DEPLOY_CLEVERREACH_CLIENT_SECRET=mysecret
cleverreach_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
_rest_endpoint="https://rest.cleverreach.com"
_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
_getdeployconf DEPLOY_CLEVERREACH_CLIENT_ID
_getdeployconf DEPLOY_CLEVERREACH_CLIENT_SECRET
_getdeployconf DEPLOY_CLEVERREACH_SUBCLIENT_ID
if [ -z "${DEPLOY_CLEVERREACH_CLIENT_ID}" ]; then
_err "CleverReach Client ID is not found, please define DEPLOY_CLEVERREACH_CLIENT_ID."
return 1
fi
if [ -z "${DEPLOY_CLEVERREACH_CLIENT_SECRET}" ]; then
_err "CleverReach client secret is not found, please define DEPLOY_CLEVERREACH_CLIENT_SECRET."
return 1
fi
_savedeployconf DEPLOY_CLEVERREACH_CLIENT_ID "${DEPLOY_CLEVERREACH_CLIENT_ID}"
_savedeployconf DEPLOY_CLEVERREACH_CLIENT_SECRET "${DEPLOY_CLEVERREACH_CLIENT_SECRET}"
_savedeployconf DEPLOY_CLEVERREACH_SUBCLIENT_ID "${DEPLOY_CLEVERREACH_SUBCLIENT_ID}"
_info "Obtaining a CleverReach access token"
_data="{\"grant_type\": \"client_credentials\", \"client_id\": \"${DEPLOY_CLEVERREACH_CLIENT_ID}\", \"client_secret\": \"${DEPLOY_CLEVERREACH_CLIENT_SECRET}\"}"
_auth_result="$(_post "$_data" "$_rest_endpoint/oauth/token.php" "" "POST" "application/json")"
_debug _data "$_data"
_debug _auth_result "$_auth_result"
_regex=".*\"access_token\":\"\([-._0-9A-Za-z]*\)\".*$"
_debug _regex "$_regex"
_access_token=$(echo "$_auth_result" | _json_decode | sed -n "s/$_regex/\1/p")
_debug _subclient "${DEPLOY_CLEVERREACH_SUBCLIENT_ID}"
if [ -n "${DEPLOY_CLEVERREACH_SUBCLIENT_ID}" ]; then
_info "Obtaining token for sub-client ${DEPLOY_CLEVERREACH_SUBCLIENT_ID}"
export _H1="Authorization: Bearer ${_access_token}"
_subclient_token_result="$(_get "$_rest_endpoint/v3/clients/$DEPLOY_CLEVERREACH_SUBCLIENT_ID/token")"
_access_token=$(echo "$_subclient_token_result" | sed -n "s/\"//p")
_debug _subclient_token_result "$_access_token"
_info "Destroying parent token at CleverReach, as it not needed anymore"
_destroy_result="$(_post "" "$_rest_endpoint/v3/oauth/token.json" "" "DELETE" "application/json")"
_debug _destroy_result "$_destroy_result"
fi
_info "Uploading certificate and key to CleverReach"
_certData="{\"cert\":\"$(_json_encode <"$_cfullchain")\", \"key\":\"$(_json_encode <"$_ckey")\"}"
export _H1="Authorization: Bearer ${_access_token}"
_add_cert_result="$(_post "$_certData" "$_rest_endpoint/v3/ssl" "" "POST" "application/json")"
if [ -z "${DEPLOY_CLEVERREACH_SUBCLIENT_ID}" ]; then
_info "Destroying token at CleverReach, as it not needed anymore"
_destroy_result="$(_post "" "$_rest_endpoint/v3/oauth/token.json" "" "DELETE" "application/json")"
_debug _destroy_result "$_destroy_result"
fi
if ! echo "$_add_cert_result" | grep '"error":' >/dev/null; then
_info "Uploaded certificate successfully"
return 0
else
_debug _add_cert_result "$_add_cert_result"
_err "Unable to update certificate"
return 1
fi
}

98
deploy/consul.sh Normal file
View File

@@ -0,0 +1,98 @@
#!/usr/bin/env sh
# Here is a script to deploy cert to hashicorp consul using curl
# (https://www.consul.io/)
#
# it requires following environment variables:
#
# CONSUL_PREFIX - this contains the prefix path in consul
# CONSUL_HTTP_ADDR - consul requires this to find your consul server
#
# additionally, you need to ensure that CONSUL_HTTP_TOKEN is available
# to access the consul server
#returns 0 means success, otherwise error.
######## Public functions #####################
#domain keyfile certfile cafile fullchain
consul_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
# validate required env vars
_getdeployconf CONSUL_PREFIX
if [ -z "$CONSUL_PREFIX" ]; then
_err "CONSUL_PREFIX needs to be defined (contains prefix path in vault)"
return 1
fi
_savedeployconf CONSUL_PREFIX "$CONSUL_PREFIX"
_getdeployconf CONSUL_HTTP_ADDR
if [ -z "$CONSUL_HTTP_ADDR" ]; then
_err "CONSUL_HTTP_ADDR needs to be defined (contains consul connection address)"
return 1
fi
_savedeployconf CONSUL_HTTP_ADDR "$CONSUL_HTTP_ADDR"
CONSUL_CMD=$(command -v consul)
# force CLI, but the binary does not exist => error
if [ -n "$USE_CLI" ] && [ -z "$CONSUL_CMD" ]; then
_err "Cannot find the consul binary!"
return 1
fi
# use the CLI first
if [ -n "$USE_CLI" ] || [ -n "$CONSUL_CMD" ]; then
_info "Found consul binary, deploying with CLI"
consul_deploy_cli "$CONSUL_CMD" "$CONSUL_PREFIX"
else
_info "Did not find consul binary, deploying with API"
consul_deploy_api "$CONSUL_HTTP_ADDR" "$CONSUL_PREFIX" "$CONSUL_HTTP_TOKEN"
fi
}
consul_deploy_api() {
CONSUL_HTTP_ADDR="$1"
CONSUL_PREFIX="$2"
CONSUL_HTTP_TOKEN="$3"
URL="$CONSUL_HTTP_ADDR/v1/kv/$CONSUL_PREFIX"
export _H1="X-Consul-Token: $CONSUL_HTTP_TOKEN"
if [ -n "$FABIO" ]; then
_post "$(cat "$_cfullchain")" "$URL/${_cdomain}-cert.pem" '' "PUT" || return 1
_post "$(cat "$_ckey")" "$URL/${_cdomain}-key.pem" '' "PUT" || return 1
else
_post "$(cat "$_ccert")" "$URL/${_cdomain}/cert.pem" '' "PUT" || return 1
_post "$(cat "$_ckey")" "$URL/${_cdomain}/cert.key" '' "PUT" || return 1
_post "$(cat "$_cca")" "$URL/${_cdomain}/chain.pem" '' "PUT" || return 1
_post "$(cat "$_cfullchain")" "$URL/${_cdomain}/fullchain.pem" '' "PUT" || return 1
fi
}
consul_deploy_cli() {
CONSUL_CMD="$1"
CONSUL_PREFIX="$2"
if [ -n "$FABIO" ]; then
$CONSUL_CMD kv put "${CONSUL_PREFIX}/${_cdomain}-cert.pem" @"$_cfullchain" || return 1
$CONSUL_CMD kv put "${CONSUL_PREFIX}/${_cdomain}-key.pem" @"$_ckey" || return 1
else
$CONSUL_CMD kv put "${CONSUL_PREFIX}/${_cdomain}/cert.pem" value=@"$_ccert" || return 1
$CONSUL_CMD kv put "${CONSUL_PREFIX}/${_cdomain}/cert.key" value=@"$_ckey" || return 1
$CONSUL_CMD kv put "${CONSUL_PREFIX}/${_cdomain}/chain.pem" value=@"$_cca" || return 1
$CONSUL_CMD kv put "${CONSUL_PREFIX}/${_cdomain}/fullchain.pem" value=@"$_cfullchain" || return 1
fi
}

View File

@@ -2,8 +2,12 @@
# Here is the script to deploy the cert to your cpanel using the cpanel API.
# Uses command line uapi. --user option is needed only if run as root.
# Returns 0 when success.
# Written by Santeri Kannisto <santeri.kannisto@2globalnomads.info>
# Public domain, 2017
#
# Please note that I am no longer using Github. If you want to report an issue
# or contact me, visit https://forum.webseodesigners.com/web-design-seo-and-hosting-f16/
#
# Written by Santeri Kannisto <santeri.kannisto@webseodesigners.com>
# Public domain, 2017-2018
#export DEPLOY_CPANEL_USER=myusername
@@ -28,15 +32,9 @@ cpanel_uapi_deploy() {
_err "The command uapi is not found."
return 1
fi
if ! _exists php; then
_err "The command php is not found."
return 1
fi
# read cert and key files and urlencode both
_certstr=$(cat "$_ccert")
_keystr=$(cat "$_ckey")
_cert=$(php -r "echo urlencode(\"$_certstr\");")
_key=$(php -r "echo urlencode(\"$_keystr\");")
_cert=$(_url_encode <"$_ccert")
_key=$(_url_encode <"$_ckey")
_debug _cert "$_cert"
_debug _key "$_key"

288
deploy/docker.sh Executable file
View File

@@ -0,0 +1,288 @@
#!/usr/bin/env sh
#DEPLOY_DOCKER_CONTAINER_LABEL="xxxxxxx"
#DEPLOY_DOCKER_CONTAINER_KEY_FILE="/path/to/key.pem"
#DEPLOY_DOCKER_CONTAINER_CERT_FILE="/path/to/cert.pem"
#DEPLOY_DOCKER_CONTAINER_CA_FILE="/path/to/ca.pem"
#DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE="/path/to/fullchain.pem"
#DEPLOY_DOCKER_CONTAINER_RELOAD_CMD="service nginx force-reload"
_DEPLOY_DOCKER_WIKI="https://github.com/acmesh-official/acme.sh/wiki/deploy-to-docker-containers"
_DOCKER_HOST_DEFAULT="/var/run/docker.sock"
docker_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
_debug _cdomain "$_cdomain"
_getdeployconf DEPLOY_DOCKER_CONTAINER_LABEL
_debug2 DEPLOY_DOCKER_CONTAINER_LABEL "$DEPLOY_DOCKER_CONTAINER_LABEL"
if [ -z "$DEPLOY_DOCKER_CONTAINER_LABEL" ]; then
_err "The DEPLOY_DOCKER_CONTAINER_LABEL variable is not defined, we use this label to find the container."
_err "See: $_DEPLOY_DOCKER_WIKI"
fi
_savedeployconf DEPLOY_DOCKER_CONTAINER_LABEL "$DEPLOY_DOCKER_CONTAINER_LABEL"
if [ "$DOCKER_HOST" ]; then
_saveaccountconf DOCKER_HOST "$DOCKER_HOST"
fi
if _exists docker && docker version | grep -i docker >/dev/null; then
_info "Using docker command"
export _USE_DOCKER_COMMAND=1
else
export _USE_DOCKER_COMMAND=
fi
export _USE_UNIX_SOCKET=
if [ -z "$_USE_DOCKER_COMMAND" ]; then
export _USE_REST=
if [ "$DOCKER_HOST" ]; then
_debug "Try use docker host: $DOCKER_HOST"
export _USE_REST=1
else
export _DOCKER_SOCK="$_DOCKER_HOST_DEFAULT"
_debug "Try use $_DOCKER_SOCK"
if [ ! -e "$_DOCKER_SOCK" ] || [ ! -w "$_DOCKER_SOCK" ]; then
_err "$_DOCKER_SOCK is not available"
return 1
fi
export _USE_UNIX_SOCKET=1
if ! _exists "curl"; then
_err "Please install curl first."
_err "We need curl to work."
return 1
fi
if ! _check_curl_version; then
return 1
fi
fi
fi
_getdeployconf DEPLOY_DOCKER_CONTAINER_KEY_FILE
_debug2 DEPLOY_DOCKER_CONTAINER_KEY_FILE "$DEPLOY_DOCKER_CONTAINER_KEY_FILE"
if [ "$DEPLOY_DOCKER_CONTAINER_KEY_FILE" ]; then
_savedeployconf DEPLOY_DOCKER_CONTAINER_KEY_FILE "$DEPLOY_DOCKER_CONTAINER_KEY_FILE"
fi
_getdeployconf DEPLOY_DOCKER_CONTAINER_CERT_FILE
_debug2 DEPLOY_DOCKER_CONTAINER_CERT_FILE "$DEPLOY_DOCKER_CONTAINER_CERT_FILE"
if [ "$DEPLOY_DOCKER_CONTAINER_CERT_FILE" ]; then
_savedeployconf DEPLOY_DOCKER_CONTAINER_CERT_FILE "$DEPLOY_DOCKER_CONTAINER_CERT_FILE"
fi
_getdeployconf DEPLOY_DOCKER_CONTAINER_CA_FILE
_debug2 DEPLOY_DOCKER_CONTAINER_CA_FILE "$DEPLOY_DOCKER_CONTAINER_CA_FILE"
if [ "$DEPLOY_DOCKER_CONTAINER_CA_FILE" ]; then
_savedeployconf DEPLOY_DOCKER_CONTAINER_CA_FILE "$DEPLOY_DOCKER_CONTAINER_CA_FILE"
fi
_getdeployconf DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE
_debug2 DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE "$DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE"
if [ "$DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE" ]; then
_savedeployconf DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE "$DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE"
fi
_getdeployconf DEPLOY_DOCKER_CONTAINER_RELOAD_CMD
_debug2 DEPLOY_DOCKER_CONTAINER_RELOAD_CMD "$DEPLOY_DOCKER_CONTAINER_RELOAD_CMD"
if [ "$DEPLOY_DOCKER_CONTAINER_RELOAD_CMD" ]; then
_savedeployconf DEPLOY_DOCKER_CONTAINER_RELOAD_CMD "$DEPLOY_DOCKER_CONTAINER_RELOAD_CMD" "base64"
fi
_cid="$(_get_id "$DEPLOY_DOCKER_CONTAINER_LABEL")"
_info "Container id: $_cid"
if [ -z "$_cid" ]; then
_err "can not find container id"
return 1
fi
if [ "$DEPLOY_DOCKER_CONTAINER_KEY_FILE" ]; then
if ! _docker_cp "$_cid" "$_ckey" "$DEPLOY_DOCKER_CONTAINER_KEY_FILE"; then
return 1
fi
fi
if [ "$DEPLOY_DOCKER_CONTAINER_CERT_FILE" ]; then
if ! _docker_cp "$_cid" "$_ccert" "$DEPLOY_DOCKER_CONTAINER_CERT_FILE"; then
return 1
fi
fi
if [ "$DEPLOY_DOCKER_CONTAINER_CA_FILE" ]; then
if ! _docker_cp "$_cid" "$_cca" "$DEPLOY_DOCKER_CONTAINER_CA_FILE"; then
return 1
fi
fi
if [ "$DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE" ]; then
if ! _docker_cp "$_cid" "$_cfullchain" "$DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE"; then
return 1
fi
fi
if [ "$DEPLOY_DOCKER_CONTAINER_RELOAD_CMD" ]; then
_info "Reloading: $DEPLOY_DOCKER_CONTAINER_RELOAD_CMD"
if ! _docker_exec "$_cid" "$DEPLOY_DOCKER_CONTAINER_RELOAD_CMD"; then
return 1
fi
fi
return 0
}
#label
_get_id() {
_label="$1"
if [ "$_USE_DOCKER_COMMAND" ]; then
docker ps -f label="$_label" --format "{{.ID}}"
elif [ "$_USE_REST" ]; then
_err "Not implemented yet."
return 1
elif [ "$_USE_UNIX_SOCKET" ]; then
_req="{\"label\":[\"$_label\"]}"
_debug2 _req "$_req"
_req="$(printf "%s" "$_req" | _url_encode)"
_debug2 _req "$_req"
listjson="$(_curl_unix_sock "${_DOCKER_SOCK:-$_DOCKER_HOST_DEFAULT}" GET "/containers/json?filters=$_req")"
_debug2 "listjson" "$listjson"
echo "$listjson" | tr '{,' '\n' | grep -i '"id":' | _head_n 1 | cut -d '"' -f 4
else
_err "Not implemented yet."
return 1
fi
}
#id cmd
_docker_exec() {
_eargs="$*"
_debug2 "_docker_exec $_eargs"
_dcid="$1"
shift
if [ "$_USE_DOCKER_COMMAND" ]; then
docker exec -i "$_dcid" sh -c "$*"
elif [ "$_USE_REST" ]; then
_err "Not implemented yet."
return 1
elif [ "$_USE_UNIX_SOCKET" ]; then
_cmd="$*"
#_cmd="$(printf "%s" "$_cmd" | sed 's/ /","/g')"
_debug2 _cmd "$_cmd"
#create exec instance:
cjson="$(_curl_unix_sock "$_DOCKER_SOCK" POST "/containers/$_dcid/exec" "{\"Cmd\": [\"sh\", \"-c\", \"$_cmd\"]}")"
_debug2 cjson "$cjson"
execid="$(echo "$cjson" | cut -d '"' -f 4)"
_debug execid "$execid"
ejson="$(_curl_unix_sock "$_DOCKER_SOCK" POST "/exec/$execid/start" "{\"Detach\": false,\"Tty\": false}")"
_debug2 ejson "$ejson"
if [ "$ejson" ]; then
_err "$ejson"
return 1
fi
else
_err "Not implemented yet."
return 1
fi
}
#id from to
_docker_cp() {
_dcid="$1"
_from="$2"
_to="$3"
_info "Copying file from $_from to $_to"
_dir="$(dirname "$_to")"
_debug2 _dir "$_dir"
if ! _docker_exec "$_dcid" mkdir -p "$_dir"; then
_err "Can not create dir: $_dir"
return 1
fi
if [ "$_USE_DOCKER_COMMAND" ]; then
if [ "$DEBUG" ] && [ "$DEBUG" -ge "2" ]; then
_docker_exec "$_dcid" tee "$_to" <"$_from"
else
_docker_exec "$_dcid" tee "$_to" <"$_from" >/dev/null
fi
if [ "$?" = "0" ]; then
_info "Success"
return 0
else
_info "Error"
return 1
fi
elif [ "$_USE_REST" ]; then
_err "Not implemented yet."
return 1
elif [ "$_USE_UNIX_SOCKET" ]; then
_frompath="$_from"
if _startswith "$_frompath" '/'; then
_frompath="$(echo "$_from" | cut -b 2-)" #remove the first '/' char
fi
_debug2 "_frompath" "$_frompath"
_toname="$(basename "$_to")"
_debug2 "_toname" "$_toname"
_debug2 "_from" "$_from"
if ! tar --transform="s,$(printf "%s" "$_frompath" | tr '*' .),$_toname," -cz "$_from" 2>/dev/null | _curl_unix_sock "$_DOCKER_SOCK" PUT "/containers/$_dcid/archive?noOverwriteDirNonDir=1&path=$(printf "%s" "$_dir" | _url_encode)" '@-' "Content-Type: application/octet-stream"; then
_err "copy error"
return 1
fi
return 0
else
_err "Not implemented yet."
return 1
fi
}
#sock method endpoint data content-type
_curl_unix_sock() {
_socket="$1"
_method="$2"
_endpoint="$3"
_data="$4"
_ctype="$5"
if [ -z "$_ctype" ]; then
_ctype="Content-Type: application/json"
fi
_debug _data "$_data"
_debug2 "url" "http://localhost$_endpoint"
if [ "$_CURL_NO_HOST" ]; then
_cux_url="http:$_endpoint"
else
_cux_url="http://localhost$_endpoint"
fi
if [ "$DEBUG" ] && [ "$DEBUG" -ge "2" ]; then
curl -vvv --silent --unix-socket "$_socket" -X "$_method" --data-binary "$_data" --header "$_ctype" "$_cux_url"
else
curl --silent --unix-socket "$_socket" -X "$_method" --data-binary "$_data" --header "$_ctype" "$_cux_url"
fi
}
_check_curl_version() {
_cversion="$(curl -V | grep '^curl ' | cut -d ' ' -f 2)"
_debug2 "_cversion" "$_cversion"
_major="$(_getfield "$_cversion" 1 '.')"
_debug2 "_major" "$_major"
_minor="$(_getfield "$_cversion" 2 '.')"
_debug2 "_minor" "$_minor"
if [ "$_major$_minor" -lt "740" ]; then
_err "curl v$_cversion doesn't support unit socket"
_err "Please upgrade to curl 7.40 or later."
return 1
fi
if [ "$_major$_minor" -lt "750" ]; then
_debug "Use short host name"
export _CURL_NO_HOST=1
else
export _CURL_NO_HOST=
fi
return 0
}

View File

@@ -69,8 +69,8 @@ exim4_deploy() {
cp "$_exim4_conf" "$_backup_conf"
_info "Modify exim4 conf: $_exim4_conf"
if _setopt "$_exim4_conf" "tls_certificate" "=" "$_real_fullchain" \
&& _setopt "$_exim4_conf" "tls_privatekey" "=" "$_real_key"; then
if _setopt "$_exim4_conf" "tls_certificate" "=" "$_real_fullchain" &&
_setopt "$_exim4_conf" "tls_privatekey" "=" "$_real_key"; then
_info "Set config success!"
else
_err "Config exim4 server error, please report bug to us."

View File

@@ -28,41 +28,59 @@ fritzbox_deploy() {
_debug _cfullchain "$_cfullchain"
if ! _exists iconv; then
_err "iconv not found"
if ! _exists uconv; then
if ! _exists perl; then
_err "iconv or uconv or perl not found"
return 1
fi
fi
fi
_fritzbox_username="${DEPLOY_FRITZBOX_USERNAME}"
_fritzbox_password="${DEPLOY_FRITZBOX_PASSWORD}"
_fritzbox_url="${DEPLOY_FRITZBOX_URL}"
# Clear traces of incorrectly stored values
_clearaccountconf DEPLOY_FRITZBOX_USERNAME
_clearaccountconf DEPLOY_FRITZBOX_PASSWORD
_clearaccountconf DEPLOY_FRITZBOX_URL
_debug _fritzbox_url "$_fritzbox_url"
_debug _fritzbox_username "$_fritzbox_username"
_secure_debug _fritzbox_password "$_fritzbox_password"
if [ -z "$_fritzbox_username" ]; then
# Read config from saved values or env
_getdeployconf DEPLOY_FRITZBOX_USERNAME
_getdeployconf DEPLOY_FRITZBOX_PASSWORD
_getdeployconf DEPLOY_FRITZBOX_URL
_debug DEPLOY_FRITZBOX_URL "$DEPLOY_FRITZBOX_URL"
_debug DEPLOY_FRITZBOX_USERNAME "$DEPLOY_FRITZBOX_USERNAME"
_secure_debug DEPLOY_FRITZBOX_PASSWORD "$DEPLOY_FRITZBOX_PASSWORD"
if [ -z "$DEPLOY_FRITZBOX_USERNAME" ]; then
_err "FRITZ!Box username is not found, please define DEPLOY_FRITZBOX_USERNAME."
return 1
fi
if [ -z "$_fritzbox_password" ]; then
if [ -z "$DEPLOY_FRITZBOX_PASSWORD" ]; then
_err "FRITZ!Box password is not found, please define DEPLOY_FRITZBOX_PASSWORD."
return 1
fi
if [ -z "$_fritzbox_url" ]; then
if [ -z "$DEPLOY_FRITZBOX_URL" ]; then
_err "FRITZ!Box url is not found, please define DEPLOY_FRITZBOX_URL."
return 1
fi
_saveaccountconf DEPLOY_FRITZBOX_USERNAME "${_fritzbox_username}"
_saveaccountconf DEPLOY_FRITZBOX_PASSWORD "${_fritzbox_password}"
_saveaccountconf DEPLOY_FRITZBOX_URL "${_fritzbox_url}"
# Save current values
_savedeployconf DEPLOY_FRITZBOX_USERNAME "$DEPLOY_FRITZBOX_USERNAME"
_savedeployconf DEPLOY_FRITZBOX_PASSWORD "$DEPLOY_FRITZBOX_PASSWORD"
_savedeployconf DEPLOY_FRITZBOX_URL "$DEPLOY_FRITZBOX_URL"
# Do not check for a valid SSL certificate, because initially the cert is not valid, so it could not install the LE generated certificate
export HTTPS_INSECURE=1
_info "Log in to the FRITZ!Box"
_fritzbox_challenge="$(_get "${_fritzbox_url}/login_sid.lua" | sed -e 's/^.*<Challenge>//' -e 's/<\/Challenge>.*$//')"
_fritzbox_hash="$(printf "%s-%s" "${_fritzbox_challenge}" "${_fritzbox_password}" | iconv -f ASCII -t UTF16LE | md5sum | awk '{print $1}')"
_fritzbox_sid="$(_get "${_fritzbox_url}/login_sid.lua?sid=0000000000000000&username=${_fritzbox_username}&response=${_fritzbox_challenge}-${_fritzbox_hash}" | sed -e 's/^.*<SID>//' -e 's/<\/SID>.*$//')"
_fritzbox_challenge="$(_get "${DEPLOY_FRITZBOX_URL}/login_sid.lua" | sed -e 's/^.*<Challenge>//' -e 's/<\/Challenge>.*$//')"
if _exists iconv; then
_fritzbox_hash="$(printf "%s-%s" "${_fritzbox_challenge}" "${DEPLOY_FRITZBOX_PASSWORD}" | iconv -f ASCII -t UTF16LE | _digest md5 hex)"
elif _exists uconv; then
_fritzbox_hash="$(printf "%s-%s" "${_fritzbox_challenge}" "${DEPLOY_FRITZBOX_PASSWORD}" | uconv -f ASCII -t UTF16LE | _digest md5 hex)"
else
_fritzbox_hash="$(printf "%s-%s" "${_fritzbox_challenge}" "${DEPLOY_FRITZBOX_PASSWORD}" | perl -p -e 'use Encode qw/encode/; print encode("UTF-16LE","$_"); $_="";' | _digest md5 hex)"
fi
_fritzbox_sid="$(_get "${DEPLOY_FRITZBOX_URL}/login_sid.lua?sid=0000000000000000&username=${DEPLOY_FRITZBOX_USERNAME}&response=${_fritzbox_challenge}-${_fritzbox_hash}" | sed -e 's/^.*<SID>//' -e 's/<\/SID>.*$//')"
if [ -z "${_fritzbox_sid}" ] || [ "${_fritzbox_sid}" = "0000000000000000" ]; then
_err "Logging in to the FRITZ!Box failed. Please check username, password and URL."
@@ -94,7 +112,7 @@ fritzbox_deploy() {
_info "Upload certificate to the FRITZ!Box"
export _H1="Content-type: multipart/form-data boundary=${_post_boundary}"
_post "$(cat "${_post_request}")" "${_fritzbox_url}/cgi-bin/firmwarecfg" | grep SSL
_post "$(cat "${_post_request}")" "${DEPLOY_FRITZBOX_URL}/cgi-bin/firmwarecfg" | grep SSL
retval=$?
if [ $retval = 0 ]; then

142
deploy/gcore_cdn.sh Normal file
View File

@@ -0,0 +1,142 @@
#!/usr/bin/env sh
# Here is the script to deploy the cert to G-Core CDN service (https://gcorelabs.com/ru/) using the G-Core Labs API (https://docs.gcorelabs.com/cdn/).
# Returns 0 when success.
#
# Written by temoffey <temofffey@gmail.com>
# Public domain, 2019
#export DEPLOY_GCORE_CDN_USERNAME=myusername
#export DEPLOY_GCORE_CDN_PASSWORD=mypassword
######## Public functions #####################
#domain keyfile certfile cafile fullchain
gcore_cdn_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
_fullchain=$(tr '\r\n' '*#' <"$_cfullchain" | sed 's/*#/#/g;s/##/#/g;s/#/\\n/g')
_key=$(tr '\r\n' '*#' <"$_ckey" | sed 's/*#/#/g;s/#/\\n/g')
_debug _fullchain "$_fullchain"
_debug _key "$_key"
if [ -z "$DEPLOY_GCORE_CDN_USERNAME" ]; then
if [ -z "$Le_Deploy_gcore_cdn_username" ]; then
_err "Please define the target username: export DEPLOY_GCORE_CDN_USERNAME=username"
return 1
fi
else
Le_Deploy_gcore_cdn_username="$DEPLOY_GCORE_CDN_USERNAME"
_savedomainconf Le_Deploy_gcore_cdn_username "$Le_Deploy_gcore_cdn_username"
fi
if [ -z "$DEPLOY_GCORE_CDN_PASSWORD" ]; then
if [ -z "$Le_Deploy_gcore_cdn_password" ]; then
_err "Please define the target password: export DEPLOY_GCORE_CDN_PASSWORD=password"
return 1
fi
else
Le_Deploy_gcore_cdn_password="$DEPLOY_GCORE_CDN_PASSWORD"
_savedomainconf Le_Deploy_gcore_cdn_password "$Le_Deploy_gcore_cdn_password"
fi
_info "Get authorization token"
_request="{\"username\":\"$Le_Deploy_gcore_cdn_username\",\"password\":\"$Le_Deploy_gcore_cdn_password\"}"
_debug _request "$_request"
export _H1="Content-Type:application/json"
_response=$(_post "$_request" "https://api.gcdn.co/auth/jwt/login")
_debug _response "$_response"
_regex=".*\"access\":\"\([-._0-9A-Za-z]*\)\".*$"
_debug _regex "$_regex"
_token=$(echo "$_response" | sed -n "s/$_regex/\1/p")
_debug _token "$_token"
if [ -z "$_token" ]; then
_err "Error G-Core Labs API authorization"
return 1
fi
_info "Find CDN resource with cname $_cdomain"
export _H2="Authorization:Token $_token"
_response=$(_get "https://api.gcdn.co/resources")
_debug _response "$_response"
_regex="\"primary_resource\":null},"
_debug _regex "$_regex"
_response=$(echo "$_response" | sed "s/$_regex/$_regex\n/g")
_debug _response "$_response"
_regex="^.*\"cname\":\"$_cdomain\".*$"
_debug _regex "$_regex"
_resource=$(echo "$_response" | _egrep_o "$_regex")
_debug _resource "$_resource"
_regex=".*\"id\":\([0-9]*\).*$"
_debug _regex "$_regex"
_resourceId=$(echo "$_resource" | sed -n "s/$_regex/\1/p")
_debug _resourceId "$_resourceId"
_regex=".*\"sslData\":\([0-9]*\).*$"
_debug _regex "$_regex"
_sslDataOld=$(echo "$_resource" | sed -n "s/$_regex/\1/p")
_debug _sslDataOld "$_sslDataOld"
_regex=".*\"originGroup\":\([0-9]*\).*$"
_debug _regex "$_regex"
_originGroup=$(echo "$_resource" | sed -n "s/$_regex/\1/p")
_debug _originGroup "$_originGroup"
if [ -z "$_resourceId" ] || [ -z "$_originGroup" ]; then
_err "Not found CDN resource with cname $_cdomain"
return 1
fi
_info "Add new SSL certificate"
_date=$(date "+%d.%m.%Y %H:%M:%S")
_request="{\"name\":\"$_cdomain ($_date)\",\"sslCertificate\":\"$_fullchain\",\"sslPrivateKey\":\"$_key\"}"
_debug _request "$_request"
_response=$(_post "$_request" "https://api.gcdn.co/sslData")
_debug _response "$_response"
_regex=".*\"id\":\([0-9]*\).*$"
_debug _regex "$_regex"
_sslDataAdd=$(echo "$_response" | sed -n "s/$_regex/\1/p")
_debug _sslDataAdd "$_sslDataAdd"
if [ -z "$_sslDataAdd" ]; then
_err "Error new SSL certificate add"
return 1
fi
_info "Update CDN resource"
_request="{\"originGroup\":$_originGroup,\"sslData\":$_sslDataAdd}"
_debug _request "$_request"
_response=$(_post "$_request" "https://api.gcdn.co/resources/$_resourceId" '' "PUT")
_debug _response "$_response"
_regex=".*\"sslData\":\([0-9]*\).*$"
_debug _regex "$_regex"
_sslDataNew=$(echo "$_response" | sed -n "s/$_regex/\1/p")
_debug _sslDataNew "$_sslDataNew"
if [ "$_sslDataNew" != "$_sslDataAdd" ]; then
_err "Error CDN resource update"
return 1
fi
if [ -z "$_sslDataOld" ] || [ "$_sslDataOld" = "null" ]; then
_info "Not found old SSL certificate"
else
_info "Delete old SSL certificate"
_response=$(_post '' "https://api.gcdn.co/sslData/$_sslDataOld" '' "DELETE")
_debug _response "$_response"
fi
_info "Certificate successfully deployed"
return 0
}

80
deploy/gitlab.sh Normal file
View File

@@ -0,0 +1,80 @@
#!/usr/bin/env sh
# Script to deploy certificate to a Gitlab hosted page
# The following variables exported from environment will be used.
# If not set then values previously saved in domain.conf file are used.
# All the variables are required
# export GITLAB_TOKEN="xxxxxxx"
# export GITLAB_PROJECT_ID=012345
# export GITLAB_DOMAIN="mydomain.com"
gitlab_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
if [ -z "$GITLAB_TOKEN" ]; then
if [ -z "$Le_Deploy_gitlab_token" ]; then
_err "GITLAB_TOKEN not defined."
return 1
fi
else
Le_Deploy_gitlab_token="$GITLAB_TOKEN"
_savedomainconf Le_Deploy_gitlab_token "$Le_Deploy_gitlab_token"
fi
if [ -z "$GITLAB_PROJECT_ID" ]; then
if [ -z "$Le_Deploy_gitlab_project_id" ]; then
_err "GITLAB_PROJECT_ID not defined."
return 1
fi
else
Le_Deploy_gitlab_project_id="$GITLAB_PROJECT_ID"
_savedomainconf Le_Deploy_gitlab_project_id "$Le_Deploy_gitlab_project_id"
fi
if [ -z "$GITLAB_DOMAIN" ]; then
if [ -z "$Le_Deploy_gitlab_domain" ]; then
_err "GITLAB_DOMAIN not defined."
return 1
fi
else
Le_Deploy_gitlab_domain="$GITLAB_DOMAIN"
_savedomainconf Le_Deploy_gitlab_domain "$Le_Deploy_gitlab_domain"
fi
string_fullchain=$(_url_encode <"$_cfullchain")
string_key=$(_url_encode <"$_ckey")
body="certificate=$string_fullchain&key=$string_key"
export _H1="PRIVATE-TOKEN: $Le_Deploy_gitlab_token"
gitlab_url="https://gitlab.com/api/v4/projects/$Le_Deploy_gitlab_project_id/pages/domains/$Le_Deploy_gitlab_domain"
_response=$(_post "$body" "$gitlab_url" 0 PUT | _dbase64 "multiline")
error_response="error"
if test "${_response#*$error_response}" != "$_response"; then
_err "Error in deploying certificate:"
_err "$_response"
return 1
fi
_debug response "$_response"
_info "Certificate successfully deployed"
return 0
}

View File

@@ -1,8 +1,41 @@
#!/usr/bin/env sh
#Here is a script to deploy cert to haproxy server.
#returns 0 means success, otherwise error.
# Script for acme.sh to deploy certificates to haproxy
#
# The following variables can be exported:
#
# export DEPLOY_HAPROXY_PEM_NAME="${domain}.pem"
#
# Defines the name of the PEM file.
# Defaults to "<domain>.pem"
#
# export DEPLOY_HAPROXY_PEM_PATH="/etc/haproxy"
#
# Defines location of PEM file for HAProxy.
# Defaults to /etc/haproxy
#
# export DEPLOY_HAPROXY_RELOAD="systemctl reload haproxy"
#
# OPTIONAL: Reload command used post deploy
# This defaults to be a no-op (ie "true").
# It is strongly recommended to set this something that makes sense
# for your distro.
#
# export DEPLOY_HAPROXY_ISSUER="no"
#
# OPTIONAL: Places CA file as "${DEPLOY_HAPROXY_PEM}.issuer"
# Note: Required for OCSP stapling to work
#
# export DEPLOY_HAPROXY_BUNDLE="no"
#
# OPTIONAL: Deploy this certificate as part of a multi-cert bundle
# This adds a suffix to the certificate based on the certificate type
# eg RSA certificates will have .rsa as a suffix to the file name
# HAProxy will load all certificates and provide one or the other
# depending on client capabilities
# Note: This functionality requires HAProxy was compiled against
# a version of OpenSSL that supports this.
#
######## Public functions #####################
@@ -14,13 +47,234 @@ haproxy_deploy() {
_cca="$4"
_cfullchain="$5"
_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
# Some defaults
DEPLOY_HAPROXY_PEM_PATH_DEFAULT="/etc/haproxy"
DEPLOY_HAPROXY_PEM_NAME_DEFAULT="${_cdomain}.pem"
DEPLOY_HAPROXY_BUNDLE_DEFAULT="no"
DEPLOY_HAPROXY_ISSUER_DEFAULT="no"
DEPLOY_HAPROXY_RELOAD_DEFAULT="true"
_err "deploy cert to haproxy server, Not implemented yet"
_debug _cdomain "${_cdomain}"
_debug _ckey "${_ckey}"
_debug _ccert "${_ccert}"
_debug _cca "${_cca}"
_debug _cfullchain "${_cfullchain}"
# PEM_PATH is optional. If not provided then assume "${DEPLOY_HAPROXY_PEM_PATH_DEFAULT}"
_getdeployconf DEPLOY_HAPROXY_PEM_PATH
_debug2 DEPLOY_HAPROXY_PEM_PATH "${DEPLOY_HAPROXY_PEM_PATH}"
if [ -n "${DEPLOY_HAPROXY_PEM_PATH}" ]; then
Le_Deploy_haproxy_pem_path="${DEPLOY_HAPROXY_PEM_PATH}"
_savedomainconf Le_Deploy_haproxy_pem_path "${Le_Deploy_haproxy_pem_path}"
elif [ -z "${Le_Deploy_haproxy_pem_path}" ]; then
Le_Deploy_haproxy_pem_path="${DEPLOY_HAPROXY_PEM_PATH_DEFAULT}"
fi
# Ensure PEM_PATH exists
if [ -d "${Le_Deploy_haproxy_pem_path}" ]; then
_debug "PEM_PATH ${Le_Deploy_haproxy_pem_path} exists"
else
_err "PEM_PATH ${Le_Deploy_haproxy_pem_path} does not exist"
return 1
fi
# PEM_NAME is optional. If not provided then assume "${DEPLOY_HAPROXY_PEM_NAME_DEFAULT}"
_getdeployconf DEPLOY_HAPROXY_PEM_NAME
_debug2 DEPLOY_HAPROXY_PEM_NAME "${DEPLOY_HAPROXY_PEM_NAME}"
if [ -n "${DEPLOY_HAPROXY_PEM_NAME}" ]; then
Le_Deploy_haproxy_pem_name="${DEPLOY_HAPROXY_PEM_NAME}"
_savedomainconf Le_Deploy_haproxy_pem_name "${Le_Deploy_haproxy_pem_name}"
elif [ -z "${Le_Deploy_haproxy_pem_name}" ]; then
Le_Deploy_haproxy_pem_name="${DEPLOY_HAPROXY_PEM_NAME_DEFAULT}"
fi
# BUNDLE is optional. If not provided then assume "${DEPLOY_HAPROXY_BUNDLE_DEFAULT}"
_getdeployconf DEPLOY_HAPROXY_BUNDLE
_debug2 DEPLOY_HAPROXY_BUNDLE "${DEPLOY_HAPROXY_BUNDLE}"
if [ -n "${DEPLOY_HAPROXY_BUNDLE}" ]; then
Le_Deploy_haproxy_bundle="${DEPLOY_HAPROXY_BUNDLE}"
_savedomainconf Le_Deploy_haproxy_bundle "${Le_Deploy_haproxy_bundle}"
elif [ -z "${Le_Deploy_haproxy_bundle}" ]; then
Le_Deploy_haproxy_bundle="${DEPLOY_HAPROXY_BUNDLE_DEFAULT}"
fi
# ISSUER is optional. If not provided then assume "${DEPLOY_HAPROXY_ISSUER_DEFAULT}"
_getdeployconf DEPLOY_HAPROXY_ISSUER
_debug2 DEPLOY_HAPROXY_ISSUER "${DEPLOY_HAPROXY_ISSUER}"
if [ -n "${DEPLOY_HAPROXY_ISSUER}" ]; then
Le_Deploy_haproxy_issuer="${DEPLOY_HAPROXY_ISSUER}"
_savedomainconf Le_Deploy_haproxy_issuer "${Le_Deploy_haproxy_issuer}"
elif [ -z "${Le_Deploy_haproxy_issuer}" ]; then
Le_Deploy_haproxy_issuer="${DEPLOY_HAPROXY_ISSUER_DEFAULT}"
fi
# RELOAD is optional. If not provided then assume "${DEPLOY_HAPROXY_RELOAD_DEFAULT}"
_getdeployconf DEPLOY_HAPROXY_RELOAD
_debug2 DEPLOY_HAPROXY_RELOAD "${DEPLOY_HAPROXY_RELOAD}"
if [ -n "${DEPLOY_HAPROXY_RELOAD}" ]; then
Le_Deploy_haproxy_reload="${DEPLOY_HAPROXY_RELOAD}"
_savedomainconf Le_Deploy_haproxy_reload "${Le_Deploy_haproxy_reload}"
elif [ -z "${Le_Deploy_haproxy_reload}" ]; then
Le_Deploy_haproxy_reload="${DEPLOY_HAPROXY_RELOAD_DEFAULT}"
fi
# Set the suffix depending if we are creating a bundle or not
if [ "${Le_Deploy_haproxy_bundle}" = "yes" ]; then
_info "Bundle creation requested"
# Initialise $Le_Keylength if its not already set
if [ -z "${Le_Keylength}" ]; then
Le_Keylength=""
fi
if _isEccKey "${Le_Keylength}"; then
_info "ECC key type detected"
_suffix=".ecdsa"
else
_info "RSA key type detected"
_suffix=".rsa"
fi
else
_suffix=""
fi
_debug _suffix "${_suffix}"
# Set variables for later
_pem="${Le_Deploy_haproxy_pem_path}/${Le_Deploy_haproxy_pem_name}${_suffix}"
_issuer="${_pem}.issuer"
_ocsp="${_pem}.ocsp"
_reload="${Le_Deploy_haproxy_reload}"
_info "Deploying PEM file"
# Create a temporary PEM file
_temppem="$(_mktemp)"
_debug _temppem "${_temppem}"
cat "${_ckey}" "${_ccert}" "${_cca}" >"${_temppem}"
_ret="$?"
# Check that we could create the temporary file
if [ "${_ret}" != "0" ]; then
_err "Error code ${_ret} returned during PEM file creation"
[ -f "${_temppem}" ] && rm -f "${_temppem}"
return ${_ret}
fi
# Move PEM file into place
_info "Moving new certificate into place"
_debug _pem "${_pem}"
cat "${_temppem}" >"${_pem}"
_ret=$?
# Clean up temp file
[ -f "${_temppem}" ] && rm -f "${_temppem}"
# Deal with any failure of moving PEM file into place
if [ "${_ret}" != "0" ]; then
_err "Error code ${_ret} returned while moving new certificate into place"
return ${_ret}
fi
# Update .issuer file if requested
if [ "${Le_Deploy_haproxy_issuer}" = "yes" ]; then
_info "Updating .issuer file"
_debug _issuer "${_issuer}"
cat "${_cca}" >"${_issuer}"
_ret="$?"
if [ "${_ret}" != "0" ]; then
_err "Error code ${_ret} returned while copying issuer/CA certificate into place"
return ${_ret}
fi
else
[ -f "${_issuer}" ] && _err "Issuer file update not requested but .issuer file exists"
fi
# Update .ocsp file if certificate was requested with --ocsp/--ocsp-must-staple option
if [ -z "${Le_OCSP_Staple}" ]; then
Le_OCSP_Staple="0"
fi
if [ "${Le_OCSP_Staple}" = "1" ]; then
_info "Updating OCSP stapling info"
_debug _ocsp "${_ocsp}"
_info "Extracting OCSP URL"
_ocsp_url=$(${ACME_OPENSSL_BIN:-openssl} x509 -noout -ocsp_uri -in "${_pem}")
_debug _ocsp_url "${_ocsp_url}"
# Only process OCSP if URL was present
if [ "${_ocsp_url}" != "" ]; then
# Extract the hostname from the OCSP URL
_info "Extracting OCSP URL"
_ocsp_host=$(echo "${_ocsp_url}" | cut -d/ -f3)
_debug _ocsp_host "${_ocsp_host}"
# Only process the certificate if we have a .issuer file
if [ -r "${_issuer}" ]; then
# Check if issuer cert is also a root CA cert
_subjectdn=$(${ACME_OPENSSL_BIN:-openssl} x509 -in "${_issuer}" -subject -noout | cut -d'/' -f2,3,4,5,6,7,8,9,10)
_debug _subjectdn "${_subjectdn}"
_issuerdn=$(${ACME_OPENSSL_BIN:-openssl} x509 -in "${_issuer}" -issuer -noout | cut -d'/' -f2,3,4,5,6,7,8,9,10)
_debug _issuerdn "${_issuerdn}"
_info "Requesting OCSP response"
# If the issuer is a CA cert then our command line has "-CAfile" added
if [ "${_subjectdn}" = "${_issuerdn}" ]; then
_cafile_argument="-CAfile \"${_issuer}\""
else
_cafile_argument=""
fi
_debug _cafile_argument "${_cafile_argument}"
# if OpenSSL/LibreSSL is v1.1 or above, the format for the -header option has changed
_openssl_version=$(${ACME_OPENSSL_BIN:-openssl} version | cut -d' ' -f2)
_debug _openssl_version "${_openssl_version}"
_openssl_major=$(echo "${_openssl_version}" | cut -d '.' -f1)
_openssl_minor=$(echo "${_openssl_version}" | cut -d '.' -f2)
if [ "${_openssl_major}" -eq "1" ] && [ "${_openssl_minor}" -ge "1" ] || [ "${_openssl_major}" -ge "2" ]; then
_header_sep="="
else
_header_sep=" "
fi
# Request the OCSP response from the issuer and store it
_openssl_ocsp_cmd="${ACME_OPENSSL_BIN:-openssl} ocsp \
-issuer \"${_issuer}\" \
-cert \"${_pem}\" \
-url \"${_ocsp_url}\" \
-header Host${_header_sep}\"${_ocsp_host}\" \
-respout \"${_ocsp}\" \
-verify_other \"${_issuer}\" \
${_cafile_argument} \
| grep -q \"${_pem}: good\""
_debug _openssl_ocsp_cmd "${_openssl_ocsp_cmd}"
eval "${_openssl_ocsp_cmd}"
_ret=$?
else
# Non fatal: No issuer file was present so no OCSP stapling file created
_err "OCSP stapling in use but no .issuer file was present"
fi
else
# Non fatal: No OCSP url was found int the certificate
_err "OCSP update requested but no OCSP URL was found in certificate"
fi
# Non fatal: Check return code of openssl command
if [ "${_ret}" != "0" ]; then
_err "Updating OCSP stapling failed with return code ${_ret}"
fi
else
# An OCSP file was already present but certificate did not have OCSP extension
if [ -f "${_ocsp}" ]; then
_err "OCSP was not requested but .ocsp file exists."
# Could remove the file at this step, although HAProxy just ignores it in this case
# rm -f "${_ocsp}" || _err "Problem removing stale .ocsp file"
fi
fi
# Reload HAProxy
_debug _reload "${_reload}"
eval "${_reload}"
_ret=$?
if [ "${_ret}" != "0" ]; then
_err "Error code ${_ret} during reload"
return ${_ret}
else
_info "Reload successful"
fi
return 0
}

View File

@@ -1,11 +1,5 @@
#!/usr/bin/env sh
#Here is a sample custom api script.
#This file name is "myapi.sh"
#So, here must be a method myapi_deploy()
#Which will be called by acme.sh to deploy the cert
#returns 0 means success, otherwise error.
######## Public functions #####################
#domain keyfile certfile cafile fullchain

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env sh
# If certificate already exist it will update only cert and key not touching other parameter
# If certificate doesn't exist it will only upload cert and key and not set other parameter
# If certificate already exists it will update only cert and key, not touching other parameters
# If certificate doesn't exist it will only upload cert and key, and not set other parameters
# Note that we deploy full chain
# Written by Geoffroi Genot <ggenot@voxbone.com>
@@ -45,7 +45,7 @@ kong_deploy() {
#Generate data for request (Multipart/form-data with mixed content)
if [ -z "$ssl_uuid" ]; then
#set sni to domain
content="--$delim${nl}Content-Disposition: form-data; name=\"snis\"${nl}${nl}$_cdomain"
content="--$delim${nl}Content-Disposition: form-data; name=\"snis[]\"${nl}${nl}$_cdomain"
fi
#add key
content="$content${nl}--$delim${nl}Content-Disposition: form-data; name=\"key\"; filename=\"$(basename "$_ckey")\"${nl}Content-Type: application/octet-stream${nl}${nl}$(cat "$_ckey")"

280
deploy/lighttpd.sh Normal file
View File

@@ -0,0 +1,280 @@
#!/usr/bin/env sh
# Script for acme.sh to deploy certificates to lighttpd
#
# The following variables can be exported:
#
# export DEPLOY_LIGHTTPD_PEM_NAME="${domain}.pem"
#
# Defines the name of the PEM file.
# Defaults to "<domain>.pem"
#
# export DEPLOY_LIGHTTPD_PEM_PATH="/etc/lighttpd"
#
# Defines location of PEM file for Lighttpd.
# Defaults to /etc/lighttpd
#
# export DEPLOY_LIGHTTPD_RELOAD="systemctl reload lighttpd"
#
# OPTIONAL: Reload command used post deploy
# This defaults to be a no-op (ie "true").
# It is strongly recommended to set this something that makes sense
# for your distro.
#
# export DEPLOY_LIGHTTPD_ISSUER="yes"
#
# OPTIONAL: Places CA file as "${DEPLOY_LIGHTTPD_PEM}.issuer"
# Note: Required for OCSP stapling to work
#
# export DEPLOY_LIGHTTPD_BUNDLE="no"
#
# OPTIONAL: Deploy this certificate as part of a multi-cert bundle
# This adds a suffix to the certificate based on the certificate type
# eg RSA certificates will have .rsa as a suffix to the file name
# Lighttpd will load all certificates and provide one or the other
# depending on client capabilities
# Note: This functionality requires Lighttpd was compiled against
# a version of OpenSSL that supports this.
#
######## Public functions #####################
#domain keyfile certfile cafile fullchain
lighttpd_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
# Some defaults
DEPLOY_LIGHTTPD_PEM_PATH_DEFAULT="/etc/lighttpd"
DEPLOY_LIGHTTPD_PEM_NAME_DEFAULT="${_cdomain}.pem"
DEPLOY_LIGHTTPD_BUNDLE_DEFAULT="no"
DEPLOY_LIGHTTPD_ISSUER_DEFAULT="yes"
DEPLOY_LIGHTTPD_RELOAD_DEFAULT="true"
_debug _cdomain "${_cdomain}"
_debug _ckey "${_ckey}"
_debug _ccert "${_ccert}"
_debug _cca "${_cca}"
_debug _cfullchain "${_cfullchain}"
# PEM_PATH is optional. If not provided then assume "${DEPLOY_LIGHTTPD_PEM_PATH_DEFAULT}"
_getdeployconf DEPLOY_LIGHTTPD_PEM_PATH
_debug2 DEPLOY_LIGHTTPD_PEM_PATH "${DEPLOY_LIGHTTPD_PEM_PATH}"
if [ -n "${DEPLOY_LIGHTTPD_PEM_PATH}" ]; then
Le_Deploy_lighttpd_pem_path="${DEPLOY_LIGHTTPD_PEM_PATH}"
_savedomainconf Le_Deploy_lighttpd_pem_path "${Le_Deploy_lighttpd_pem_path}"
elif [ -z "${Le_Deploy_lighttpd_pem_path}" ]; then
Le_Deploy_lighttpd_pem_path="${DEPLOY_LIGHTTPD_PEM_PATH_DEFAULT}"
fi
# Ensure PEM_PATH exists
if [ -d "${Le_Deploy_lighttpd_pem_path}" ]; then
_debug "PEM_PATH ${Le_Deploy_lighttpd_pem_path} exists"
else
_err "PEM_PATH ${Le_Deploy_lighttpd_pem_path} does not exist"
return 1
fi
# PEM_NAME is optional. If not provided then assume "${DEPLOY_LIGHTTPD_PEM_NAME_DEFAULT}"
_getdeployconf DEPLOY_LIGHTTPD_PEM_NAME
_debug2 DEPLOY_LIGHTTPD_PEM_NAME "${DEPLOY_LIGHTTPD_PEM_NAME}"
if [ -n "${DEPLOY_LIGHTTPD_PEM_NAME}" ]; then
Le_Deploy_lighttpd_pem_name="${DEPLOY_LIGHTTPD_PEM_NAME}"
_savedomainconf Le_Deploy_lighttpd_pem_name "${Le_Deploy_lighttpd_pem_name}"
elif [ -z "${Le_Deploy_lighttpd_pem_name}" ]; then
Le_Deploy_lighttpd_pem_name="${DEPLOY_LIGHTTPD_PEM_NAME_DEFAULT}"
fi
# BUNDLE is optional. If not provided then assume "${DEPLOY_LIGHTTPD_BUNDLE_DEFAULT}"
_getdeployconf DEPLOY_LIGHTTPD_BUNDLE
_debug2 DEPLOY_LIGHTTPD_BUNDLE "${DEPLOY_LIGHTTPD_BUNDLE}"
if [ -n "${DEPLOY_LIGHTTPD_BUNDLE}" ]; then
Le_Deploy_lighttpd_bundle="${DEPLOY_LIGHTTPD_BUNDLE}"
_savedomainconf Le_Deploy_lighttpd_bundle "${Le_Deploy_lighttpd_bundle}"
elif [ -z "${Le_Deploy_lighttpd_bundle}" ]; then
Le_Deploy_lighttpd_bundle="${DEPLOY_LIGHTTPD_BUNDLE_DEFAULT}"
fi
# ISSUER is optional. If not provided then assume "${DEPLOY_LIGHTTPD_ISSUER_DEFAULT}"
_getdeployconf DEPLOY_LIGHTTPD_ISSUER
_debug2 DEPLOY_LIGHTTPD_ISSUER "${DEPLOY_LIGHTTPD_ISSUER}"
if [ -n "${DEPLOY_LIGHTTPD_ISSUER}" ]; then
Le_Deploy_lighttpd_issuer="${DEPLOY_LIGHTTPD_ISSUER}"
_savedomainconf Le_Deploy_lighttpd_issuer "${Le_Deploy_lighttpd_issuer}"
elif [ -z "${Le_Deploy_lighttpd_issuer}" ]; then
Le_Deploy_lighttpd_issuer="${DEPLOY_LIGHTTPD_ISSUER_DEFAULT}"
fi
# RELOAD is optional. If not provided then assume "${DEPLOY_LIGHTTPD_RELOAD_DEFAULT}"
_getdeployconf DEPLOY_LIGHTTPD_RELOAD
_debug2 DEPLOY_LIGHTTPD_RELOAD "${DEPLOY_LIGHTTPD_RELOAD}"
if [ -n "${DEPLOY_LIGHTTPD_RELOAD}" ]; then
Le_Deploy_lighttpd_reload="${DEPLOY_LIGHTTPD_RELOAD}"
_savedomainconf Le_Deploy_lighttpd_reload "${Le_Deploy_lighttpd_reload}"
elif [ -z "${Le_Deploy_lighttpd_reload}" ]; then
Le_Deploy_lighttpd_reload="${DEPLOY_LIGHTTPD_RELOAD_DEFAULT}"
fi
# Set the suffix depending if we are creating a bundle or not
if [ "${Le_Deploy_lighttpd_bundle}" = "yes" ]; then
_info "Bundle creation requested"
# Initialise $Le_Keylength if its not already set
if [ -z "${Le_Keylength}" ]; then
Le_Keylength=""
fi
if _isEccKey "${Le_Keylength}"; then
_info "ECC key type detected"
_suffix=".ecdsa"
else
_info "RSA key type detected"
_suffix=".rsa"
fi
else
_suffix=""
fi
_debug _suffix "${_suffix}"
# Set variables for later
_pem="${Le_Deploy_lighttpd_pem_path}/${Le_Deploy_lighttpd_pem_name}${_suffix}"
_issuer="${_pem}.issuer"
_ocsp="${_pem}.ocsp"
_reload="${Le_Deploy_lighttpd_reload}"
_info "Deploying PEM file"
# Create a temporary PEM file
_temppem="$(_mktemp)"
_debug _temppem "${_temppem}"
cat "${_ckey}" "${_ccert}" "${_cca}" >"${_temppem}"
_ret="$?"
# Check that we could create the temporary file
if [ "${_ret}" != "0" ]; then
_err "Error code ${_ret} returned during PEM file creation"
[ -f "${_temppem}" ] && rm -f "${_temppem}"
return ${_ret}
fi
# Move PEM file into place
_info "Moving new certificate into place"
_debug _pem "${_pem}"
cat "${_temppem}" >"${_pem}"
_ret=$?
# Clean up temp file
[ -f "${_temppem}" ] && rm -f "${_temppem}"
# Deal with any failure of moving PEM file into place
if [ "${_ret}" != "0" ]; then
_err "Error code ${_ret} returned while moving new certificate into place"
return ${_ret}
fi
# Update .issuer file if requested
if [ "${Le_Deploy_lighttpd_issuer}" = "yes" ]; then
_info "Updating .issuer file"
_debug _issuer "${_issuer}"
cat "${_cca}" >"${_issuer}"
_ret="$?"
if [ "${_ret}" != "0" ]; then
_err "Error code ${_ret} returned while copying issuer/CA certificate into place"
return ${_ret}
fi
else
[ -f "${_issuer}" ] && _err "Issuer file update not requested but .issuer file exists"
fi
# Update .ocsp file if certificate was requested with --ocsp/--ocsp-must-staple option
if [ -z "${Le_OCSP_Staple}" ]; then
Le_OCSP_Staple="0"
fi
if [ "${Le_OCSP_Staple}" = "1" ]; then
_info "Updating OCSP stapling info"
_debug _ocsp "${_ocsp}"
_info "Extracting OCSP URL"
_ocsp_url=$(${ACME_OPENSSL_BIN:-openssl} x509 -noout -ocsp_uri -in "${_pem}")
_debug _ocsp_url "${_ocsp_url}"
# Only process OCSP if URL was present
if [ "${_ocsp_url}" != "" ]; then
# Extract the hostname from the OCSP URL
_info "Extracting OCSP URL"
_ocsp_host=$(echo "${_ocsp_url}" | cut -d/ -f3)
_debug _ocsp_host "${_ocsp_host}"
# Only process the certificate if we have a .issuer file
if [ -r "${_issuer}" ]; then
# Check if issuer cert is also a root CA cert
_subjectdn=$(${ACME_OPENSSL_BIN:-openssl} x509 -in "${_issuer}" -subject -noout | cut -d'/' -f2,3,4,5,6,7,8,9,10)
_debug _subjectdn "${_subjectdn}"
_issuerdn=$(${ACME_OPENSSL_BIN:-openssl} x509 -in "${_issuer}" -issuer -noout | cut -d'/' -f2,3,4,5,6,7,8,9,10)
_debug _issuerdn "${_issuerdn}"
_info "Requesting OCSP response"
# If the issuer is a CA cert then our command line has "-CAfile" added
if [ "${_subjectdn}" = "${_issuerdn}" ]; then
_cafile_argument="-CAfile \"${_issuer}\""
else
_cafile_argument=""
fi
_debug _cafile_argument "${_cafile_argument}"
# if OpenSSL/LibreSSL is v1.1 or above, the format for the -header option has changed
_openssl_version=$(${ACME_OPENSSL_BIN:-openssl} version | cut -d' ' -f2)
_debug _openssl_version "${_openssl_version}"
_openssl_major=$(echo "${_openssl_version}" | cut -d '.' -f1)
_openssl_minor=$(echo "${_openssl_version}" | cut -d '.' -f2)
if [ "${_openssl_major}" -eq "1" ] && [ "${_openssl_minor}" -ge "1" ] || [ "${_openssl_major}" -ge "2" ]; then
_header_sep="="
else
_header_sep=" "
fi
# Request the OCSP response from the issuer and store it
_openssl_ocsp_cmd="${ACME_OPENSSL_BIN:-openssl} ocsp \
-issuer \"${_issuer}\" \
-cert \"${_pem}\" \
-url \"${_ocsp_url}\" \
-header Host${_header_sep}\"${_ocsp_host}\" \
-respout \"${_ocsp}\" \
-verify_other \"${_issuer}\" \
${_cafile_argument} \
| grep -q \"${_pem}: good\""
_debug _openssl_ocsp_cmd "${_openssl_ocsp_cmd}"
eval "${_openssl_ocsp_cmd}"
_ret=$?
else
# Non fatal: No issuer file was present so no OCSP stapling file created
_err "OCSP stapling in use but no .issuer file was present"
fi
else
# Non fatal: No OCSP url was found int the certificate
_err "OCSP update requested but no OCSP URL was found in certificate"
fi
# Non fatal: Check return code of openssl command
if [ "${_ret}" != "0" ]; then
_err "Updating OCSP stapling failed with return code ${_ret}"
fi
else
# An OCSP file was already present but certificate did not have OCSP extension
if [ -f "${_ocsp}" ]; then
_err "OCSP was not requested but .ocsp file exists."
# Could remove the file at this step, although Lighttpd just ignores it in this case
# rm -f "${_ocsp}" || _err "Problem removing stale .ocsp file"
fi
fi
# Reload Lighttpd
_debug _reload "${_reload}"
eval "${_reload}"
_ret=$?
if [ "${_ret}" != "0" ]; then
_err "Error code ${_ret} during reload"
return ${_ret}
else
_info "Reload successful"
fi
return 0
}

79
deploy/mailcow.sh Normal file
View File

@@ -0,0 +1,79 @@
#!/usr/bin/env sh
#Here is a script to deploy cert to mailcow.
#returns 0 means success, otherwise error.
######## Public functions #####################
#domain keyfile certfile cafile fullchain
mailcow_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
_getdeployconf DEPLOY_MAILCOW_PATH
_getdeployconf DEPLOY_MAILCOW_RELOAD
_debug DEPLOY_MAILCOW_PATH "$DEPLOY_MAILCOW_PATH"
_debug DEPLOY_MAILCOW_RELOAD "$DEPLOY_MAILCOW_RELOAD"
if [ -z "$DEPLOY_MAILCOW_PATH" ]; then
_err "Mailcow path is not found, please define DEPLOY_MAILCOW_PATH."
return 1
fi
_savedeployconf DEPLOY_MAILCOW_PATH "$DEPLOY_MAILCOW_PATH"
[ -n "$DEPLOY_MAILCOW_RELOAD" ] && _savedeployconf DEPLOY_MAILCOW_RELOAD "$DEPLOY_MAILCOW_RELOAD"
_ssl_path="$DEPLOY_MAILCOW_PATH"
if [ -f "$DEPLOY_MAILCOW_PATH/generate_config.sh" ]; then
_ssl_path="$DEPLOY_MAILCOW_PATH/data/assets/ssl/"
fi
if [ ! -d "$_ssl_path" ]; then
_err "Cannot find mailcow ssl path: $_ssl_path"
return 1
fi
# ECC or RSA
length=$(_readdomainconf Le_Keylength)
if _isEccKey "$length"; then
_info "ECC key type detected"
_cert_name_prefix="ecdsa-"
else
_info "RSA key type detected"
_cert_name_prefix=""
fi
_info "Copying key and cert"
_real_key="$_ssl_path/${_cert_name_prefix}key.pem"
if ! cat "$_ckey" >"$_real_key"; then
_err "Error: write key file to: $_real_key"
return 1
fi
_real_fullchain="$_ssl_path/${_cert_name_prefix}cert.pem"
if ! cat "$_cfullchain" >"$_real_fullchain"; then
_err "Error: write cert file to: $_real_fullchain"
return 1
fi
DEFAULT_MAILCOW_RELOAD="docker restart \$(docker ps --quiet --filter name=nginx-mailcow --filter name=dovecot-mailcow)"
_reload="${DEPLOY_MAILCOW_RELOAD:-$DEFAULT_MAILCOW_RELOAD}"
_info "Run reload: $_reload"
if eval "$_reload"; then
_info "Reload success!"
fi
return 0
}

59
deploy/mydevil.sh Executable file
View File

@@ -0,0 +1,59 @@
#!/usr/bin/env sh
# MyDevil.net API (2019-02-03)
#
# MyDevil.net already supports automatic Let's Encrypt certificates,
# except for wildcard domains.
#
# This script depends on `devil` command that MyDevil.net provides,
# which means that it works only on server side.
#
# Author: Marcin Konicki <https://ahwayakchih.neoni.net>
#
######## Public functions #####################
# Usage: mydevil_deploy domain keyfile certfile cafile fullchain
mydevil_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
ip=""
_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
if ! _exists "devil"; then
_err "Could not find 'devil' command."
return 1
fi
ip=$(mydevil_get_ip "$_cdomain")
if [ -z "$ip" ]; then
_err "Could not find IP for domain $_cdomain."
return 1
fi
# Delete old certificate first
_info "Removing old certificate for $_cdomain at $ip"
devil ssl www del "$ip" "$_cdomain"
# Add new certificate
_info "Adding new certificate for $_cdomain at $ip"
devil ssl www add "$ip" "$_cfullchain" "$_ckey" "$_cdomain" || return 1
return 0
}
#################### Private functions below ##################################
# Usage: ip=$(mydevil_get_ip domain.com)
# echo $ip
mydevil_get_ip() {
devil dns list "$1" | cut -w -s -f 3,7 | grep "^A$(printf '\t')" | cut -w -s -f 2 || return 1
return 0
}

156
deploy/openmediavault.sh Normal file
View File

@@ -0,0 +1,156 @@
#!/usr/bin/env sh
# This deploy hook is tested on OpenMediaVault 5.x. It supports both local and remote deployment.
# The way it works is that if a cert with the matching domain name is not found, it will firstly create a dummy cert to get its uuid, and then replace it with your cert.
#
# DEPLOY_OMV_WEBUI_ADMIN - This is OMV web gui admin account. Default value is admin. It's required as the user parameter (-u) for the omv-rpc command.
# DEPLOY_OMV_HOST and DEPLOY_OMV_SSH_USER are optional. They are used for remote deployment through ssh (support public key authentication only). Per design, OMV web gui admin doesn't have ssh permission, so another account is needed for ssh.
#
# returns 0 means success, otherwise error.
######## Public functions #####################
#domain keyfile certfile cafile fullchain
openmediavault_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
_getdeployconf DEPLOY_OMV_WEBUI_ADMIN
if [ -z "$DEPLOY_OMV_WEBUI_ADMIN" ]; then
DEPLOY_OMV_WEBUI_ADMIN="admin"
fi
_savedeployconf DEPLOY_OMV_WEBUI_ADMIN "$DEPLOY_OMV_WEBUI_ADMIN"
_getdeployconf DEPLOY_OMV_HOST
_getdeployconf DEPLOY_OMV_SSH_USER
if [ -n "$DEPLOY_OMV_HOST" ] && [ -n "$DEPLOY_OMV_SSH_USER" ]; then
_info "[OMV deploy-hook] Deploy certificate remotely through ssh."
_savedeployconf DEPLOY_OMV_HOST "$DEPLOY_OMV_HOST"
_savedeployconf DEPLOY_OMV_SSH_USER "$DEPLOY_OMV_SSH_USER"
else
_info "[OMV deploy-hook] Deploy certificate locally."
fi
if [ -n "$DEPLOY_OMV_HOST" ] && [ -n "$DEPLOY_OMV_SSH_USER" ]; then
_command="omv-rpc -u $DEPLOY_OMV_WEBUI_ADMIN 'CertificateMgmt' 'getList' '{\"start\": 0, \"limit\": -1}' | jq -r '.data[] | select(.name==\"/CN='$_cdomain'\") | .uuid'"
# shellcheck disable=SC2029
_uuid=$(ssh "$DEPLOY_OMV_SSH_USER@$DEPLOY_OMV_HOST" "$_command")
_debug _command "$_command"
if [ -z "$_uuid" ]; then
_info "[OMV deploy-hook] Domain $_cdomain has no certificate in openmediavault, creating it!"
_command="omv-rpc -u $DEPLOY_OMV_WEBUI_ADMIN 'CertificateMgmt' 'create' '{\"cn\": \"test.example.com\", \"size\": 4096, \"days\": 3650, \"c\": \"\", \"st\": \"\", \"l\": \"\", \"o\": \"\", \"ou\": \"\", \"email\": \"\"}' | jq -r '.uuid'"
# shellcheck disable=SC2029
_uuid=$(ssh "$DEPLOY_OMV_SSH_USER@$DEPLOY_OMV_HOST" "$_command")
_debug _command "$_command"
if [ -z "$_uuid" ]; then
_err "[OMV deploy-hook] An error occured while creating the certificate"
return 1
fi
fi
_info "[OMV deploy-hook] Domain $_cdomain has uuid: $_uuid"
_fullchain=$(jq <"$_cfullchain" -aRs .)
_key=$(jq <"$_ckey" -aRs .)
_debug _fullchain "$_fullchain"
_debug _key "$_key"
_info "[OMV deploy-hook] Updating key and certificate in openmediavault"
_command="omv-rpc -u $DEPLOY_OMV_WEBUI_ADMIN 'CertificateMgmt' 'set' '{\"uuid\":\"$_uuid\", \"certificate\":$_fullchain, \"privatekey\":$_key, \"comment\":\"acme.sh deployed $(date)\"}'"
# shellcheck disable=SC2029
_result=$(ssh "$DEPLOY_OMV_SSH_USER@$DEPLOY_OMV_HOST" "$_command")
_debug _command "$_command"
_debug _result "$_result"
_command="omv-rpc -u $DEPLOY_OMV_WEBUI_ADMIN 'WebGui' 'setSettings' \$(omv-rpc -u $DEPLOY_OMV_WEBUI_ADMIN 'WebGui' 'getSettings' | jq -c '.sslcertificateref=\"$_uuid\"')"
# shellcheck disable=SC2029
_result=$(ssh "$DEPLOY_OMV_SSH_USER@$DEPLOY_OMV_HOST" "$_command")
_debug _command "$_command"
_debug _result "$_result"
_info "[OMV deploy-hook] Asking openmediavault to apply changes... (this could take some time, hang in there)"
_command="omv-rpc -u $DEPLOY_OMV_WEBUI_ADMIN 'Config' 'applyChanges' '{\"modules\":[], \"force\": false}'"
# shellcheck disable=SC2029
_result=$(ssh "$DEPLOY_OMV_SSH_USER@$DEPLOY_OMV_HOST" "$_command")
_debug _command "$_command"
_debug _result "$_result"
_info "[OMV deploy-hook] Asking nginx to reload"
_command="nginx -s reload"
# shellcheck disable=SC2029
_result=$(ssh "$DEPLOY_OMV_SSH_USER@$DEPLOY_OMV_HOST" "$_command")
_debug _command "$_command"
_debug _result "$_result"
else
# shellcheck disable=SC2086
_uuid=$(omv-rpc -u $DEPLOY_OMV_WEBUI_ADMIN 'CertificateMgmt' 'getList' '{"start": 0, "limit": -1}' | jq -r '.data[] | select(.name=="/CN='$_cdomain'") | .uuid')
if [ -z "$_uuid" ]; then
_info "[OMV deploy-hook] Domain $_cdomain has no certificate in openmediavault, creating it!"
# shellcheck disable=SC2086
_uuid=$(omv-rpc -u $DEPLOY_OMV_WEBUI_ADMIN 'CertificateMgmt' 'create' '{"cn": "test.example.com", "size": 4096, "days": 3650, "c": "", "st": "", "l": "", "o": "", "ou": "", "email": ""}' | jq -r '.uuid')
if [ -z "$_uuid" ]; then
_err "[OMB deploy-hook] An error occured while creating the certificate"
return 1
fi
fi
_info "[OMV deploy-hook] Domain $_cdomain has uuid: $_uuid"
_fullchain=$(jq <"$_cfullchain" -aRs .)
_key=$(jq <"$_ckey" -aRs .)
_debug _fullchain "$_fullchain"
_debug _key "$_key"
_info "[OMV deploy-hook] Updating key and certificate in openmediavault"
_command="omv-rpc -u $DEPLOY_OMV_WEBUI_ADMIN 'CertificateMgmt' 'set' '{\"uuid\":\"$_uuid\", \"certificate\":$_fullchain, \"privatekey\":$_key, \"comment\":\"acme.sh deployed $(date)\"}'"
_result=$(eval "$_command")
_debug _command "$_command"
_debug _result "$_result"
_command="omv-rpc -u $DEPLOY_OMV_WEBUI_ADMIN 'WebGui' 'setSettings' \$(omv-rpc -u $DEPLOY_OMV_WEBUI_ADMIN 'WebGui' 'getSettings' | jq -c '.sslcertificateref=\"$_uuid\"')"
_result=$(eval "$_command")
_debug _command "$_command"
_debug _result "$_result"
_info "[OMV deploy-hook] Asking openmediavault to apply changes... (this could take some time, hang in there)"
_command="omv-rpc -u $DEPLOY_OMV_WEBUI_ADMIN 'Config' 'applyChanges' '{\"modules\":[], \"force\": false}'"
_result=$(eval "$_command")
_debug _command "$_command"
_debug _result "$_result"
_info "[OMV deploy-hook] Asking nginx to reload"
_command="nginx -s reload"
_result=$(eval "$_command")
_debug _command "$_command"
_debug _result "$_result"
fi
return 0
}

262
deploy/openstack.sh Normal file
View File

@@ -0,0 +1,262 @@
#!/usr/bin/env sh
# OpenStack Barbican deploy hook
#
# This requires you to have OpenStackClient and python-barbicanclient
# installed.
#
# You will require Keystone V3 credentials loaded into your environment, which
# could be either password or v3applicationcredential type.
#
# Author: Andy Botting <andy@andybotting.com>
openstack_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
if ! _exists openstack; then
_err "OpenStack client not found"
return 1
fi
_openstack_credentials || return $?
_info "Generate import pkcs12"
_import_pkcs12="$(_mktemp)"
if ! _openstack_to_pkcs "$_import_pkcs12" "$_ckey" "$_ccert" "$_cca"; then
_err "Error creating pkcs12 certificate"
return 1
fi
_debug _import_pkcs12 "$_import_pkcs12"
_base64_pkcs12=$(_base64 "multiline" <"$_import_pkcs12")
secretHrefs=$(_openstack_get_secrets)
_debug secretHrefs "$secretHrefs"
_openstack_store_secret || return $?
if [ -n "$secretHrefs" ]; then
_info "Cleaning up existing secret"
_openstack_delete_secrets || return $?
fi
_info "Certificate successfully deployed"
return 0
}
_openstack_store_secret() {
if ! openstack secret store --name "$_cdomain." -t 'application/octet-stream' -e base64 --payload "$_base64_pkcs12"; then
_err "Failed to create OpenStack secret"
return 1
fi
return
}
_openstack_delete_secrets() {
echo "$secretHrefs" | while read -r secretHref; do
_info "Deleting old secret $secretHref"
if ! openstack secret delete "$secretHref"; then
_err "Failed to delete OpenStack secret"
return 1
fi
done
return
}
_openstack_get_secrets() {
if ! secretHrefs=$(openstack secret list -f value --name "$_cdomain." | cut -d' ' -f1); then
_err "Failed to list secrets"
return 1
fi
echo "$secretHrefs"
}
_openstack_to_pkcs() {
# The existing _toPkcs command can't allow an empty password, due to sh
# -z test, so copied here and forcing the empty password.
_cpfx="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
${ACME_OPENSSL_BIN:-openssl} pkcs12 -export -out "$_cpfx" -inkey "$_ckey" -in "$_ccert" -certfile "$_cca" -password "pass:"
}
_openstack_credentials() {
_debug "Check OpenStack credentials"
# If we have OS_AUTH_URL already set in the environment, then assume we want
# to use those, otherwise use stored credentials
if [ -n "$OS_AUTH_URL" ]; then
_debug "OS_AUTH_URL env var found, using environment"
else
_debug "OS_AUTH_URL not found, loading stored credentials"
OS_AUTH_URL="${OS_AUTH_URL:-$(_readaccountconf_mutable OS_AUTH_URL)}"
OS_IDENTITY_API_VERSION="${OS_IDENTITY_API_VERSION:-$(_readaccountconf_mutable OS_IDENTITY_API_VERSION)}"
OS_AUTH_TYPE="${OS_AUTH_TYPE:-$(_readaccountconf_mutable OS_AUTH_TYPE)}"
OS_APPLICATION_CREDENTIAL_ID="${OS_APPLICATION_CREDENTIAL_ID:-$(_readaccountconf_mutable OS_APPLICATION_CREDENTIAL_ID)}"
OS_APPLICATION_CREDENTIAL_SECRET="${OS_APPLICATION_CREDENTIAL_SECRET:-$(_readaccountconf_mutable OS_APPLICATION_CREDENTIAL_SECRET)}"
OS_USERNAME="${OS_USERNAME:-$(_readaccountconf_mutable OS_USERNAME)}"
OS_PASSWORD="${OS_PASSWORD:-$(_readaccountconf_mutable OS_PASSWORD)}"
OS_PROJECT_NAME="${OS_PROJECT_NAME:-$(_readaccountconf_mutable OS_PROJECT_NAME)}"
OS_PROJECT_ID="${OS_PROJECT_ID:-$(_readaccountconf_mutable OS_PROJECT_ID)}"
OS_USER_DOMAIN_NAME="${OS_USER_DOMAIN_NAME:-$(_readaccountconf_mutable OS_USER_DOMAIN_NAME)}"
OS_USER_DOMAIN_ID="${OS_USER_DOMAIN_ID:-$(_readaccountconf_mutable OS_USER_DOMAIN_ID)}"
OS_PROJECT_DOMAIN_NAME="${OS_PROJECT_DOMAIN_NAME:-$(_readaccountconf_mutable OS_PROJECT_DOMAIN_NAME)}"
OS_PROJECT_DOMAIN_ID="${OS_PROJECT_DOMAIN_ID:-$(_readaccountconf_mutable OS_PROJECT_DOMAIN_ID)}"
fi
# Check each var and either save or clear it depending on whether its set.
# The helps us clear out old vars in the case where a user may want
# to switch between password and app creds
_debug "OS_AUTH_URL" "$OS_AUTH_URL"
if [ -n "$OS_AUTH_URL" ]; then
export OS_AUTH_URL
_saveaccountconf_mutable OS_AUTH_URL "$OS_AUTH_URL"
else
unset OS_AUTH_URL
_clearaccountconf SAVED_OS_AUTH_URL
fi
_debug "OS_IDENTITY_API_VERSION" "$OS_IDENTITY_API_VERSION"
if [ -n "$OS_IDENTITY_API_VERSION" ]; then
export OS_IDENTITY_API_VERSION
_saveaccountconf_mutable OS_IDENTITY_API_VERSION "$OS_IDENTITY_API_VERSION"
else
unset OS_IDENTITY_API_VERSION
_clearaccountconf SAVED_OS_IDENTITY_API_VERSION
fi
_debug "OS_AUTH_TYPE" "$OS_AUTH_TYPE"
if [ -n "$OS_AUTH_TYPE" ]; then
export OS_AUTH_TYPE
_saveaccountconf_mutable OS_AUTH_TYPE "$OS_AUTH_TYPE"
else
unset OS_AUTH_TYPE
_clearaccountconf SAVED_OS_AUTH_TYPE
fi
_debug "OS_APPLICATION_CREDENTIAL_ID" "$OS_APPLICATION_CREDENTIAL_ID"
if [ -n "$OS_APPLICATION_CREDENTIAL_ID" ]; then
export OS_APPLICATION_CREDENTIAL_ID
_saveaccountconf_mutable OS_APPLICATION_CREDENTIAL_ID "$OS_APPLICATION_CREDENTIAL_ID"
else
unset OS_APPLICATION_CREDENTIAL_ID
_clearaccountconf SAVED_OS_APPLICATION_CREDENTIAL_ID
fi
_secure_debug "OS_APPLICATION_CREDENTIAL_SECRET" "$OS_APPLICATION_CREDENTIAL_SECRET"
if [ -n "$OS_APPLICATION_CREDENTIAL_SECRET" ]; then
export OS_APPLICATION_CREDENTIAL_SECRET
_saveaccountconf_mutable OS_APPLICATION_CREDENTIAL_SECRET "$OS_APPLICATION_CREDENTIAL_SECRET"
else
unset OS_APPLICATION_CREDENTIAL_SECRET
_clearaccountconf SAVED_OS_APPLICATION_CREDENTIAL_SECRET
fi
_debug "OS_USERNAME" "$OS_USERNAME"
if [ -n "$OS_USERNAME" ]; then
export OS_USERNAME
_saveaccountconf_mutable OS_USERNAME "$OS_USERNAME"
else
unset OS_USERNAME
_clearaccountconf SAVED_OS_USERNAME
fi
_secure_debug "OS_PASSWORD" "$OS_PASSWORD"
if [ -n "$OS_PASSWORD" ]; then
export OS_PASSWORD
_saveaccountconf_mutable OS_PASSWORD "$OS_PASSWORD"
else
unset OS_PASSWORD
_clearaccountconf SAVED_OS_PASSWORD
fi
_debug "OS_PROJECT_NAME" "$OS_PROJECT_NAME"
if [ -n "$OS_PROJECT_NAME" ]; then
export OS_PROJECT_NAME
_saveaccountconf_mutable OS_PROJECT_NAME "$OS_PROJECT_NAME"
else
unset OS_PROJECT_NAME
_clearaccountconf SAVED_OS_PROJECT_NAME
fi
_debug "OS_PROJECT_ID" "$OS_PROJECT_ID"
if [ -n "$OS_PROJECT_ID" ]; then
export OS_PROJECT_ID
_saveaccountconf_mutable OS_PROJECT_ID "$OS_PROJECT_ID"
else
unset OS_PROJECT_ID
_clearaccountconf SAVED_OS_PROJECT_ID
fi
_debug "OS_USER_DOMAIN_NAME" "$OS_USER_DOMAIN_NAME"
if [ -n "$OS_USER_DOMAIN_NAME" ]; then
export OS_USER_DOMAIN_NAME
_saveaccountconf_mutable OS_USER_DOMAIN_NAME "$OS_USER_DOMAIN_NAME"
else
unset OS_USER_DOMAIN_NAME
_clearaccountconf SAVED_OS_USER_DOMAIN_NAME
fi
_debug "OS_USER_DOMAIN_ID" "$OS_USER_DOMAIN_ID"
if [ -n "$OS_USER_DOMAIN_ID" ]; then
export OS_USER_DOMAIN_ID
_saveaccountconf_mutable OS_USER_DOMAIN_ID "$OS_USER_DOMAIN_ID"
else
unset OS_USER_DOMAIN_ID
_clearaccountconf SAVED_OS_USER_DOMAIN_ID
fi
_debug "OS_PROJECT_DOMAIN_NAME" "$OS_PROJECT_DOMAIN_NAME"
if [ -n "$OS_PROJECT_DOMAIN_NAME" ]; then
export OS_PROJECT_DOMAIN_NAME
_saveaccountconf_mutable OS_PROJECT_DOMAIN_NAME "$OS_PROJECT_DOMAIN_NAME"
else
unset OS_PROJECT_DOMAIN_NAME
_clearaccountconf SAVED_OS_PROJECT_DOMAIN_NAME
fi
_debug "OS_PROJECT_DOMAIN_ID" "$OS_PROJECT_DOMAIN_ID"
if [ -n "$OS_PROJECT_DOMAIN_ID" ]; then
export OS_PROJECT_DOMAIN_ID
_saveaccountconf_mutable OS_PROJECT_DOMAIN_ID "$OS_PROJECT_DOMAIN_ID"
else
unset OS_PROJECT_DOMAIN_ID
_clearaccountconf SAVED_OS_PROJECT_DOMAIN_ID
fi
if [ "$OS_AUTH_TYPE" = "v3applicationcredential" ]; then
# Application Credential auth
if [ -z "$OS_APPLICATION_CREDENTIAL_ID" ] || [ -z "$OS_APPLICATION_CREDENTIAL_SECRET" ]; then
_err "When using OpenStack application credentials, OS_APPLICATION_CREDENTIAL_ID"
_err "and OS_APPLICATION_CREDENTIAL_SECRET must be set."
_err "Please check your credentials and try again."
return 1
fi
else
# Password auth
if [ -z "$OS_USERNAME" ] || [ -z "$OS_PASSWORD" ]; then
_err "OpenStack username or password not found."
_err "Please check your credentials and try again."
return 1
fi
if [ -z "$OS_PROJECT_NAME" ] && [ -z "$OS_PROJECT_ID" ]; then
_err "When using password authentication, OS_PROJECT_NAME or"
_err "OS_PROJECT_ID must be set."
_err "Please check your credentials and try again."
return 1
fi
fi
return 0
}

139
deploy/panos.sh Normal file
View File

@@ -0,0 +1,139 @@
#!/usr/bin/env sh
# Script to deploy certificates to Palo Alto Networks PANOS via API
# Note PANOS API KEY and IP address needs to be set prior to running.
# The following variables exported from environment will be used.
# If not set then values previously saved in domain.conf file are used.
#
# Firewall admin with superuser and IP address is required.
#
# export PANOS_USER="" # required
# export PANOS_PASS="" # required
# export PANOS_HOST="" # required
# This function is to parse the XML
parse_response() {
type=$2
if [ "$type" = 'keygen' ]; then
status=$(echo "$1" | sed 's/^.*\(['\'']\)\([a-z]*\)'\''.*/\2/g')
if [ "$status" = "success" ]; then
panos_key=$(echo "$1" | sed 's/^.*\(<key>\)\(.*\)<\/key>.*/\2/g')
_panos_key=$panos_key
else
message="PAN-OS Key could not be set."
fi
else
status=$(echo "$1" | sed 's/^.*"\([a-z]*\)".*/\1/g')
message=$(echo "$1" | sed 's/^.*<result>\(.*\)<\/result.*/\1/g')
fi
return 0
}
deployer() {
content=""
type=$1 # Types are keygen, cert, key, commit
_debug "**** Deploying $type *****"
panos_url="https://$_panos_host/api/"
if [ "$type" = 'keygen' ]; then
_H1="Content-Type: application/x-www-form-urlencoded"
content="type=keygen&user=$_panos_user&password=$_panos_pass"
# content="$content${nl}--$delim${nl}Content-Disposition: form-data; type=\"keygen\"; user=\"$_panos_user\"; password=\"$_panos_pass\"${nl}Content-Type: application/octet-stream${nl}${nl}"
fi
if [ "$type" = 'cert' ] || [ "$type" = 'key' ]; then
#Generate DEIM
delim="-----MultipartDelimiter$(date "+%s%N")"
nl="\015\012"
#Set Header
export _H1="Content-Type: multipart/form-data; boundary=$delim"
if [ "$type" = 'cert' ]; then
panos_url="${panos_url}?type=import"
content="--$delim${nl}Content-Disposition: form-data; name=\"category\"\r\n\r\ncertificate"
content="$content${nl}--$delim${nl}Content-Disposition: form-data; name=\"certificate-name\"\r\n\r\n$_cdomain"
content="$content${nl}--$delim${nl}Content-Disposition: form-data; name=\"key\"\r\n\r\n$_panos_key"
content="$content${nl}--$delim${nl}Content-Disposition: form-data; name=\"format\"\r\n\r\npem"
content="$content${nl}--$delim${nl}Content-Disposition: form-data; name=\"file\"; filename=\"$(basename "$_cfullchain")\"${nl}Content-Type: application/octet-stream${nl}${nl}$(cat "$_cfullchain")"
fi
if [ "$type" = 'key' ]; then
panos_url="${panos_url}?type=import"
content="--$delim${nl}Content-Disposition: form-data; name=\"category\"\r\n\r\nprivate-key"
content="$content${nl}--$delim${nl}Content-Disposition: form-data; name=\"certificate-name\"\r\n\r\n$_cdomain"
content="$content${nl}--$delim${nl}Content-Disposition: form-data; name=\"key\"\r\n\r\n$_panos_key"
content="$content${nl}--$delim${nl}Content-Disposition: form-data; name=\"format\"\r\n\r\npem"
content="$content${nl}--$delim${nl}Content-Disposition: form-data; name=\"passphrase\"\r\n\r\n123456"
content="$content${nl}--$delim${nl}Content-Disposition: form-data; name=\"file\"; filename=\"$(basename "$_ckey")\"${nl}Content-Type: application/octet-stream${nl}${nl}$(cat "$_ckey")"
fi
#Close multipart
content="$content${nl}--$delim--${nl}${nl}"
#Convert CRLF
content=$(printf %b "$content")
fi
if [ "$type" = 'commit' ]; then
export _H1="Content-Type: application/x-www-form-urlencoded"
cmd=$(printf "%s" "<commit><partial><$_panos_user></$_panos_user></partial></commit>" | _url_encode)
content="type=commit&key=$_panos_key&cmd=$cmd"
fi
response=$(_post "$content" "$panos_url" "" "POST")
parse_response "$response" "$type"
# Saving response to variables
response_status=$status
#DEBUG
_debug response_status "$response_status"
if [ "$response_status" = "success" ]; then
_debug "Successfully deployed $type"
return 0
else
_err "Deploy of type $type failed. Try deploying with --debug to troubleshoot."
_debug "$message"
return 1
fi
}
# This is the main function that will call the other functions to deploy everything.
panos_deploy() {
_cdomain="$1"
_ckey="$2"
_cfullchain="$5"
# PANOS ENV VAR check
if [ -z "$PANOS_USER" ] || [ -z "$PANOS_PASS" ] || [ -z "$PANOS_HOST" ]; then
_debug "No ENV variables found lets check for saved variables"
_getdeployconf PANOS_USER
_getdeployconf PANOS_PASS
_getdeployconf PANOS_HOST
_panos_user=$PANOS_USER
_panos_pass=$PANOS_PASS
_panos_host=$PANOS_HOST
if [ -z "$_panos_user" ] && [ -z "$_panos_pass" ] && [ -z "$_panos_host" ]; then
_err "No host, user and pass found.. If this is the first time deploying please set PANOS_HOST, PANOS_USER and PANOS_PASS in environment variables. Delete them after you have succesfully deployed certs."
return 1
else
_debug "Using saved env variables."
fi
else
_debug "Detected ENV variables to be saved to the deploy conf."
# Encrypt and save user
_savedeployconf PANOS_USER "$PANOS_USER" 1
_savedeployconf PANOS_PASS "$PANOS_PASS" 1
_savedeployconf PANOS_HOST "$PANOS_HOST" 1
_panos_user="$PANOS_USER"
_panos_pass="$PANOS_PASS"
_panos_host="$PANOS_HOST"
fi
_debug "Let's use username and pass to generate token."
if [ -z "$_panos_user" ] || [ -z "$_panos_pass" ] || [ -z "$_panos_host" ]; then
_err "Please pass username and password and host as env variables PANOS_USER, PANOS_PASS and PANOS_HOST"
return 1
else
_debug "Getting PANOS KEY"
deployer keygen
if [ -z "$_panos_key" ]; then
_err "Missing apikey."
return 1
else
deployer cert
deployer key
deployer commit
fi
fi
}

123
deploy/peplink.sh Normal file
View File

@@ -0,0 +1,123 @@
#!/usr/bin/env sh
# Script to deploy cert to Peplink Routers
#
# The following environment variables must be set:
#
# PEPLINK_Hostname - Peplink hostname
# PEPLINK_Username - Peplink username to login
# PEPLINK_Password - Peplink password to login
#
# The following environmental variables may be set if you don't like their
# default values:
#
# PEPLINK_Certtype - Certificate type to target for replacement
# defaults to "webadmin", can be one of:
# * "chub" (ContentHub)
# * "openvpn" (OpenVPN CA)
# * "portal" (Captive Portal SSL)
# * "webadmin" (Web Admin SSL)
# * "webproxy" (Proxy Root CA)
# * "wwan_ca" (Wi-Fi WAN CA)
# * "wwan_client" (Wi-Fi WAN Client)
# PEPLINK_Scheme - defaults to "https"
# PEPLINK_Port - defaults to "443"
#
#returns 0 means success, otherwise error.
######## Public functions #####################
_peplink_get_cookie_data() {
grep -i "\W$1=" | grep -i "^Set-Cookie:" | _tail_n 1 | _egrep_o "$1=[^;]*;" | tr -d ';'
}
#domain keyfile certfile cafile fullchain
peplink_deploy() {
_cdomain="$1"
_ckey="$2"
_cfullchain="$5"
_debug _cdomain "$_cdomain"
_debug _cfullchain "$_cfullchain"
_debug _ckey "$_ckey"
# Get Hostname, Username and Password, but don't save until we successfully authenticate
_getdeployconf PEPLINK_Hostname
_getdeployconf PEPLINK_Username
_getdeployconf PEPLINK_Password
if [ -z "${PEPLINK_Hostname:-}" ] || [ -z "${PEPLINK_Username:-}" ] || [ -z "${PEPLINK_Password:-}" ]; then
_err "PEPLINK_Hostname & PEPLINK_Username & PEPLINK_Password must be set"
return 1
fi
_debug2 PEPLINK_Hostname "$PEPLINK_Hostname"
_debug2 PEPLINK_Username "$PEPLINK_Username"
_secure_debug2 PEPLINK_Password "$PEPLINK_Password"
# Optional certificate type, scheme, and port for Peplink
_getdeployconf PEPLINK_Certtype
_getdeployconf PEPLINK_Scheme
_getdeployconf PEPLINK_Port
# Don't save the certificate type until we verify it exists and is supported
_savedeployconf PEPLINK_Scheme "$PEPLINK_Scheme"
_savedeployconf PEPLINK_Port "$PEPLINK_Port"
# Default vaules for certificate type, scheme, and port
[ -n "${PEPLINK_Certtype}" ] || PEPLINK_Certtype="webadmin"
[ -n "${PEPLINK_Scheme}" ] || PEPLINK_Scheme="https"
[ -n "${PEPLINK_Port}" ] || PEPLINK_Port="443"
_debug2 PEPLINK_Certtype "$PEPLINK_Certtype"
_debug2 PEPLINK_Scheme "$PEPLINK_Scheme"
_debug2 PEPLINK_Port "$PEPLINK_Port"
_base_url="$PEPLINK_Scheme://$PEPLINK_Hostname:$PEPLINK_Port"
_debug _base_url "$_base_url"
# Login, get the auth token from the cookie
_info "Logging into $PEPLINK_Hostname:$PEPLINK_Port"
encoded_username="$(printf "%s" "$PEPLINK_Username" | _url_encode)"
encoded_password="$(printf "%s" "$PEPLINK_Password" | _url_encode)"
response=$(_post "func=login&username=$encoded_username&password=$encoded_password" "$_base_url/cgi-bin/MANGA/api.cgi")
auth_token=$(_peplink_get_cookie_data "bauth" <"$HTTP_HEADER")
_debug3 response "$response"
_debug auth_token "$auth_token"
if [ -z "$auth_token" ]; then
_err "Unable to authenticate to $PEPLINK_Hostname:$PEPLINK_Port using $PEPLINK_Scheme."
_err "Check your username and password."
return 1
fi
_H1="Cookie: $auth_token"
export _H1
_debug2 H1 "${_H1}"
# Now that we know the hostnameusername and password are good, save them
_savedeployconf PEPLINK_Hostname "$PEPLINK_Hostname"
_savedeployconf PEPLINK_Username "$PEPLINK_Username"
_savedeployconf PEPLINK_Password "$PEPLINK_Password"
_info "Generate form POST request"
encoded_key="$(_url_encode <"$_ckey")"
encoded_fullchain="$(_url_encode <"$_cfullchain")"
body="cert_type=$PEPLINK_Certtype&cert_uid=&section=CERT_modify&key_pem=$encoded_key&key_pem_passphrase=&key_pem_passphrase_confirm=&cert_pem=$encoded_fullchain"
_debug3 body "$body"
_info "Upload $PEPLINK_Certtype certificate to the Peplink"
response=$(_post "$body" "$_base_url/cgi-bin/MANGA/admin.cgi")
_debug3 response "$response"
if echo "$response" | grep 'Success' >/dev/null; then
# We've verified this certificate type is valid, so save it
_savedeployconf PEPLINK_Certtype "$PEPLINK_Certtype"
_info "Certificate was updated"
return 0
else
_err "Unable to update certificate, error code $response"
return 1
fi
}

96
deploy/qiniu.sh Normal file
View File

@@ -0,0 +1,96 @@
#!/usr/bin/env sh
# Script to create certificate to qiniu.com
#
# This deployment required following variables
# export QINIU_AK="QINIUACCESSKEY"
# export QINIU_SK="QINIUSECRETKEY"
# export QINIU_CDN_DOMAIN="cdn.example.com"
# If you have more than one domain, just
# export QINIU_CDN_DOMAIN="cdn1.example.com cdn2.example.com"
QINIU_API_BASE="https://api.qiniu.com"
qiniu_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
if [ -z "$QINIU_AK" ]; then
_err "QINIU_AK is not defined."
return 1
else
_savedomainconf QINIU_AK "$QINIU_AK"
fi
if [ -z "$QINIU_SK" ]; then
_err "QINIU_SK is not defined."
return 1
else
_savedomainconf QINIU_SK "$QINIU_SK"
fi
if [ "$QINIU_CDN_DOMAIN" ]; then
_savedomainconf QINIU_CDN_DOMAIN "$QINIU_CDN_DOMAIN"
else
QINIU_CDN_DOMAIN="$_cdomain"
fi
## upload certificate
string_fullchain=$(sed 's/$/\\n/' "$_cfullchain" | tr -d '\n')
string_key=$(sed 's/$/\\n/' "$_ckey" | tr -d '\n')
sslcert_path="/sslcert"
sslcerl_body="{\"name\":\"$_cdomain\",\"common_name\":\"$QINIU_CDN_DOMAIN\",\"ca\":\"$string_fullchain\",\"pri\":\"$string_key\"}"
sslcert_access_token="$(_make_access_token "$sslcert_path")"
_debug sslcert_access_token "$sslcert_access_token"
export _H1="Authorization: QBox $sslcert_access_token"
sslcert_response=$(_post "$sslcerl_body" "$QINIU_API_BASE$sslcert_path" 0 "POST" "application/json" | _dbase64 "multiline")
if ! _contains "$sslcert_response" "certID"; then
_err "Error in creating certificate:"
_err "$sslcert_response"
return 1
fi
_debug sslcert_response "$sslcert_response"
_info "Certificate successfully uploaded, updating domain $_cdomain"
## extract certId
_certId="$(printf "%s" "$sslcert_response" | _normalizeJson | _egrep_o "certID\": *\"[^\"]*\"" | cut -d : -f 2)"
_debug certId "$_certId"
## update domain ssl config
update_body="{\"certid\":$_certId,\"forceHttps\":false}"
for domain in $QINIU_CDN_DOMAIN; do
update_path="/domain/$domain/httpsconf"
update_access_token="$(_make_access_token "$update_path")"
_debug update_access_token "$update_access_token"
export _H1="Authorization: QBox $update_access_token"
update_response=$(_post "$update_body" "$QINIU_API_BASE$update_path" 0 "PUT" "application/json" | _dbase64 "multiline")
if _contains "$update_response" "error"; then
_err "Error in updating domain $domain httpsconf:"
_err "$update_response"
return 1
fi
_debug update_response "$update_response"
_info "Domain $domain certificate has been deployed successfully"
done
return 0
}
_make_access_token() {
_token="$(printf "%s\n" "$1" | _hmac "sha1" "$(printf "%s" "$QINIU_SK" | _hex_dump | tr -d " ")" | _base64 | tr -- '+/' '-_')"
echo "$QINIU_AK:$_token"
}

203
deploy/routeros.sh Normal file
View File

@@ -0,0 +1,203 @@
#!/usr/bin/env sh
# Here is a script to deploy cert to routeros router.
# Deploy the cert to remote routeros
#
# ```sh
# acme.sh --deploy -d ftp.example.com --deploy-hook routeros
# ```
#
# Before you can deploy the certificate to router os, you need
# to add the id_rsa.pub key to the routeros and assign a user
# to that key.
#
# The user need to have access to ssh, ftp, read and write.
#
# There are no need to enable ftp service for the script to work,
# as they are transmitted over SCP, however ftp is needed to store
# the files on the router.
#
# Then you need to set the environment variables for the
# deploy script to work.
#
# ```sh
# export ROUTER_OS_USERNAME=certuser
# export ROUTER_OS_HOST=router.example.com
# export ROUTER_OS_PORT=22
#
# acme.sh --deploy -d ftp.example.com --deploy-hook routeros
# ```
#
# The deploy script will remove previously deployed certificates,
# and it does this with an assumption on how RouterOS names imported
# certificates, adding a "cer_0" suffix at the end. This is true for
# versions 6.32 -> 6.41.3, but it is not guaranteed that it will be
# true for future versions when upgrading.
#
# If the router have other certificates with the same name as the one
# beeing deployed, then this script will remove those certificates.
#
# At the end of the script, the services that use those certificates
# could be updated. Currently only the www-ssl service is beeing
# updated, but more services could be added.
#
# For instance:
# ```sh
# export ROUTER_OS_ADDITIONAL_SERVICES="/ip service set api-ssl certificate=$_cdomain.cer_0"
# ```
#
# One optional thing to do as well is to create a script that updates
# all the required services and run that script in a single command.
#
# To adopt parameters to `scp` and/or `ssh` set the optional
# `ROUTER_OS_SSH_CMD` and `ROUTER_OS_SCP_CMD` variables accordingly,
# see ssh(1) and scp(1) for parameters to those commands.
#
# Example:
# ```ssh
# export ROUTER_OS_SSH_CMD="ssh -i /acme.sh/.ssh/router.example.com -o UserKnownHostsFile=/acme.sh/.ssh/known_hosts"
# export ROUTER_OS_SCP_CMD="scp -i /acme.sh/.ssh/router.example.com -o UserKnownHostsFile=/acme.sh/.ssh/known_hosts"
# ````
#
# returns 0 means success, otherwise error.
######## Public functions #####################
#domain keyfile certfile cafile fullchain
routeros_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
_err_code=0
_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
_getdeployconf ROUTER_OS_HOST
if [ -z "$ROUTER_OS_HOST" ]; then
_debug "Using _cdomain as ROUTER_OS_HOST, please set if not correct."
ROUTER_OS_HOST="$_cdomain"
fi
_getdeployconf ROUTER_OS_USERNAME
if [ -z "$ROUTER_OS_USERNAME" ]; then
_err "Need to set the env variable ROUTER_OS_USERNAME"
return 1
fi
_getdeployconf ROUTER_OS_PORT
if [ -z "$ROUTER_OS_PORT" ]; then
_debug "Using default port 22 as ROUTER_OS_PORT, please set if not correct."
ROUTER_OS_PORT=22
fi
_getdeployconf ROUTER_OS_SSH_CMD
if [ -z "$ROUTER_OS_SSH_CMD" ]; then
_debug "Use default ssh setup."
ROUTER_OS_SSH_CMD="ssh -p $ROUTER_OS_PORT"
fi
_getdeployconf ROUTER_OS_SCP_CMD
if [ -z "$ROUTER_OS_SCP_CMD" ]; then
_debug "USe default scp setup."
ROUTER_OS_SCP_CMD="scp -P $ROUTER_OS_PORT"
fi
_getdeployconf ROUTER_OS_ADDITIONAL_SERVICES
if [ -z "$ROUTER_OS_ADDITIONAL_SERVICES" ]; then
_debug "Not enabling additional services"
ROUTER_OS_ADDITIONAL_SERVICES=""
fi
_savedeployconf ROUTER_OS_HOST "$ROUTER_OS_HOST"
_savedeployconf ROUTER_OS_USERNAME "$ROUTER_OS_USERNAME"
_savedeployconf ROUTER_OS_PORT "$ROUTER_OS_PORT"
_savedeployconf ROUTER_OS_SSH_CMD "$ROUTER_OS_SSH_CMD"
_savedeployconf ROUTER_OS_SCP_CMD "$ROUTER_OS_SCP_CMD"
_savedeployconf ROUTER_OS_ADDITIONAL_SERVICES "$ROUTER_OS_ADDITIONAL_SERVICES"
# push key to routeros
if ! _scp_certificate "$_ckey" "$ROUTER_OS_USERNAME@$ROUTER_OS_HOST:$_cdomain.key"; then
return $_err_code
fi
# push certificate chain to routeros
if ! _scp_certificate "$_cfullchain" "$ROUTER_OS_USERNAME@$ROUTER_OS_HOST:$_cdomain.cer"; then
return $_err_code
fi
DEPLOY_SCRIPT_CMD="/system script add name=\"LE Cert Deploy - $_cdomain\" owner=$ROUTER_OS_USERNAME \
comment=\"generated by routeros deploy script in acme.sh\" \
source=\"/certificate remove [ find name=$_cdomain.cer_0 ];\
\n/certificate remove [ find name=$_cdomain.cer_1 ];\
\n/certificate remove [ find name=$_cdomain.cer_2 ];\
\ndelay 1;\
\n/certificate import file-name=$_cdomain.cer passphrase=\\\"\\\";\
\n/certificate import file-name=$_cdomain.key passphrase=\\\"\\\";\
\ndelay 1;\
\n/file remove $_cdomain.cer;\
\n/file remove $_cdomain.key;\
\ndelay 2;\
\n/ip service set www-ssl certificate=$_cdomain.cer_0;\
\n$ROUTER_OS_ADDITIONAL_SERVICES;\
\n\"
"
if ! _ssh_remote_cmd "$DEPLOY_SCRIPT_CMD"; then
return $_err_code
fi
if ! _ssh_remote_cmd "/system script run \"LE Cert Deploy - $_cdomain\""; then
return $_err_code
fi
if ! _ssh_remote_cmd "/system script remove \"LE Cert Deploy - $_cdomain\""; then
return $_err_code
fi
return 0
}
# inspired by deploy/ssh.sh
_ssh_remote_cmd() {
_cmd="$1"
_secure_debug "Remote commands to execute: $_cmd"
_info "Submitting sequence of commands to routeros"
# quotations in bash cmd below intended. Squash travis spellcheck error
# shellcheck disable=SC2029
$ROUTER_OS_SSH_CMD "$ROUTER_OS_USERNAME@$ROUTER_OS_HOST" "$_cmd"
_err_code="$?"
if [ "$_err_code" != "0" ]; then
_err "Error code $_err_code returned from routeros"
fi
return $_err_code
}
_scp_certificate() {
_src="$1"
_dst="$2"
_secure_debug "scp '$_src' to '$_dst'"
_info "Push key '$_src' to routeros"
$ROUTER_OS_SCP_CMD "$_src" "$_dst"
_err_code="$?"
if [ "$_err_code" != "0" ]; then
_err "Error code $_err_code returned from scp"
fi
return $_err_code
}

303
deploy/ssh.sh Normal file
View File

@@ -0,0 +1,303 @@
#!/usr/bin/env sh
# Script to deploy certificates to remote server by SSH
# Note that SSH must be able to login to remote host without a password...
# SSH Keys must have been exchanged with the remote host. Validate and
# test that you can login to USER@SERVER from the host running acme.sh before
# using this script.
#
# The following variables exported from environment will be used.
# If not set then values previously saved in domain.conf file are used.
#
# Only a username is required. All others are optional.
#
# The following examples are for QNAP NAS running QTS 4.2
# export DEPLOY_SSH_CMD="" # defaults to "ssh -T"
# export DEPLOY_SSH_USER="admin" # required
# export DEPLOY_SSH_SERVER="qnap" # defaults to domain name
# export DEPLOY_SSH_KEYFILE="/etc/stunnel/stunnel.pem"
# export DEPLOY_SSH_CERTFILE="/etc/stunnel/stunnel.pem"
# export DEPLOY_SSH_CAFILE="/etc/stunnel/uca.pem"
# export DEPLOY_SSH_FULLCHAIN=""
# export DEPLOY_SSH_REMOTE_CMD="/etc/init.d/stunnel.sh restart"
# export DEPLOY_SSH_BACKUP="" # yes or no, default to yes or previously saved value
# export DEPLOY_SSH_BACKUP_PATH=".acme_ssh_deploy" # path on remote system. Defaults to .acme_ssh_deploy
# export DEPLOY_SSH_MULTI_CALL="" # yes or no, default to no or previously saved value
#
######## Public functions #####################
#domain keyfile certfile cafile fullchain
ssh_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
_deploy_ssh_servers=""
_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
# USER is required to login by SSH to remote host.
_getdeployconf DEPLOY_SSH_USER
_debug2 DEPLOY_SSH_USER "$DEPLOY_SSH_USER"
if [ -z "$DEPLOY_SSH_USER" ]; then
if [ -z "$Le_Deploy_ssh_user" ]; then
_err "DEPLOY_SSH_USER not defined."
return 1
fi
else
Le_Deploy_ssh_user="$DEPLOY_SSH_USER"
_savedomainconf Le_Deploy_ssh_user "$Le_Deploy_ssh_user"
fi
# SERVER is optional. If not provided then use _cdomain
_getdeployconf DEPLOY_SSH_SERVER
_debug2 DEPLOY_SSH_SERVER "$DEPLOY_SSH_SERVER"
if [ -n "$DEPLOY_SSH_SERVER" ]; then
Le_Deploy_ssh_server="$DEPLOY_SSH_SERVER"
_savedomainconf Le_Deploy_ssh_server "$Le_Deploy_ssh_server"
elif [ -z "$Le_Deploy_ssh_server" ]; then
Le_Deploy_ssh_server="$_cdomain"
fi
# CMD is optional. If not provided then use ssh
_getdeployconf DEPLOY_SSH_CMD
_debug2 DEPLOY_SSH_CMD "$DEPLOY_SSH_CMD"
if [ -n "$DEPLOY_SSH_CMD" ]; then
Le_Deploy_ssh_cmd="$DEPLOY_SSH_CMD"
_savedomainconf Le_Deploy_ssh_cmd "$Le_Deploy_ssh_cmd"
elif [ -z "$Le_Deploy_ssh_cmd" ]; then
Le_Deploy_ssh_cmd="ssh -T"
fi
# BACKUP is optional. If not provided then default to previously saved value or yes.
_getdeployconf DEPLOY_SSH_BACKUP
_debug2 DEPLOY_SSH_BACKUP "$DEPLOY_SSH_BACKUP"
if [ "$DEPLOY_SSH_BACKUP" = "no" ]; then
Le_Deploy_ssh_backup="no"
elif [ -z "$Le_Deploy_ssh_backup" ] || [ "$DEPLOY_SSH_BACKUP" = "yes" ]; then
Le_Deploy_ssh_backup="yes"
fi
_savedomainconf Le_Deploy_ssh_backup "$Le_Deploy_ssh_backup"
# BACKUP_PATH is optional. If not provided then default to previously saved value or .acme_ssh_deploy
_getdeployconf DEPLOY_SSH_BACKUP_PATH
_debug2 DEPLOY_SSH_BACKUP_PATH "$DEPLOY_SSH_BACKUP_PATH"
if [ -n "$DEPLOY_SSH_BACKUP_PATH" ]; then
Le_Deploy_ssh_backup_path="$DEPLOY_SSH_BACKUP_PATH"
elif [ -z "$Le_Deploy_ssh_backup_path" ]; then
Le_Deploy_ssh_backup_path=".acme_ssh_deploy"
fi
_savedomainconf Le_Deploy_ssh_backup_path "$Le_Deploy_ssh_backup_path"
# MULTI_CALL is optional. If not provided then default to previously saved
# value (which may be undefined... equivalent to "no").
_getdeployconf DEPLOY_SSH_MULTI_CALL
_debug2 DEPLOY_SSH_MULTI_CALL "$DEPLOY_SSH_MULTI_CALL"
if [ "$DEPLOY_SSH_MULTI_CALL" = "yes" ]; then
Le_Deploy_ssh_multi_call="yes"
_savedomainconf Le_Deploy_ssh_multi_call "$Le_Deploy_ssh_multi_call"
elif [ "$DEPLOY_SSH_MULTI_CALL" = "no" ]; then
Le_Deploy_ssh_multi_call=""
_cleardomainconf Le_Deploy_ssh_multi_call
fi
_deploy_ssh_servers=$Le_Deploy_ssh_server
for Le_Deploy_ssh_server in $_deploy_ssh_servers; do
_ssh_deploy
done
}
_ssh_deploy() {
_err_code=0
_cmdstr=""
_backupprefix=""
_backupdir=""
_info "Deploy certificates to remote server $Le_Deploy_ssh_user@$Le_Deploy_ssh_server"
if [ "$Le_Deploy_ssh_multi_call" = "yes" ]; then
_info "Using MULTI_CALL mode... Required commands sent in multiple calls to remote host"
else
_info "Required commands batched and sent in single call to remote host"
fi
if [ "$Le_Deploy_ssh_backup" = "yes" ]; then
_backupprefix="$Le_Deploy_ssh_backup_path/$_cdomain-backup"
_backupdir="$_backupprefix-$(_utc_date | tr ' ' '-')"
# run cleanup on the backup directory, erase all older
# than 180 days (15552000 seconds).
_cmdstr="{ now=\"\$(date -u +%s)\"; for fn in $_backupprefix*; \
do if [ -d \"\$fn\" ] && [ \"\$(expr \$now - \$(date -ur \$fn +%s) )\" -ge \"15552000\" ]; \
then rm -rf \"\$fn\"; echo \"Backup \$fn deleted as older than 180 days\"; fi; done; }; $_cmdstr"
# Alternate version of above... _cmdstr="find $_backupprefix* -type d -mtime +180 2>/dev/null | xargs rm -rf; $_cmdstr"
# Create our backup directory for overwritten cert files.
_cmdstr="mkdir -p $_backupdir; $_cmdstr"
_info "Backup of old certificate files will be placed in remote directory $_backupdir"
_info "Backup directories erased after 180 days."
if [ "$Le_Deploy_ssh_multi_call" = "yes" ]; then
if ! _ssh_remote_cmd "$_cmdstr"; then
return $_err_code
fi
_cmdstr=""
fi
fi
# KEYFILE is optional.
# If provided then private key will be copied to provided filename.
_getdeployconf DEPLOY_SSH_KEYFILE
_debug2 DEPLOY_SSH_KEYFILE "$DEPLOY_SSH_KEYFILE"
if [ -n "$DEPLOY_SSH_KEYFILE" ]; then
Le_Deploy_ssh_keyfile="$DEPLOY_SSH_KEYFILE"
_savedomainconf Le_Deploy_ssh_keyfile "$Le_Deploy_ssh_keyfile"
fi
if [ -n "$Le_Deploy_ssh_keyfile" ]; then
if [ "$Le_Deploy_ssh_backup" = "yes" ]; then
# backup file we are about to overwrite.
_cmdstr="$_cmdstr cp $Le_Deploy_ssh_keyfile $_backupdir >/dev/null;"
fi
# copy new certificate into file.
_cmdstr="$_cmdstr echo \"$(cat "$_ckey")\" > $Le_Deploy_ssh_keyfile;"
_info "will copy private key to remote file $Le_Deploy_ssh_keyfile"
if [ "$Le_Deploy_ssh_multi_call" = "yes" ]; then
if ! _ssh_remote_cmd "$_cmdstr"; then
return $_err_code
fi
_cmdstr=""
fi
fi
# CERTFILE is optional.
# If provided then certificate will be copied or appended to provided filename.
_getdeployconf DEPLOY_SSH_CERTFILE
_debug2 DEPLOY_SSH_CERTFILE "$DEPLOY_SSH_CERTFILE"
if [ -n "$DEPLOY_SSH_CERTFILE" ]; then
Le_Deploy_ssh_certfile="$DEPLOY_SSH_CERTFILE"
_savedomainconf Le_Deploy_ssh_certfile "$Le_Deploy_ssh_certfile"
fi
if [ -n "$Le_Deploy_ssh_certfile" ]; then
_pipe=">"
if [ "$Le_Deploy_ssh_certfile" = "$Le_Deploy_ssh_keyfile" ]; then
# if filename is same as previous file then append.
_pipe=">>"
elif [ "$Le_Deploy_ssh_backup" = "yes" ]; then
# backup file we are about to overwrite.
_cmdstr="$_cmdstr cp $Le_Deploy_ssh_certfile $_backupdir >/dev/null;"
fi
# copy new certificate into file.
_cmdstr="$_cmdstr echo \"$(cat "$_ccert")\" $_pipe $Le_Deploy_ssh_certfile;"
_info "will copy certificate to remote file $Le_Deploy_ssh_certfile"
if [ "$Le_Deploy_ssh_multi_call" = "yes" ]; then
if ! _ssh_remote_cmd "$_cmdstr"; then
return $_err_code
fi
_cmdstr=""
fi
fi
# CAFILE is optional.
# If provided then CA intermediate certificate will be copied or appended to provided filename.
_getdeployconf DEPLOY_SSH_CAFILE
_debug2 DEPLOY_SSH_CAFILE "$DEPLOY_SSH_CAFILE"
if [ -n "$DEPLOY_SSH_CAFILE" ]; then
Le_Deploy_ssh_cafile="$DEPLOY_SSH_CAFILE"
_savedomainconf Le_Deploy_ssh_cafile "$Le_Deploy_ssh_cafile"
fi
if [ -n "$Le_Deploy_ssh_cafile" ]; then
_pipe=">"
if [ "$Le_Deploy_ssh_cafile" = "$Le_Deploy_ssh_keyfile" ] ||
[ "$Le_Deploy_ssh_cafile" = "$Le_Deploy_ssh_certfile" ]; then
# if filename is same as previous file then append.
_pipe=">>"
elif [ "$Le_Deploy_ssh_backup" = "yes" ]; then
# backup file we are about to overwrite.
_cmdstr="$_cmdstr cp $Le_Deploy_ssh_cafile $_backupdir >/dev/null;"
fi
# copy new certificate into file.
_cmdstr="$_cmdstr echo \"$(cat "$_cca")\" $_pipe $Le_Deploy_ssh_cafile;"
_info "will copy CA file to remote file $Le_Deploy_ssh_cafile"
if [ "$Le_Deploy_ssh_multi_call" = "yes" ]; then
if ! _ssh_remote_cmd "$_cmdstr"; then
return $_err_code
fi
_cmdstr=""
fi
fi
# FULLCHAIN is optional.
# If provided then fullchain certificate will be copied or appended to provided filename.
_getdeployconf DEPLOY_SSH_FULLCHAIN
_debug2 DEPLOY_SSH_FULLCHAIN "$DEPLOY_SSH_FULLCHAIN"
if [ -n "$DEPLOY_SSH_FULLCHAIN" ]; then
Le_Deploy_ssh_fullchain="$DEPLOY_SSH_FULLCHAIN"
_savedomainconf Le_Deploy_ssh_fullchain "$Le_Deploy_ssh_fullchain"
fi
if [ -n "$Le_Deploy_ssh_fullchain" ]; then
_pipe=">"
if [ "$Le_Deploy_ssh_fullchain" = "$Le_Deploy_ssh_keyfile" ] ||
[ "$Le_Deploy_ssh_fullchain" = "$Le_Deploy_ssh_certfile" ] ||
[ "$Le_Deploy_ssh_fullchain" = "$Le_Deploy_ssh_cafile" ]; then
# if filename is same as previous file then append.
_pipe=">>"
elif [ "$Le_Deploy_ssh_backup" = "yes" ]; then
# backup file we are about to overwrite.
_cmdstr="$_cmdstr cp $Le_Deploy_ssh_fullchain $_backupdir >/dev/null;"
fi
# copy new certificate into file.
_cmdstr="$_cmdstr echo \"$(cat "$_cfullchain")\" $_pipe $Le_Deploy_ssh_fullchain;"
_info "will copy fullchain to remote file $Le_Deploy_ssh_fullchain"
if [ "$Le_Deploy_ssh_multi_call" = "yes" ]; then
if ! _ssh_remote_cmd "$_cmdstr"; then
return $_err_code
fi
_cmdstr=""
fi
fi
# REMOTE_CMD is optional.
# If provided then this command will be executed on remote host.
_getdeployconf DEPLOY_SSH_REMOTE_CMD
_debug2 DEPLOY_SSH_REMOTE_CMD "$DEPLOY_SSH_REMOTE_CMD"
if [ -n "$DEPLOY_SSH_REMOTE_CMD" ]; then
Le_Deploy_ssh_remote_cmd="$DEPLOY_SSH_REMOTE_CMD"
_savedomainconf Le_Deploy_ssh_remote_cmd "$Le_Deploy_ssh_remote_cmd"
fi
if [ -n "$Le_Deploy_ssh_remote_cmd" ]; then
_cmdstr="$_cmdstr $Le_Deploy_ssh_remote_cmd;"
_info "Will execute remote command $Le_Deploy_ssh_remote_cmd"
if [ "$Le_Deploy_ssh_multi_call" = "yes" ]; then
if ! _ssh_remote_cmd "$_cmdstr"; then
return $_err_code
fi
_cmdstr=""
fi
fi
# if commands not all sent in multiple calls then all commands sent in a single SSH call now...
if [ -n "$_cmdstr" ]; then
if ! _ssh_remote_cmd "$_cmdstr"; then
return $_err_code
fi
fi
return 0
}
#cmd
_ssh_remote_cmd() {
_cmd="$1"
_secure_debug "Remote commands to execute: $_cmd"
_info "Submitting sequence of commands to remote server by ssh"
# quotations in bash cmd below intended. Squash travis spellcheck error
# shellcheck disable=SC2029
$Le_Deploy_ssh_cmd "$Le_Deploy_ssh_user@$Le_Deploy_ssh_server" sh -c "'$_cmd'"
_err_code="$?"
if [ "$_err_code" != "0" ]; then
_err "Error code $_err_code returned from ssh"
fi
return $_err_code
}

View File

@@ -22,6 +22,8 @@ strongswan_deploy() {
_ipsec=/usr/sbin/ipsec
elif [ -x /usr/sbin/strongswan ]; then
_ipsec=/usr/sbin/strongswan
elif [ -x /usr/local/sbin/ipsec ]; then
_ipsec=/usr/local/sbin/ipsec
else
_err "no strongswan or ipsec command is detected"
return 1

183
deploy/synology_dsm.sh Normal file
View File

@@ -0,0 +1,183 @@
#!/usr/bin/env sh
# Here is a script to deploy cert to Synology DSM
#
# It requires following environment variables:
#
# SYNO_Username - Synology Username to login (must be an administrator)
# SYNO_Password - Synology Password to login
# SYNO_Certificate - Certificate description to target for replacement
#
# The following environmental variables may be set if you don't like their
# default values:
#
# SYNO_Scheme - defaults to http
# SYNO_Hostname - defaults to localhost
# SYNO_Port - defaults to 5000
# SYNO_DID - device ID to skip OTP - defaults to empty
# SYNO_TOTP_SECRET - TOTP secret to generate OTP - defaults to empty
#
# Dependencies:
# -------------
# - jq and curl
# - oathtool (When using 2 Factor Authentication and SYNO_TOTP_SECRET is set)
#
#returns 0 means success, otherwise error.
######## Public functions #####################
#domain keyfile certfile cafile fullchain
synology_dsm_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_debug _cdomain "$_cdomain"
# Get Username and Password, but don't save until we successfully authenticate
_getdeployconf SYNO_Username
_getdeployconf SYNO_Password
_getdeployconf SYNO_Create
_getdeployconf SYNO_DID
_getdeployconf SYNO_TOTP_SECRET
if [ -z "${SYNO_Username:-}" ] || [ -z "${SYNO_Password:-}" ]; then
_err "SYNO_Username & SYNO_Password must be set"
return 1
fi
_debug2 SYNO_Username "$SYNO_Username"
_secure_debug2 SYNO_Password "$SYNO_Password"
# Optional scheme, hostname, and port for Synology DSM
_getdeployconf SYNO_Scheme
_getdeployconf SYNO_Hostname
_getdeployconf SYNO_Port
# default vaules for scheme, hostname, and port
# defaulting to localhost and http because it's localhost...
[ -n "${SYNO_Scheme}" ] || SYNO_Scheme="http"
[ -n "${SYNO_Hostname}" ] || SYNO_Hostname="localhost"
[ -n "${SYNO_Port}" ] || SYNO_Port="5000"
_savedeployconf SYNO_Scheme "$SYNO_Scheme"
_savedeployconf SYNO_Hostname "$SYNO_Hostname"
_savedeployconf SYNO_Port "$SYNO_Port"
_debug2 SYNO_Scheme "$SYNO_Scheme"
_debug2 SYNO_Hostname "$SYNO_Hostname"
_debug2 SYNO_Port "$SYNO_Port"
# Get the certificate description, but don't save it until we verfiy it's real
_getdeployconf SYNO_Certificate
_debug SYNO_Certificate "${SYNO_Certificate:-}"
# shellcheck disable=SC1003 # We are not trying to escape a single quote
if printf "%s" "$SYNO_Certificate" | grep '\\'; then
_err "Do not use a backslash (\) in your certificate description"
return 1
fi
_base_url="$SYNO_Scheme://$SYNO_Hostname:$SYNO_Port"
_debug _base_url "$_base_url"
_debug "Getting API version"
response=$(_get "$_base_url/webapi/query.cgi?api=SYNO.API.Info&version=1&method=query&query=SYNO.API.Auth")
api_version=$(echo "$response" | grep "SYNO.API.Auth" | sed -n 's/.*"maxVersion" *: *\([0-9]*\).*/\1/p')
_debug3 response "$response"
_debug3 api_version "$api_version"
# Login, get the token from JSON and session id from cookie
_info "Logging into $SYNO_Hostname:$SYNO_Port"
encoded_username="$(printf "%s" "$SYNO_Username" | _url_encode)"
encoded_password="$(printf "%s" "$SYNO_Password" | _url_encode)"
otp_code=""
if [ -n "$SYNO_TOTP_SECRET" ]; then
if _exists oathtool; then
otp_code="$(oathtool --base32 --totp "${SYNO_TOTP_SECRET}" 2>/dev/null)"
else
_err "oathtool could not be found, install oathtool to use SYNO_TOTP_SECRET"
return 1
fi
fi
if [ -n "$SYNO_DID" ]; then
_H1="Cookie: did=$SYNO_DID"
export _H1
_debug3 H1 "${_H1}"
fi
response=$(_post "method=login&account=$encoded_username&passwd=$encoded_password&api=SYNO.API.Auth&version=$api_version&enable_syno_token=yes&otp_code=$otp_code" "$_base_url/webapi/auth.cgi?enable_syno_token=yes")
token=$(echo "$response" | grep "synotoken" | sed -n 's/.*"synotoken" *: *"\([^"]*\).*/\1/p')
_debug3 response "$response"
_debug token "$token"
if [ -z "$token" ]; then
_err "Unable to authenticate to $SYNO_Hostname:$SYNO_Port using $SYNO_Scheme."
_err "Check your username and password."
_err "If two-factor authentication is enabled for the user, set SYNO_TOTP_SECRET."
return 1
fi
sid=$(echo "$response" | grep "sid" | sed -n 's/.*"sid" *: *"\([^"]*\).*/\1/p')
_H1="X-SYNO-TOKEN: $token"
export _H1
_debug2 H1 "${_H1}"
# Now that we know the username and password are good, save them
_savedeployconf SYNO_Username "$SYNO_Username"
_savedeployconf SYNO_Password "$SYNO_Password"
_savedeployconf SYNO_DID "$SYNO_DID"
_savedeployconf SYNO_TOTP_SECRET "$SYNO_TOTP_SECRET"
_info "Getting certificates in Synology DSM"
response=$(_post "api=SYNO.Core.Certificate.CRT&method=list&version=1&_sid=$sid" "$_base_url/webapi/entry.cgi")
_debug3 response "$response"
escaped_certificate="$(printf "%s" "$SYNO_Certificate" | sed 's/\([].*^$[]\)/\\\1/g;s/"/\\\\"/g')"
_debug escaped_certificate "$escaped_certificate"
id=$(echo "$response" | sed -n "s/.*\"desc\":\"$escaped_certificate\",\"id\":\"\([^\"]*\).*/\1/p")
_debug2 id "$id"
if [ -z "$id" ] && [ -z "${SYNO_Create:-}" ]; then
_err "Unable to find certificate: $SYNO_Certificate and \$SYNO_Create is not set"
return 1
fi
# we've verified this certificate description is a thing, so save it
_savedeployconf SYNO_Certificate "$SYNO_Certificate" "base64"
_info "Generate form POST request"
nl="\0015\0012"
delim="--------------------------$(_utc_date | tr -d -- '-: ')"
content="--$delim${nl}Content-Disposition: form-data; name=\"key\"; filename=\"$(basename "$_ckey")\"${nl}Content-Type: application/octet-stream${nl}${nl}$(cat "$_ckey")\0012"
content="$content${nl}--$delim${nl}Content-Disposition: form-data; name=\"cert\"; filename=\"$(basename "$_ccert")\"${nl}Content-Type: application/octet-stream${nl}${nl}$(cat "$_ccert")\0012"
content="$content${nl}--$delim${nl}Content-Disposition: form-data; name=\"inter_cert\"; filename=\"$(basename "$_cca")\"${nl}Content-Type: application/octet-stream${nl}${nl}$(cat "$_cca")\0012"
content="$content${nl}--$delim${nl}Content-Disposition: form-data; name=\"id\"${nl}${nl}$id"
content="$content${nl}--$delim${nl}Content-Disposition: form-data; name=\"desc\"${nl}${nl}${SYNO_Certificate}"
if echo "$response" | sed -n "s/.*\"desc\":\"$escaped_certificate\",\([^{]*\).*/\1/p" | grep -- 'is_default":true' >/dev/null; then
_debug2 default "this is the default certificate"
content="$content${nl}--$delim${nl}Content-Disposition: form-data; name=\"as_default\"${nl}${nl}true"
else
_debug2 default "this is NOT the default certificate"
fi
content="$content${nl}--$delim--${nl}"
content="$(printf "%b_" "$content")"
content="${content%_}" # protect trailing \n
_info "Upload certificate to the Synology DSM"
response=$(_post "$content" "$_base_url/webapi/entry.cgi?api=SYNO.Core.Certificate&method=import&version=1&SynoToken=$token&_sid=$sid" "" "POST" "multipart/form-data; boundary=${delim}")
_debug3 response "$response"
if ! echo "$response" | grep '"error":' >/dev/null; then
if echo "$response" | grep '"restart_httpd":true' >/dev/null; then
_info "http services were restarted"
else
_info "http services were NOT restarted"
fi
return 0
else
_err "Unable to update certificate, error code $response"
return 1
fi
}

202
deploy/truenas.sh Normal file
View File

@@ -0,0 +1,202 @@
#!/usr/bin/env sh
# Here is a scipt to deploy the cert to your TrueNAS using the REST API.
# https://www.truenas.com/docs/hub/additional-topics/api/rest_api.html
#
# Written by Frank Plass github@f-plass.de
# https://github.com/danb35/deploy-freenas/blob/master/deploy_freenas.py
# Thanks to danb35 for your template!
#
# Following environment variables must be set:
#
# export DEPLOY_TRUENAS_APIKEY="<API_KEY_GENERATED_IN_THE_WEB_UI"
#
# The following environmental variables may be set if you don't like their
# default values:
#
# DEPLOY_TRUENAS_HOSTNAME - defaults to localhost
# DEPLOY_TRUENAS_SCHEME - defaults to http, set alternatively to https
#
#returns 0 means success, otherwise error.
######## Public functions #####################
#domain keyfile certfile cafile fullchain
truenas_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
_getdeployconf DEPLOY_TRUENAS_APIKEY
if [ -z "$DEPLOY_TRUENAS_APIKEY" ]; then
_err "TrueNAS API key not found, please set the DEPLOY_TRUENAS_APIKEY environment variable."
return 1
fi
_secure_debug2 DEPLOY_TRUENAS_APIKEY "$DEPLOY_TRUENAS_APIKEY"
# Optional hostname, scheme for TrueNAS
_getdeployconf DEPLOY_TRUENAS_HOSTNAME
_getdeployconf DEPLOY_TRUENAS_SCHEME
# default values for hostname and scheme
[ -n "${DEPLOY_TRUENAS_HOSTNAME}" ] || DEPLOY_TRUENAS_HOSTNAME="localhost"
[ -n "${DEPLOY_TRUENAS_SCHEME}" ] || DEPLOY_TRUENAS_SCHEME="http"
_debug2 DEPLOY_TRUENAS_HOSTNAME "$DEPLOY_TRUENAS_HOSTNAME"
_debug2 DEPLOY_TRUENAS_SCHEME "$DEPLOY_TRUENAS_SCHEME"
_api_url="$DEPLOY_TRUENAS_SCHEME://$DEPLOY_TRUENAS_HOSTNAME/api/v2.0"
_debug _api_url "$_api_url"
_H1="Authorization: Bearer $DEPLOY_TRUENAS_APIKEY"
_secure_debug3 _H1 "$_H1"
_info "Testing Connection TrueNAS"
_response=$(_get "$_api_url/system/state")
_info "TrueNAS system state: $_response."
if [ -z "$_response" ]; then
_err "Unable to authenticate to $_api_url."
_err 'Check your connection settings are correct, e.g.'
_err 'DEPLOY_TRUENAS_HOSTNAME="192.168.x.y" or DEPLOY_TRUENAS_HOSTNAME="truenas.example.com".'
_err 'DEPLOY_TRUENAS_SCHEME="https" or DEPLOY_TRUENAS_SCHEME="http".'
_err "Verify your TrueNAS API key is valid and set correctly, e.g. DEPLOY_TRUENAS_APIKEY=xxxx...."
return 1
fi
_savedeployconf DEPLOY_TRUENAS_APIKEY "$DEPLOY_TRUENAS_APIKEY"
_savedeployconf DEPLOY_TRUENAS_HOSTNAME "$DEPLOY_TRUENAS_HOSTNAME"
_savedeployconf DEPLOY_TRUENAS_SCHEME "$DEPLOY_TRUENAS_SCHEME"
_info "Getting current active certificate from TrueNAS"
_response=$(_get "$_api_url/system/general")
_active_cert_id=$(echo "$_response" | grep -B2 '"name":' | grep 'id' | tr -d -- '"id: ,')
_active_cert_name=$(echo "$_response" | grep '"name":' | sed -n 's/.*: "\(.\{1,\}\)",$/\1/p')
_param_httpsredirect=$(echo "$_response" | grep '"ui_httpsredirect":' | sed -n 's/.*": \(.\{1,\}\),$/\1/p')
_debug Active_UI_Certificate_ID "$_active_cert_id"
_debug Active_UI_Certificate_Name "$_active_cert_name"
_debug Active_UI_http_redirect "$_param_httpsredirect"
if [ "$DEPLOY_TRUENAS_SCHEME" = "http" ] && [ "$_param_httpsredirect" = "true" ]; then
_info "HTTP->HTTPS redirection is enabled"
_info "Setting DEPLOY_TRUENAS_SCHEME to 'https'"
DEPLOY_TRUENAS_SCHEME="https"
_api_url="$DEPLOY_TRUENAS_SCHEME://$DEPLOY_TRUENAS_HOSTNAME/api/v2.0"
_savedeployconf DEPLOY_TRUENAS_SCHEME "$DEPLOY_TRUENAS_SCHEME"
fi
_info "Uploading new certificate to TrueNAS"
_certname="Letsencrypt_$(_utc_date | tr ' ' '_' | tr -d -- ':')"
_debug3 _certname "$_certname"
_certData="{\"create_type\": \"CERTIFICATE_CREATE_IMPORTED\", \"name\": \"${_certname}\", \"certificate\": \"$(_json_encode <"$_cfullchain")\", \"privatekey\": \"$(_json_encode <"$_ckey")\"}"
_add_cert_result="$(_post "$_certData" "$_api_url/certificate" "" "POST" "application/json")"
_debug3 _add_cert_result "$_add_cert_result"
_info "Fetching list of installed certificates"
_cert_list=$(_get "$_api_url/system/general/ui_certificate_choices")
_cert_id=$(echo "$_cert_list" | grep "$_certname" | sed -n 's/.*"\([0-9]\{1,\}\)".*$/\1/p')
_debug3 _cert_id "$_cert_id"
_info "Current activate certificate ID: $_cert_id"
_activateData="{\"ui_certificate\": \"${_cert_id}\"}"
_activate_result="$(_post "$_activateData" "$_api_url/system/general" "" "PUT" "application/json")"
_debug3 _activate_result "$_activate_result"
_info "Checking if WebDAV certificate is the same as the TrueNAS web UI"
_webdav_list=$(_get "$_api_url/webdav")
_webdav_cert_id=$(echo "$_webdav_list" | grep '"certssl":' | tr -d -- '"certsl: ,')
if [ "$_webdav_cert_id" = "$_active_cert_id" ]; then
_info "Updating the WebDAV certificate"
_debug _webdav_cert_id "$_webdav_cert_id"
_webdav_data="{\"certssl\": \"${_cert_id}\"}"
_activate_webdav_cert="$(_post "$_webdav_data" "$_api_url/webdav" "" "PUT" "application/json")"
_webdav_new_cert_id=$(echo "$_activate_webdav_cert" | _json_decode | grep '"certssl":' | sed -n 's/.*: \([0-9]\{1,\}\),\{0,1\}$/\1/p')
if [ "$_webdav_new_cert_id" -eq "$_cert_id" ]; then
_info "WebDAV certificate updated successfully"
else
_err "Unable to set WebDAV certificate"
_debug3 _activate_webdav_cert "$_activate_webdav_cert"
_debug3 _webdav_new_cert_id "$_webdav_new_cert_id"
return 1
fi
_debug3 _webdav_new_cert_id "$_webdav_new_cert_id"
else
_info "WebDAV certificate is not configured or is not the same as TrueNAS web UI"
fi
_info "Checking if FTP certificate is the same as the TrueNAS web UI"
_ftp_list=$(_get "$_api_url/ftp")
_ftp_cert_id=$(echo "$_ftp_list" | grep '"ssltls_certificate":' | tr -d -- '"certislfa:_ ,')
if [ "$_ftp_cert_id" = "$_active_cert_id" ]; then
_info "Updating the FTP certificate"
_debug _ftp_cert_id "$_ftp_cert_id"
_ftp_data="{\"ssltls_certificate\": \"${_cert_id}\"}"
_activate_ftp_cert="$(_post "$_ftp_data" "$_api_url/ftp" "" "PUT" "application/json")"
_ftp_new_cert_id=$(echo "$_activate_ftp_cert" | _json_decode | grep '"ssltls_certificate":' | sed -n 's/.*: \([0-9]\{1,\}\),\{0,1\}$/\1/p')
if [ "$_ftp_new_cert_id" -eq "$_cert_id" ]; then
_info "FTP certificate updated successfully"
else
_err "Unable to set FTP certificate"
_debug3 _activate_ftp_cert "$_activate_ftp_cert"
_debug3 _ftp_new_cert_id "$_ftp_new_cert_id"
return 1
fi
_debug3 _activate_ftp_cert "$_activate_ftp_cert"
else
_info "FTP certificate is not configured or is not the same as TrueNAS web UI"
fi
_info "Checking if S3 certificate is the same as the TrueNAS web UI"
_s3_list=$(_get "$_api_url/s3")
_s3_cert_id=$(echo "$_s3_list" | grep '"certificate":' | tr -d -- '"certifa:_ ,')
if [ "$_s3_cert_id" = "$_active_cert_id" ]; then
_info "Updating the S3 certificate"
_debug _s3_cert_id "$_s3_cert_id"
_s3_data="{\"certificate\": \"${_cert_id}\"}"
_activate_s3_cert="$(_post "$_s3_data" "$_api_url/s3" "" "PUT" "application/json")"
_s3_new_cert_id=$(echo "$_activate_s3_cert" | _json_decode | grep '"certificate":' | sed -n 's/.*: \([0-9]\{1,\}\),\{0,1\}$/\1/p')
if [ "$_s3_new_cert_id" -eq "$_cert_id" ]; then
_info "S3 certificate updated successfully"
else
_err "Unable to set S3 certificate"
_debug3 _activate_s3_cert "$_activate_s3_cert"
_debug3 _s3_new_cert_id "$_s3_new_cert_id"
return 1
fi
_debug3 _activate_s3_cert "$_activate_s3_cert"
else
_info "S3 certificate is not configured or is not the same as TrueNAS web UI"
fi
_info "Deleting old certificate"
_delete_result="$(_post "" "$_api_url/certificate/id/$_active_cert_id" "" "DELETE" "application/json")"
_debug3 _delete_result "$_delete_result"
_info "Reloading TrueNAS web UI"
_restart_UI=$(_get "$_api_url/system/general/ui_restart")
_debug2 _restart_UI "$_restart_UI"
if [ -n "$_add_cert_result" ] && [ -n "$_activate_result" ]; then
return 0
else
_err "Certificate update was not succesful, please try again with --debug"
return 1
fi
}

View File

@@ -1,12 +1,43 @@
#!/usr/bin/env sh
#Here is a script to deploy cert to unifi server.
# Here is a script to deploy cert on a Unifi Controller or Cloud Key device.
# It supports:
# - self-hosted Unifi Controller
# - Unifi Cloud Key (Gen1/2/2+)
# - Unifi Cloud Key running UnifiOS (v2.0.0+, Gen2/2+ only)
# Please report bugs to https://github.com/acmesh-official/acme.sh/issues/3359
#returns 0 means success, otherwise error.
# The deploy-hook automatically detects standard Unifi installations
# for each of the supported environments. Most users should not need
# to set any of these variables, but if you are running a self-hosted
# Controller with custom locations, set these as necessary before running
# the deploy hook. (Defaults shown below.)
#
# Settings for Unifi Controller:
# Location of Java keystore or unifi.keystore.jks file:
#DEPLOY_UNIFI_KEYSTORE="/usr/lib/unifi/data/keystore"
# Keystore password (built into Unifi Controller, not a user-set password):
#DEPLOY_UNIFI_KEYPASS="aircontrolenterprise"
# Command to restart Unifi Controller:
#DEPLOY_UNIFI_RELOAD="service unifi restart"
#
# Settings for Unifi Cloud Key Gen1 (nginx admin pages):
# Directory where cloudkey.crt and cloudkey.key live:
#DEPLOY_UNIFI_CLOUDKEY_CERTDIR="/etc/ssl/private"
# Command to restart maintenance pages and Controller
# (same setting as above, default is updated when running on Cloud Key Gen1):
#DEPLOY_UNIFI_RELOAD="service nginx restart && service unifi restart"
#
# Settings for UnifiOS (Cloud Key Gen2):
# Directory where unifi-core.crt and unifi-core.key live:
#DEPLOY_UNIFI_CORE_CONFIG="/data/unifi-core/config/"
# Command to restart unifi-core:
#DEPLOY_UNIFI_RELOAD="systemctl restart unifi-core"
#
# At least one of DEPLOY_UNIFI_KEYSTORE, DEPLOY_UNIFI_CLOUDKEY_CERTDIR,
# or DEPLOY_UNIFI_CORE_CONFIG must exist to receive the deployed certs.
######## Public functions #####################
@@ -24,77 +55,160 @@ unifi_deploy() {
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
_getdeployconf DEPLOY_UNIFI_KEYSTORE
_getdeployconf DEPLOY_UNIFI_KEYPASS
_getdeployconf DEPLOY_UNIFI_CLOUDKEY_CERTDIR
_getdeployconf DEPLOY_UNIFI_CORE_CONFIG
_getdeployconf DEPLOY_UNIFI_RELOAD
_debug2 DEPLOY_UNIFI_KEYSTORE "$DEPLOY_UNIFI_KEYSTORE"
_debug2 DEPLOY_UNIFI_KEYPASS "$DEPLOY_UNIFI_KEYPASS"
_debug2 DEPLOY_UNIFI_CLOUDKEY_CERTDIR "$DEPLOY_UNIFI_CLOUDKEY_CERTDIR"
_debug2 DEPLOY_UNIFI_CORE_CONFIG "$DEPLOY_UNIFI_CORE_CONFIG"
_debug2 DEPLOY_UNIFI_RELOAD "$DEPLOY_UNIFI_RELOAD"
# Space-separated list of environments detected and installed:
_services_updated=""
# Default reload commands accumulated as we auto-detect environments:
_reload_cmd=""
# Unifi Controller environment (self hosted or any Cloud Key) --
# auto-detect by file /usr/lib/unifi/data/keystore:
_unifi_keystore="${DEPLOY_UNIFI_KEYSTORE:-/usr/lib/unifi/data/keystore}"
if [ -f "$_unifi_keystore" ]; then
_info "Installing certificate for Unifi Controller (Java keystore)"
_debug _unifi_keystore "$_unifi_keystore"
if ! _exists keytool; then
_err "keytool not found"
return 1
fi
DEFAULT_UNIFI_KEYSTORE="/usr/lib/unifi/data/keystore"
_unifi_keystore="${DEPLOY_UNIFI_KEYSTORE:-$DEFAULT_UNIFI_KEYSTORE}"
DEFAULT_UNIFI_KEYPASS="aircontrolenterprise"
_unifi_keypass="${DEPLOY_UNIFI_KEYPASS:-$DEFAULT_UNIFI_KEYPASS}"
DEFAULT_UNIFI_RELOAD="service unifi restart"
_reload="${DEPLOY_UNIFI_RELOAD:-$DEFAULT_UNIFI_RELOAD}"
_debug _unifi_keystore "$_unifi_keystore"
if [ ! -f "$_unifi_keystore" ]; then
if [ -z "$DEPLOY_UNIFI_KEYSTORE" ]; then
_err "unifi keystore is not found, please define DEPLOY_UNIFI_KEYSTORE"
return 1
else
_err "It seems that the specified unifi keystore is not valid, please check."
return 1
fi
fi
if [ ! -w "$_unifi_keystore" ]; then
_err "The file $_unifi_keystore is not writable, please change the permission."
return 1
fi
_info "Generate import pkcs12"
_unifi_keypass="${DEPLOY_UNIFI_KEYPASS:-aircontrolenterprise}"
_debug "Generate import pkcs12"
_import_pkcs12="$(_mktemp)"
_toPkcs "$_import_pkcs12" "$_ckey" "$_ccert" "$_cca" "$_unifi_keypass" unifi root
# shellcheck disable=SC2181
if [ "$?" != "0" ]; then
_err "Oops, error creating import pkcs12, please report bug to us."
_err "Error generating pkcs12. Please re-run with --debug and report a bug."
return 1
fi
_info "Modify unifi keystore: $_unifi_keystore"
_debug "Import into keystore: $_unifi_keystore"
if keytool -importkeystore \
-deststorepass "$_unifi_keypass" -destkeypass "$_unifi_keypass" -destkeystore "$_unifi_keystore" \
-srckeystore "$_import_pkcs12" -srcstoretype PKCS12 -srcstorepass "$_unifi_keypass" \
-alias unifi -noprompt; then
_info "Import keystore success!"
_debug "Import keystore success!"
rm "$_import_pkcs12"
else
_err "Import unifi keystore error, please report bug to us."
_err "Error importing into Unifi Java keystore."
_err "Please re-run with --debug and report a bug."
rm "$_import_pkcs12"
return 1
fi
_info "Run reload: $_reload"
if eval "$_reload"; then
if systemctl -q is-active unifi; then
_reload_cmd="${_reload_cmd:+$_reload_cmd && }service unifi restart"
fi
_services_updated="${_services_updated} unifi"
_info "Install Unifi Controller certificate success!"
elif [ "$DEPLOY_UNIFI_KEYSTORE" ]; then
_err "The specified DEPLOY_UNIFI_KEYSTORE='$DEPLOY_UNIFI_KEYSTORE' is not valid, please check."
return 1
fi
# Cloud Key environment (non-UnifiOS -- nginx serves admin pages) --
# auto-detect by file /etc/ssl/private/cloudkey.key:
_cloudkey_certdir="${DEPLOY_UNIFI_CLOUDKEY_CERTDIR:-/etc/ssl/private}"
if [ -f "${_cloudkey_certdir}/cloudkey.key" ]; then
_info "Installing certificate for Cloud Key Gen1 (nginx admin pages)"
_debug _cloudkey_certdir "$_cloudkey_certdir"
if [ ! -w "$_cloudkey_certdir" ]; then
_err "The directory $_cloudkey_certdir is not writable; please check permissions."
return 1
fi
# Cloud Key expects to load the keystore from /etc/ssl/private/unifi.keystore.jks.
# Normally /usr/lib/unifi/data/keystore is a symlink there (so the keystore was
# updated above), but if not, we don't know how to handle this installation:
if ! cmp -s "$_unifi_keystore" "${_cloudkey_certdir}/unifi.keystore.jks"; then
_err "Unsupported Cloud Key configuration: keystore not found at '${_cloudkey_certdir}/unifi.keystore.jks'"
return 1
fi
cat "$_cfullchain" >"${_cloudkey_certdir}/cloudkey.crt"
cat "$_ckey" >"${_cloudkey_certdir}/cloudkey.key"
(cd "$_cloudkey_certdir" && tar -cf cert.tar cloudkey.crt cloudkey.key unifi.keystore.jks)
if systemctl -q is-active nginx; then
_reload_cmd="${_reload_cmd:+$_reload_cmd && }service nginx restart"
fi
_info "Install Cloud Key Gen1 certificate success!"
_services_updated="${_services_updated} nginx"
elif [ "$DEPLOY_UNIFI_CLOUDKEY_CERTDIR" ]; then
_err "The specified DEPLOY_UNIFI_CLOUDKEY_CERTDIR='$DEPLOY_UNIFI_CLOUDKEY_CERTDIR' is not valid, please check."
return 1
fi
# UnifiOS environment -- auto-detect by /data/unifi-core/config/unifi-core.key:
_unifi_core_config="${DEPLOY_UNIFI_CORE_CONFIG:-/data/unifi-core/config}"
if [ -f "${_unifi_core_config}/unifi-core.key" ]; then
_info "Installing certificate for UnifiOS"
_debug _unifi_core_config "$_unifi_core_config"
if [ ! -w "$_unifi_core_config" ]; then
_err "The directory $_unifi_core_config is not writable; please check permissions."
return 1
fi
cat "$_cfullchain" >"${_unifi_core_config}/unifi-core.crt"
cat "$_ckey" >"${_unifi_core_config}/unifi-core.key"
if systemctl -q is-active unifi-core; then
_reload_cmd="${_reload_cmd:+$_reload_cmd && }systemctl restart unifi-core"
fi
_info "Install UnifiOS certificate success!"
_services_updated="${_services_updated} unifi-core"
elif [ "$DEPLOY_UNIFI_CORE_CONFIG" ]; then
_err "The specified DEPLOY_UNIFI_CORE_CONFIG='$DEPLOY_UNIFI_CORE_CONFIG' is not valid, please check."
return 1
fi
if [ -z "$_services_updated" ]; then
# None of the Unifi environments were auto-detected, so no deployment has occurred
# (and none of DEPLOY_UNIFI_{KEYSTORE,CLOUDKEY_CERTDIR,CORE_CONFIG} were set).
_err "Unable to detect Unifi environment in standard location."
_err "(This deploy hook must be run on the Unifi device, not a remote machine.)"
_err "For non-standard Unifi installations, set DEPLOY_UNIFI_KEYSTORE,"
_err "DEPLOY_UNIFI_CLOUDKEY_CERTDIR, and/or DEPLOY_UNIFI_CORE_CONFIG as appropriate."
return 1
fi
_reload_cmd="${DEPLOY_UNIFI_RELOAD:-$_reload_cmd}"
if [ -z "$_reload_cmd" ]; then
_err "Certificates were installed for services:${_services_updated},"
_err "but none appear to be active. Please set DEPLOY_UNIFI_RELOAD"
_err "to a command that will restart the necessary services."
return 1
fi
_info "Reload services (this may take some time): $_reload_cmd"
if eval "$_reload_cmd"; then
_info "Reload success!"
if [ "$DEPLOY_UNIFI_KEYSTORE" ]; then
_savedomainconf DEPLOY_UNIFI_KEYSTORE "$DEPLOY_UNIFI_KEYSTORE"
else
_cleardomainconf DEPLOY_UNIFI_KEYSTORE
fi
if [ "$DEPLOY_UNIFI_KEYPASS" ]; then
_savedomainconf DEPLOY_UNIFI_KEYPASS "$DEPLOY_UNIFI_KEYPASS"
else
_cleardomainconf DEPLOY_UNIFI_KEYPASS
fi
if [ "$DEPLOY_UNIFI_RELOAD" ]; then
_savedomainconf DEPLOY_UNIFI_RELOAD "$DEPLOY_UNIFI_RELOAD"
else
_cleardomainconf DEPLOY_UNIFI_RELOAD
fi
return 0
else
_err "Reload error"
return 1
fi
return 0
# Successful, so save all (non-default) config:
_savedeployconf DEPLOY_UNIFI_KEYSTORE "$DEPLOY_UNIFI_KEYSTORE"
_savedeployconf DEPLOY_UNIFI_KEYPASS "$DEPLOY_UNIFI_KEYPASS"
_savedeployconf DEPLOY_UNIFI_CLOUDKEY_CERTDIR "$DEPLOY_UNIFI_CLOUDKEY_CERTDIR"
_savedeployconf DEPLOY_UNIFI_CORE_CONFIG "$DEPLOY_UNIFI_CORE_CONFIG"
_savedeployconf DEPLOY_UNIFI_RELOAD "$DEPLOY_UNIFI_RELOAD"
return 0
}

78
deploy/vault.sh Normal file
View File

@@ -0,0 +1,78 @@
#!/usr/bin/env sh
# Here is a script to deploy cert to hashicorp vault using curl
# (https://www.vaultproject.io/)
#
# it requires following environment variables:
#
# VAULT_PREFIX - this contains the prefix path in vault
# VAULT_ADDR - vault requires this to find your vault server
#
# additionally, you need to ensure that VAULT_TOKEN is avialable
# to access the vault server
#returns 0 means success, otherwise error.
######## Public functions #####################
#domain keyfile certfile cafile fullchain
vault_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
# validate required env vars
_getdeployconf VAULT_PREFIX
if [ -z "$VAULT_PREFIX" ]; then
_err "VAULT_PREFIX needs to be defined (contains prefix path in vault)"
return 1
fi
_savedeployconf VAULT_PREFIX "$VAULT_PREFIX"
_getdeployconf VAULT_ADDR
if [ -z "$VAULT_ADDR" ]; then
_err "VAULT_ADDR needs to be defined (contains vault connection address)"
return 1
fi
_savedeployconf VAULT_ADDR "$VAULT_ADDR"
# JSON does not allow multiline strings.
# So replacing new-lines with "\n" here
_ckey=$(sed -z 's/\n/\\n/g' <"$2")
_ccert=$(sed -z 's/\n/\\n/g' <"$3")
_cca=$(sed -z 's/\n/\\n/g' <"$4")
_cfullchain=$(sed -z 's/\n/\\n/g' <"$5")
URL="$VAULT_ADDR/v1/$VAULT_PREFIX/$_cdomain"
export _H1="X-Vault-Token: $VAULT_TOKEN"
if [ -n "$FABIO" ]; then
if [ -n "$VAULT_KV_V2" ]; then
_post "{ \"data\": {\"cert\": \"$_cfullchain\", \"key\": \"$_ckey\"} }" "$URL"
else
_post "{\"cert\": \"$_cfullchain\", \"key\": \"$_ckey\"}" "$URL"
fi
else
if [ -n "$VAULT_KV_V2" ]; then
_post "{\"data\": {\"value\": \"$_ccert\"}}" "$URL/cert.pem"
_post "{\"data\": {\"value\": \"$_ckey\"}}" "$URL/cert.key"
_post "{\"data\": {\"value\": \"$_cca\"}}" "$URL/chain.pem"
_post "{\"data\": {\"value\": \"$_cfullchain\"}}" "$URL/fullchain.pem"
else
_post "{\"value\": \"$_ccert\"}" "$URL/cert.pem"
_post "{\"value\": \"$_ckey\"}" "$URL/cert.key"
_post "{\"value\": \"$_cca\"}" "$URL/chain.pem"
_post "{\"value\": \"$_cfullchain\"}" "$URL/fullchain.pem"
fi
fi
}

61
deploy/vault_cli.sh Normal file
View File

@@ -0,0 +1,61 @@
#!/usr/bin/env sh
# Here is a script to deploy cert to hashicorp vault
# (https://www.vaultproject.io/)
#
# it requires the vault binary to be available in PATH, and the following
# environment variables:
#
# VAULT_PREFIX - this contains the prefix path in vault
# VAULT_ADDR - vault requires this to find your vault server
#
# additionally, you need to ensure that VAULT_TOKEN is avialable or
# `vault auth` has applied the appropriate authorization for the vault binary
# to access the vault server
#returns 0 means success, otherwise error.
######## Public functions #####################
#domain keyfile certfile cafile fullchain
vault_cli_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
# validate required env vars
if [ -z "$VAULT_PREFIX" ]; then
_err "VAULT_PREFIX needs to be defined (contains prefix path in vault)"
return 1
fi
if [ -z "$VAULT_ADDR" ]; then
_err "VAULT_ADDR needs to be defined (contains vault connection address)"
return 1
fi
VAULT_CMD=$(command -v vault)
if [ ! $? ]; then
_err "cannot find vault binary!"
return 1
fi
if [ -n "$FABIO" ]; then
$VAULT_CMD kv put "${VAULT_PREFIX}/${_cdomain}" cert=@"$_cfullchain" key=@"$_ckey" || return 1
else
$VAULT_CMD kv put "${VAULT_PREFIX}/${_cdomain}/cert.pem" value=@"$_ccert" || return 1
$VAULT_CMD kv put "${VAULT_PREFIX}/${_cdomain}/cert.key" value=@"$_ckey" || return 1
$VAULT_CMD kv put "${VAULT_PREFIX}/${_cdomain}/chain.pem" value=@"$_cca" || return 1
$VAULT_CMD kv put "${VAULT_PREFIX}/${_cdomain}/fullchain.pem" value=@"$_cfullchain" || return 1
fi
}

View File

@@ -65,9 +65,9 @@ vsftpd_deploy() {
cp "$_vsftpd_conf" "$_backup_conf"
_info "Modify vsftpd conf: $_vsftpd_conf"
if _setopt "$_vsftpd_conf" "rsa_cert_file" "=" "$_real_fullchain" \
&& _setopt "$_vsftpd_conf" "rsa_private_key_file" "=" "$_real_key" \
&& _setopt "$_vsftpd_conf" "ssl_enable" "=" "YES"; then
if _setopt "$_vsftpd_conf" "rsa_cert_file" "=" "$_real_fullchain" &&
_setopt "$_vsftpd_conf" "rsa_private_key_file" "=" "$_real_key" &&
_setopt "$_vsftpd_conf" "ssl_enable" "=" "YES"; then
_info "Set config success!"
else
_err "Config vsftpd server error, please report bug to us."

View File

@@ -1,780 +1,6 @@
# How to use DNS API
DNS api usage:
## 1. Use CloudFlare domain API to automatically issue cert
First you need to login to your CloudFlare account to get your API key.
https://github.com/acmesh-official/acme.sh/wiki/dnsapi
```
export CF_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export CF_Email="xxxx@sss.com"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_cf -d example.com -d www.example.com
```
The `CF_Key` and `CF_Email` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 2. Use DNSPod.cn domain API to automatically issue cert
First you need to login to your DNSPod account to get your API Key and ID.
```
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_dp -d example.com -d www.example.com
```
The `DP_Id` and `DP_Key` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 3. Use CloudXNS.com domain API to automatically issue cert
First you need to login to your CloudXNS account to get your API Key and Secret.
```
export CX_Key="1234"
export CX_Secret="sADDsdasdgdsf"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_cx -d example.com -d www.example.com
```
The `CX_Key` and `CX_Secret` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 4. Use GoDaddy.com domain API to automatically issue cert
First you need to login to your GoDaddy account to get your API Key and Secret.
https://developer.godaddy.com/keys/
Please create a Production key, instead of a Test key.
```
export GD_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export GD_Secret="asdfsdafdsfdsfdsfdsfdsafd"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_gd -d example.com -d www.example.com
```
The `GD_Key` and `GD_Secret` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 5. Use PowerDNS embedded API to automatically issue cert
First you need to login to your PowerDNS account to enable the API and set your API-Token in the configuration.
https://doc.powerdns.com/md/httpapi/README/
```
export PDNS_Url="http://ns.example.com:8081"
export PDNS_ServerId="localhost"
export PDNS_Token="0123456789ABCDEF"
export PDNS_Ttl=60
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_pdns -d example.com -d www.example.com
```
The `PDNS_Url`, `PDNS_ServerId`, `PDNS_Token` and `PDNS_Ttl` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 6. Use OVH/kimsufi/soyoustart/runabove API to automatically issue cert
https://github.com/Neilpang/acme.sh/wiki/How-to-use-OVH-domain-api
## 7. Use nsupdate to automatically issue cert
First, generate a key for updating the zone
```
b=$(dnssec-keygen -a hmac-sha512 -b 512 -n USER -K /tmp foo)
cat > /etc/named/keys/update.key <<EOF
key "update" {
algorithm hmac-sha512;
secret "$(awk '/^Key/{print $2}' /tmp/$b.private)";
};
EOF
rm -f /tmp/$b.{private,key}
```
Include this key in your named configuration
```
include "/etc/named/keys/update.key";
```
Next, configure your zone to allow dynamic updates.
Depending on your named version, use either
```
zone "example.com" {
type master;
allow-update { key "update"; };
};
```
or
```
zone "example.com" {
type master;
update-policy {
grant update subdomain example.com.;
};
}
```
Finally, make the DNS server and update Key available to `acme.sh`
```
export NSUPDATE_SERVER="dns.example.com"
export NSUPDATE_KEY="/path/to/your/nsupdate.key"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_nsupdate -d example.com -d www.example.com
```
The `NSUPDATE_SERVER` and `NSUPDATE_KEY` settings will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 8. Use LuaDNS domain API
Get your API token at https://api.luadns.com/settings
```
export LUA_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export LUA_Email="xxxx@sss.com"
```
To issue a cert:
```
acme.sh --issue --dns dns_lua -d example.com -d www.example.com
```
The `LUA_Key` and `LUA_Email` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 9. Use DNSMadeEasy domain API
Get your API credentials at https://cp.dnsmadeeasy.com/account/info
```
export ME_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export ME_Secret="qdfqsdfkjdskfj"
```
To issue a cert:
```
acme.sh --issue --dns dns_me -d example.com -d www.example.com
```
The `ME_Key` and `ME_Secret` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 10. Use Amazon Route53 domain API
https://github.com/Neilpang/acme.sh/wiki/How-to-use-Amazon-Route53-API
```
export AWS_ACCESS_KEY_ID=XXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXX
```
To issue a cert:
```
acme.sh --issue --dns dns_aws -d example.com -d www.example.com
```
The `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 11. Use Aliyun domain API to automatically issue cert
First you need to login to your Aliyun account to get your API key.
[https://ak-console.aliyun.com/#/accesskey](https://ak-console.aliyun.com/#/accesskey)
```
export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_ali -d example.com -d www.example.com
```
The `Ali_Key` and `Ali_Secret` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 12. Use ISPConfig 3.1 API
This only works for ISPConfig 3.1 (and newer).
Create a Remote User in the ISPConfig Control Panel. The Remote User must have access to at least `DNS zone functions` and `DNS txt functions`.
```
export ISPC_User="xxx"
export ISPC_Password="xxx"
export ISPC_Api="https://ispc.domain.tld:8080/remote/json.php"
export ISPC_Api_Insecure=1
```
If you have installed ISPConfig on a different port, then alter the 8080 accordingly.
Leaver ISPC_Api_Insecure set to 1 if you have not a valid ssl cert for your installation. Change it to 0 if you have a valid ssl cert.
To issue a cert:
```
acme.sh --issue --dns dns_ispconfig -d example.com -d www.example.com
```
The `ISPC_User`, `ISPC_Password`, `ISPC_Api`and `ISPC_Api_Insecure` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 13. Use Alwaysdata domain API
First you need to login to your Alwaysdata account to get your API Key.
```sh
export AD_API_KEY="myalwaysdataapikey"
```
Ok, let's issue a cert now:
```sh
acme.sh --issue --dns dns_ad -d example.com -d www.example.com
```
The `AD_API_KEY` will be saved in `~/.acme.sh/account.conf` and will be reused
when needed.
## 14. Use Linode domain API
First you need to login to your Linode account to get your API Key.
[https://manager.linode.com/profile/api](https://manager.linode.com/profile/api)
Then add an API key with label *ACME* and copy the new key.
```sh
export LINODE_API_KEY="..."
```
Due to the reload time of any changes in the DNS records, we have to use the `dnssleep` option to wait at least 15 minutes for the changes to take effect.
Ok, let's issue a cert now:
```sh
acme.sh --issue --dns dns_linode --dnssleep 900 -d example.com -d www.example.com
```
The `LINODE_API_KEY` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 15. Use FreeDNS
FreeDNS (https://freedns.afraid.org/) does not provide an API to update DNS records (other than IPv4 and IPv6
dynamic DNS addresses). The acme.sh plugin therefore retrieves and updates domain TXT records by logging
into the FreeDNS website to read the HTML and posting updates as HTTP. The plugin needs to know your
userid and password for the FreeDNS website.
```sh
export FREEDNS_User="..."
export FREEDNS_Password="..."
```
You need only provide this the first time you run the acme.sh client with FreeDNS validation and then again
whenever you change your password at the FreeDNS site. The acme.sh FreeDNS plugin does not store your userid
or password but rather saves an authentication token returned by FreeDNS in `~/.acme.sh/account.conf` and
reuses that when needed.
Now you can issue a certificate.
```sh
acme.sh --issue --dns dns_freedns -d example.com -d www.example.com
```
Note that you cannot use acme.sh automatic DNS validation for FreeDNS public domains or for a subdomain that
you create under a FreeDNS public domain. You must own the top level domain in order to automatically
validate with acme.sh at FreeDNS.
## 16. Use cyon.ch
You only need to set your cyon.ch login credentials.
If you also have 2 Factor Authentication (OTP) enabled, you need to set your secret token too and have `oathtool` installed.
```
export CY_Username="your_cyon_username"
export CY_Password="your_cyon_password"
export CY_OTP_Secret="your_otp_secret" # Only required if using 2FA
```
To issue a cert:
```
acme.sh --issue --dns dns_cyon -d example.com -d www.example.com
```
The `CY_Username`, `CY_Password` and `CY_OTP_Secret` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 17. Use Domain-Offensive/Resellerinterface/Domainrobot API
You will need your login credentials (Partner ID+Password) to the Resellerinterface, and export them before you run `acme.sh`:
```
export DO_PID="KD-1234567"
export DO_PW="cdfkjl3n2"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_do -d example.com -d www.example.com
```
## 18. Use Gandi LiveDNS API
You must enable the new Gandi LiveDNS API first and the create your api key, See: http://doc.livedns.gandi.net/
```
export GANDI_LIVEDNS_KEY="fdmlfsdklmfdkmqsdfk"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_gandi_livedns -d example.com -d www.example.com
```
## 19. Use Knot (knsupdate) DNS API to automatically issue cert
First, generate a TSIG key for updating the zone.
```
keymgr tsig generate acme_key algorithm hmac-sha512 > /etc/knot/acme.key
```
Include this key in your knot configuration file.
```
include: /etc/knot/acme.key
```
Next, configure your zone to allow dynamic updates.
Dynamic updates for the zone are allowed via proper ACL rule with the `update` action. For in-depth instructions, please see [Knot DNS's documentation](https://www.knot-dns.cz/documentation/).
```
acl:
- id: acme_acl
address: 192.168.1.0/24
key: acme_key
action: update
zone:
- domain: example.com
file: example.com.zone
acl: acme_acl
```
Finally, make the DNS server and TSIG Key available to `acme.sh`
```
export KNOT_SERVER="dns.example.com"
export KNOT_KEY=`grep \# /etc/knot/acme.key | cut -d' ' -f2`
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_knot -d example.com -d www.example.com
```
The `KNOT_SERVER` and `KNOT_KEY` settings will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 20. Use DigitalOcean API (native)
You need to obtain a read and write capable API key from your DigitalOcean account. See: https://www.digitalocean.com/help/api/
```
export DO_API_KEY="75310dc4ca779ac39a19f6355db573b49ce92ae126553ebd61ac3a3ae34834cc"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_dgon -d example.com -d www.example.com
```
## 21. Use ClouDNS.net API
You need to set the HTTP API user ID and password credentials. See: https://www.cloudns.net/wiki/article/42/. For security reasons, it's recommended to use a sub user ID that only has access to the necessary zones, as a regular API user has access to your entire account.
```
# Use this for a sub auth ID
export CLOUDNS_SUB_AUTH_ID=XXXXX
# Use this for a regular auth ID
#export CLOUDNS_AUTH_ID=XXXXX
export CLOUDNS_AUTH_PASSWORD="YYYYYYYYY"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_cloudns -d example.com -d www.example.com
```
The `CLOUDNS_AUTH_ID` and `CLOUDNS_AUTH_PASSWORD` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 22. Use Infoblox API
First you need to create/obtain API credentials on your Infoblox appliance.
```
export Infoblox_Creds="username:password"
export Infoblox_Server="ip or fqdn of infoblox appliance"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_infoblox -d example.com -d www.example.com
```
Note: This script will automatically create and delete the ephemeral txt record.
The `Infoblox_Creds` and `Infoblox_Server` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 23. Use VSCALE API
First you need to create/obtain API tokens on your [settings panel](https://vscale.io/panel/settings/tokens/).
```
VSCALE_API_KEY="sdfsdfsdfljlbjkljlkjsdfoiwje"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_vscale -d example.com -d www.example.com
```
## 24. Use Dynu API
First you need to create/obtain API credentials from your Dynu account. See: https://www.dynu.com/resources/api/documentation
```
export Dynu_ClientId="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
export Dynu_Secret="yyyyyyyyyyyyyyyyyyyyyyyyy"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_dynu -d example.com -d www.example.com
```
The `Dynu_ClientId` and `Dynu_Secret` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 25. Use DNSimple API
First you need to login to your DNSimple account and generate a new oauth token.
https://dnsimple.com/a/{your account id}/account/access_tokens
Note that this is an _account_ token and not a user token. The account token is
needed to infer the `account_id` used in requests. A user token will not be able
to determine the correct account to use.
```
export DNSimple_OAUTH_TOKEN="sdfsdfsdfljlbjkljlkjsdfoiwje"
```
To issue the cert just specify the `dns_dnsimple` API.
```
acme.sh --issue --dns dns_dnsimple -d example.com
```
The `DNSimple_OAUTH_TOKEN` will be saved in `~/.acme.sh/account.conf` and will
be reused when needed.
If you have any issues with this integration please report them to
https://github.com/pho3nixf1re/acme.sh/issues.
## 26. Use NS1.com API
```
export NS1_Key="fdmlfsdklmfdkmqsdfk"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_nsone -d example.com -d www.example.com
```
## 27. Use DuckDNS.org API
```
export DuckDNS_Token="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
```
Please note that since DuckDNS uses StartSSL as their cert provider, thus
--insecure may need to be used when issuing certs:
```
acme.sh --insecure --issue --dns dns_duckdns -d mydomain.duckdns.org
```
For issues, please report to https://github.com/raidenii/acme.sh/issues.
## 28. Use Name.com API
You'll need to fill out the form at https://www.name.com/reseller/apply to apply
for API username and token.
```
export Namecom_Username="testuser"
export Namecom_Token="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
```
And now you can issue certs with:
```
acme.sh --issue --dns dns_namecom -d example.com -d www.example.com
```
For issues, please report to https://github.com/raidenii/acme.sh/issues.
## 29. Use Dyn Managed DNS API to automatically issue cert
First, login to your Dyn Managed DNS account: https://portal.dynect.net/login/
It is recommended to add a new user specific for API access.
The minimum "Zones & Records Permissions" required are:
```
RecordAdd
RecordUpdate
RecordDelete
RecordGet
ZoneGet
ZoneAddNode
ZoneRemoveNode
ZonePublish
```
Pass the API user credentials to the environment:
```
export DYN_Customer="customer"
export DYN_Username="apiuser"
export DYN_Password="secret"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_dyn -d example.com -d www.example.com
```
The `DYN_Customer`, `DYN_Username` and `DYN_Password` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 30. Use pdd.yandex.ru API
```
export PDD_Token="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
```
Follow these instructions to get the token for your domain https://tech.yandex.com/domain/doc/concepts/access-docpage/
```
acme.sh --issue --dns dns_yandex -d mydomain.example.org
```
For issues, please report to https://github.com/non7top/acme.sh/issues.
## 31. Use Hurricane Electric
Hurricane Electric (https://dns.he.net/) doesn't have an API so just set your login credentials like so:
```
export HE_Username="yourusername"
export HE_Password="password"
```
Then you can issue your certificate:
```
acme.sh --issue --dns dns_he -d example.com -d www.example.com
```
The `HE_Username` and `HE_Password` settings will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
Please report any issues to https://github.com/angel333/acme.sh or to <me@ondrejsimek.com>.
## 32. Use UnoEuro API to automatically issue cert
First you need to login to your UnoEuro account to get your API key.
```
export UNO_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export UNO_User="UExxxxxx"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_unoeuro -d example.com -d www.example.com
```
The `UNO_Key` and `UNO_User` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 33. Use INWX
[INWX](https://www.inwx.de/) offers an [xmlrpc api](https://www.inwx.de/de/help/apidoc) with your standard login credentials, set them like so:
```
export INWX_User="yourusername"
export INWX_Password="password"
```
Then you can issue your certificates with:
```
acme.sh --issue --dns dns_inwx -d example.com -d www.example.com
```
The `INWX_User` and `INWX_Password` settings will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 34. User Servercow API v1
Create a new user from the servercow control center. Don't forget to activate **DNS API** for this user.
```
export SERVERCOW_API_Username=username
export SERVERCOW_API_Password=password
```
Now you cann issue a cert:
```
acme.sh --issue --dns dns_servercow -d example.com -d www.example.com
```
Both, `SERVERCOW_API_Username` and `SERVERCOW_API_Password` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 35. Use Namesilo.com API
You'll need to generate an API key at https://www.namesilo.com/account_api.php
Optionally you may restrict the access to an IP range there.
```
export Namesilo_Key="xxxxxxxxxxxxxxxxxxxxxxxx"
```
And now you can issue certs with:
```
acme.sh --issue --dns dns_namesilo --dnssleep 900 -d example.com -d www.example.com
```
## 36. Use autoDNS (InternetX)
[InternetX](https://www.internetx.com/) offers an [xml api](https://help.internetx.com/display/API/AutoDNS+XML-API) with your standard login credentials, set them like so:
```
export AUTODNS_USER="yourusername"
export AUTODNS_PASSWORD="password"
export AUTODNS_CONTEXT="context"
```
Then you can issue your certificates with:
```
acme.sh --issue --dns dns_autodns -d example.com -d www.example.com
```
The `AUTODNS_USER`, `AUTODNS_PASSWORD` and `AUTODNS_CONTEXT` settings will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 37. Use Azure DNS
You have to create a service principal first. See:[How to use Azure DNS](../../../wiki/How-to-use-Azure-DNS)
```
export AZUREDNS_SUBSCRIPTIONID="12345678-9abc-def0-1234-567890abcdef"
export AZUREDNS_TENANTID="11111111-2222-3333-4444-555555555555"
export AZUREDNS_APPID="3b5033b5-7a66-43a5-b3b9-a36b9e7c25ed"
export AZUREDNS_CLIENTSECRET="1b0224ef-34d4-5af9-110f-77f527d561bd"
```
Then you can issue your certificates with:
```
acme.sh --issue --dns dns_azure -d example.com -d www.example.com
```
`AZUREDNS_SUBSCRIPTIONID`, `AZUREDNS_TENANTID`,`AZUREDNS_APPID` and `AZUREDNS_CLIENTSECRET` settings will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 38. Use selectel.com(selectel.ru) domain API to automatically issue cert
First you need to login to your account to get your API key from: https://my.selectel.ru/profile/apikeys.
```sh
export SL_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_selectel -d example.com -d www.example.com
```
The `SL_Key` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 39. Use zonomi.com domain API to automatically issue cert
First you need to login to your account to find your API key from: http://zonomi.com/app/dns/dyndns.jsp
Your will find your api key in the example urls:
```sh
https://zonomi.com/app/dns/dyndns.jsp?host=example.com&api_key=1063364558943540954358668888888888
```
```sh
export ZM_Key="1063364558943540954358668888888888"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_zonomi -d example.com -d www.example.com
```
The `ZM_Key` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 40. Use DreamHost DNS API
DNS API keys may be created at https://panel.dreamhost.com/?tree=home.api.
Ensure the created key has add and remove privelages.
```
export DH_API_Key="<api key>"
acme.sh --issue --dns dns_dreamhost -d example.com -d www.example.com
```
The 'DH_API_KEY' will be saved in `~/.acme.sh/account.conf` and will
be reused when needed.
# Use custom API
If your API is not supported yet, you can write your own DNS API.
Let's assume you want to name it 'myapi':
1. Create a bash script named `~/.acme.sh/dns_myapi.sh`,
2. In the script you must have a function named `dns_myapi_add()` which will be called by acme.sh to add the DNS records.
3. Then you can use your API to issue cert like this:
```
acme.sh --issue --dns dns_myapi -d example.com -d www.example.com
```
For more details, please check our sample script: [dns_myapi.sh](dns_myapi.sh)
See: https://github.com/Neilpang/acme.sh/wiki/DNS-API-Dev-Guide
# Use lexicon DNS API
https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api

261
dnsapi/dns_1984hosting.sh Executable file
View File

@@ -0,0 +1,261 @@
#!/usr/bin/env sh
#This file name is "dns_1984hosting.sh"
#So, here must be a method dns_1984hosting_add()
#Which will be called by acme.sh to add the txt record to your api system.
#returns 0 means success, otherwise error.
#Author: Adrian Fedoreanu
#Report Bugs here: https://github.com/acmesh-official/acme.sh
# or here... https://github.com/acmesh-official/acme.sh/issues/2851
#
######## Public functions #####################
# Export 1984HOSTING username and password in following variables
#
# One984HOSTING_Username=username
# One984HOSTING_Password=password
#
# sessionid cookie is saved in ~/.acme.sh/account.conf
# username/password need to be set only when changed.
#Usage: dns_1984hosting_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_1984hosting_add() {
fulldomain=$1
txtvalue=$2
_info "Add TXT record using 1984Hosting"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
if ! _1984hosting_login; then
_err "1984Hosting login failed for user $One984HOSTING_Username. Check $HTTP_HEADER file"
return 1
fi
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "invalid domain" "$fulldomain"
return 1
fi
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_debug "Add TXT record $fulldomain with value '$txtvalue'"
value="$(printf '%s' "$txtvalue" | _url_encode)"
url="https://1984.hosting/domains/entry/"
postdata="entry=new"
postdata="$postdata&type=TXT"
postdata="$postdata&ttl=900"
postdata="$postdata&zone=$_domain"
postdata="$postdata&host=$_sub_domain"
postdata="$postdata&rdata=%22$value%22"
_debug2 postdata "$postdata"
_authpost "$postdata" "$url"
response="$(echo "$_response" | _normalizeJson)"
_debug2 response "$response"
if _contains "$response" '"haserrors": true'; then
_err "1984Hosting failed to add TXT record for $_sub_domain bad RC from _post"
return 1
elif _contains "$response" "html>"; then
_err "1984Hosting failed to add TXT record for $_sub_domain. Check $HTTP_HEADER file"
return 1
elif _contains "$response" '"auth": false'; then
_err "1984Hosting failed to add TXT record for $_sub_domain. Invalid or expired cookie"
return 1
fi
_info "Added acme challenge TXT record for $fulldomain at 1984Hosting"
return 0
}
#Usage: fulldomain txtvalue
#Remove the txt record after validation.
dns_1984hosting_rm() {
fulldomain=$1
txtvalue=$2
_info "Delete TXT record using 1984Hosting"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
if ! _1984hosting_login; then
_err "1984Hosting login failed for user $One984HOSTING_Username. Check $HTTP_HEADER file"
return 1
fi
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "invalid domain" "$fulldomain"
return 1
fi
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_debug "Delete $fulldomain TXT record"
url="https://1984.hosting/domains"
if ! _get_zone_id "$url" "$_domain"; then
_err "invalid zone" "$_domain"
return 1
fi
_htmlget "$url/$_zone_id" "$txtvalue"
_debug2 _response "$_response"
entry_id="$(echo "$_response" | _egrep_o 'entry_[0-9]+' | sed 's/entry_//')"
_debug2 entry_id "$entry_id"
if [ -z "$entry_id" ]; then
_err "Error getting TXT entry_id for $1"
return 1
fi
_authpost "entry=$entry_id" "$url/delentry/"
response="$(echo "$_response" | _normalizeJson)"
_debug2 response "$response"
if ! _contains "$response" '"ok": true'; then
_err "1984Hosting failed to delete TXT record for $entry_id bad RC from _post"
return 1
fi
_info "Deleted acme challenge TXT record for $fulldomain at 1984Hosting"
return 0
}
#################### Private functions below ##################################
# usage: _1984hosting_login username password
# returns 0 success
_1984hosting_login() {
if ! _check_credentials; then return 1; fi
if _check_cookies; then
_debug "Already logged in"
return 0
fi
_debug "Login to 1984Hosting as user $One984HOSTING_Username"
username=$(printf '%s' "$One984HOSTING_Username" | _url_encode)
password=$(printf '%s' "$One984HOSTING_Password" | _url_encode)
url="https://1984.hosting/accounts/checkuserauth/"
response="$(_post "username=$username&password=$password&otpkey=" $url)"
response="$(echo "$response" | _normalizeJson)"
_debug2 response "$response"
if _contains "$response" '"loggedin": true'; then
One984HOSTING_SESSIONID_COOKIE="$(grep -i '^set-cookie:' "$HTTP_HEADER" | _egrep_o 'sessionid=[^;]*;' | tr -d ';')"
One984HOSTING_CSRFTOKEN_COOKIE="$(grep -i '^set-cookie:' "$HTTP_HEADER" | _egrep_o 'csrftoken=[^;]*;' | tr -d ';')"
export One984HOSTING_SESSIONID_COOKIE
export One984HOSTING_CSRFTOKEN_COOKIE
_saveaccountconf_mutable One984HOSTING_SESSIONID_COOKIE "$One984HOSTING_SESSIONID_COOKIE"
_saveaccountconf_mutable One984HOSTING_CSRFTOKEN_COOKIE "$One984HOSTING_CSRFTOKEN_COOKIE"
return 0
fi
return 1
}
_check_credentials() {
if [ -z "$One984HOSTING_Username" ] || [ -z "$One984HOSTING_Password" ]; then
One984HOSTING_Username=""
One984HOSTING_Password=""
_err "You haven't specified 1984Hosting username or password yet."
_err "Please export as One984HOSTING_Username / One984HOSTING_Password and try again."
return 1
fi
return 0
}
_check_cookies() {
One984HOSTING_SESSIONID_COOKIE="${One984HOSTING_SESSIONID_COOKIE:-$(_readaccountconf_mutable One984HOSTING_SESSIONID_COOKIE)}"
One984HOSTING_CSRFTOKEN_COOKIE="${One984HOSTING_CSRFTOKEN_COOKIE:-$(_readaccountconf_mutable One984HOSTING_CSRFTOKEN_COOKIE)}"
if [ -z "$One984HOSTING_SESSIONID_COOKIE" ] || [ -z "$One984HOSTING_CSRFTOKEN_COOKIE" ]; then
_debug "No cached cookie(s) found"
return 1
fi
_authget "https://1984.hosting/accounts/loginstatus/"
if _contains "$response" '"ok": true'; then
_debug "Cached cookies still valid"
return 0
fi
_debug "Cached cookies no longer valid"
One984HOSTING_SESSIONID_COOKIE=""
One984HOSTING_CSRFTOKEN_COOKIE=""
_saveaccountconf_mutable One984HOSTING_SESSIONID_COOKIE "$One984HOSTING_SESSIONID_COOKIE"
_saveaccountconf_mutable One984HOSTING_CSRFTOKEN_COOKIE "$One984HOSTING_CSRFTOKEN_COOKIE"
return 1
}
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
_get_root() {
domain="$1"
i=1
p=1
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
if [ -z "$h" ]; then
#not valid
return 1
fi
_authget "https://1984.hosting/domains/soacheck/?zone=$h&nameserver=ns0.1984.is."
if _contains "$_response" "serial" && ! _contains "$_response" "null"; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain="$h"
return 0
fi
p=$i
i=$(_math "$i" + 1)
done
return 1
}
#usage: _get_zone_id url domain.com
#returns zone id for domain.com
_get_zone_id() {
url=$1
domain=$2
_htmlget "$url" "$domain"
_debug2 _response "$_response"
_zone_id="$(echo "$_response" | _egrep_o 'zone\/[0-9]+' | _head_n 1)"
_debug2 _zone_id "$_zone_id"
if [ -z "$_zone_id" ]; then
_err "Error getting _zone_id for $2"
return 1
fi
return 0
}
# add extra headers to request
_authget() {
export _H1="Cookie: $One984HOSTING_CSRFTOKEN_COOKIE;$One984HOSTING_SESSIONID_COOKIE"
_response=$(_get "$1" | _normalizeJson)
_debug2 _response "$_response"
}
# truncate huge HTML response
# echo: Argument list too long
_htmlget() {
export _H1="Cookie: $One984HOSTING_CSRFTOKEN_COOKIE;$One984HOSTING_SESSIONID_COOKIE"
_response=$(_get "$1" | grep "$2")
if _contains "$_response" "@$2"; then
_response=$(echo "$_response" | grep -v "[@]" | _head_n 1)
fi
}
# add extra headers to request
_authpost() {
url="https://1984.hosting/domains"
_get_zone_id "$url" "$_domain"
csrf_header="$(echo "$One984HOSTING_CSRFTOKEN_COOKIE" | _egrep_o "=[^=][0-9a-zA-Z]*" | tr -d "=")"
export _H1="Cookie: $One984HOSTING_CSRFTOKEN_COOKIE;$One984HOSTING_SESSIONID_COOKIE"
export _H2="Referer: https://1984.hosting/domains/$_zone_id"
export _H3="X-CSRFToken: $csrf_header"
_response=$(_post "$1" "$2")
}

94
dnsapi/dns_acmedns.sh Executable file
View File

@@ -0,0 +1,94 @@
#!/usr/bin/env sh
#
#Author: Wolfgang Ebner
#Author: Sven Neubuaer
#Report Bugs here: https://github.com/dampfklon/acme.sh
#
# Usage:
# export ACMEDNS_BASE_URL="https://auth.acme-dns.io"
#
# You can optionally define an already existing account:
#
# export ACMEDNS_USERNAME="<username>"
# export ACMEDNS_PASSWORD="<password>"
# export ACMEDNS_SUBDOMAIN="<subdomain>"
#
######## Public functions #####################
#Usage: dns_acmedns_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
# Used to add txt record
dns_acmedns_add() {
fulldomain=$1
txtvalue=$2
_info "Using acme-dns"
_debug "fulldomain $fulldomain"
_debug "txtvalue $txtvalue"
#for compatiblity from account conf
ACMEDNS_USERNAME="${ACMEDNS_USERNAME:-$(_readaccountconf_mutable ACMEDNS_USERNAME)}"
_clearaccountconf_mutable ACMEDNS_USERNAME
ACMEDNS_PASSWORD="${ACMEDNS_PASSWORD:-$(_readaccountconf_mutable ACMEDNS_PASSWORD)}"
_clearaccountconf_mutable ACMEDNS_PASSWORD
ACMEDNS_SUBDOMAIN="${ACMEDNS_SUBDOMAIN:-$(_readaccountconf_mutable ACMEDNS_SUBDOMAIN)}"
_clearaccountconf_mutable ACMEDNS_SUBDOMAIN
ACMEDNS_BASE_URL="${ACMEDNS_BASE_URL:-$(_readdomainconf ACMEDNS_BASE_URL)}"
ACMEDNS_USERNAME="${ACMEDNS_USERNAME:-$(_readdomainconf ACMEDNS_USERNAME)}"
ACMEDNS_PASSWORD="${ACMEDNS_PASSWORD:-$(_readdomainconf ACMEDNS_PASSWORD)}"
ACMEDNS_SUBDOMAIN="${ACMEDNS_SUBDOMAIN:-$(_readdomainconf ACMEDNS_SUBDOMAIN)}"
if [ "$ACMEDNS_BASE_URL" = "" ]; then
ACMEDNS_BASE_URL="https://auth.acme-dns.io"
fi
ACMEDNS_UPDATE_URL="$ACMEDNS_BASE_URL/update"
ACMEDNS_REGISTER_URL="$ACMEDNS_BASE_URL/register"
if [ -z "$ACMEDNS_USERNAME" ] || [ -z "$ACMEDNS_PASSWORD" ]; then
response="$(_post "" "$ACMEDNS_REGISTER_URL" "" "POST")"
_debug response "$response"
ACMEDNS_USERNAME=$(echo "$response" | sed -n 's/^{.*\"username\":[ ]*\"\([^\"]*\)\".*}/\1/p')
_debug "received username: $ACMEDNS_USERNAME"
ACMEDNS_PASSWORD=$(echo "$response" | sed -n 's/^{.*\"password\":[ ]*\"\([^\"]*\)\".*}/\1/p')
_debug "received password: $ACMEDNS_PASSWORD"
ACMEDNS_SUBDOMAIN=$(echo "$response" | sed -n 's/^{.*\"subdomain\":[ ]*\"\([^\"]*\)\".*}/\1/p')
_debug "received subdomain: $ACMEDNS_SUBDOMAIN"
ACMEDNS_FULLDOMAIN=$(echo "$response" | sed -n 's/^{.*\"fulldomain\":[ ]*\"\([^\"]*\)\".*}/\1/p')
_info "##########################################################"
_info "# Create $fulldomain CNAME $ACMEDNS_FULLDOMAIN DNS entry #"
_info "##########################################################"
_info "Press enter to continue... "
read -r _
fi
_savedomainconf ACMEDNS_BASE_URL "$ACMEDNS_BASE_URL"
_savedomainconf ACMEDNS_USERNAME "$ACMEDNS_USERNAME"
_savedomainconf ACMEDNS_PASSWORD "$ACMEDNS_PASSWORD"
_savedomainconf ACMEDNS_SUBDOMAIN "$ACMEDNS_SUBDOMAIN"
export _H1="X-Api-User: $ACMEDNS_USERNAME"
export _H2="X-Api-Key: $ACMEDNS_PASSWORD"
data="{\"subdomain\":\"$ACMEDNS_SUBDOMAIN\", \"txt\": \"$txtvalue\"}"
_debug data "$data"
response="$(_post "$data" "$ACMEDNS_UPDATE_URL" "" "POST")"
_debug response "$response"
if ! echo "$response" | grep "\"$txtvalue\"" >/dev/null; then
_err "invalid response of acme-dns"
return 1
fi
}
#Usage: fulldomain txtvalue
#Remove the txt record after validation.
dns_acmedns_rm() {
fulldomain=$1
txtvalue=$2
_info "Using acme-dns"
_debug "fulldomain $fulldomain"
_debug "txtvalue $txtvalue"
}
#################### Private functions below ##################################

83
dnsapi/dns_acmeproxy.sh Normal file
View File

@@ -0,0 +1,83 @@
#!/usr/bin/env sh
## Acmeproxy DNS provider to be used with acmeproxy (http://github.com/mdbraber/acmeproxy)
## API integration by Maarten den Braber
##
## Report any bugs via https://github.com/mdbraber/acme.sh
dns_acmeproxy_add() {
fulldomain="${1}"
txtvalue="${2}"
action="present"
_debug "Calling: _acmeproxy_request() '${fulldomain}' '${txtvalue}' '${action}'"
_acmeproxy_request "$fulldomain" "$txtvalue" "$action"
}
dns_acmeproxy_rm() {
fulldomain="${1}"
txtvalue="${2}"
action="cleanup"
_debug "Calling: _acmeproxy_request() '${fulldomain}' '${txtvalue}' '${action}'"
_acmeproxy_request "$fulldomain" "$txtvalue" "$action"
}
_acmeproxy_request() {
## Nothing to see here, just some housekeeping
fulldomain=$1
txtvalue=$2
action=$3
_info "Using acmeproxy"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
ACMEPROXY_ENDPOINT="${ACMEPROXY_ENDPOINT:-$(_readaccountconf_mutable ACMEPROXY_ENDPOINT)}"
ACMEPROXY_USERNAME="${ACMEPROXY_USERNAME:-$(_readaccountconf_mutable ACMEPROXY_USERNAME)}"
ACMEPROXY_PASSWORD="${ACMEPROXY_PASSWORD:-$(_readaccountconf_mutable ACMEPROXY_PASSWORD)}"
## Check for the endpoint
if [ -z "$ACMEPROXY_ENDPOINT" ]; then
ACMEPROXY_ENDPOINT=""
_err "You didn't specify the endpoint"
_err "Please set them via 'export ACMEPROXY_ENDPOINT=https://ip:port' and try again."
return 1
fi
## Save the credentials to the account file
_saveaccountconf_mutable ACMEPROXY_ENDPOINT "$ACMEPROXY_ENDPOINT"
_saveaccountconf_mutable ACMEPROXY_USERNAME "$ACMEPROXY_USERNAME"
_saveaccountconf_mutable ACMEPROXY_PASSWORD "$ACMEPROXY_PASSWORD"
if [ -z "$ACMEPROXY_USERNAME" ] || [ -z "$ACMEPROXY_PASSWORD" ]; then
_info "ACMEPROXY_USERNAME and/or ACMEPROXY_PASSWORD not set - using without client authentication! Make sure you're using server authentication (e.g. IP-based)"
export _H1="Accept: application/json"
export _H2="Content-Type: application/json"
else
## Base64 encode the credentials
credentials=$(printf "%b" "$ACMEPROXY_USERNAME:$ACMEPROXY_PASSWORD" | _base64)
## Construct the HTTP Authorization header
export _H1="Authorization: Basic $credentials"
export _H2="Accept: application/json"
export _H3="Content-Type: application/json"
fi
## Add the challenge record to the acmeproxy grid member
response="$(_post "{\"fqdn\": \"$fulldomain.\", \"value\": \"$txtvalue\"}" "$ACMEPROXY_ENDPOINT/$action" "" "POST")"
## Let's see if we get something intelligible back from the unit
if echo "$response" | grep "\"$txtvalue\"" >/dev/null; then
_info "Successfully updated the txt record"
return 0
else
_err "Error encountered during record addition"
_err "$response"
return 1
fi
}
#################### Private functions below ##################################

141
dnsapi/dns_active24.sh Executable file
View File

@@ -0,0 +1,141 @@
#!/usr/bin/env sh
#ACTIVE24_Token="sdfsdfsdfljlbjkljlkjsdfoiwje"
ACTIVE24_Api="https://api.active24.com"
######## Public functions #####################
# Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
# Used to add txt record
dns_active24_add() {
fulldomain=$1
txtvalue=$2
_active24_init
_info "Adding txt record"
if _active24_rest POST "dns/$_domain/txt/v1" "{\"name\":\"$_sub_domain\",\"text\":\"$txtvalue\",\"ttl\":0}"; then
if _contains "$response" "errors"; then
_err "Add txt record error."
return 1
else
_info "Added, OK"
return 0
fi
fi
_err "Add txt record error."
return 1
}
# Usage: fulldomain txtvalue
# Used to remove the txt record after validation
dns_active24_rm() {
fulldomain=$1
txtvalue=$2
_active24_init
_debug "Getting txt records"
_active24_rest GET "dns/$_domain/records/v1"
if _contains "$response" "errors"; then
_err "Error"
return 1
fi
hash_ids=$(echo "$response" | _egrep_o "[^{]+${txtvalue}[^}]+" | _egrep_o "hashId\":\"[^\"]+" | cut -c10-)
for hash_id in $hash_ids; do
_debug "Removing hash_id" "$hash_id"
if _active24_rest DELETE "dns/$_domain/$hash_id/v1" ""; then
if _contains "$response" "errors"; then
_err "Unable to remove txt record."
return 1
else
_info "Removed txt record."
return 0
fi
fi
done
_err "No txt records found."
return 1
}
#################### Private functions below ##################################
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
_get_root() {
domain=$1
if ! _active24_rest GET "dns/domains/v1"; then
return 1
fi
i=2
p=1
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug "h" "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
if _contains "$response" "\"$h\"" >/dev/null; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain=$h
return 0
fi
p=$i
i=$(_math "$i" + 1)
done
return 1
}
_active24_rest() {
m=$1
ep="$2"
data="$3"
_debug "$ep"
export _H1="Authorization: Bearer $ACTIVE24_Token"
if [ "$m" != "GET" ]; then
_debug "data" "$data"
response="$(_post "$data" "$ACTIVE24_Api/$ep" "" "$m" "application/json")"
else
response="$(_get "$ACTIVE24_Api/$ep")"
fi
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}
_active24_init() {
ACTIVE24_Token="${ACTIVE24_Token:-$(_readaccountconf_mutable ACTIVE24_Token)}"
if [ -z "$ACTIVE24_Token" ]; then
ACTIVE24_Token=""
_err "You didn't specify a Active24 api token yet."
_err "Please create the token and try again."
return 1
fi
_saveaccountconf_mutable ACTIVE24_Token "$ACTIVE24_Token"
_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"
}

View File

@@ -181,11 +181,12 @@ _describe_records_query() {
_clean() {
_check_exist_query "$_domain" "$_sub_domain"
# do not correct grammar here
if ! _ali_rest "Check exist records" "ignore"; then
return 1
fi
record_id="$(echo "$response" | tr '{' "\n" | grep "$_sub_domain" | grep "$txtvalue" | tr "," "\n" | grep RecordId | cut -d '"' -f 4)"
record_id="$(echo "$response" | tr '{' "\n" | grep "$_sub_domain" | grep -- "$txtvalue" | tr "," "\n" | grep RecordId | cut -d '"' -f 4)"
_debug2 record_id "$record_id"
if [ -z "$record_id" ]; then

150
dnsapi/dns_anx.sh Normal file
View File

@@ -0,0 +1,150 @@
#!/usr/bin/env sh
# Anexia CloudDNS acme.sh hook
# Author: MA
#ANX_Token="xxxx"
ANX_API='https://engine.anexia-it.com/api/clouddns/v1'
######## Public functions #####################
dns_anx_add() {
fulldomain=$1
txtvalue=$2
_info "Using ANX CDNS API"
ANX_Token="${ANX_Token:-$(_readaccountconf_mutable ANX_Token)}"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
if [ "$ANX_Token" ]; then
_saveaccountconf_mutable ANX_Token "$ANX_Token"
else
_err "You didn't specify a ANEXIA Engine API token."
return 1
fi
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "invalid domain"
return 1
fi
# Always add records, wildcard need two records with the same name
_anx_rest POST "zone.json/${_domain}/records" "{\"name\":\"$_sub_domain\",\"type\":\"TXT\",\"rdata\":\"$txtvalue\"}"
if _contains "$response" "$txtvalue"; then
return 0
else
return 1
fi
}
dns_anx_rm() {
fulldomain=$1
txtvalue=$2
_info "Using ANX CDNS API"
ANX_Token="${ANX_Token:-$(_readaccountconf_mutable ANX_Token)}"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "invalid domain"
return 1
fi
_get_record_id
if _is_uuid "$_record_id"; then
if ! _anx_rest DELETE "zone.json/${_domain}/records/$_record_id"; then
_err "Delete record"
return 1
fi
else
_info "No record found."
fi
echo "$response" | tr -d " " | grep \"status\":\"OK\" >/dev/null
}
#################### Private functions below ##################################
_is_uuid() {
pattern='^\{?[A-Z0-9a-z]{8}-[A-Z0-9a-z]{4}-[A-Z0-9a-z]{4}-[A-Z0-9a-z]{4}-[A-Z0-9a-z]{12}\}?$'
if echo "$1" | _egrep_o "$pattern" >/dev/null; then
return 0
fi
return 1
}
_get_record_id() {
_debug subdomain "$_sub_domain"
_debug domain "$_domain"
if _anx_rest GET "zone.json/${_domain}/records?name=$_sub_domain&type=TXT"; then
_debug response "$response"
if _contains "$response" "\"name\":\"$_sub_domain\"" >/dev/null; then
_record_id=$(printf "%s\n" "$response" | _egrep_o "\[.\"identifier\":\"[^\"]*\"" | head -n 1 | cut -d : -f 2 | tr -d \")
else
_record_id=''
fi
else
_err "Search existing record"
fi
}
_anx_rest() {
m=$1
ep="$2"
data="$3"
_debug "$ep"
export _H1="Content-Type: application/json"
export _H2="Authorization: Token $ANX_Token"
if [ "$m" != "GET" ]; then
_debug data "$data"
response="$(_post "$data" "${ANX_API}/$ep" "" "$m")"
else
response="$(_get "${ANX_API}/$ep")"
fi
# shellcheck disable=SC2181
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug response "$response"
return 0
}
_get_root() {
domain=$1
i=1
p=1
_anx_rest GET "zone.json"
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
if _contains "$response" "\"name\":\"$h\""; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain=$h
return 0
fi
p=$i
i=$(_math "$i" + 1)
done
return 1
}

150
dnsapi/dns_arvan.sh Normal file
View File

@@ -0,0 +1,150 @@
#!/usr/bin/env sh
#Arvan_Token="Apikey xxxx"
ARVAN_API_URL="https://napi.arvancloud.com/cdn/4.0/domains"
#Author: Vahid Fardi
#Report Bugs here: https://github.com/Neilpang/acme.sh
#
######## Public functions #####################
#Usage: dns_arvan_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_arvan_add() {
fulldomain=$1
txtvalue=$2
_info "Using Arvan"
Arvan_Token="${Arvan_Token:-$(_readaccountconf_mutable Arvan_Token)}"
if [ -z "$Arvan_Token" ]; then
_err "You didn't specify \"Arvan_Token\" token yet."
_err "You can get yours from here https://npanel.arvancloud.com/profile/api-keys"
return 1
fi
#save the api token to the account conf file.
_saveaccountconf_mutable Arvan_Token "$Arvan_Token"
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_info "Adding record"
if _arvan_rest POST "$_domain/dns-records" "{\"type\":\"TXT\",\"name\":\"$_sub_domain\",\"value\":{\"text\":\"$txtvalue\"},\"ttl\":120}"; then
if _contains "$response" "$txtvalue"; then
_info "response id is $response"
_info "Added, OK"
return 0
elif _contains "$response" "Record Data is Duplicated"; then
_info "Already exists, OK"
return 0
else
_err "Add txt record error."
return 1
fi
fi
_err "Add txt record error."
return 0
}
#Usage: fulldomain txtvalue
#Remove the txt record after validation.
dns_arvan_rm() {
fulldomain=$1
txtvalue=$2
_info "Using Arvan"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
Arvan_Token="${Arvan_Token:-$(_readaccountconf_mutable Arvan_Token)}"
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_debug "Getting txt records"
_arvan_rest GET "${_domain}/dns-records"
if ! printf "%s" "$response" | grep \"current_page\":1 >/dev/null; then
_err "Error on Arvan Api"
_err "Please create a github issue with debbug log"
return 1
fi
_record_id=$(echo "$response" | _egrep_o ".\"id\":\"[^\"]*\",\"type\":\"txt\",\"name\":\"_acme-challenge\",\"value\":{\"text\":\"$txtvalue\"}" | cut -d : -f 2 | cut -d , -f 1 | tr -d \")
if ! _arvan_rest "DELETE" "${_domain}/dns-records/${_record_id}"; then
_err "Error on Arvan Api"
return 1
fi
_debug "$response"
_contains "$response" 'dns record deleted'
return 0
}
#################### Private functions below ##################################
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
_get_root() {
domain=$1
i=2
p=1
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
if ! _arvan_rest GET "$h"; then
return 1
fi
if _contains "$response" "\"domain\":\"$h\""; then
_domain_id=$(echo "$response" | cut -d : -f 3 | cut -d , -f 1 | tr -d \")
if [ "$_domain_id" ]; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain=$h
return 0
fi
return 1
fi
p=$i
i=$(_math "$i" + 1)
done
return 1
}
_arvan_rest() {
mtd="$1"
ep="$2"
data="$3"
token_trimmed=$(echo "$Arvan_Token" | tr -d '"')
export _H1="Authorization: $token_trimmed"
if [ "$mtd" = "DELETE" ]; then
#DELETE Request shouldn't have Content-Type
_debug data "$data"
response="$(_post "$data" "$ARVAN_API_URL/$ep" "" "$mtd")"
elif [ "$mtd" = "POST" ]; then
export _H2="Content-Type: application/json"
_debug data "$data"
response="$(_post "$data" "$ARVAN_API_URL/$ep" "" "$mtd")"
else
response="$(_get "$ARVAN_API_URL/$ep$data")"
fi
return 0
}

171
dnsapi/dns_aurora.sh Normal file
View File

@@ -0,0 +1,171 @@
#!/usr/bin/env sh
#
#AURORA_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
#
#AURORA_Secret="sdfsdfsdfljlbjkljlkjsdfoiwje"
AURORA_Api="https://api.auroradns.eu"
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_aurora_add() {
fulldomain=$1
txtvalue=$2
AURORA_Key="${AURORA_Key:-$(_readaccountconf_mutable AURORA_Key)}"
AURORA_Secret="${AURORA_Secret:-$(_readaccountconf_mutable AURORA_Secret)}"
if [ -z "$AURORA_Key" ] || [ -z "$AURORA_Secret" ]; then
AURORA_Key=""
AURORA_Secret=""
_err "You didn't specify an Aurora api key and secret yet."
_err "You can get yours from here https://cp.pcextreme.nl/auroradns/users."
return 1
fi
#save the api key and secret to the account conf file.
_saveaccountconf_mutable AURORA_Key "$AURORA_Key"
_saveaccountconf_mutable AURORA_Secret "$AURORA_Secret"
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_info "Adding record"
if _aurora_rest POST "zones/$_domain_id/records" "{\"type\":\"TXT\",\"name\":\"$_sub_domain\",\"content\":\"$txtvalue\",\"ttl\":300}"; then
if _contains "$response" "$txtvalue"; then
_info "Added, OK"
return 0
elif _contains "$response" "RecordExistsError"; then
_info "Already exists, OK"
return 0
else
_err "Add txt record error."
return 1
fi
fi
_err "Add txt record error."
return 1
}
#fulldomain txtvalue
dns_aurora_rm() {
fulldomain=$1
txtvalue=$2
AURORA_Key="${AURORA_Key:-$(_readaccountconf_mutable AURORA_Key)}"
AURORA_Secret="${AURORA_Secret:-$(_readaccountconf_mutable AURORA_Secret)}"
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_debug "Getting records"
_aurora_rest GET "zones/${_domain_id}/records"
if ! _contains "$response" "$txtvalue"; then
_info "Don't need to remove."
else
records=$(echo "$response" | _normalizeJson | tr -d "[]" | sed "s/},{/}|{/g" | tr "|" "\n")
if [ "$(echo "$records" | wc -l)" -le 2 ]; then
_err "Can not parse records."
return 1
fi
record_id=$(echo "$records" | grep "\"type\": *\"TXT\"" | grep "\"name\": *\"$_sub_domain\"" | grep "\"content\": *\"$txtvalue\"" | _egrep_o "\"id\": *\"[^\"]*\"" | cut -d : -f 2 | tr -d \" | _head_n 1 | tr -d " ")
_debug "record_id" "$record_id"
if [ -z "$record_id" ]; then
_err "Can not get record id to remove."
return 1
fi
if ! _aurora_rest DELETE "zones/$_domain_id/records/$record_id"; then
_err "Delete record error."
return 1
fi
fi
return 0
}
#################### Private functions below ##################################
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
_get_root() {
domain=$1
i=1
p=1
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
if ! _aurora_rest GET "zones/$h"; then
return 1
fi
if _contains "$response" "\"name\": \"$h\""; then
_domain_id=$(echo "$response" | _normalizeJson | tr -d "{}" | tr "," "\n" | grep "\"id\": *\"" | cut -d : -f 2 | tr -d \" | _head_n 1 | tr -d " ")
_debug _domain_id "$_domain_id"
if [ "$_domain_id" ]; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain=$h
return 0
fi
return 1
fi
p=$i
i=$(_math "$i" + 1)
done
return 1
}
_aurora_rest() {
m=$1
ep="$2"
data="$3"
_debug "$ep"
key_trimmed=$(echo "$AURORA_Key" | tr -d '"')
secret_trimmed=$(echo "$AURORA_Secret" | tr -d '"')
timestamp=$(date -u +"%Y%m%dT%H%M%SZ")
signature=$(printf "%s/%s%s" "$m" "$ep" "$timestamp" | _hmac sha256 "$(printf "%s" "$secret_trimmed" | _hex_dump | tr -d " ")" | _base64)
authorization=$(printf "AuroraDNSv1 %s" "$(printf "%s:%s" "$key_trimmed" "$signature" | _base64)")
export _H1="Content-Type: application/json; charset=UTF-8"
export _H2="X-AuroraDNS-Date: $timestamp"
export _H3="Authorization: $authorization"
if [ "$m" != "GET" ]; then
_debug data "$data"
response="$(_post "$data" "$AURORA_Api/$ep" "" "$m")"
else
response="$(_get "$AURORA_Api/$ep")"
fi
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}

View File

@@ -6,11 +6,13 @@
#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"
AWS_WIKI="https://github.com/Neilpang/acme.sh/wiki/How-to-use-Amazon-Route53-API"
AWS_WIKI="https://github.com/acmesh-official/acme.sh/wiki/How-to-use-Amazon-Route53-API"
######## Public functions #####################
@@ -21,29 +23,40 @@ dns_aws_add() {
AWS_ACCESS_KEY_ID="${AWS_ACCESS_KEY_ID:-$(_readaccountconf_mutable AWS_ACCESS_KEY_ID)}"
AWS_SECRET_ACCESS_KEY="${AWS_SECRET_ACCESS_KEY:-$(_readaccountconf_mutable AWS_SECRET_ACCESS_KEY)}"
AWS_DNS_SLOWRATE="${AWS_DNS_SLOWRATE:-$(_readaccountconf_mutable AWS_DNS_SLOWRATE)}"
if [ -z "$AWS_ACCESS_KEY_ID" ] || [ -z "$AWS_SECRET_ACCESS_KEY" ]; then
_use_container_role || _use_instance_role
fi
if [ -z "$AWS_ACCESS_KEY_ID" ] || [ -z "$AWS_SECRET_ACCESS_KEY" ]; then
AWS_ACCESS_KEY_ID=""
AWS_SECRET_ACCESS_KEY=""
_err "You don't specify aws route53 api key id and and api key secret yet."
_err "You haven't specified the aws route53 api key id and and api key secret yet."
_err "Please create your key and try again. see $(__green $AWS_WIKI)"
return 1
fi
#save for future use
#save for future use, unless using a role which will be fetched as needed
if [ -z "$_using_role" ]; then
_saveaccountconf_mutable AWS_ACCESS_KEY_ID "$AWS_ACCESS_KEY_ID"
_saveaccountconf_mutable AWS_SECRET_ACCESS_KEY "$AWS_SECRET_ACCESS_KEY"
_saveaccountconf_mutable AWS_DNS_SLOWRATE "$AWS_DNS_SLOWRATE"
fi
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "invalid domain"
_sleep 1
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_info "Geting existing records for $fulldomain"
_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
@@ -55,7 +68,8 @@ dns_aws_add() {
fi
if [ "$_resource_record" ] && _contains "$response" "$txtvalue"; then
_info "The txt record already exists, skip"
_info "The TXT record already exists. Skipping."
_sleep 1
return 0
fi
@@ -64,10 +78,17 @@ dns_aws_add() {
_aws_tmpl_xml="<ChangeResourceRecordSetsRequest xmlns=\"https://route53.amazonaws.com/doc/2013-04-01/\"><ChangeBatch><Changes><Change><Action>UPSERT</Action><ResourceRecordSet><Name>$fulldomain</Name><Type>TXT</Type><TTL>300</TTL><ResourceRecords>$_resource_record<ResourceRecord><Value>\"$txtvalue\"</Value></ResourceRecord></ResourceRecords></ResourceRecordSet></Change></Changes></ChangeBatch></ChangeResourceRecordSetsRequest>"
if aws_rest POST "2013-04-01$_domain_id/rrset/" "" "$_aws_tmpl_xml" && _contains "$response" "ChangeResourceRecordSetsResponse"; then
_info "txt record updated success."
return 0
_info "TXT record updated successfully."
if [ -n "$AWS_DNS_SLOWRATE" ]; then
_info "Slow rate activated: sleeping for $AWS_DNS_SLOWRATE seconds"
_sleep "$AWS_DNS_SLOWRATE"
else
_sleep 1
fi
return 0
fi
_sleep 1
return 1
}
@@ -78,17 +99,25 @@ dns_aws_rm() {
AWS_ACCESS_KEY_ID="${AWS_ACCESS_KEY_ID:-$(_readaccountconf_mutable AWS_ACCESS_KEY_ID)}"
AWS_SECRET_ACCESS_KEY="${AWS_SECRET_ACCESS_KEY:-$(_readaccountconf_mutable AWS_SECRET_ACCESS_KEY)}"
AWS_DNS_SLOWRATE="${AWS_DNS_SLOWRATE:-$(_readaccountconf_mutable AWS_DNS_SLOWRATE)}"
if [ -z "$AWS_ACCESS_KEY_ID" ] || [ -z "$AWS_SECRET_ACCESS_KEY" ]; then
_use_container_role || _use_instance_role
fi
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "invalid domain"
_sleep 1
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_info "Geting existing records for $fulldomain"
_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
@@ -96,17 +125,25 @@ dns_aws_rm() {
_resource_record="$(echo "$response" | sed 's/<ResourceRecordSet>/"/g' | tr '"' "\n" | grep "<Name>$fulldomain.</Name>" | _egrep_o "<ResourceRecords.*</ResourceRecords>" | sed "s/<ResourceRecords>//" | sed "s#</ResourceRecords>##")"
_debug "_resource_record" "$_resource_record"
else
_debug "no records exists, skip"
_debug "no records exist, skip"
_sleep 1
return 0
fi
_aws_tmpl_xml="<ChangeResourceRecordSetsRequest xmlns=\"https://route53.amazonaws.com/doc/2013-04-01/\"><ChangeBatch><Changes><Change><Action>DELETE</Action><ResourceRecordSet><ResourceRecords>$_resource_record</ResourceRecords><Name>$fulldomain.</Name><Type>TXT</Type><TTL>300</TTL></ResourceRecordSet></Change></Changes></ChangeBatch></ChangeResourceRecordSetsRequest>"
if aws_rest POST "2013-04-01$_domain_id/rrset/" "" "$_aws_tmpl_xml" && _contains "$response" "ChangeResourceRecordSetsResponse"; then
_info "txt record deleted success."
return 0
_info "TXT record deleted successfully."
if [ -n "$AWS_DNS_SLOWRATE" ]; then
_info "Slow rate activated: sleeping for $AWS_DNS_SLOWRATE seconds"
_sleep "$AWS_DNS_SLOWRATE"
else
_sleep 1
fi
return 0
fi
_sleep 1
return 1
}
@@ -151,7 +188,7 @@ _get_root() {
_domain=$h
return 0
fi
_err "Can not find domain id: $h"
_err "Can't find domain with id: $h"
return 1
fi
fi
@@ -162,6 +199,55 @@ _get_root() {
return 1
}
_use_container_role() {
# automatically set if running inside ECS
if [ -z "$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" ]; then
_debug "No ECS environment variable detected"
return 1
fi
_use_metadata "169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"
}
_use_instance_role() {
_url="http://169.254.169.254/latest/meta-data/iam/security-credentials/"
_debug "_url" "$_url"
if ! _get "$_url" true 1 | _head_n 1 | grep -Fq 200; then
_debug "Unable to fetch IAM role from instance metadata"
return 1
fi
_aws_role=$(_get "$_url" "" 1)
_debug "_aws_role" "$_aws_role"
_use_metadata "$_url$_aws_role"
}
_use_metadata() {
_aws_creds="$(
_get "$1" "" 1 |
_normalizeJson |
tr '{,}' '\n' |
while read -r _line; do
_key="$(echo "${_line%%:*}" | tr -d '"')"
_value="${_line#*:}"
_debug3 "_key" "$_key"
_secure_debug3 "_value" "$_value"
case "$_key" in
AccessKeyId) echo "AWS_ACCESS_KEY_ID=$_value" ;;
SecretAccessKey) echo "AWS_SECRET_ACCESS_KEY=$_value" ;;
Token) echo "AWS_SESSION_TOKEN=$_value" ;;
esac
done |
paste -sd' ' -
)"
_secure_debug "_aws_creds" "$_aws_creds"
if [ -z "$_aws_creds" ]; then
return 1
fi
eval "$_aws_creds"
_using_role=true
}
#method uri qstr data
aws_rest() {
mtd="$1"

204
dnsapi/dns_azion.sh Normal file
View File

@@ -0,0 +1,204 @@
#!/usr/bin/env sh
#
#AZION_Email=""
#AZION_Password=""
#
AZION_Api="https://api.azionapi.net"
######## Public functions ########
# Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
# Used to add txt record
dns_azion_add() {
fulldomain=$1
txtvalue=$2
_debug "Detect the root zone"
if ! _get_root "$fulldomain"; then
_err "Domain not found"
return 1
fi
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_debug _domain_id "$_domain_id"
_info "Add or update record"
_get_record "$_domain_id" "$_sub_domain"
if [ "$record_id" ]; then
_payload="{\"record_type\": \"TXT\", \"entry\": \"$_sub_domain\", \"answers_list\": [$answers_list, \"$txtvalue\"], \"ttl\": 20}"
if _azion_rest PUT "intelligent_dns/$_domain_id/records/$record_id" "$_payload"; then
if _contains "$response" "$txtvalue"; then
_info "Record updated."
return 0
fi
fi
else
_payload="{\"record_type\": \"TXT\", \"entry\": \"$_sub_domain\", \"answers_list\": [\"$txtvalue\"], \"ttl\": 20}"
if _azion_rest POST "intelligent_dns/$_domain_id/records" "$_payload"; then
if _contains "$response" "$txtvalue"; then
_info "Record added."
return 0
fi
fi
fi
_err "Failed to add or update record."
return 1
}
# Usage: fulldomain txtvalue
# Used to remove the txt record after validation
dns_azion_rm() {
fulldomain=$1
txtvalue=$2
_debug "Detect the root zone"
if ! _get_root "$fulldomain"; then
_err "Domain not found"
return 1
fi
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_debug _domain_id "$_domain_id"
_info "Removing record"
_get_record "$_domain_id" "$_sub_domain"
if [ "$record_id" ]; then
if _azion_rest DELETE "intelligent_dns/$_domain_id/records/$record_id"; then
_info "Record removed."
return 0
else
_err "Failed to remove record."
return 1
fi
else
_info "Record not found or already removed."
return 0
fi
}
#################### Private functions below ##################################
# Usage: _acme-challenge.www.domain.com
# returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
_get_root() {
domain=$1
i=1
p=1
if ! _azion_rest GET "intelligent_dns"; then
return 1
fi
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
# not valid
return 1
fi
if _contains "$response" "\"domain\":\"$h\""; then
_domain_id=$(echo "$response" | tr '{' "\n" | grep "\"domain\":\"$h\"" | _egrep_o "\"id\":[0-9]*" | _head_n 1 | cut -d : -f 2 | tr -d \")
_debug _domain_id "$_domain_id"
if [ "$_domain_id" ]; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain=$h
return 0
fi
return 1
fi
p=$i
i=$(_math "$i" + 1)
done
return 1
}
_get_record() {
_domain_id=$1
_record=$2
if ! _azion_rest GET "intelligent_dns/$_domain_id/records"; then
return 1
fi
if _contains "$response" "\"entry\":\"$_record\""; then
_json_record=$(echo "$response" | tr '{' "\n" | grep "\"entry\":\"$_record\"")
if [ "$_json_record" ]; then
record_id=$(echo "$_json_record" | _egrep_o "\"record_id\":[0-9]*" | _head_n 1 | cut -d : -f 2 | tr -d \")
answers_list=$(echo "$_json_record" | _egrep_o "\"answers_list\":\[.*\]" | _head_n 1 | cut -d : -f 2 | tr -d \[\])
return 0
fi
return 1
fi
return 1
}
_get_token() {
AZION_Email="${AZION_Email:-$(_readaccountconf_mutable AZION_Email)}"
AZION_Password="${AZION_Password:-$(_readaccountconf_mutable AZION_Password)}"
if ! _contains "$AZION_Email" "@"; then
_err "It seems that the AZION_Email is not a valid email address. Revalidate your environments."
return 1
fi
if [ -z "$AZION_Email" ] || [ -z "$AZION_Password" ]; then
_err "You didn't specified a AZION_Email/AZION_Password to generate Azion token."
return 1
fi
_saveaccountconf_mutable AZION_Email "$AZION_Email"
_saveaccountconf_mutable AZION_Password "$AZION_Password"
_basic_auth=$(printf "%s:%s" "$AZION_Email" "$AZION_Password" | _base64)
_debug _basic_auth "$_basic_auth"
export _H1="Accept: application/json; version=3"
export _H2="Content-Type: application/json"
export _H3="Authorization: Basic $_basic_auth"
response="$(_post "" "$AZION_Api/tokens" "" "POST")"
if _contains "$response" "\"token\":\"" >/dev/null; then
_azion_token=$(echo "$response" | _egrep_o "\"token\":\"[^\"]*\"" | cut -d : -f 2 | tr -d \")
export AZION_Token="$_azion_token"
else
_err "Failed to generate Azion token"
return 1
fi
}
_azion_rest() {
_method=$1
_uri="$2"
_data="$3"
if [ -z "$AZION_Token" ]; then
_get_token
fi
_debug2 token "$AZION_Token"
export _H1="Accept: application/json; version=3"
export _H2="Content-Type: application/json"
export _H3="Authorization: token $AZION_Token"
if [ "$_method" != "GET" ]; then
_debug _data "$_data"
response="$(_post "$_data" "$AZION_Api/$_uri" "" "$_method")"
else
response="$(_get "$AZION_Api/$_uri")"
fi
_debug2 response "$response"
if [ "$?" != "0" ]; then
_err "error $_method $_uri $_data"
return 1
fi
return 0
}

View File

@@ -1,5 +1,7 @@
#!/usr/bin/env sh
WIKI="https://github.com/acmesh-official/acme.sh/wiki/How-to-use-Azure-DNS"
######## Public functions #####################
# Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
@@ -7,23 +9,36 @@
#
# Ref: https://docs.microsoft.com/en-us/rest/api/dns/recordsets/createorupdate
#
dns_azure_add() {
fulldomain=$1
txtvalue=$2
AZUREDNS_SUBSCRIPTIONID="${AZUREDNS_SUBSCRIPTIONID:-$(_readaccountconf_mutable AZUREDNS_SUBSCRIPTIONID)}"
AZUREDNS_TENANTID="${AZUREDNS_TENANTID:-$(_readaccountconf_mutable AZUREDNS_TENANTID)}"
AZUREDNS_APPID="${AZUREDNS_APPID:-$(_readaccountconf_mutable AZUREDNS_APPID)}"
AZUREDNS_CLIENTSECRET="${AZUREDNS_CLIENTSECRET:-$(_readaccountconf_mutable AZUREDNS_CLIENTSECRET)}"
if [ -z "$AZUREDNS_SUBSCRIPTIONID" ]; then
AZUREDNS_SUBSCRIPTIONID=""
AZUREDNS_TENANTID=""
AZUREDNS_APPID=""
AZUREDNS_CLIENTSECRET=""
_err "You didn't specify the Azure Subscription ID "
_err "You didn't specify the Azure Subscription ID"
return 1
fi
#save subscription id to account conf file.
_saveaccountconf_mutable AZUREDNS_SUBSCRIPTIONID "$AZUREDNS_SUBSCRIPTIONID"
AZUREDNS_MANAGEDIDENTITY="${AZUREDNS_MANAGEDIDENTITY:-$(_readaccountconf_mutable AZUREDNS_MANAGEDIDENTITY)}"
if [ "$AZUREDNS_MANAGEDIDENTITY" = true ]; then
_info "Using Azure managed identity"
#save managed identity as preferred authentication method, clear service principal credentials from conf file.
_saveaccountconf_mutable AZUREDNS_MANAGEDIDENTITY "$AZUREDNS_MANAGEDIDENTITY"
_saveaccountconf_mutable AZUREDNS_TENANTID ""
_saveaccountconf_mutable AZUREDNS_APPID ""
_saveaccountconf_mutable AZUREDNS_CLIENTSECRET ""
else
_info "You didn't ask to use Azure managed identity, checking service principal credentials"
AZUREDNS_TENANTID="${AZUREDNS_TENANTID:-$(_readaccountconf_mutable AZUREDNS_TENANTID)}"
AZUREDNS_APPID="${AZUREDNS_APPID:-$(_readaccountconf_mutable AZUREDNS_APPID)}"
AZUREDNS_CLIENTSECRET="${AZUREDNS_CLIENTSECRET:-$(_readaccountconf_mutable AZUREDNS_CLIENTSECRET)}"
if [ -z "$AZUREDNS_TENANTID" ]; then
AZUREDNS_SUBSCRIPTIONID=""
@@ -51,13 +66,15 @@ dns_azure_add() {
_err "You didn't specify the Azure Client Secret"
return 1
fi
#save account details to account conf file.
_saveaccountconf_mutable AZUREDNS_SUBSCRIPTIONID "$AZUREDNS_SUBSCRIPTIONID"
#save account details to account conf file, don't opt in for azure manages identity check.
_saveaccountconf_mutable AZUREDNS_MANAGEDIDENTITY "false"
_saveaccountconf_mutable AZUREDNS_TENANTID "$AZUREDNS_TENANTID"
_saveaccountconf_mutable AZUREDNS_APPID "$AZUREDNS_APPID"
_saveaccountconf_mutable AZUREDNS_CLIENTSECRET "$AZUREDNS_CLIENTSECRET"
fi
accesstoken=$(_azure_getaccess_token "$AZUREDNS_TENANTID" "$AZUREDNS_APPID" "$AZUREDNS_CLIENTSECRET")
accesstoken=$(_azure_getaccess_token "$AZUREDNS_MANAGEDIDENTITY" "$AZUREDNS_TENANTID" "$AZUREDNS_APPID" "$AZUREDNS_CLIENTSECRET")
if ! _get_root "$fulldomain" "$AZUREDNS_SUBSCRIPTIONID" "$accesstoken"; then
_err "invalid domain"
@@ -69,12 +86,37 @@ dns_azure_add() {
acmeRecordURI="https://management.azure.com$(printf '%s' "$_domain_id" | sed 's/\\//g')/TXT/$_sub_domain?api-version=2017-09-01"
_debug "$acmeRecordURI"
body="{\"properties\": {\"TTL\": 3600, \"TXTRecords\": [{\"value\": [\"$txtvalue\"]}]}}"
# Get existing TXT record
_azure_rest GET "$acmeRecordURI" "" "$accesstoken"
values="{\"value\":[\"$txtvalue\"]}"
timestamp="$(_time)"
if [ "$_code" = "200" ]; then
vlist="$(echo "$response" | _egrep_o "\"value\"\\s*:\\s*\\[\\s*\"[^\"]*\"\\s*]" | cut -d : -f 2 | tr -d "[]\"")"
_debug "existing TXT found"
_debug "$vlist"
existingts="$(echo "$response" | _egrep_o "\"acmetscheck\"\\s*:\\s*\"[^\"]*\"" | _head_n 1 | cut -d : -f 2 | tr -d "\"")"
if [ -z "$existingts" ]; then
# the record was not created by acme.sh. Copy the exisiting entires
existingts=$timestamp
fi
_diff="$(_math "$timestamp - $existingts")"
_debug "existing txt age: $_diff"
# only use recently added records and discard if older than 2 hours because they are probably orphaned
if [ "$_diff" -lt 7200 ]; then
_debug "existing txt value: $vlist"
for v in $vlist; do
values="$values ,{\"value\":[\"$v\"]}"
done
fi
fi
# Add the txtvalue TXT Record
body="{\"properties\":{\"metadata\":{\"acmetscheck\":\"$timestamp\"},\"TTL\":10, \"TXTRecords\":[$values]}}"
_azure_rest PUT "$acmeRecordURI" "$body" "$accesstoken"
if [ "$_code" = "200" ] || [ "$_code" = '201' ]; then
_info "validation record added"
_info "validation value added"
return 0
else
_err "error adding validation record ($_code)"
_err "error adding validation value ($_code)"
return 1
fi
}
@@ -89,10 +131,6 @@ dns_azure_rm() {
txtvalue=$2
AZUREDNS_SUBSCRIPTIONID="${AZUREDNS_SUBSCRIPTIONID:-$(_readaccountconf_mutable AZUREDNS_SUBSCRIPTIONID)}"
AZUREDNS_TENANTID="${AZUREDNS_TENANTID:-$(_readaccountconf_mutable AZUREDNS_TENANTID)}"
AZUREDNS_APPID="${AZUREDNS_APPID:-$(_readaccountconf_mutable AZUREDNS_APPID)}"
AZUREDNS_CLIENTSECRET="${AZUREDNS_CLIENTSECRET:-$(_readaccountconf_mutable AZUREDNS_CLIENTSECRET)}"
if [ -z "$AZUREDNS_SUBSCRIPTIONID" ]; then
AZUREDNS_SUBSCRIPTIONID=""
AZUREDNS_TENANTID=""
@@ -102,6 +140,15 @@ dns_azure_rm() {
return 1
fi
AZUREDNS_MANAGEDIDENTITY="${AZUREDNS_MANAGEDIDENTITY:-$(_readaccountconf_mutable AZUREDNS_MANAGEDIDENTITY)}"
if [ "$AZUREDNS_MANAGEDIDENTITY" = true ]; then
_info "Using Azure managed identity"
else
_info "You didn't ask to use Azure managed identity, checking service principal credentials"
AZUREDNS_TENANTID="${AZUREDNS_TENANTID:-$(_readaccountconf_mutable AZUREDNS_TENANTID)}"
AZUREDNS_APPID="${AZUREDNS_APPID:-$(_readaccountconf_mutable AZUREDNS_APPID)}"
AZUREDNS_CLIENTSECRET="${AZUREDNS_CLIENTSECRET:-$(_readaccountconf_mutable AZUREDNS_CLIENTSECRET)}"
if [ -z "$AZUREDNS_TENANTID" ]; then
AZUREDNS_SUBSCRIPTIONID=""
AZUREDNS_TENANTID=""
@@ -128,8 +175,9 @@ dns_azure_rm() {
_err "You didn't specify the Azure Client Secret"
return 1
fi
fi
accesstoken=$(_azure_getaccess_token "$AZUREDNS_TENANTID" "$AZUREDNS_APPID" "$AZUREDNS_CLIENTSECRET")
accesstoken=$(_azure_getaccess_token "$AZUREDNS_MANAGEDIDENTITY" "$AZUREDNS_TENANTID" "$AZUREDNS_APPID" "$AZUREDNS_CLIENTSECRET")
if ! _get_root "$fulldomain" "$AZUREDNS_SUBSCRIPTIONID" "$accesstoken"; then
_err "invalid domain"
@@ -141,7 +189,20 @@ dns_azure_rm() {
acmeRecordURI="https://management.azure.com$(printf '%s' "$_domain_id" | sed 's/\\//g')/TXT/$_sub_domain?api-version=2017-09-01"
_debug "$acmeRecordURI"
body="{\"properties\": {\"TTL\": 3600, \"TXTRecords\": [{\"value\": [\"$txtvalue\"]}]}}"
# Get existing TXT record
_azure_rest GET "$acmeRecordURI" "" "$accesstoken"
timestamp="$(_time)"
if [ "$_code" = "200" ]; then
vlist="$(echo "$response" | _egrep_o "\"value\"\\s*:\\s*\\[\\s*\"[^\"]*\"\\s*]" | cut -d : -f 2 | tr -d "[]\"" | grep -v -- "$txtvalue")"
values=""
comma=""
for v in $vlist; do
values="$values$comma{\"value\":[\"$v\"]}"
comma=","
done
if [ -z "$values" ]; then
# No values left remove record
_debug "removing validation record completely $acmeRecordURI"
_azure_rest DELETE "$acmeRecordURI" "" "$accesstoken"
if [ "$_code" = "200" ] || [ "$_code" = '204' ]; then
_info "validation record removed"
@@ -149,6 +210,19 @@ dns_azure_rm() {
_err "error removing validation record ($_code)"
return 1
fi
else
# Remove only txtvalue from the TXT Record
body="{\"properties\":{\"metadata\":{\"acmetscheck\":\"$timestamp\"},\"TTL\":10, \"TXTRecords\":[$values]}}"
_azure_rest PUT "$acmeRecordURI" "$body" "$accesstoken"
if [ "$_code" = "200" ] || [ "$_code" = '201' ]; then
_info "validation value removed"
return 0
else
_err "error removing validation value ($_code)"
return 1
fi
fi
fi
}
################### Private functions below ##################################
@@ -159,52 +233,103 @@ _azure_rest() {
data="$3"
accesstoken="$4"
MAX_REQUEST_RETRY_TIMES=5
_request_retry_times=0
while [ "${_request_retry_times}" -lt "$MAX_REQUEST_RETRY_TIMES" ]; do
_debug3 _request_retry_times "$_request_retry_times"
export _H1="authorization: Bearer $accesstoken"
export _H2="accept: application/json"
export _H3="Content-Type: application/json"
# clear headers from previous request to avoid getting wrong http code on timeouts
: >"$HTTP_HEADER"
_debug "$ep"
if [ "$m" != "GET" ]; then
_debug data "$data"
_secure_debug2 "data $data"
response="$(_post "$data" "$ep" "" "$m")"
else
response="$(_get "$ep")"
fi
_debug2 response "$response"
_code="$(grep "^HTTP" "$HTTP_HEADER" | _tail_n 1 | cut -d " " -f 2 | tr -d "\r\n")"
_debug2 "http response code $_code"
if [ "$?" != "0" ]; then
_err "error $ep"
_ret="$?"
_secure_debug2 "response $response"
_code="$(grep "^HTTP" "$HTTP_HEADER" | _tail_n 1 | cut -d " " -f 2 | tr -d "\\r\\n")"
_debug "http response code $_code"
if [ "$_code" = "401" ]; then
# we have an invalid access token set to expired
_saveaccountconf_mutable AZUREDNS_TOKENVALIDTO "0"
_err "access denied make sure your Azure settings are correct. See $WIKI"
return 1
fi
# See https://docs.microsoft.com/en-us/azure/architecture/best-practices/retry-service-specific#general-rest-and-retry-guidelines for retryable HTTP codes
if [ "$_ret" != "0" ] || [ -z "$_code" ] || [ "$_code" = "408" ] || [ "$_code" = "500" ] || [ "$_code" = "503" ] || [ "$_code" = "504" ]; then
_request_retry_times="$(_math "$_request_retry_times" + 1)"
_info "REST call error $_code retrying $ep in $_request_retry_times s"
_sleep "$_request_retry_times"
continue
fi
break
done
if [ "$_request_retry_times" = "$MAX_REQUEST_RETRY_TIMES" ]; then
_err "Error Azure REST called was retried $MAX_REQUEST_RETRY_TIMES times."
_err "Calling $ep failed."
return 1
fi
response="$(echo "$response" | _normalizeJson)"
return 0
}
## Ref: https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-oauth-service-to-service#request-an-access-token
_azure_getaccess_token() {
TENANTID=$1
clientID=$2
clientSecret=$3
managedIdentity=$1
tenantID=$2
clientID=$3
clientSecret=$4
accesstoken="${AZUREDNS_BEARERTOKEN:-$(_readaccountconf_mutable AZUREDNS_BEARERTOKEN)}"
expires_on="${AZUREDNS_TOKENVALIDTO:-$(_readaccountconf_mutable AZUREDNS_TOKENVALIDTO)}"
# can we reuse the bearer token?
if [ -n "$accesstoken" ] && [ -n "$expires_on" ]; then
if [ "$(_time)" -lt "$expires_on" ]; then
# brearer token is still valid - reuse it
_debug "reusing bearer token"
printf "%s" "$accesstoken"
return 0
else
_debug "bearer token expired"
fi
fi
_debug "getting new bearer token"
if [ "$managedIdentity" = true ]; then
# https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-use-vm-token#get-a-token-using-http
export _H1="Metadata: true"
response="$(_get http://169.254.169.254/metadata/identity/oauth2/token\?api-version=2018-02-01\&resource=https://management.azure.com/)"
response="$(echo "$response" | _normalizeJson)"
accesstoken=$(echo "$response" | _egrep_o "\"access_token\":\"[^\"]*\"" | _head_n 1 | cut -d : -f 2 | tr -d \")
expires_on=$(echo "$response" | _egrep_o "\"expires_on\":\"[^\"]*\"" | _head_n 1 | cut -d : -f 2 | tr -d \")
else
export _H1="accept: application/json"
export _H2="Content-Type: application/x-www-form-urlencoded"
body="resource=$(printf "%s" 'https://management.core.windows.net/' | _url_encode)&client_id=$(printf "%s" "$clientID" | _url_encode)&client_secret=$(printf "%s" "$clientSecret" | _url_encode)&grant_type=client_credentials"
_debug data "$body"
response="$(_post "$body" "https://login.windows.net/$TENANTID/oauth2/token" "" "POST")"
_secure_debug2 "data $body"
response="$(_post "$body" "https://login.microsoftonline.com/$tenantID/oauth2/token" "" "POST")"
_ret="$?"
_secure_debug2 "response $response"
response="$(echo "$response" | _normalizeJson)"
accesstoken=$(echo "$response" | _egrep_o "\"access_token\":\"[^\"]*\"" | _head_n 1 | cut -d : -f 2 | tr -d \")
_debug2 "response $response"
expires_on=$(echo "$response" | _egrep_o "\"expires_on\":\"[^\"]*\"" | _head_n 1 | cut -d : -f 2 | tr -d \")
fi
if [ -z "$accesstoken" ]; then
_err "no acccess token received"
_err "no acccess token received. Check your Azure settings see $WIKI"
return 1
fi
if [ "$?" != "0" ]; then
if [ "$_ret" != "0" ]; then
_err "error $response"
return 1
fi
_saveaccountconf_mutable AZUREDNS_BEARERTOKEN "$accesstoken"
_saveaccountconf_mutable AZUREDNS_TOKENVALIDTO "$expires_on"
printf "%s" "$accesstoken"
return 0
}
@@ -213,7 +338,7 @@ _get_root() {
domain=$1
subscriptionId=$2
accesstoken=$3
i=2
i=1
p=1
## Ref: https://docs.microsoft.com/en-us/rest/api/dns/zones/list
@@ -221,9 +346,8 @@ _get_root() {
## (ZoneListResult with continuation token for the next page of results)
## Per https://docs.microsoft.com/en-us/azure/azure-subscription-service-limits#dns-limits you are limited to 100 Zone/subscriptions anyways
##
_azure_rest GET "https://management.azure.com/subscriptions/$subscriptionId/providers/Microsoft.Network/dnszones?api-version=2017-09-01" "" "$accesstoken"
# Find matching domain name is Json response
_azure_rest GET "https://management.azure.com/subscriptions/$subscriptionId/providers/Microsoft.Network/dnszones?\$top=500&api-version=2017-09-01" "" "$accesstoken"
# Find matching domain name in Json response
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug2 "Checking domain: $h"
@@ -234,9 +358,14 @@ _get_root() {
fi
if _contains "$response" "\"name\":\"$h\"" >/dev/null; then
_domain_id=$(echo "$response" | _egrep_o "\{\"id\":\"[^\"]*$h\"" | head -n 1 | cut -d : -f 2 | tr -d \")
_domain_id=$(echo "$response" | _egrep_o "\\{\"id\":\"[^\"]*\\/$h\"" | head -n 1 | cut -d : -f 2 | tr -d \")
if [ "$_domain_id" ]; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
if [ "$i" = 1 ]; then
#create the record at the domain apex (@) if only the domain name was provided as --domain-alias
_sub_domain="@"
else
_sub_domain=$(echo "$domain" | cut -d . -f 1-$p)
fi
_domain=$h
return 0
fi

View File

@@ -5,6 +5,10 @@
#
#CF_Email="xxxx@sss.com"
#CF_Token="xxxx"
#CF_Account_ID="xxxx"
#CF_Zone_ID="xxxx"
CF_Api="https://api.cloudflare.com/client/v4"
######## Public functions #####################
@@ -14,13 +18,28 @@ dns_cf_add() {
fulldomain=$1
txtvalue=$2
CF_Token="${CF_Token:-$(_readaccountconf_mutable CF_Token)}"
CF_Account_ID="${CF_Account_ID:-$(_readaccountconf_mutable CF_Account_ID)}"
CF_Zone_ID="${CF_Zone_ID:-$(_readaccountconf_mutable CF_Zone_ID)}"
CF_Key="${CF_Key:-$(_readaccountconf_mutable CF_Key)}"
CF_Email="${CF_Email:-$(_readaccountconf_mutable CF_Email)}"
if [ "$CF_Token" ]; then
if [ "$CF_Zone_ID" ]; then
_savedomainconf CF_Token "$CF_Token"
_savedomainconf CF_Account_ID "$CF_Account_ID"
_savedomainconf CF_Zone_ID "$CF_Zone_ID"
else
_saveaccountconf_mutable CF_Token "$CF_Token"
_saveaccountconf_mutable CF_Account_ID "$CF_Account_ID"
_saveaccountconf_mutable CF_Zone_ID "$CF_Zone_ID"
fi
else
if [ -z "$CF_Key" ] || [ -z "$CF_Email" ]; then
CF_Key=""
CF_Email=""
_err "You don't specify cloudflare api key and email yet."
_err "Please create you key and try again."
_err "You didn't specify a Cloudflare api key and email yet."
_err "You can get yours from here https://dash.cloudflare.com/profile."
return 1
fi
@@ -29,10 +48,10 @@ dns_cf_add() {
_err "Please check and retry."
return 1
fi
#save the api key and email to the account conf file.
_saveaccountconf_mutable CF_Key "$CF_Key"
_saveaccountconf_mutable CF_Email "$CF_Email"
fi
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
@@ -46,7 +65,7 @@ dns_cf_add() {
_debug "Getting txt records"
_cf_rest GET "zones/${_domain_id}/dns_records?type=TXT&name=$fulldomain"
if ! printf "%s" "$response" | grep \"success\":true >/dev/null; then
if ! echo "$response" | tr -d " " | grep \"success\":true >/dev/null; then
_err "Error"
return 1
fi
@@ -58,9 +77,12 @@ dns_cf_add() {
# if [ "$count" = "0" ]; then
_info "Adding record"
if _cf_rest POST "zones/$_domain_id/dns_records" "{\"type\":\"TXT\",\"name\":\"$fulldomain\",\"content\":\"$txtvalue\",\"ttl\":120}"; then
if printf -- "%s" "$response" | grep "$fulldomain" >/dev/null; then
if _contains "$response" "$txtvalue"; then
_info "Added, OK"
return 0
elif _contains "$response" "The record already exists"; then
_info "Already exists, OK"
return 0
else
_err "Add txt record error."
return 1
@@ -68,19 +90,6 @@ dns_cf_add() {
fi
_err "Add txt record error."
return 1
# else
# _info "Updating record"
# record_id=$(printf "%s\n" "$response" | _egrep_o "\"id\":\"[^\"]*\"" | cut -d : -f 2 | tr -d \" | head -n 1)
# _debug "record_id" "$record_id"
#
# _cf_rest PUT "zones/$_domain_id/dns_records/$record_id" "{\"id\":\"$record_id\",\"type\":\"TXT\",\"name\":\"$fulldomain\",\"content\":\"$txtvalue\",\"zone_id\":\"$_domain_id\",\"zone_name\":\"$_domain\"}"
# if [ "$?" = "0" ]; then
# _info "Updated, OK"
# return 0
# fi
# _err "Update error"
# return 1
# fi
}
@@ -89,15 +98,11 @@ dns_cf_rm() {
fulldomain=$1
txtvalue=$2
CF_Token="${CF_Token:-$(_readaccountconf_mutable CF_Token)}"
CF_Account_ID="${CF_Account_ID:-$(_readaccountconf_mutable CF_Account_ID)}"
CF_Zone_ID="${CF_Zone_ID:-$(_readaccountconf_mutable CF_Zone_ID)}"
CF_Key="${CF_Key:-$(_readaccountconf_mutable CF_Key)}"
CF_Email="${CF_Email:-$(_readaccountconf_mutable CF_Email)}"
if [ -z "$CF_Key" ] || [ -z "$CF_Email" ]; then
CF_Key=""
CF_Email=""
_err "You don't specify cloudflare api key and email yet."
_err "Please create you key and try again."
return 1
fi
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
@@ -111,17 +116,17 @@ dns_cf_rm() {
_debug "Getting txt records"
_cf_rest GET "zones/${_domain_id}/dns_records?type=TXT&name=$fulldomain&content=$txtvalue"
if ! printf "%s" "$response" | grep \"success\":true >/dev/null; then
_err "Error"
if ! echo "$response" | tr -d " " | grep \"success\":true >/dev/null; then
_err "Error: $response"
return 1
fi
count=$(printf "%s\n" "$response" | _egrep_o "\"count\":[^,]*" | cut -d : -f 2)
count=$(echo "$response" | _egrep_o "\"count\": *[^,]*" | cut -d : -f 2 | tr -d " ")
_debug count "$count"
if [ "$count" = "0" ]; then
_info "Don't need to remove."
else
record_id=$(printf "%s\n" "$response" | _egrep_o "\"id\":\"[^\"]*\"" | cut -d : -f 2 | tr -d \" | head -n 1)
record_id=$(echo "$response" | _egrep_o "\"id\": *\"[^\"]*\"" | cut -d : -f 2 | tr -d \" | _head_n 1 | tr -d " ")
_debug "record_id" "$record_id"
if [ -z "$record_id" ]; then
_err "Can not get record id to remove."
@@ -131,7 +136,7 @@ dns_cf_rm() {
_err "Delete record error."
return 1
fi
_contains "$response" '"success":true'
echo "$response" | tr -d " " | grep \"success\":true >/dev/null
fi
}
@@ -144,8 +149,30 @@ dns_cf_rm() {
# _domain_id=sdjkglgdfewsdfg
_get_root() {
domain=$1
i=2
i=1
p=1
# Use Zone ID directly if provided
if [ "$CF_Zone_ID" ]; then
if ! _cf_rest GET "zones/$CF_Zone_ID"; then
return 1
else
if echo "$response" | tr -d " " | grep \"success\":true >/dev/null; then
_domain=$(echo "$response" | _egrep_o "\"name\": *\"[^\"]*\"" | cut -d : -f 2 | tr -d \" | _head_n 1 | tr -d " ")
if [ "$_domain" ]; then
_cutlength=$((${#domain} - ${#_domain} - 1))
_sub_domain=$(printf "%s" "$domain" | cut -c "1-$_cutlength")
_domain_id=$CF_Zone_ID
return 0
else
return 1
fi
else
return 1
fi
fi
fi
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
@@ -154,12 +181,18 @@ _get_root() {
return 1
fi
if [ "$CF_Account_ID" ]; then
if ! _cf_rest GET "zones?name=$h&account.id=$CF_Account_ID"; then
return 1
fi
else
if ! _cf_rest GET "zones?name=$h"; then
return 1
fi
fi
if _contains "$response" "\"name\":\"$h\"" >/dev/null; then
_domain_id=$(printf "%s\n" "$response" | _egrep_o "\[.\"id\":\"[^\"]*\"" | head -n 1 | cut -d : -f 2 | tr -d \")
if _contains "$response" "\"name\":\"$h\"" || _contains "$response" '"total_count":1'; then
_domain_id=$(echo "$response" | _egrep_o "\[.\"id\": *\"[^\"]*\"" | _head_n 1 | cut -d : -f 2 | tr -d \" | tr -d " ")
if [ "$_domain_id" ]; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain=$h
@@ -179,9 +212,17 @@ _cf_rest() {
data="$3"
_debug "$ep"
export _H1="X-Auth-Email: $CF_Email"
export _H2="X-Auth-Key: $CF_Key"
export _H3="Content-Type: application/json"
email_trimmed=$(echo "$CF_Email" | tr -d '"')
key_trimmed=$(echo "$CF_Key" | tr -d '"')
token_trimmed=$(echo "$CF_Token" | tr -d '"')
export _H1="Content-Type: application/json"
if [ "$token_trimmed" ]; then
export _H2="Authorization: Bearer $token_trimmed"
else
export _H2="X-Auth-Email: $email_trimmed"
export _H3="X-Auth-Key: $key_trimmed"
fi
if [ "$m" != "GET" ]; then
_debug data "$data"

197
dnsapi/dns_clouddns.sh Executable file
View File

@@ -0,0 +1,197 @@
#!/usr/bin/env sh
# Author: Radek Sprta <sprta@vshosting.cz>
#CLOUDDNS_EMAIL=XXXXX
#CLOUDDNS_PASSWORD="YYYYYYYYY"
#CLOUDDNS_CLIENT_ID=XXXXX
CLOUDDNS_API='https://admin.vshosting.cloud/clouddns'
CLOUDDNS_LOGIN_API='https://admin.vshosting.cloud/api/public/auth/login'
######## Public functions #####################
# Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_clouddns_add() {
fulldomain=$1
txtvalue=$2
_debug "fulldomain" "$fulldomain"
CLOUDDNS_CLIENT_ID="${CLOUDDNS_CLIENT_ID:-$(_readaccountconf_mutable CLOUDDNS_CLIENT_ID)}"
CLOUDDNS_EMAIL="${CLOUDDNS_EMAIL:-$(_readaccountconf_mutable CLOUDDNS_EMAIL)}"
CLOUDDNS_PASSWORD="${CLOUDDNS_PASSWORD:-$(_readaccountconf_mutable CLOUDDNS_PASSWORD)}"
if [ -z "$CLOUDDNS_PASSWORD" ] || [ -z "$CLOUDDNS_EMAIL" ] || [ -z "$CLOUDDNS_CLIENT_ID" ]; then
CLOUDDNS_CLIENT_ID=""
CLOUDDNS_EMAIL=""
CLOUDDNS_PASSWORD=""
_err "You didn't specify a CloudDNS password, email and client ID yet."
return 1
fi
if ! _contains "$CLOUDDNS_EMAIL" "@"; then
_err "It seems that the CLOUDDNS_EMAIL=$CLOUDDNS_EMAIL is not a valid email address."
_err "Please check and retry."
return 1
fi
# Save CloudDNS client id, email and password to config file
_saveaccountconf_mutable CLOUDDNS_CLIENT_ID "$CLOUDDNS_CLIENT_ID"
_saveaccountconf_mutable CLOUDDNS_EMAIL "$CLOUDDNS_EMAIL"
_saveaccountconf_mutable CLOUDDNS_PASSWORD "$CLOUDDNS_PASSWORD"
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "Invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
# Add TXT record
data="{\"type\":\"TXT\",\"name\":\"$fulldomain.\",\"value\":\"$txtvalue\",\"domainId\":\"$_domain_id\"}"
if _clouddns_api POST "record-txt" "$data"; then
if _contains "$response" "$txtvalue"; then
_info "Added, OK"
elif _contains "$response" '"code":4136'; then
_info "Already exists, OK"
else
_err "Add TXT record error."
return 1
fi
fi
_debug "Publishing record changes"
_clouddns_api PUT "domain/$_domain_id/publish" "{\"soaTtl\":300}"
}
# Usage: rm _acme-challenge.www.domain.com
dns_clouddns_rm() {
fulldomain=$1
_debug "fulldomain" "$fulldomain"
CLOUDDNS_CLIENT_ID="${CLOUDDNS_CLIENT_ID:-$(_readaccountconf_mutable CLOUDDNS_CLIENT_ID)}"
CLOUDDNS_EMAIL="${CLOUDDNS_EMAIL:-$(_readaccountconf_mutable CLOUDDNS_EMAIL)}"
CLOUDDNS_PASSWORD="${CLOUDDNS_PASSWORD:-$(_readaccountconf_mutable CLOUDDNS_PASSWORD)}"
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "Invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
# Get record ID
_clouddns_api GET "domain/$_domain_id"
if _contains "$response" "lastDomainRecordList"; then
re="\"lastDomainRecordList\".*\"id\":\"([^\"}]*)\"[^}]*\"name\":\"$fulldomain.\","
_last_domains=$(echo "$response" | _egrep_o "$re")
re2="\"id\":\"([^\"}]*)\"[^}]*\"name\":\"$fulldomain.\","
_record_id=$(echo "$_last_domains" | _egrep_o "$re2" | _head_n 1 | cut -d : -f 2 | cut -d , -f 1 | tr -d "\"")
_debug _record_id "$_record_id"
else
_err "Could not retrieve record ID"
return 1
fi
_info "Removing record"
if _clouddns_api DELETE "record/$_record_id"; then
if _contains "$response" "\"error\":"; then
_err "Could not remove record"
return 1
fi
fi
_debug "Publishing record changes"
_clouddns_api PUT "domain/$_domain_id/publish" "{\"soaTtl\":300}"
}
#################### Private functions below ##################################
# Usage: _get_root _acme-challenge.www.domain.com
# Returns:
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
_get_root() {
domain=$1
# Get domain root
data="{\"search\": [{\"name\": \"clientId\", \"operator\": \"eq\", \"value\": \"$CLOUDDNS_CLIENT_ID\"}]}"
_clouddns_api "POST" "domain/search" "$data"
domain_slice="$domain"
while [ -z "$domain_root" ]; do
if _contains "$response" "\"domainName\":\"$domain_slice\.\""; then
domain_root="$domain_slice"
_debug domain_root "$domain_root"
fi
domain_slice="$(echo "$domain_slice" | cut -d . -f 2-)"
done
# Get domain id
data="{\"search\": [{\"name\": \"clientId\", \"operator\": \"eq\", \"value\": \"$CLOUDDNS_CLIENT_ID\"}, \
{\"name\": \"domainName\", \"operator\": \"eq\", \"value\": \"$domain_root.\"}]}"
_clouddns_api "POST" "domain/search" "$data"
if _contains "$response" "\"id\":\""; then
re='domainType\":\"[^\"]*\",\"id\":\"([^\"]*)\",' # Match domain id
_domain_id=$(echo "$response" | _egrep_o "$re" | _head_n 1 | cut -d : -f 3 | tr -d "\",")
if [ "$_domain_id" ]; then
_sub_domain=$(printf "%s" "$domain" | sed "s/.$domain_root//")
_domain="$domain_root"
return 0
fi
_err 'Domain name not found on your CloudDNS account'
return 1
fi
return 1
}
# Usage: _clouddns_api GET domain/search '{"data": "value"}'
# Returns:
# response='{"message": "api response"}'
_clouddns_api() {
method=$1
endpoint="$2"
data="$3"
_debug endpoint "$endpoint"
if [ -z "$CLOUDDNS_TOKEN" ]; then
_clouddns_login
fi
_debug CLOUDDNS_TOKEN "$CLOUDDNS_TOKEN"
export _H1="Content-Type: application/json"
export _H2="Authorization: Bearer $CLOUDDNS_TOKEN"
if [ "$method" != "GET" ]; then
_debug data "$data"
response="$(_post "$data" "$CLOUDDNS_API/$endpoint" "" "$method" | tr -d '\t\r\n ')"
else
response="$(_get "$CLOUDDNS_API/$endpoint" | tr -d '\t\r\n ')"
fi
# shellcheck disable=SC2181
if [ "$?" != "0" ]; then
_err "Error $endpoint"
return 1
fi
_debug2 response "$response"
return 0
}
# Returns:
# CLOUDDNS_TOKEN=dslfje2rj23l
_clouddns_login() {
login_data="{\"email\": \"$CLOUDDNS_EMAIL\", \"password\": \"$CLOUDDNS_PASSWORD\"}"
response="$(_post "$login_data" "$CLOUDDNS_LOGIN_API" "" "POST" "Content-Type: application/json")"
if _contains "$response" "\"accessToken\":\""; then
CLOUDDNS_TOKEN=$(echo "$response" | _egrep_o "\"accessToken\":\"[^\"]*\"" | cut -d : -f 2 | tr -d \")
export CLOUDDNS_TOKEN
else
echo 'Could not get CloudDNS access token; check your credentials'
return 1
fi
return 0
}

View File

@@ -2,11 +2,14 @@
# Author: Boyan Peychev <boyan at cloudns dot net>
# Repository: https://github.com/ClouDNS/acme.sh/
# Editor: I Komang Suryadana
#CLOUDNS_AUTH_ID=XXXXX
#CLOUDNS_SUB_AUTH_ID=XXXXX
#CLOUDNS_AUTH_PASSWORD="YYYYYYYYY"
CLOUDNS_API="https://api.cloudns.net"
DOMAIN_TYPE=
DOMAIN_MASTER=
######## Public functions #####################
@@ -26,14 +29,11 @@ dns_cloudns_add() {
host="$(echo "$1" | sed "s/\.$zone\$//")"
record=$2
record_id=$(_dns_cloudns_get_record_id "$zone" "$host")
_debug zone "$zone"
_debug host "$host"
_debug record "$record"
_debug record_id "$record_id"
if [ -z "$record_id" ]; then
_info "Adding the TXT record for $1"
_dns_cloudns_http_api_call "dns/add-record.json" "domain-name=$zone&record-type=TXT&host=$host&record=$record&ttl=60"
if ! _contains "$response" "\"status\":\"Success\""; then
@@ -41,15 +41,6 @@ dns_cloudns_add() {
return 1
fi
_info "Added."
else
_info "Updating the TXT record for $1"
_dns_cloudns_http_api_call "dns/mod-record.json" "domain-name=$zone&record-id=$record_id&record-type=TXT&host=$host&record=$record&ttl=60"
if ! _contains "$response" "\"status\":\"Success\""; then
_err "The TXT record for $1 cannot be updated."
return 1
fi
_info "Updated."
fi
return 0
}
@@ -72,28 +63,47 @@ dns_cloudns_rm() {
host="$(echo "$1" | sed "s/\.$zone\$//")"
record=$2
record_id=$(_dns_cloudns_get_record_id "$zone" "$host")
_dns_cloudns_get_zone_info "$zone"
_debug "Type" "$DOMAIN_TYPE"
_debug "Cloud Master" "$DOMAIN_MASTER"
if _contains "$DOMAIN_TYPE" "cloud"; then
zone=$DOMAIN_MASTER
fi
_debug "ZONE" "$zone"
_dns_cloudns_http_api_call "dns/records.json" "domain-name=$zone&host=$host&type=TXT"
if ! _contains "$response" "\"id\":"; then
return 1
fi
for i in $(echo "$response" | tr '{' "\n" | grep "$record"); do
record_id=$(echo "$i" | tr ',' "\n" | grep -E '^"id"' | sed -re 's/^\"id\"\:\"([0-9]+)\"$/\1/g')
if [ -n "$record_id" ]; then
_debug zone "$zone"
_debug host "$host"
_debug record "$record"
_debug record_id "$record_id"
if [ ! -z "$record_id" ]; then
_info "Deleting the TXT record for $1"
_dns_cloudns_http_api_call "dns/delete-record.json" "domain-name=$zone&record-id=$record_id"
if ! _contains "$response" "\"status\":\"Success\""; then
_err "The TXT record for $1 cannot be deleted."
return 1
fi
else
_info "Deleted."
fi
fi
done
return 0
}
#################### Private functions below ##################################
_dns_cloudns_init_check() {
if [ ! -z "$CLOUDNS_INIT_CHECK_COMPLETED" ]; then
if [ -n "$CLOUDNS_INIT_CHECK_COMPLETED" ]; then
return 0
fi
@@ -126,7 +136,7 @@ _dns_cloudns_init_check() {
return 1
fi
#save the api id and password to the account conf file.
# save the api id and password to the account conf file.
_saveaccountconf_mutable CLOUDNS_AUTH_ID "$CLOUDNS_AUTH_ID"
_saveaccountconf_mutable CLOUDNS_SUB_AUTH_ID "$CLOUDNS_SUB_AUTH_ID"
_saveaccountconf_mutable CLOUDNS_AUTH_PASSWORD "$CLOUDNS_AUTH_PASSWORD"
@@ -136,6 +146,18 @@ _dns_cloudns_init_check() {
return 0
}
_dns_cloudns_get_zone_info() {
zone=$1
_dns_cloudns_http_api_call "dns/get-zone-info.json" "domain-name=$zone"
if ! _contains "$response" "\"status\":\"Failed\""; then
DOMAIN_TYPE=$(echo "$response" | _egrep_o '"type":"[^"]*"' | cut -d : -f 2 | tr -d '"')
if _contains "$DOMAIN_TYPE" "cloud"; then
DOMAIN_MASTER=$(echo "$response" | _egrep_o '"cloud-master":"[^"]*"' | cut -d : -f 2 | tr -d '"')
fi
fi
return 0
}
_dns_cloudns_get_zone_name() {
i=2
while true; do
@@ -159,15 +181,6 @@ _dns_cloudns_get_zone_name() {
return 1
}
_dns_cloudns_get_record_id() {
_dns_cloudns_http_api_call "dns/records.json" "domain-name=$1&host=$2&type=TXT"
if _contains "$response" "\"id\":"; then
echo "$response" | cut -d '"' -f 2
return 0
fi
return 1
}
_dns_cloudns_http_api_call() {
method=$1
@@ -175,7 +188,7 @@ _dns_cloudns_http_api_call() {
_debug CLOUDNS_SUB_AUTH_ID "$CLOUDNS_SUB_AUTH_ID"
_debug CLOUDNS_AUTH_PASSWORD "$CLOUDNS_AUTH_PASSWORD"
if [ ! -z "$CLOUDNS_SUB_AUTH_ID" ]; then
if [ -n "$CLOUDNS_SUB_AUTH_ID" ]; then
auth_user="sub-auth-id=$CLOUDNS_SUB_AUTH_ID"
else
auth_user="auth-id=$CLOUDNS_AUTH_ID"
@@ -189,7 +202,7 @@ _dns_cloudns_http_api_call() {
response="$(_get "$CLOUDNS_API/$method?$data")"
_debug2 response "$response"
_debug response "$response"
return 0
}

157
dnsapi/dns_cn.sh Normal file
View File

@@ -0,0 +1,157 @@
#!/usr/bin/env sh
# DNS API for acme.sh for Core-Networks (https://beta.api.core-networks.de/doc/).
# created by 5ll and francis
CN_API="https://beta.api.core-networks.de"
######## Public functions #####################
dns_cn_add() {
fulldomain=$1
txtvalue=$2
if ! _cn_login; then
_err "login failed"
return 1
fi
_debug "First detect the root zone"
if ! _cn_get_root "$fulldomain"; then
_err "invalid domain"
return 1
fi
_debug "_sub_domain $_sub_domain"
_debug "_domain $_domain"
_info "Adding record"
curData="{\"name\":\"$_sub_domain\",\"ttl\":120,\"type\":\"TXT\",\"data\":\"$txtvalue\"}"
curResult="$(_post "${curData}" "${CN_API}/dnszones/${_domain}/records/")"
_debug "curData $curData"
_debug "curResult $curResult"
if _contains "$curResult" ""; then
_info "Added, OK"
if ! _cn_commit; then
_err "commiting changes failed"
return 1
fi
return 0
else
_err "Add txt record error."
_debug "curData is $curData"
_debug "curResult is $curResult"
_err "error adding text record, response was $curResult"
return 1
fi
}
dns_cn_rm() {
fulldomain=$1
txtvalue=$2
if ! _cn_login; then
_err "login failed"
return 1
fi
_debug "First detect the root zone"
if ! _cn_get_root "$fulldomain"; then
_err "invalid domain"
return 1
fi
_info "Deleting record"
curData="{\"name\":\"$_sub_domain\",\"data\":\"$txtvalue\"}"
curResult="$(_post "${curData}" "${CN_API}/dnszones/${_domain}/records/delete")"
_debug curData is "$curData"
_info "commiting changes"
if ! _cn_commit; then
_err "commiting changes failed"
return 1
fi
_info "Deletet txt record"
return 0
}
################### Private functions below ##################################
_cn_login() {
CN_User="${CN_User:-$(_readaccountconf_mutable CN_User)}"
CN_Password="${CN_Password:-$(_readaccountconf_mutable CN_Password)}"
if [ -z "$CN_User" ] || [ -z "$CN_Password" ]; then
CN_User=""
CN_Password=""
_err "You must export variables: CN_User and CN_Password"
return 1
fi
#save the config variables to the account conf file.
_saveaccountconf_mutable CN_User "$CN_User"
_saveaccountconf_mutable CN_Password "$CN_Password"
_info "Getting an AUTH-Token"
curData="{\"login\":\"${CN_User}\",\"password\":\"${CN_Password}\"}"
curResult="$(_post "${curData}" "${CN_API}/auth/token")"
_debug "Calling _CN_login: '${curData}' '${CN_API}/auth/token'"
if _contains "${curResult}" '"token":"'; then
authToken=$(echo "${curResult}" | cut -d ":" -f2 | cut -d "," -f1 | sed 's/^.\(.*\).$/\1/')
export _H1="Authorization: Bearer $authToken"
_info "Successfully acquired AUTH-Token"
_debug "AUTH-Token: '${authToken}'"
_debug "_H1 '${_H1}'"
else
_err "Couldn't acquire an AUTH-Token"
return 1
fi
}
# Commit changes
_cn_commit() {
_info "Commiting changes"
_post "" "${CN_API}/dnszones/$h/records/commit"
}
_cn_get_root() {
domain=$1
i=2
p=1
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
_debug _H1 "${_H1}"
if [ -z "$h" ]; then
#not valid
return 1
fi
_cn_zonelist="$(_get ${CN_API}/dnszones/)"
_debug _cn_zonelist "${_cn_zonelist}"
if [ "$?" != "0" ]; then
_err "something went wrong while getting the zone list"
return 1
fi
if _contains "$_cn_zonelist" "\"name\":\"$h\"" >/dev/null; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain=$h
return 0
else
_debug "Zonelist does not contain domain - iterating "
fi
p=$i
i=$(_math "$i" + 1)
done
_err "Zonelist does not contain domain - exiting"
return 1
}

253
dnsapi/dns_conoha.sh Executable file
View File

@@ -0,0 +1,253 @@
#!/usr/bin/env sh
CONOHA_DNS_EP_PREFIX_REGEXP="https://dns-service\."
######## Public functions #####################
#Usage: dns_conoha_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_conoha_add() {
fulldomain=$1
txtvalue=$2
_info "Using conoha"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
_debug "Check uesrname and password"
CONOHA_Username="${CONOHA_Username:-$(_readaccountconf_mutable CONOHA_Username)}"
CONOHA_Password="${CONOHA_Password:-$(_readaccountconf_mutable CONOHA_Password)}"
CONOHA_TenantId="${CONOHA_TenantId:-$(_readaccountconf_mutable CONOHA_TenantId)}"
CONOHA_IdentityServiceApi="${CONOHA_IdentityServiceApi:-$(_readaccountconf_mutable CONOHA_IdentityServiceApi)}"
if [ -z "$CONOHA_Username" ] || [ -z "$CONOHA_Password" ] || [ -z "$CONOHA_TenantId" ] || [ -z "$CONOHA_IdentityServiceApi" ]; then
CONOHA_Username=""
CONOHA_Password=""
CONOHA_TenantId=""
CONOHA_IdentityServiceApi=""
_err "You didn't specify a conoha api username and password yet."
_err "Please create the user and try again."
return 1
fi
_saveaccountconf_mutable CONOHA_Username "$CONOHA_Username"
_saveaccountconf_mutable CONOHA_Password "$CONOHA_Password"
_saveaccountconf_mutable CONOHA_TenantId "$CONOHA_TenantId"
_saveaccountconf_mutable CONOHA_IdentityServiceApi "$CONOHA_IdentityServiceApi"
if token="$(_conoha_get_accesstoken "$CONOHA_IdentityServiceApi/tokens" "$CONOHA_Username" "$CONOHA_Password" "$CONOHA_TenantId")"; then
accesstoken="$(printf "%s" "$token" | sed -n 1p)"
CONOHA_Api="$(printf "%s" "$token" | sed -n 2p)"
else
return 1
fi
_debug "First detect the root zone"
if ! _get_root "$fulldomain" "$CONOHA_Api" "$accesstoken"; then
_err "invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_info "Adding record"
body="{\"type\":\"TXT\",\"name\":\"$fulldomain.\",\"data\":\"$txtvalue\",\"ttl\":60}"
if _conoha_rest POST "$CONOHA_Api/v1/domains/$_domain_id/records" "$body" "$accesstoken"; then
if _contains "$response" '"data":"'"$txtvalue"'"'; then
_info "Added, OK"
return 0
else
_err "Add txt record error."
return 1
fi
fi
_err "Add txt record error."
return 1
}
#Usage: fulldomain txtvalue
#Remove the txt record after validation.
dns_conoha_rm() {
fulldomain=$1
txtvalue=$2
_info "Using conoha"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
_debug "Check uesrname and password"
CONOHA_Username="${CONOHA_Username:-$(_readaccountconf_mutable CONOHA_Username)}"
CONOHA_Password="${CONOHA_Password:-$(_readaccountconf_mutable CONOHA_Password)}"
CONOHA_TenantId="${CONOHA_TenantId:-$(_readaccountconf_mutable CONOHA_TenantId)}"
CONOHA_IdentityServiceApi="${CONOHA_IdentityServiceApi:-$(_readaccountconf_mutable CONOHA_IdentityServiceApi)}"
if [ -z "$CONOHA_Username" ] || [ -z "$CONOHA_Password" ] || [ -z "$CONOHA_TenantId" ] || [ -z "$CONOHA_IdentityServiceApi" ]; then
CONOHA_Username=""
CONOHA_Password=""
CONOHA_TenantId=""
CONOHA_IdentityServiceApi=""
_err "You didn't specify a conoha api username and password yet."
_err "Please create the user and try again."
return 1
fi
_saveaccountconf_mutable CONOHA_Username "$CONOHA_Username"
_saveaccountconf_mutable CONOHA_Password "$CONOHA_Password"
_saveaccountconf_mutable CONOHA_TenantId "$CONOHA_TenantId"
_saveaccountconf_mutable CONOHA_IdentityServiceApi "$CONOHA_IdentityServiceApi"
if token="$(_conoha_get_accesstoken "$CONOHA_IdentityServiceApi/tokens" "$CONOHA_Username" "$CONOHA_Password" "$CONOHA_TenantId")"; then
accesstoken="$(printf "%s" "$token" | sed -n 1p)"
CONOHA_Api="$(printf "%s" "$token" | sed -n 2p)"
else
return 1
fi
_debug "First detect the root zone"
if ! _get_root "$fulldomain" "$CONOHA_Api" "$accesstoken"; then
_err "invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_debug "Getting txt records"
if ! _conoha_rest GET "$CONOHA_Api/v1/domains/$_domain_id/records" "" "$accesstoken"; then
_err "Error"
return 1
fi
record_id=$(printf "%s" "$response" | _egrep_o '{[^}]*}' |
grep '"type":"TXT"' | grep "\"data\":\"$txtvalue\"" | _egrep_o "\"id\":\"[^\"]*\"" |
_head_n 1 | cut -d : -f 2 | tr -d \")
if [ -z "$record_id" ]; then
_err "Can not get record id to remove."
return 1
fi
_debug record_id "$record_id"
_info "Removing the txt record"
if ! _conoha_rest DELETE "$CONOHA_Api/v1/domains/$_domain_id/records/$record_id" "" "$accesstoken"; then
_err "Delete record error."
return 1
fi
return 0
}
#################### Private functions below ##################################
_conoha_rest() {
m="$1"
ep="$2"
data="$3"
accesstoken="$4"
export _H1="Accept: application/json"
export _H2="Content-Type: application/json"
if [ -n "$accesstoken" ]; then
export _H3="X-Auth-Token: $accesstoken"
fi
_debug "$ep"
if [ "$m" != "GET" ]; then
_secure_debug2 data "$data"
response="$(_post "$data" "$ep" "" "$m")"
else
response="$(_get "$ep")"
fi
_ret="$?"
_secure_debug2 response "$response"
if [ "$_ret" != "0" ]; then
_err "error $ep"
return 1
fi
response="$(printf "%s" "$response" | _normalizeJson)"
return 0
}
_conoha_get_accesstoken() {
ep="$1"
username="$2"
password="$3"
tenantId="$4"
accesstoken="$(_readaccountconf_mutable conoha_accesstoken)"
expires="$(_readaccountconf_mutable conoha_tokenvalidto)"
CONOHA_Api="$(_readaccountconf_mutable conoha_dns_ep)"
# can we reuse the access token?
if [ -n "$accesstoken" ] && [ -n "$expires" ] && [ -n "$CONOHA_Api" ]; then
utc_date="$(_utc_date | sed "s/ /T/")"
if expr "$utc_date" "<" "$expires" >/dev/null; then
# access token is still valid - reuse it
_debug "reusing access token"
printf "%s\n%s\n" "$accesstoken" "$CONOHA_Api"
return 0
else
_debug "access token expired"
fi
fi
_debug "getting new access token"
body="$(printf '{"auth":{"passwordCredentials":{"username":"%s","password":"%s"},"tenantId":"%s"}}' "$username" "$password" "$tenantId")"
if ! _conoha_rest POST "$ep" "$body" ""; then
_err error "$response"
return 1
fi
accesstoken=$(printf "%s" "$response" | _egrep_o "\"id\":\"[^\"]*\"" | _head_n 1 | cut -d : -f 2 | tr -d \")
expires=$(printf "%s" "$response" | _egrep_o "\"expires\":\"[^\"]*\"" | _head_n 1 | cut -d : -f 2-4 | tr -d \" | tr -d Z) #expect UTC
if [ -z "$accesstoken" ] || [ -z "$expires" ]; then
_err "no acccess token received. Check your Conoha settings see $WIKI"
return 1
fi
_saveaccountconf_mutable conoha_accesstoken "$accesstoken"
_saveaccountconf_mutable conoha_tokenvalidto "$expires"
CONOHA_Api=$(printf "%s" "$response" | _egrep_o 'publicURL":"'"$CONOHA_DNS_EP_PREFIX_REGEXP"'[^"]*"' | _head_n 1 | cut -d : -f 2-3 | tr -d \")
if [ -z "$CONOHA_Api" ]; then
_err "failed to get conoha dns endpoint url"
return 1
fi
_saveaccountconf_mutable conoha_dns_ep "$CONOHA_Api"
printf "%s\n%s\n" "$accesstoken" "$CONOHA_Api"
return 0
}
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
_get_root() {
domain="$1"
ep="$2"
accesstoken="$3"
i=2
p=1
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100).
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
if ! _conoha_rest GET "$ep/v1/domains?name=$h" "" "$accesstoken"; then
return 1
fi
if _contains "$response" "\"name\":\"$h\"" >/dev/null; then
_domain_id=$(printf "%s\n" "$response" | _egrep_o "\"id\":\"[^\"]*\"" | head -n 1 | cut -d : -f 2 | tr -d \")
if [ "$_domain_id" ]; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain=$h
return 0
fi
return 1
fi
p=$i
i=$(_math "$i" + 1)
done
return 1
}

176
dnsapi/dns_constellix.sh Normal file
View File

@@ -0,0 +1,176 @@
#!/usr/bin/env sh
# Author: Wout Decre <wout@canodus.be>
CONSTELLIX_Api="https://api.dns.constellix.com/v1"
#CONSTELLIX_Key="XXX"
#CONSTELLIX_Secret="XXX"
######## Public functions #####################
# Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
# Used to add txt record
dns_constellix_add() {
fulldomain=$1
txtvalue=$2
CONSTELLIX_Key="${CONSTELLIX_Key:-$(_readaccountconf_mutable CONSTELLIX_Key)}"
CONSTELLIX_Secret="${CONSTELLIX_Secret:-$(_readaccountconf_mutable CONSTELLIX_Secret)}"
if [ -z "$CONSTELLIX_Key" ] || [ -z "$CONSTELLIX_Secret" ]; then
_err "You did not specify the Contellix API key and secret yet."
return 1
fi
_saveaccountconf_mutable CONSTELLIX_Key "$CONSTELLIX_Key"
_saveaccountconf_mutable CONSTELLIX_Secret "$CONSTELLIX_Secret"
if ! _get_root "$fulldomain"; then
_err "Invalid domain"
return 1
fi
# The TXT record might already exist when working with wildcard certificates. In that case, update the record by adding the new value.
_debug "Search TXT record"
if _constellix_rest GET "domains/${_domain_id}/records/TXT/search?exact=${_sub_domain}"; then
if printf -- "%s" "$response" | grep "{\"errors\":\[\"Requested record was not found\"\]}" >/dev/null; then
_info "Adding TXT record"
if _constellix_rest POST "domains/${_domain_id}/records" "[{\"type\":\"txt\",\"add\":true,\"set\":{\"name\":\"${_sub_domain}\",\"ttl\":60,\"roundRobin\":[{\"value\":\"${txtvalue}\"}]}}]"; then
if printf -- "%s" "$response" | grep "{\"success\":\"1 record(s) added, 0 record(s) updated, 0 record(s) deleted\"}" >/dev/null; then
_info "Added"
return 0
else
_err "Error adding TXT record"
fi
fi
else
_record_id=$(printf "%s\n" "$response" | _egrep_o "\"id\":[0-9]*" | cut -d ':' -f 2)
if _constellix_rest GET "domains/${_domain_id}/records/TXT/${_record_id}"; then
_new_rr_values=$(printf "%s\n" "$response" | _egrep_o '"roundRobin":\[[^]]*\]' | sed "s/\]$/,{\"value\":\"${txtvalue}\"}]/")
_debug _new_rr_values "$_new_rr_values"
_info "Updating TXT record"
if _constellix_rest PUT "domains/${_domain_id}/records/TXT/${_record_id}" "{\"name\":\"${_sub_domain}\",\"ttl\":60,${_new_rr_values}}"; then
if printf -- "%s" "$response" | grep "{\"success\":\"Record.*updated successfully\"}" >/dev/null; then
_info "Updated"
return 0
elif printf -- "%s" "$response" | grep "{\"errors\":\[\"Contents are identical\"\]}" >/dev/null; then
_info "Already exists, no need to update"
return 0
else
_err "Error updating TXT record"
fi
fi
fi
fi
fi
return 1
}
# Usage: fulldomain txtvalue
# Used to remove the txt record after validation
dns_constellix_rm() {
fulldomain=$1
txtvalue=$2
CONSTELLIX_Key="${CONSTELLIX_Key:-$(_readaccountconf_mutable CONSTELLIX_Key)}"
CONSTELLIX_Secret="${CONSTELLIX_Secret:-$(_readaccountconf_mutable CONSTELLIX_Secret)}"
if [ -z "$CONSTELLIX_Key" ] || [ -z "$CONSTELLIX_Secret" ]; then
_err "You did not specify the Contellix API key and secret yet."
return 1
fi
if ! _get_root "$fulldomain"; then
_err "Invalid domain"
return 1
fi
# The TXT record might have been removed already when working with some wildcard certificates.
_debug "Search TXT record"
if _constellix_rest GET "domains/${_domain_id}/records/TXT/search?exact=${_sub_domain}"; then
if printf -- "%s" "$response" | grep "{\"errors\":\[\"Requested record was not found\"\]}" >/dev/null; then
_info "Removed"
return 0
else
_info "Removing TXT record"
if _constellix_rest POST "domains/${_domain_id}/records" "[{\"type\":\"txt\",\"delete\":true,\"filter\":{\"field\":\"name\",\"op\":\"eq\",\"value\":\"${_sub_domain}\"}}]"; then
if printf -- "%s" "$response" | grep "{\"success\":\"0 record(s) added, 0 record(s) updated, 1 record(s) deleted\"}" >/dev/null; then
_info "Removed"
return 0
else
_err "Error removing TXT record"
fi
fi
fi
fi
return 1
}
#################### Private functions below ##################################
_get_root() {
domain=$1
i=2
p=1
_debug "Detecting root zone"
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
if [ -z "$h" ]; then
return 1
fi
if ! _constellix_rest GET "domains/search?exact=$h"; then
return 1
fi
if _contains "$response" "\"name\":\"$h\""; then
_domain_id=$(printf "%s\n" "$response" | _egrep_o "\"id\":[0-9]*" | cut -d ':' -f 2)
if [ "$_domain_id" ]; then
_sub_domain=$(printf "%s" "$domain" | cut -d '.' -f 1-$p)
_domain="$h"
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
return 0
fi
return 1
fi
p=$i
i=$(_math "$i" + 1)
done
return 1
}
_constellix_rest() {
m=$1
ep="$2"
data="$3"
_debug "$ep"
rdate=$(date +"%s")"000"
hmac=$(printf "%s" "$rdate" | _hmac sha1 "$(printf "%s" "$CONSTELLIX_Secret" | _hex_dump | tr -d ' ')" | _base64)
export _H1="x-cnsdns-apiKey: $CONSTELLIX_Key"
export _H2="x-cnsdns-requestDate: $rdate"
export _H3="x-cnsdns-hmac: $hmac"
export _H4="Accept: application/json"
export _H5="Content-Type: application/json"
if [ "$m" != "GET" ]; then
_debug data "$data"
response="$(_post "$data" "$CONSTELLIX_Api/$ep" "" "$m")"
else
response="$(_get "$CONSTELLIX_Api/$ep")"
fi
if [ "$?" != "0" ]; then
_err "Error $ep"
return 1
fi
_debug response "$response"
return 0
}

159
dnsapi/dns_cpanel.sh Executable file
View File

@@ -0,0 +1,159 @@
#!/usr/bin/env sh
#
#Author: Bjarne Saltbaek
#Report Bugs here: https://github.com/acmesh-official/acme.sh/issues/3732
#
#
######## Public functions #####################
#
# Export CPANEL username,api token and hostname in the following variables
#
# cPanel_Username=username
# cPanel_Apitoken=apitoken
# cPanel_Hostname=hostname
#
# Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
# Used to add txt record
dns_cpanel_add() {
fulldomain=$1
txtvalue=$2
_info "Adding TXT record to cPanel based system"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
_debug cPanel_Username "$cPanel_Username"
_debug cPanel_Apitoken "$cPanel_Apitoken"
_debug cPanel_Hostname "$cPanel_Hostname"
if ! _cpanel_login; then
_err "cPanel Login failed for user $cPanel_Username. Check $HTTP_HEADER file"
return 1
fi
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "No matching root domain for $fulldomain found"
return 1
fi
# adding entry
_info "Adding the entry"
stripped_fulldomain=$(echo "$fulldomain" | sed "s/.$_domain//")
_debug "Adding $stripped_fulldomain to $_domain zone"
_myget "json-api/cpanel?cpanel_jsonapi_apiversion=2&cpanel_jsonapi_module=ZoneEdit&cpanel_jsonapi_func=add_zone_record&domain=$_domain&name=$stripped_fulldomain&type=TXT&txtdata=$txtvalue&ttl=1"
if _successful_update; then return 0; fi
_err "Couldn't create entry!"
return 1
}
# Usage: fulldomain txtvalue
# Used to remove the txt record after validation
dns_cpanel_rm() {
fulldomain=$1
txtvalue=$2
_info "Using cPanel based system"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
if ! _cpanel_login; then
_err "cPanel Login failed for user $cPanel_Username. Check $HTTP_HEADER file"
return 1
fi
if ! _get_root; then
_err "No matching root domain for $fulldomain found"
return 1
fi
_findentry "$fulldomain" "$txtvalue"
if [ -z "$_id" ]; then
_info "Entry doesn't exist, nothing to delete"
return 0
fi
_debug "Deleting record..."
_myget "json-api/cpanel?cpanel_jsonapi_apiversion=2&cpanel_jsonapi_module=ZoneEdit&cpanel_jsonapi_func=remove_zone_record&domain=$_domain&line=$_id"
# removing entry
_debug "_result is: $_result"
if _successful_update; then return 0; fi
_err "Couldn't delete entry!"
return 1
}
#################### Private functions below ##################################
_checkcredentials() {
cPanel_Username="${cPanel_Username:-$(_readaccountconf_mutable cPanel_Username)}"
cPanel_Apitoken="${cPanel_Apitoken:-$(_readaccountconf_mutable cPanel_Apitoken)}"
cPanel_Hostname="${cPanel_Hostname:-$(_readaccountconf_mutable cPanel_Hostname)}"
if [ -z "$cPanel_Username" ] || [ -z "$cPanel_Apitoken" ] || [ -z "$cPanel_Hostname" ]; then
cPanel_Username=""
cPanel_Apitoken=""
cPanel_Hostname=""
_err "You haven't specified cPanel username, apitoken and hostname yet."
_err "Please add credentials and try again."
return 1
fi
#save the credentials to the account conf file.
_saveaccountconf_mutable cPanel_Username "$cPanel_Username"
_saveaccountconf_mutable cPanel_Apitoken "$cPanel_Apitoken"
_saveaccountconf_mutable cPanel_Hostname "$cPanel_Hostname"
return 0
}
_cpanel_login() {
if ! _checkcredentials; then return 1; fi
if ! _myget "json-api/cpanel?cpanel_jsonapi_apiversion=2&cpanel_jsonapi_module=CustInfo&cpanel_jsonapi_func=displaycontactinfo"; then
_err "cPanel login failed for user $cPanel_Username."
return 1
fi
return 0
}
_myget() {
#Adds auth header to request
export _H1="Authorization: cpanel $cPanel_Username:$cPanel_Apitoken"
_result=$(_get "$cPanel_Hostname/$1")
}
_get_root() {
_myget 'json-api/cpanel?cpanel_jsonapi_apiversion=2&cpanel_jsonapi_module=ZoneEdit&cpanel_jsonapi_func=fetchzones'
_domains=$(echo "$_result" | sed 's/.*\(zones.*\[\).*/\1/' | cut -d':' -f2 | sed 's/"//g' | sed 's/{//g')
_debug "_result is: $_result"
_debug "_domains is: $_domains"
if [ -z "$_domains" ]; then
_err "Primary domain list not found!"
return 1
fi
for _domain in $_domains; do
_debug "Checking if $fulldomain ends with $_domain"
if (_endswith "$fulldomain" "$_domain"); then
_debug "Root domain: $_domain"
return 0
fi
done
return 1
}
_successful_update() {
if (echo "$_result" | grep -q 'newserial'); then return 0; fi
return 1
}
_findentry() {
_debug "In _findentry"
#returns id of dns entry, if it exists
_myget "json-api/cpanel?cpanel_jsonapi_apiversion=2&cpanel_jsonapi_module=ZoneEdit&cpanel_jsonapi_func=fetchzone_records&domain=$_domain"
_id=$(echo "$_result" | sed "s/.*\(line.*$fulldomain.*$txtvalue\).*/\1/" | cut -d ':' -f 2 | cut -d ',' -f 1)
_debug "_result is: $_result"
_debug "fulldomain. is $fulldomain."
_debug "txtvalue is $txtvalue"
_debug "_id is: $_id"
if [ -n "$_id" ]; then
_debug "Entry found with _id=$_id"
return 0
fi
return 1
}

159
dnsapi/dns_curanet.sh Normal file
View File

@@ -0,0 +1,159 @@
#!/usr/bin/env sh
#Script to use with curanet.dk, scannet.dk, wannafind.dk, dandomain.dk DNS management.
#Requires api credentials with scope: dns
#Author: Peter L. Hansen <peter@r12.dk>
#Version 1.0
CURANET_REST_URL="https://api.curanet.dk/dns/v1/Domains"
CURANET_AUTH_URL="https://apiauth.dk.team.blue/auth/realms/Curanet/protocol/openid-connect/token"
CURANET_ACCESS_TOKEN=""
######## Public functions #####################
#Usage: dns_curanet_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_curanet_add() {
fulldomain=$1
txtvalue=$2
_info "Using curanet"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
CURANET_AUTHCLIENTID="${CURANET_AUTHCLIENTID:-$(_readaccountconf_mutable CURANET_AUTHCLIENTID)}"
CURANET_AUTHSECRET="${CURANET_AUTHSECRET:-$(_readaccountconf_mutable CURANET_AUTHSECRET)}"
if [ -z "$CURANET_AUTHCLIENTID" ] || [ -z "$CURANET_AUTHSECRET" ]; then
CURANET_AUTHCLIENTID=""
CURANET_AUTHSECRET=""
_err "You don't specify curanet api client and secret."
_err "Please create your auth info and try again."
return 1
fi
#save the credentials to the account conf file.
_saveaccountconf_mutable CURANET_AUTHCLIENTID "$CURANET_AUTHCLIENTID"
_saveaccountconf_mutable CURANET_AUTHSECRET "$CURANET_AUTHSECRET"
if ! _get_token; then
_err "Unable to get token"
return 1
fi
if ! _get_root "$fulldomain"; then
_err "Invalid domain"
return 1
fi
export _H1="Content-Type: application/json-patch+json"
export _H2="Accept: application/json"
export _H3="Authorization: Bearer $CURANET_ACCESS_TOKEN"
data="{\"name\": \"$fulldomain\",\"type\": \"TXT\",\"ttl\": 60,\"priority\": 0,\"data\": \"$txtvalue\"}"
response="$(_post "$data" "$CURANET_REST_URL/${_domain}/Records" "" "")"
if _contains "$response" "$txtvalue"; then
_debug "TXT record added OK"
else
_err "Unable to add TXT record"
return 1
fi
return 0
}
#Usage: fulldomain txtvalue
#Remove the txt record after validation.
dns_curanet_rm() {
fulldomain=$1
txtvalue=$2
_info "Using curanet"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
CURANET_AUTHCLIENTID="${CURANET_AUTHCLIENTID:-$(_readaccountconf_mutable CURANET_AUTHCLIENTID)}"
CURANET_AUTHSECRET="${CURANET_AUTHSECRET:-$(_readaccountconf_mutable CURANET_AUTHSECRET)}"
if ! _get_token; then
_err "Unable to get token"
return 1
fi
if ! _get_root "$fulldomain"; then
_err "Invalid domain"
return 1
fi
_debug "Getting current record list to identify TXT to delete"
export _H1="Content-Type: application/json"
export _H2="Accept: application/json"
export _H3="Authorization: Bearer $CURANET_ACCESS_TOKEN"
response="$(_get "$CURANET_REST_URL/${_domain}/Records" "" "")"
if ! _contains "$response" "$txtvalue"; then
_err "Unable to delete record (does not contain $txtvalue )"
return 1
fi
recordid=$(echo "$response" | _egrep_o "{\"id\":[0-9]+,\"name\":\"$fulldomain\",\"type\":\"TXT\",\"ttl\":60,\"priority\":0,\"data\":\"..$txtvalue" | _egrep_o "id\":[0-9]+" | cut -c 5-)
if [ -z "$recordid" ]; then
_err "Unable to get recordid"
_debug "regex {\"id\":[0-9]+,\"name\":\"$fulldomain\",\"type\":\"TXT\",\"ttl\":60,\"priority\":0,\"data\":\"..$txtvalue"
_debug "response $response"
return 1
fi
_debug "Deleting recordID $recordid"
response="$(_post "" "$CURANET_REST_URL/${_domain}/Records/$recordid" "" "DELETE")"
return 0
}
#################### Private functions below ##################################
_get_token() {
response="$(_post "grant_type=client_credentials&client_id=$CURANET_AUTHCLIENTID&client_secret=$CURANET_AUTHSECRET&scope=dns" "$CURANET_AUTH_URL" "" "")"
if ! _contains "$response" "access_token"; then
_err "Unable get access token"
return 1
fi
CURANET_ACCESS_TOKEN=$(echo "$response" | _egrep_o "\"access_token\":\"[^\"]+" | cut -c 17-)
if [ -z "$CURANET_ACCESS_TOKEN" ]; then
_err "Unable to get token"
return 1
fi
return 0
}
#_acme-challenge.www.domain.com
#returns
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
_get_root() {
domain=$1
i=1
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
export _H1="Content-Type: application/json"
export _H2="Accept: application/json"
export _H3="Authorization: Bearer $CURANET_ACCESS_TOKEN"
response="$(_get "$CURANET_REST_URL/$h/Records" "" "")"
if [ ! "$(echo "$response" | _egrep_o "Entity not found")" ]; then
_domain=$h
return 0
fi
i=$(_math "$i" + 1)
done
return 1
}

View File

@@ -1,181 +0,0 @@
#!/usr/bin/env sh
# Cloudxns.com Domain api
#
#CX_Key="1234"
#
#CX_Secret="sADDsdasdgdsf"
CX_Api="https://www.cloudxns.net/api2"
#REST_API
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_cx_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$CX_Key" ] || [ -z "$CX_Secret" ]; then
CX_Key=""
CX_Secret=""
_err "You don't specify cloudxns.com api key or secret yet."
_err "Please create you key and try again."
return 1
fi
REST_API="$CX_Api"
#save the api key and email to the account conf file.
_saveaccountconf CX_Key "$CX_Key"
_saveaccountconf CX_Secret "$CX_Secret"
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "invalid domain"
return 1
fi
add_record "$_domain" "$_sub_domain" "$txtvalue"
}
#fulldomain txtvalue
dns_cx_rm() {
fulldomain=$1
txtvalue=$2
REST_API="$CX_Api"
if _get_root "$fulldomain"; then
record_id=""
existing_records "$_domain" "$_sub_domain" "$txtvalue"
if [ "$record_id" ]; then
_rest DELETE "record/$record_id/$_domain_id" "{}"
_info "Deleted record ${fulldomain}"
fi
fi
}
#usage: root sub
#return if the sub record already exists.
#echos the existing records count.
# '0' means doesn't exist
existing_records() {
_debug "Getting txt records"
root=$1
sub=$2
if ! _rest GET "record/$_domain_id?:domain_id?host_id=0&offset=0&row_num=100"; then
return 1
fi
seg=$(printf "%s\n" "$response" | _egrep_o '"record_id":[^{]*host":"'"$_sub_domain"'"[^}]*\}')
_debug seg "$seg"
if [ -z "$seg" ]; then
return 0
fi
if printf "%s" "$response" | grep '"type":"TXT"' >/dev/null; then
record_id=$(printf "%s\n" "$seg" | _egrep_o '"record_id":"[^"]*"' | cut -d : -f 2 | tr -d \" | _head_n 1)
_debug record_id "$record_id"
return 0
fi
}
#add the txt record.
#usage: root sub txtvalue
add_record() {
root=$1
sub=$2
txtvalue=$3
fulldomain="$sub.$root"
_info "Adding record"
if ! _rest POST "record" "{\"domain_id\": $_domain_id, \"host\":\"$_sub_domain\", \"value\":\"$txtvalue\", \"type\":\"TXT\",\"ttl\":600, \"line_id\":1}"; then
return 1
fi
return 0
}
#################### Private functions below ##################################
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
_get_root() {
domain=$1
i=2
p=1
if ! _rest GET "domain"; then
return 1
fi
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
if _contains "$response" "$h."; then
seg=$(printf "%s\n" "$response" | _egrep_o '"id":[^{]*"'"$h"'."[^}]*}')
_debug seg "$seg"
_domain_id=$(printf "%s\n" "$seg" | _egrep_o "\"id\":\"[^\"]*\"" | cut -d : -f 2 | tr -d \")
_debug _domain_id "$_domain_id"
if [ "$_domain_id" ]; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_debug _sub_domain "$_sub_domain"
_domain="$h"
_debug _domain "$_domain"
return 0
fi
return 1
fi
p="$i"
i=$(_math "$i" + 1)
done
return 1
}
#Usage: method URI data
_rest() {
m=$1
ep="$2"
_debug ep "$ep"
url="$REST_API/$ep"
_debug url "$url"
cdate=$(date -u "+%Y-%m-%d %H:%M:%S UTC")
_debug cdate "$cdate"
data="$3"
_debug data "$data"
sec="$CX_Key$url$data$cdate$CX_Secret"
_debug sec "$sec"
hmac=$(printf "%s" "$sec" | _digest md5 hex)
_debug hmac "$hmac"
export _H1="API-KEY: $CX_Key"
export _H2="API-REQUEST-DATE: $cdate"
export _H3="API-HMAC: $hmac"
export _H4="Content-Type: application/json"
if [ "$data" ]; then
response="$(_post "$data" "$url" "" "$m")"
else
response="$(_get "$url")"
fi
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
_contains "$response" '"code":1'
}

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env sh
########
# Custom cyon.ch DNS API for use with [acme.sh](https://github.com/Neilpang/acme.sh)
# Custom cyon.ch DNS API for use with [acme.sh](https://github.com/acmesh-official/acme.sh)
#
# Usage: acme.sh --issue --dns dns_cyon -d www.domain.com
#
@@ -18,23 +18,23 @@
########
dns_cyon_add() {
_cyon_load_credentials \
&& _cyon_load_parameters "$@" \
&& _cyon_print_header "add" \
&& _cyon_login \
&& _cyon_change_domain_env \
&& _cyon_add_txt \
&& _cyon_logout
_cyon_load_credentials &&
_cyon_load_parameters "$@" &&
_cyon_print_header "add" &&
_cyon_login &&
_cyon_change_domain_env &&
_cyon_add_txt &&
_cyon_logout
}
dns_cyon_rm() {
_cyon_load_credentials \
&& _cyon_load_parameters "$@" \
&& _cyon_print_header "delete" \
&& _cyon_login \
&& _cyon_change_domain_env \
&& _cyon_delete_txt \
&& _cyon_logout
_cyon_load_credentials &&
_cyon_load_parameters "$@" &&
_cyon_print_header "delete" &&
_cyon_login &&
_cyon_change_domain_env &&
_cyon_delete_txt &&
_cyon_logout
}
#########################
@@ -66,7 +66,7 @@ _cyon_load_credentials() {
_debug "Save credentials to account.conf"
_saveaccountconf CY_Username "${CY_Username}"
_saveaccountconf CY_Password_B64 "$CY_Password_B64"
if [ ! -z "${CY_OTP_Secret}" ]; then
if [ -n "${CY_OTP_Secret}" ]; then
_saveaccountconf CY_OTP_Secret "$CY_OTP_Secret"
else
_clearaccountconf CY_OTP_Secret
@@ -164,7 +164,7 @@ _cyon_login() {
# todo: instead of just checking if the env variable is defined, check if we actually need to do a 2FA auth request.
# 2FA authentication with OTP?
if [ ! -z "${CY_OTP_Secret}" ]; then
if [ -n "${CY_OTP_Secret}" ]; then
_info " - Authorising with OTP code..."
if ! _exists oathtool; then

184
dnsapi/dns_da.sh Executable file
View File

@@ -0,0 +1,184 @@
#!/usr/bin/env sh
# -*- mode: sh; tab-width: 2; indent-tabs-mode: s; coding: utf-8 -*-
# vim: et ts=2 sw=2
#
# DirectAdmin 1.41.0 API
# The DirectAdmin interface has it's own Let's encrypt functionality, but this
# script can be used to generate certificates for names which are not hosted on
# DirectAdmin
#
# User must provide login data and URL to DirectAdmin incl. port.
# You can create login key, by using the Login Keys function
# ( https://da.example.com:8443/CMD_LOGIN_KEYS ), which only has access to
# - CMD_API_DNS_CONTROL
# - CMD_API_SHOW_DOMAINS
#
# See also https://www.directadmin.com/api.php and
# https://www.directadmin.com/features.php?id=1298
#
# Report bugs to https://github.com/TigerP/acme.sh/issues
#
# Values to export:
# export DA_Api="https://remoteUser:remotePassword@da.example.com:8443"
# export DA_Api_Insecure=1
#
# Set DA_Api_Insecure to 1 for insecure and 0 for secure -> difference is
# whether ssl cert is checked for validity (0) or whether it is just accepted
# (1)
#
######## Public functions #####################
# Usage: dns_myapi_add _acme-challenge.www.example.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
# Used to add txt record
dns_da_add() {
fulldomain="${1}"
txtvalue="${2}"
_debug "Calling: dns_da_add() '${fulldomain}' '${txtvalue}'"
_DA_credentials && _DA_getDomainInfo && _DA_addTxt
}
# Usage: dns_da_rm _acme-challenge.www.example.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
# Used to remove the txt record after validation
dns_da_rm() {
fulldomain="${1}"
txtvalue="${2}"
_debug "Calling: dns_da_rm() '${fulldomain}' '${txtvalue}'"
_DA_credentials && _DA_getDomainInfo && _DA_rmTxt
}
#################### Private functions below ##################################
# Usage: _DA_credentials
# It will check if the needed settings are available
_DA_credentials() {
DA_Api="${DA_Api:-$(_readaccountconf_mutable DA_Api)}"
DA_Api_Insecure="${DA_Api_Insecure:-$(_readaccountconf_mutable DA_Api_Insecure)}"
if [ -z "${DA_Api}" ] || [ -z "${DA_Api_Insecure}" ]; then
DA_Api=""
DA_Api_Insecure=""
_err "You haven't specified the DirectAdmin Login data, URL and whether you want check the DirectAdmin SSL cert. Please try again."
return 1
else
_saveaccountconf_mutable DA_Api "${DA_Api}"
_saveaccountconf_mutable DA_Api_Insecure "${DA_Api_Insecure}"
# Set whether curl should use secure or insecure mode
export HTTPS_INSECURE="${DA_Api_Insecure}"
fi
}
# Usage: _get_root _acme-challenge.www.example.com
# Split the full domain to a domain and subdomain
#returns
# _sub_domain=_acme-challenge.www
# _domain=example.com
_get_root() {
domain=$1
i=2
p=1
# Get a list of all the domains
# response will contain "list[]=example.com&list[]=example.org"
_da_api CMD_API_SHOW_DOMAINS "" "${domain}"
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
# not valid
_debug "The given domain $h is not valid"
return 1
fi
if _contains "$response" "$h" >/dev/null; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain=$h
return 0
fi
p=$i
i=$(_math "$i" + 1)
done
_debug "Stop on 100"
return 1
}
# Usage: _da_api CMD_API_* data example.com
# Use the DirectAdmin API and check the result
# returns
# response="error=0&text=Result text&details="
_da_api() {
cmd=$1
data=$2
domain=$3
_debug "$domain; $data"
response="$(_post "$data" "$DA_Api/$cmd" "" "POST")"
if [ "$?" != "0" ]; then
_err "error $cmd"
return 1
fi
_debug response "$response"
case "${cmd}" in
CMD_API_DNS_CONTROL)
# Parse the result in general
# error=0&text=Records Deleted&details=
# error=1&text=Cannot View Dns Record&details=No domain provided
err_field="$(_getfield "$response" 1 '&')"
txt_field="$(_getfield "$response" 2 '&')"
details_field="$(_getfield "$response" 3 '&')"
error="$(_getfield "$err_field" 2 '=')"
text="$(_getfield "$txt_field" 2 '=')"
details="$(_getfield "$details_field" 2 '=')"
_debug "error: ${error}, text: ${text}, details: ${details}"
if [ "$error" != "0" ]; then
_err "error $response"
return 1
fi
;;
CMD_API_SHOW_DOMAINS) ;;
esac
return 0
}
# Usage: _DA_getDomainInfo
# Get the root zone if possible
_DA_getDomainInfo() {
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "invalid domain"
return 1
else
_debug "The root domain: $_domain"
_debug "The sub domain: $_sub_domain"
fi
return 0
}
# Usage: _DA_addTxt
# Use the API to add a record
_DA_addTxt() {
curData="domain=${_domain}&action=add&type=TXT&name=${_sub_domain}&value=\"${txtvalue}\""
_debug "Calling _DA_addTxt: '${curData}' '${DA_Api}/CMD_API_DNS_CONTROL'"
_da_api CMD_API_DNS_CONTROL "${curData}" "${_domain}"
_debug "Result of _DA_addTxt: '$response'"
if _contains "${response}" 'error=0'; then
_debug "Add TXT succeeded"
return 0
fi
_debug "Add TXT failed"
return 1
}
# Usage: _DA_rmTxt
# Use the API to remove a record
_DA_rmTxt() {
curData="domain=${_domain}&action=select&txtrecs0=name=${_sub_domain}&amp;value=\"${txtvalue}\""
_debug "Calling _DA_rmTxt: '${curData}' '${DA_Api}/CMD_API_DNS_CONTROL'"
if _da_api CMD_API_DNS_CONTROL "${curData}" "${_domain}"; then
_debug "Result of _DA_rmTxt: '$response'"
else
_err "Result of _DA_rmTxt: '$response'"
fi
if _contains "${response}" 'error=0'; then
_debug "RM TXT succeeded"
return 0
fi
_debug "RM TXT failed"
return 1
}

130
dnsapi/dns_ddnss.sh Normal file
View File

@@ -0,0 +1,130 @@
#!/usr/bin/env sh
#Created by RaidenII, to use DuckDNS's API to add/remove text records
#modified by helbgd @ 03/13/2018 to support ddnss.de
#modified by mod242 @ 04/24/2018 to support different ddnss domains
#Please note: the Wildcard Feature must be turned on for the Host record
#and the checkbox for TXT needs to be enabled
# Pass credentials before "acme.sh --issue --dns dns_ddnss ..."
# --
# export DDNSS_Token="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
# --
#
DDNSS_DNS_API="https://ddnss.de/upd.php"
######## Public functions #####################
#Usage: dns_ddnss_add _acme-challenge.domain.ddnss.de "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_ddnss_add() {
fulldomain=$1
txtvalue=$2
DDNSS_Token="${DDNSS_Token:-$(_readaccountconf_mutable DDNSS_Token)}"
if [ -z "$DDNSS_Token" ]; then
_err "You must export variable: DDNSS_Token"
_err "The token for your DDNSS account is necessary."
_err "You can look it up in your DDNSS account."
return 1
fi
# Now save the credentials.
_saveaccountconf_mutable DDNSS_Token "$DDNSS_Token"
# Unfortunately, DDNSS does not seems to support lookup domain through API
# So I assume your credentials (which are your domain and token) are correct
# If something goes wrong, we will get a KO response from DDNSS
if ! _ddnss_get_domain; then
return 1
fi
# Now add the TXT record to DDNSS DNS
_info "Trying to add TXT record"
if _ddnss_rest GET "key=$DDNSS_Token&host=$_ddnss_domain&txtm=1&txt=$txtvalue"; then
if [ "$response" = "Updated 1 hostname." ]; then
_info "TXT record has been successfully added to your DDNSS domain."
_info "Note that all subdomains under this domain uses the same TXT record."
return 0
else
_err "Errors happened during adding the TXT record, response=$response"
return 1
fi
else
_err "Errors happened during adding the TXT record."
return 1
fi
}
#Usage: fulldomain txtvalue
#Remove the txt record after validation.
dns_ddnss_rm() {
fulldomain=$1
txtvalue=$2
DDNSS_Token="${DDNSS_Token:-$(_readaccountconf_mutable DDNSS_Token)}"
if [ -z "$DDNSS_Token" ]; then
_err "You must export variable: DDNSS_Token"
_err "The token for your DDNSS account is necessary."
_err "You can look it up in your DDNSS account."
return 1
fi
if ! _ddnss_get_domain; then
return 1
fi
# Now remove the TXT record from DDNS DNS
_info "Trying to remove TXT record"
if _ddnss_rest GET "key=$DDNSS_Token&host=$_ddnss_domain&txtm=2"; then
if [ "$response" = "Updated 1 hostname." ]; then
_info "TXT record has been successfully removed from your DDNSS domain."
return 0
else
_err "Errors happened during removing the TXT record, response=$response"
return 1
fi
else
_err "Errors happened during removing the TXT record."
return 1
fi
}
#################### Private functions below ##################################
#fulldomain=_acme-challenge.domain.ddnss.de
#returns
# _ddnss_domain=domain
_ddnss_get_domain() {
# We'll extract the domain/username from full domain
_ddnss_domain="$(echo "$fulldomain" | _lower_case | _egrep_o '[.][^.][^.]*[.](ddnss|dyn-ip24|dyndns|dyn|dyndns1|home-webserver|myhome-server|dynip)\..*' | cut -d . -f 2-)"
if [ -z "$_ddnss_domain" ]; then
_err "Error extracting the domain."
return 1
fi
return 0
}
#Usage: method URI
_ddnss_rest() {
method=$1
param="$2"
_debug param "$param"
url="$DDNSS_DNS_API?$param"
_debug url "$url"
# DDNSS uses GET to update domain info
if [ "$method" = "GET" ]; then
response="$(_get "$url" | sed 's/<[a-zA-Z\/][^>]*>//g' | tr -s "\n" | _tail_n 1)"
else
_err "Unsupported method"
return 1
fi
_debug2 response "$response"
return 0
}

197
dnsapi/dns_desec.sh Normal file
View File

@@ -0,0 +1,197 @@
#!/usr/bin/env sh
#
# deSEC.io Domain API
#
# Author: Zheng Qian
#
# deSEC API doc
# https://desec.readthedocs.io/en/latest/
REST_API="https://desec.io/api/v1/domains"
######## Public functions #####################
#Usage: dns_desec_add _acme-challenge.foobar.dedyn.io "d41d8cd98f00b204e9800998ecf8427e"
dns_desec_add() {
fulldomain=$1
txtvalue=$2
_info "Using desec.io api"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
DEDYN_TOKEN="${DEDYN_TOKEN:-$(_readaccountconf_mutable DEDYN_TOKEN)}"
if [ -z "$DEDYN_TOKEN" ]; then
DEDYN_TOKEN=""
_err "You did not specify DEDYN_TOKEN yet."
_err "Please create your key and try again."
_err "e.g."
_err "export DEDYN_TOKEN=d41d8cd98f00b204e9800998ecf8427e"
return 1
fi
#save the api token to the account conf file.
_saveaccountconf_mutable DEDYN_TOKEN "$DEDYN_TOKEN"
_debug "First detect the root zone"
if ! _get_root "$fulldomain" "$REST_API/"; then
_err "invalid domain"
return 1
fi
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
# Get existing TXT record
_debug "Getting txt records"
txtvalues="\"\\\"$txtvalue\\\"\""
_desec_rest GET "$REST_API/$_domain/rrsets/$_sub_domain/TXT/"
if [ "$_code" = "200" ]; then
oldtxtvalues="$(echo "$response" | _egrep_o "\"records\":\\[\"\\S*\"\\]" | cut -d : -f 2 | tr -d "[]\\\\\"" | sed "s/,/ /g")"
_debug "existing TXT found"
_debug oldtxtvalues "$oldtxtvalues"
if [ -n "$oldtxtvalues" ]; then
for oldtxtvalue in $oldtxtvalues; do
txtvalues="$txtvalues, \"\\\"$oldtxtvalue\\\"\""
done
fi
fi
_debug txtvalues "$txtvalues"
_info "Adding record"
body="[{\"subname\":\"$_sub_domain\", \"type\":\"TXT\", \"records\":[$txtvalues], \"ttl\":3600}]"
if _desec_rest PUT "$REST_API/$_domain/rrsets/" "$body"; then
if _contains "$response" "$txtvalue"; then
_info "Added, OK"
return 0
else
_err "Add txt record error."
return 1
fi
fi
_err "Add txt record error."
return 1
}
#Usage: fulldomain txtvalue
#Remove the txt record after validation.
dns_desec_rm() {
fulldomain=$1
txtvalue=$2
_info "Using desec.io api"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
DEDYN_TOKEN="${DEDYN_TOKEN:-$(_readaccountconf_mutable DEDYN_TOKEN)}"
if [ -z "$DEDYN_TOKEN" ]; then
DEDYN_TOKEN=""
_err "You did not specify DEDYN_TOKEN yet."
_err "Please create your key and try again."
_err "e.g."
_err "export DEDYN_TOKEN=d41d8cd98f00b204e9800998ecf8427e"
return 1
fi
_debug "First detect the root zone"
if ! _get_root "$fulldomain" "$REST_API/"; then
_err "invalid domain"
return 1
fi
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
# Get existing TXT record
_debug "Getting txt records"
txtvalues=""
_desec_rest GET "$REST_API/$_domain/rrsets/$_sub_domain/TXT/"
if [ "$_code" = "200" ]; then
oldtxtvalues="$(echo "$response" | _egrep_o "\"records\":\\[\"\\S*\"\\]" | cut -d : -f 2 | tr -d "[]\\\\\"" | sed "s/,/ /g")"
_debug "existing TXT found"
_debug oldtxtvalues "$oldtxtvalues"
if [ -n "$oldtxtvalues" ]; then
for oldtxtvalue in $oldtxtvalues; do
if [ "$txtvalue" != "$oldtxtvalue" ]; then
txtvalues="$txtvalues, \"\\\"$oldtxtvalue\\\"\""
fi
done
fi
fi
txtvalues="$(echo "$txtvalues" | cut -c3-)"
_debug txtvalues "$txtvalues"
_info "Deleting record"
body="[{\"subname\":\"$_sub_domain\", \"type\":\"TXT\", \"records\":[$txtvalues], \"ttl\":3600}]"
_desec_rest PUT "$REST_API/$_domain/rrsets/" "$body"
if [ "$_code" = "200" ]; then
_info "Deleted, OK"
return 0
fi
_err "Delete txt record error."
return 1
}
#################### Private functions below ##################################
_desec_rest() {
m="$1"
ep="$2"
data="$3"
export _H1="Authorization: Token $DEDYN_TOKEN"
export _H2="Accept: application/json"
export _H3="Content-Type: application/json"
if [ "$m" != "GET" ]; then
_secure_debug2 data "$data"
response="$(_post "$data" "$ep" "" "$m")"
else
response="$(_get "$ep")"
fi
_ret="$?"
_code="$(grep "^HTTP" "$HTTP_HEADER" | _tail_n 1 | cut -d " " -f 2 | tr -d "\\r\\n")"
_debug "http response code $_code"
_secure_debug2 response "$response"
if [ "$_ret" != "0" ]; then
_err "error $ep"
return 1
fi
response="$(printf "%s" "$response" | _normalizeJson)"
return 0
}
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
_get_root() {
domain="$1"
ep="$2"
i=2
p=1
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
if ! _desec_rest GET "$ep"; then
return 1
fi
if _contains "$response" "\"name\":\"$h\"" >/dev/null; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain=$h
return 0
fi
p=$i
i=$(_math "$i" + 1)
done
return 1
}

65
dnsapi/dns_df.sh Normal file
View File

@@ -0,0 +1,65 @@
#!/usr/bin/env sh
########################################################################
# https://dyndnsfree.de hook script for acme.sh
#
# Environment variables:
#
# - $DF_user (your dyndnsfree.de username)
# - $DF_password (your dyndnsfree.de password)
#
# Author: Thilo Gass <thilo.gass@gmail.com>
# Git repo: https://github.com/ThiloGa/acme.sh
#-- dns_df_add() - Add TXT record --------------------------------------
# Usage: dns_df_add _acme-challenge.subdomain.domain.com "XyZ123..."
dyndnsfree_api="https://dynup.de/acme.php"
dns_df_add() {
fulldomain=$1
txt_value=$2
_info "Using DNS-01 dyndnsfree.de hook"
DF_user="${DF_user:-$(_readaccountconf_mutable DF_user)}"
DF_password="${DF_password:-$(_readaccountconf_mutable DF_password)}"
if [ -z "$DF_user" ] || [ -z "$DF_password" ]; then
DF_user=""
DF_password=""
_err "No auth details provided. Please set user credentials using the \$DF_user and \$DF_password environment variables."
return 1
fi
#save the api user and password to the account conf file.
_debug "Save user and password"
_saveaccountconf_mutable DF_user "$DF_user"
_saveaccountconf_mutable DF_password "$DF_password"
domain="$(printf "%s" "$fulldomain" | cut -d"." -f2-)"
get="$dyndnsfree_api?username=$DF_user&password=$DF_password&hostname=$domain&add_hostname=$fulldomain&txt=$txt_value"
if ! erg="$(_get "$get")"; then
_err "error Adding $fulldomain TXT: $txt_value"
return 1
fi
if _contains "$erg" "success"; then
_info "Success, TXT Added, OK"
else
_err "error Adding $fulldomain TXT: $txt_value erg: $erg"
return 1
fi
_debug "ok Auto $fulldomain TXT: $txt_value erg: $erg"
return 0
}
dns_df_rm() {
fulldomain=$1
txtvalue=$2
_info "TXT enrty in $fulldomain is deleted automatically"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
}

View File

@@ -20,12 +20,22 @@
dns_dgon_add() {
fulldomain="$(echo "$1" | _lower_case)"
txtvalue=$2
DO_API_KEY="${DO_API_KEY:-$(_readaccountconf_mutable DO_API_KEY)}"
# Check if API Key Exists
if [ -z "$DO_API_KEY" ]; then
DO_API_KEY=""
_err "You did not specify DigitalOcean API key."
_err "Please export DO_API_KEY and try again."
return 1
fi
_info "Using digitalocean dns validation - add record"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
## save the env vars (key and domain split location) for later automated use
_saveaccountconf DO_API_KEY "$DO_API_KEY"
_saveaccountconf_mutable DO_API_KEY "$DO_API_KEY"
## split the domain for DO API
if ! _get_base_domain "$fulldomain"; then
@@ -39,7 +49,7 @@ dns_dgon_add() {
export _H1="Content-Type: application/json"
export _H2="Authorization: Bearer $DO_API_KEY"
PURL='https://api.digitalocean.com/v2/domains/'$_domain'/records'
PBODY='{"type":"TXT","name":"'$_sub_domain'","data":"'$txtvalue'"}'
PBODY='{"type":"TXT","name":"'$_sub_domain'","data":"'$txtvalue'","ttl":120}'
_debug PURL "$PURL"
_debug PBODY "$PBODY"
@@ -65,6 +75,16 @@ dns_dgon_add() {
dns_dgon_rm() {
fulldomain="$(echo "$1" | _lower_case)"
txtvalue=$2
DO_API_KEY="${DO_API_KEY:-$(_readaccountconf_mutable DO_API_KEY)}"
# Check if API Key Exists
if [ -z "$DO_API_KEY" ]; then
DO_API_KEY=""
_err "You did not specify DigitalOcean API key."
_err "Please export DO_API_KEY and try again."
return 1
fi
_info "Using digitalocean dns validation - remove record"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
@@ -84,33 +104,31 @@ dns_dgon_rm() {
## may get: "links":{"pages":{"last":".../v2/domains/DOM/records?page=2","next":".../v2/domains/DOM/records?page=2"}}
GURL="https://api.digitalocean.com/v2/domains/$_domain/records"
## while we dont have a record ID we keep going
while [ -z "$record" ]; do
## Get all the matching records
while true; do
## 1) get the URL
## the create request - get
## args: URL, [onlyheader, timeout]
domain_list="$(_get "$GURL")"
## 2) find record
## check for what we are looing for: "type":"A","name":"$_sub_domain"
record="$(echo "$domain_list" | _egrep_o "\"id\"\s*\:\s*\"*\d+\"*[^}]*\"name\"\s*\:\s*\"$_sub_domain\"[^}]*\"data\"\s*\:\s*\"$txtvalue\"")"
## 3) check record and get next page
if [ -z "$record" ]; then
## find the next page if we dont have a match
nextpage="$(echo "$domain_list" | _egrep_o "\"links\".*" | _egrep_o "\"next\".*" | _egrep_o "http.*page\=\d+")"
if [ -z "$nextpage" ]; then
_err "no record and no nextpage in digital ocean DNS removal"
## check response
if [ "$?" != "0" ]; then
_err "error in domain_list response: $domain_list"
return 1
fi
_debug2 nextpage "$nextpage"
GURL="$nextpage"
fi
## we break out of the loop when we have a record
done
_debug2 domain_list "$domain_list"
## we found the record
rec_id="$(echo "$record" | _egrep_o "id\"\s*\:\s*\"*\d+" | _egrep_o "\d+")"
_debug rec_id "$rec_id"
## 2) find records
## check for what we are looking for: "type":"A","name":"$_sub_domain"
record="$(echo "$domain_list" | _egrep_o "\"id\"\s*\:\s*\"*[0-9]+\"*[^}]*\"name\"\s*\:\s*\"$_sub_domain\"[^}]*\"data\"\s*\:\s*\"$txtvalue\"")"
if [ -n "$record" ]; then
## we found records
rec_ids="$(echo "$record" | _egrep_o "id\"\s*\:\s*\"*[0-9]+" | _egrep_o "[0-9]+")"
_debug rec_ids "$rec_ids"
if [ -n "$rec_ids" ]; then
echo "$rec_ids" | while IFS= read -r rec_id; do
## delete the record
## delete URL for removing the one we dont want
DURL="https://api.digitalocean.com/v2/domains/$_domain/records/$rec_id"
@@ -126,6 +144,20 @@ dns_dgon_rm() {
fi
_debug2 response "$response"
done
fi
fi
## 3) find the next page
nextpage="$(echo "$domain_list" | _egrep_o "\"links\".*" | _egrep_o "\"next\".*" | _egrep_o "http.*page\=[0-9]+")"
if [ -z "$nextpage" ]; then
break
fi
_debug2 nextpage "$nextpage"
GURL="$nextpage"
done
## finished correctly
return 0
}
@@ -146,7 +178,7 @@ dns_dgon_rm() {
## _domain="domain.com"
_get_base_domain() {
# args
fulldomain="$(echo "$1" | tr '[:upper:]' '[:lower:]')"
fulldomain="$(echo "$1" | _lower_case)"
_debug fulldomain "$fulldomain"
# domain max legal length = 253
@@ -158,10 +190,12 @@ _get_base_domain() {
export _H2="Authorization: Bearer $DO_API_KEY"
_debug DO_API_KEY "$DO_API_KEY"
## get URL for the list of domains
## havent seen this request paginated, tested with 18 domains (more requires manual requests with DO)
## may get: "links":{"pages":{"last":".../v2/domains/DOM/records?page=2","next":".../v2/domains/DOM/records?page=2"}}
DOMURL="https://api.digitalocean.com/v2/domains"
## get the domain list (DO gives basically a full XFER!)
## while we dont have a matching domain we keep going
while [ -z "$found" ]; do
## get the domain list (current page)
domain_list="$(_get "$DOMURL")"
## check response
@@ -179,14 +213,12 @@ _get_base_domain() {
_domain=$(printf "%s" "$fulldomain" | cut -d . -f "$i"-"$MAX_DOM")
## check we got something back from our cut (or are we at the end)
if [ -z "$_domain" ]; then
## we got to the end of the domain - invalid domain
_err "domain not found in DigitalOcean account"
return 1
break
fi
## we got part of a domain back - grep it out
found="$(echo "$domain_list" | _egrep_o "\"name\"\s*\:\s*\"$_domain\"")"
## check if it exists
if [ ! -z "$found" ]; then
if [ -n "$found" ]; then
## exists - exit loop returning the parts
sub_point=$(_math $i - 1)
_sub_domain=$(printf "%s" "$fulldomain" | cut -d . -f 1-"$sub_point")
@@ -198,6 +230,19 @@ _get_base_domain() {
i=$(_math $i + 1)
done
if [ -z "$found" ]; then
## find the next page if we dont have a match
nextpage="$(echo "$domain_list" | _egrep_o "\"links\".*" | _egrep_o "\"next\".*" | _egrep_o "http.*page\=[0-9]+")"
if [ -z "$nextpage" ]; then
_err "no record and no nextpage in digital ocean DNS removal"
return 1
fi
_debug2 nextpage "$nextpage"
DOMURL="$nextpage"
fi
done
## we went through the entire domain zone list and dint find one that matched
## doesnt look like we can add in the record
_err "domain not found in DigitalOcean account, but we should never get here"

87
dnsapi/dns_dnshome.sh Executable file
View File

@@ -0,0 +1,87 @@
#!/usr/bin/env sh
# dnsHome.de API for acme.sh
#
# This Script adds the necessary TXT record to a Subdomain
#
# Author dnsHome.de (https://github.com/dnsHome-de)
#
# Report Bugs to https://github.com/acmesh-official/acme.sh/issues/3819
#
# export DNSHOME_Subdomain=""
# export DNSHOME_SubdomainPassword=""
# Usage: add subdomain.ddnsdomain.tld "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
# Used to add txt record
dns_dnshome_add() {
txtvalue=$2
DNSHOME_Subdomain="${DNSHOME_Subdomain:-$(_readdomainconf DNSHOME_Subdomain)}"
DNSHOME_SubdomainPassword="${DNSHOME_SubdomainPassword:-$(_readdomainconf DNSHOME_SubdomainPassword)}"
if [ -z "$DNSHOME_Subdomain" ] || [ -z "$DNSHOME_SubdomainPassword" ]; then
DNSHOME_Subdomain=""
DNSHOME_SubdomainPassword=""
_err "Please specify/export your dnsHome.de Subdomain and Password"
return 1
fi
#save the credentials to the account conf file.
_savedomainconf DNSHOME_Subdomain "$DNSHOME_Subdomain"
_savedomainconf DNSHOME_SubdomainPassword "$DNSHOME_SubdomainPassword"
DNSHOME_Api="https://$DNSHOME_Subdomain:$DNSHOME_SubdomainPassword@www.dnshome.de/dyndns.php"
_DNSHOME_rest POST "acme=add&txt=$txtvalue"
if ! echo "$response" | grep 'successfully' >/dev/null; then
_err "Error"
_err "$response"
return 1
fi
return 0
}
# Usage: txtvalue
# Used to remove the txt record after validation
dns_dnshome_rm() {
txtvalue=$2
DNSHOME_Subdomain="${DNSHOME_Subdomain:-$(_readdomainconf DNSHOME_Subdomain)}"
DNSHOME_SubdomainPassword="${DNSHOME_SubdomainPassword:-$(_readdomainconf DNSHOME_SubdomainPassword)}"
DNSHOME_Api="https://$DNSHOME_Subdomain:$DNSHOME_SubdomainPassword@www.dnshome.de/dyndns.php"
if [ -z "$DNSHOME_Subdomain" ] || [ -z "$DNSHOME_SubdomainPassword" ]; then
DNSHOME_Subdomain=""
DNSHOME_SubdomainPassword=""
_err "Please specify/export your dnsHome.de Subdomain and Password"
return 1
fi
_DNSHOME_rest POST "acme=rm&txt=$txtvalue"
if ! echo "$response" | grep 'successfully' >/dev/null; then
_err "Error"
_err "$response"
return 1
fi
return 0
}
#################### Private functions below ##################################
_DNSHOME_rest() {
method=$1
data="$2"
_debug "$data"
_debug data "$data"
response="$(_post "$data" "$DNSHOME_Api" "" "$method")"
if [ "$?" != "0" ]; then
_err "error $data"
return 1
fi
_debug2 response "$response"
return 0
}

View File

@@ -39,7 +39,6 @@ dns_dnsimple_add() {
_get_records "$_account_id" "$_domain" "$_sub_domain"
if [ "$_records_count" = "0" ]; then
_info "Adding record"
if _dnsimple_rest POST "$_account_id/zones/$_domain/records" "{\"type\":\"TXT\",\"name\":\"$_sub_domain\",\"content\":\"$txtvalue\",\"ttl\":120}"; then
if printf -- "%s" "$response" | grep "\"name\":\"$_sub_domain\"" >/dev/null; then
@@ -51,22 +50,6 @@ dns_dnsimple_add() {
fi
fi
_err "Add txt record error."
else
_info "Updating record"
_extract_record_id "$_records" "$_sub_domain"
if _dnsimple_rest \
PATCH \
"$_account_id/zones/$_domain/records/$_record_id" \
"{\"type\":\"TXT\",\"name\":\"$_sub_domain\",\"content\":\"$txtvalue\",\"ttl\":120}"; then
_info "Updated!"
return 0
fi
_err "Update error"
return 1
fi
}
# fulldomain
@@ -84,19 +67,19 @@ dns_dnsimple_rm() {
fi
_get_records "$_account_id" "$_domain" "$_sub_domain"
_extract_record_id "$_records" "$_sub_domain"
if [ "$_record_id" ]; then
if _dnsimple_rest DELETE "$_account_id/zones/$_domain/records/$_record_id"; then
_info "removed record" "$_record_id"
echo "$_record_id" | while read -r item; do
if _dnsimple_rest DELETE "$_account_id/zones/$_domain/records/$item"; then
_info "removed record" "$item"
return 0
fi
fi
_err "failed to remove record" "$_record_id"
else
_err "failed to remove record" "$item"
return 1
fi
done
fi
}
#################### Private functions bellow ##################################
@@ -169,7 +152,7 @@ _get_records() {
sub_domain=$3
_debug "fetching txt records"
_dnsimple_rest GET "$account_id/zones/$domain/records?per_page=100"
_dnsimple_rest GET "$account_id/zones/$domain/records?per_page=5000&sort=id:desc"
if ! _contains "$response" "\"id\":"; then
_err "failed to retrieve records"

View File

@@ -67,14 +67,14 @@ _dns_do_list_rrs() {
_err "getRRList origin ${_domain} failed"
return 1
fi
_rr_list="$(echo "${response}" \
| tr -d "\n\r\t" \
| sed -e 's/<item xsi:type="ns2:Map">/\n/g' \
| grep ">$(_regexcape "$fulldomain")</value>" \
| sed -e 's/<\/item>/\n/g' \
| grep '>id</key><value' \
| _egrep_o '>[0-9]{1,16}<' \
| tr -d '><')"
_rr_list="$(echo "${response}" |
tr -d "\n\r\t" |
sed -e 's/<item xsi:type="ns2:Map">/\n/g' |
grep ">$(_regexcape "$fulldomain")</value>" |
sed -e 's/<\/item>/\n/g' |
grep '>id</key><value' |
_egrep_o '>[0-9]{1,16}<' |
tr -d '><')"
[ "${_rr_list}" ]
}
@@ -120,10 +120,10 @@ _get_root() {
i=1
_dns_do_soap getDomainList
_all_domains="$(echo "${response}" \
| tr -d "\n\r\t " \
| _egrep_o 'domain</key><value[^>]+>[^<]+' \
| sed -e 's/^domain<\/key><value[^>]*>//g')"
_all_domains="$(echo "${response}" |
tr -d "\n\r\t " |
_egrep_o 'domain</key><value[^>]+>[^<]+' |
sed -e 's/^domain<\/key><value[^>]*>//g')"
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)

59
dnsapi/dns_doapi.sh Executable file
View File

@@ -0,0 +1,59 @@
#!/usr/bin/env sh
# Official Let's Encrypt API for do.de / Domain-Offensive
#
# This is different from the dns_do adapter, because dns_do is only usable for enterprise customers
# This API is also available to private customers/individuals
#
# Provide the required LetsEncrypt token like this:
# DO_LETOKEN="FmD408PdqT1E269gUK57"
DO_API="https://www.do.de/api/letsencrypt"
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_doapi_add() {
fulldomain=$1
txtvalue=$2
DO_LETOKEN="${DO_LETOKEN:-$(_readaccountconf_mutable DO_LETOKEN)}"
if [ -z "$DO_LETOKEN" ]; then
DO_LETOKEN=""
_err "You didn't configure a do.de API token yet."
_err "Please set DO_LETOKEN and try again."
return 1
fi
_saveaccountconf_mutable DO_LETOKEN "$DO_LETOKEN"
_info "Adding TXT record to ${fulldomain}"
response="$(_get "$DO_API?token=$DO_LETOKEN&domain=${fulldomain}&value=${txtvalue}")"
if _contains "${response}" 'success'; then
return 0
fi
_err "Could not create resource record, check logs"
_err "${response}"
return 1
}
dns_doapi_rm() {
fulldomain=$1
DO_LETOKEN="${DO_LETOKEN:-$(_readaccountconf_mutable DO_LETOKEN)}"
if [ -z "$DO_LETOKEN" ]; then
DO_LETOKEN=""
_err "You didn't configure a do.de API token yet."
_err "Please set DO_LETOKEN and try again."
return 1
fi
_saveaccountconf_mutable DO_LETOKEN "$DO_LETOKEN"
_info "Deleting resource record $fulldomain"
response="$(_get "$DO_API?token=$DO_LETOKEN&domain=${fulldomain}&action=delete")"
if _contains "${response}" 'success'; then
return 0
fi
_err "Could not delete resource record, check logs"
_err "${response}"
return 1
}

155
dnsapi/dns_domeneshop.sh Normal file
View File

@@ -0,0 +1,155 @@
#!/usr/bin/env sh
DOMENESHOP_Api_Endpoint="https://api.domeneshop.no/v0"
##################### Public functions #####################
# Usage: dns_domeneshop_add <full domain> <txt record>
# Example: dns_domeneshop_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_domeneshop_add() {
fulldomain=$1
txtvalue=$2
# Get token and secret
DOMENESHOP_Token="${DOMENESHOP_Token:-$(_readaccountconf_mutable DOMENESHOP_Token)}"
DOMENESHOP_Secret="${DOMENESHOP_Secret:-$(_readaccountconf_mutable DOMENESHOP_Secret)}"
if [ -z "$DOMENESHOP_Token" ] || [ -z "$DOMENESHOP_Secret" ]; then
DOMENESHOP_Token=""
DOMENESHOP_Secret=""
_err "You need to spesify a Domeneshop/Domainnameshop API Token and Secret."
return 1
fi
# Save the api token and secret.
_saveaccountconf_mutable DOMENESHOP_Token "$DOMENESHOP_Token"
_saveaccountconf_mutable DOMENESHOP_Secret "$DOMENESHOP_Secret"
# Get the domain name id
if ! _get_domainid "$fulldomain"; then
_err "Did not find domainname"
return 1
fi
# Create record
_domeneshop_rest POST "domains/$_domainid/dns" "{\"type\":\"TXT\",\"host\":\"$_sub_domain\",\"data\":\"$txtvalue\",\"ttl\":120}"
}
# Usage: dns_domeneshop_rm <full domain> <txt record>
# Example: dns_domeneshop_rm _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_domeneshop_rm() {
fulldomain=$1
txtvalue=$2
# Get token and secret
DOMENESHOP_Token="${DOMENESHOP_Token:-$(_readaccountconf_mutable DOMENESHOP_Token)}"
DOMENESHOP_Secret="${DOMENESHOP_Secret:-$(_readaccountconf_mutable DOMENESHOP_Secret)}"
if [ -z "$DOMENESHOP_Token" ] || [ -z "$DOMENESHOP_Secret" ]; then
DOMENESHOP_Token=""
DOMENESHOP_Secret=""
_err "You need to spesify a Domeneshop/Domainnameshop API Token and Secret."
return 1
fi
# Get the domain name id
if ! _get_domainid "$fulldomain"; then
_err "Did not find domainname"
return 1
fi
# Find record
if ! _get_recordid "$_domainid" "$_sub_domain" "$txtvalue"; then
_err "Did not find dns record"
return 1
fi
# Remove record
_domeneshop_rest DELETE "domains/$_domainid/dns/$_recordid"
}
##################### Private functions #####################
_get_domainid() {
domain=$1
# Get domains
_domeneshop_rest GET "domains"
if ! _contains "$response" "\"id\":"; then
_err "failed to get domain names"
return 1
fi
i=2
p=1
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug "h" "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
if _contains "$response" "\"$h\"" >/dev/null; then
# We have found the domain name.
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain=$h
_domainid=$(printf "%s" "$response" | _egrep_o "[^{]*\"domain\":\"$_domain\"[^}]*" | _egrep_o "\"id\":[0-9]+" | cut -d : -f 2)
return 0
fi
p=$i
i=$(_math "$i" + 1)
done
return 1
}
_get_recordid() {
domainid=$1
subdomain=$2
txtvalue=$3
# Get all dns records for the domainname
_domeneshop_rest GET "domains/$domainid/dns"
if ! _contains "$response" "\"id\":"; then
_debug "No records in dns"
return 1
fi
if ! _contains "$response" "\"host\":\"$subdomain\""; then
_debug "Record does not exist"
return 1
fi
# Get the id of the record in question
_recordid=$(printf "%s" "$response" | _egrep_o "[^{]*\"host\":\"$subdomain\"[^}]*" | _egrep_o "[^{]*\"data\":\"$txtvalue\"[^}]*" | _egrep_o "\"id\":[0-9]+" | cut -d : -f 2)
if [ -z "$_recordid" ]; then
return 1
fi
return 0
}
_domeneshop_rest() {
method=$1
endpoint=$2
data=$3
credentials=$(printf "%b" "$DOMENESHOP_Token:$DOMENESHOP_Secret" | _base64)
export _H1="Authorization: Basic $credentials"
export _H2="Content-Type: application/json"
if [ "$method" != "GET" ]; then
response="$(_post "$data" "$DOMENESHOP_Api_Endpoint/$endpoint" "" "$method")"
else
response="$(_get "$DOMENESHOP_Api_Endpoint/$endpoint")"
fi
if [ "$?" != "0" ]; then
_err "error $endpoint"
return 1
fi
return 0
}

View File

@@ -53,7 +53,7 @@ dns_dp_rm() {
return 1
fi
if ! _rest POST "Record.List" "login_token=$DP_Id,$DP_Key&format=json&domain_id=$_domain_id&sub_domain=$_sub_domain"; then
if ! _rest POST "Record.List" "login_token=$DP_Id,$DP_Key&format=json&lang=en&domain_id=$_domain_id&sub_domain=$_sub_domain"; then
_err "Record.Lis error."
return 1
fi
@@ -63,19 +63,19 @@ dns_dp_rm() {
return 0
fi
record_id=$(echo "$response" | _egrep_o '{[^{]*"value":"'"$txtvalue"'"' | cut -d , -f 1 | cut -d : -f 2 | tr -d \")
record_id=$(echo "$response" | tr "{" "\n" | grep -- "$txtvalue" | grep '^"id"' | cut -d : -f 2 | cut -d '"' -f 2)
_debug record_id "$record_id"
if [ -z "$record_id" ]; then
_err "Can not get record id."
return 1
fi
if ! _rest POST "Record.Remove" "login_token=$DP_Id,$DP_Key&format=json&domain_id=$_domain_id&record_id=$record_id"; then
if ! _rest POST "Record.Remove" "login_token=$DP_Id,$DP_Key&format=json&lang=en&domain_id=$_domain_id&record_id=$record_id"; then
_err "Record.Remove error."
return 1
fi
_contains "$response" "Action completed successful"
_contains "$response" "successful"
}
@@ -89,11 +89,11 @@ add_record() {
_info "Adding record"
if ! _rest POST "Record.Create" "login_token=$DP_Id,$DP_Key&format=json&domain_id=$_domain_id&sub_domain=$_sub_domain&record_type=TXT&value=$txtvalue&record_line=默认"; then
if ! _rest POST "Record.Create" "login_token=$DP_Id,$DP_Key&format=json&lang=en&domain_id=$_domain_id&sub_domain=$_sub_domain&record_type=TXT&value=$txtvalue&record_line=%E9%BB%98%E8%AE%A4"; then
return 1
fi
_contains "$response" "Action completed successful" || _contains "$response" "Domain record already exists"
_contains "$response" "successful" || _contains "$response" "Domain record already exists"
}
#################### Private functions below ##################################
@@ -113,11 +113,11 @@ _get_root() {
return 1
fi
if ! _rest POST "Domain.Info" "login_token=$DP_Id,$DP_Key&format=json&domain=$h"; then
if ! _rest POST "Domain.Info" "login_token=$DP_Id,$DP_Key&format=json&lang=en&domain=$h"; then
return 1
fi
if _contains "$response" "Action completed successful"; then
if _contains "$response" "successful"; then
_domain_id=$(printf "%s\n" "$response" | _egrep_o "\"id\":\"[^\"]*\"" | cut -d : -f 2 | tr -d \")
_debug _domain_id "$_domain_id"
if [ "$_domain_id" ]; then

161
dnsapi/dns_dpi.sh Executable file
View File

@@ -0,0 +1,161 @@
#!/usr/bin/env sh
# Dnspod.com Domain api
#
#DPI_Id="1234"
#
#DPI_Key="sADDsdasdgdsf"
REST_API="https://api.dnspod.com"
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_dpi_add() {
fulldomain=$1
txtvalue=$2
DPI_Id="${DPI_Id:-$(_readaccountconf_mutable DPI_Id)}"
DPI_Key="${DPI_Key:-$(_readaccountconf_mutable DPI_Key)}"
if [ -z "$DPI_Id" ] || [ -z "$DPI_Key" ]; then
DPI_Id=""
DPI_Key=""
_err "You don't specify dnspod api key and key id yet."
_err "Please create you key and try again."
return 1
fi
#save the api key and email to the account conf file.
_saveaccountconf_mutable DPI_Id "$DPI_Id"
_saveaccountconf_mutable DPI_Key "$DPI_Key"
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "invalid domain"
return 1
fi
add_record "$_domain" "$_sub_domain" "$txtvalue"
}
#fulldomain txtvalue
dns_dpi_rm() {
fulldomain=$1
txtvalue=$2
DPI_Id="${DPI_Id:-$(_readaccountconf_mutable DPI_Id)}"
DPI_Key="${DPI_Key:-$(_readaccountconf_mutable DPI_Key)}"
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "invalid domain"
return 1
fi
if ! _rest POST "Record.List" "login_token=$DPI_Id,$DPI_Key&format=json&domain_id=$_domain_id&sub_domain=$_sub_domain"; then
_err "Record.Lis error."
return 1
fi
if _contains "$response" 'No records'; then
_info "Don't need to remove."
return 0
fi
record_id=$(echo "$response" | tr "{" "\n" | grep -- "$txtvalue" | grep '^"id"' | cut -d : -f 2 | cut -d '"' -f 2)
_debug record_id "$record_id"
if [ -z "$record_id" ]; then
_err "Can not get record id."
return 1
fi
if ! _rest POST "Record.Remove" "login_token=$DPI_Id,$DPI_Key&format=json&domain_id=$_domain_id&record_id=$record_id"; then
_err "Record.Remove error."
return 1
fi
_contains "$response" "Operation successful"
}
#add the txt record.
#usage: root sub txtvalue
add_record() {
root=$1
sub=$2
txtvalue=$3
fulldomain="$sub.$root"
_info "Adding record"
if ! _rest POST "Record.Create" "login_token=$DPI_Id,$DPI_Key&format=json&domain_id=$_domain_id&sub_domain=$_sub_domain&record_type=TXT&value=$txtvalue&record_line=default"; then
return 1
fi
_contains "$response" "Operation successful" || _contains "$response" "Domain record already exists"
}
#################### Private functions below ##################################
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
_get_root() {
domain=$1
i=2
p=1
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
if [ -z "$h" ]; then
#not valid
return 1
fi
if ! _rest POST "Domain.Info" "login_token=$DPI_Id,$DPI_Key&format=json&domain=$h"; then
return 1
fi
if _contains "$response" "Operation successful"; then
_domain_id=$(printf "%s\n" "$response" | _egrep_o "\"id\":\"[^\"]*\"" | cut -d : -f 2 | tr -d \")
_debug _domain_id "$_domain_id"
if [ "$_domain_id" ]; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_debug _sub_domain "$_sub_domain"
_domain="$h"
_debug _domain "$_domain"
return 0
fi
return 1
fi
p="$i"
i=$(_math "$i" + 1)
done
return 1
}
#Usage: method URI data
_rest() {
m="$1"
ep="$2"
data="$3"
_debug "$ep"
url="$REST_API/$ep"
_debug url "$url"
if [ "$m" = "GET" ]; then
response="$(_get "$url" | tr -d '\r')"
else
_debug2 data "$data"
response="$(_post "$data" "$url" | tr -d '\r')"
fi
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}

View File

@@ -12,7 +12,7 @@
DuckDNS_API="https://www.duckdns.org/update"
######## Public functions #####################
######## Public functions ######################
#Usage: dns_duckdns_add _acme-challenge.domain.duckdns.org "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_duckdns_add() {
@@ -91,13 +91,12 @@ dns_duckdns_rm() {
#################### Private functions below ##################################
#fulldomain=_acme-challenge.domain.duckdns.org
#returns
# _duckdns_domain=domain
# fulldomain may be 'domain.duckdns.org' (if using --domain-alias) or '_acme-challenge.domain.duckdns.org'
# either way, return 'domain'. (duckdns does not allow further subdomains and restricts domains to [a-z0-9-].)
_duckdns_get_domain() {
# We'll extract the domain/username from full domain
_duckdns_domain="$(printf "%s" "$fulldomain" | _lower_case | _egrep_o '[.][^.][^.]*[.]duckdns.org' | cut -d . -f 2)"
_duckdns_domain="$(printf "%s" "$fulldomain" | _lower_case | _egrep_o '^(_acme-challenge\.)?([a-z0-9-]+\.)+duckdns\.org' | sed -n 's/^\([^.]\{1,\}\.\)*\([a-z0-9-]\{1,\}\)\.duckdns\.org$/\2/p;')"
if [ -z "$_duckdns_domain" ]; then
_err "Error extracting the domain."
@@ -113,16 +112,21 @@ _duckdns_rest() {
param="$2"
_debug param "$param"
url="$DuckDNS_API?$param"
if [ -n "$DEBUG" ] && [ "$DEBUG" -gt 0 ]; then
url="$url&verbose=true"
fi
_debug url "$url"
# DuckDNS uses GET to update domain info
if [ "$method" = "GET" ]; then
response="$(_get "$url")"
_debug2 response "$response"
if [ -n "$DEBUG" ] && [ "$DEBUG" -gt 0 ] && _contains "$response" "UPDATED" && _contains "$response" "OK"; then
response="OK"
fi
else
_err "Unsupported method"
return 1
fi
_debug2 response "$response"
return 0
}

176
dnsapi/dns_durabledns.sh Normal file
View File

@@ -0,0 +1,176 @@
#!/usr/bin/env sh
#DD_API_User="xxxxx"
#DD_API_Key="xxxxxx"
_DD_BASE="https://durabledns.com/services/dns"
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_durabledns_add() {
fulldomain=$1
txtvalue=$2
DD_API_User="${DD_API_User:-$(_readaccountconf_mutable DD_API_User)}"
DD_API_Key="${DD_API_Key:-$(_readaccountconf_mutable DD_API_Key)}"
if [ -z "$DD_API_User" ] || [ -z "$DD_API_Key" ]; then
DD_API_User=""
DD_API_Key=""
_err "You didn't specify a durabledns api user or key yet."
_err "You can get yours from here https://durabledns.com/dashboard/index.php"
return 1
fi
#save the api key and email to the account conf file.
_saveaccountconf_mutable DD_API_User "$DD_API_User"
_saveaccountconf_mutable DD_API_Key "$DD_API_Key"
_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"
_dd_soap createRecord string zonename "$_domain." string name "$_sub_domain" string type "TXT" string data "$txtvalue" int aux 0 int ttl 10 string ddns_enabled N
_contains "$response" "createRecordResponse"
}
dns_durabledns_rm() {
fulldomain=$1
txtvalue=$2
DD_API_User="${DD_API_User:-$(_readaccountconf_mutable DD_API_User)}"
DD_API_Key="${DD_API_Key:-$(_readaccountconf_mutable DD_API_Key)}"
if [ -z "$DD_API_User" ] || [ -z "$DD_API_Key" ]; then
DD_API_User=""
DD_API_Key=""
_err "You didn't specify a durabledns api user or key yet."
_err "You can get yours from here https://durabledns.com/dashboard/index.php"
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 "Find record id"
if ! _dd_soap listRecords string zonename "$_domain."; then
_err "can not listRecords"
return 1
fi
subtxt="$(echo "$txtvalue" | cut -c 1-30)"
record="$(echo "$response" | sed 's/<item\>/#<item>/g' | tr '#' '\n' | grep ">$subtxt")"
_debug record "$record"
if [ -z "$record" ]; then
_err "can not find record for txtvalue" "$txtvalue"
_err "$response"
return 1
fi
recordid="$(echo "$record" | _egrep_o '<id xsi:type="xsd:int">[0-9]*</id>' | cut -d '>' -f 2 | cut -d '<' -f 1)"
_debug recordid "$recordid"
if [ -z "$recordid" ]; then
_err "can not find record id"
return 1
fi
if ! _dd_soap deleteRecord string zonename "$_domain." int id "$recordid"; then
_err "delete error"
return 1
fi
_contains "$response" "Success"
}
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
_get_root() {
domain=$1
if ! _dd_soap "listZones"; then
return 1
fi
i=1
p=1
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
if _contains "$response" ">$h.</origin>"; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain=$h
return 0
fi
p=$i
i=$(_math "$i" + 1)
done
return 1
}
#method
_dd_soap() {
_method="$1"
shift
_urn="${_method}wsdl"
# put the parameters to xml
body="<tns:$_method>
<apiuser xsi:type=\"xsd:string\">$DD_API_User</apiuser>
<apikey xsi:type=\"xsd:string\">$DD_API_Key</apikey>
"
while [ "$1" ]; do
_t="$1"
shift
_k="$1"
shift
_v="$1"
shift
body="$body<$_k xsi:type=\"xsd:$_t\">$_v</$_k>"
done
body="$body</tns:$_method>"
_debug2 "SOAP request ${body}"
# build SOAP XML
_xml='<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="urn:'$_urn'"
xmlns:types="urn:'$_urn'/encodedTypes"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">'"$body"'</soap:Body>
</soap:Envelope>'
_debug2 _xml "$_xml"
# set SOAP headers
_action="SOAPAction: \"urn:$_urn#$_method\""
_debug2 "_action" "$_action"
export _H1="$_action"
export _H2="Content-Type: text/xml; charset=utf-8"
_url="$_DD_BASE/$_method.php"
_debug "_url" "$_url"
if ! response="$(_post "${_xml}" "${_url}")"; then
_err "Error <$1>"
return 1
fi
_debug2 "response" "$response"
response="$(echo "$response" | tr -d "\r\n" | _egrep_o ":${_method}Response .*:${_method}Response><")"
_debug2 "response" "$response"
return 0
}

View File

@@ -10,7 +10,7 @@
Dynu_Token=""
#
#Endpoint
Dynu_EndPoint="https://api.dynu.com/v1"
Dynu_EndPoint="https://api.dynu.com/v2"
#
#Author: Dynu Systems, Inc.
#Report Bugs here: https://github.com/shar0119/acme.sh
@@ -51,11 +51,11 @@ dns_dynu_add() {
_debug _domain_name "$_domain_name"
_info "Creating TXT record."
if ! _dynu_rest POST "dns/record/add" "{\"domain_name\":\"$_domain_name\",\"node_name\":\"$_node\",\"record_type\":\"TXT\",\"text_data\":\"$txtvalue\",\"state\":true,\"ttl\":90}"; then
if ! _dynu_rest POST "dns/$dnsId/record" "{\"domainId\":\"$dnsId\",\"nodeName\":\"$_node\",\"recordType\":\"TXT\",\"textData\":\"$txtvalue\",\"state\":true,\"ttl\":90}"; then
return 1
fi
if ! _contains "$response" "text_data"; then
if ! _contains "$response" "200"; then
_err "Could not add TXT record."
return 1
fi
@@ -132,11 +132,12 @@ _get_root() {
return 1
fi
if ! _dynu_rest GET "dns/get/$h"; then
if ! _dynu_rest GET "dns/getroot/$h"; then
return 1
fi
if _contains "$response" "\"name\":\"$h\"" >/dev/null; then
if _contains "$response" "\"domainName\":\"$h\"" >/dev/null; then
dnsId=$(printf "%s" "$response" | tr -d "{}" | cut -d , -f 2 | cut -d : -f 2)
_domain_name=$h
_node=$(printf "%s" "$domain" | cut -d . -f 1-$p)
return 0
@@ -152,7 +153,7 @@ _get_recordid() {
fulldomain=$1
txtvalue=$2
if ! _dynu_rest GET "dns/record/get?hostname=$fulldomain&rrtype=TXT"; then
if ! _dynu_rest GET "dns/$dnsId/record"; then
return 1
fi
@@ -161,19 +162,18 @@ _get_recordid() {
return 0
fi
_dns_record_id=$(printf "%s" "$response" | _egrep_o "{[^}]*}" | grep "\"text_data\":\"$txtvalue\"" | _egrep_o ",[^,]*," | grep ',"id":' | tr -d ",," | cut -d : -f 2)
_dns_record_id=$(printf "%s" "$response" | sed -e 's/[^{]*\({[^}]*}\)[^{]*/\1\n/g' | grep "\"textData\":\"$txtvalue\"" | sed -e 's/.*"id":\([^,]*\).*/\1/')
return 0
}
_delete_txt_record() {
_dns_record_id=$1
if ! _dynu_rest GET "dns/record/delete/$_dns_record_id"; then
if ! _dynu_rest DELETE "dns/$dnsId/record/$_dns_record_id"; then
return 1
fi
if ! _contains "$response" "true"; then
if ! _contains "$response" "200"; then
return 1
fi
@@ -189,7 +189,7 @@ _dynu_rest() {
export _H1="Authorization: Bearer $Dynu_Token"
export _H2="Content-Type: application/json"
if [ "$data" ]; then
if [ "$data" ] || [ "$m" = "DELETE" ]; then
_debug data "$data"
response="$(_post "$data" "$Dynu_EndPoint/$ep" "" "$m")"
else
@@ -216,8 +216,12 @@ _dynu_authentication() {
_err "Authentication failed."
return 1
fi
if _contains "$response" "accessToken"; then
Dynu_Token=$(printf "%s" "$response" | tr -d "[]" | cut -d , -f 2 | cut -d : -f 2 | cut -d '"' -f 2)
if _contains "$response" "Authentication Exception"; then
_err "Authentication failed."
return 1
fi
if _contains "$response" "access_token"; then
Dynu_Token=$(printf "%s" "$response" | tr -d "{}" | cut -d , -f 1 | cut -d : -f 2 | cut -d '"' -f 2)
fi
if _contains "$Dynu_Token" "null"; then
Dynu_Token=""

285
dnsapi/dns_dynv6.sh Normal file
View File

@@ -0,0 +1,285 @@
#!/usr/bin/env sh
#Author StefanAbl
#Usage specify a private keyfile to use with dynv6 'export KEY="path/to/keyfile"'
#or use the HTTP REST API by by specifying a token 'export DYNV6_TOKEN="value"
#if no keyfile is specified, you will be asked if you want to create one in /home/$USER/.ssh/dynv6 and /home/$USER/.ssh/dynv6.pub
dynv6_api="https://dynv6.com/api/v2"
######## Public functions #####################
# Please Read this guide first: https://github.com/Neilpang/acme.sh/wiki/DNS-API-Dev-Guide
#Usage: dns_dynv6_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_dynv6_add() {
fulldomain=$1
txtvalue=$2
_info "Using dynv6 api"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
_get_authentication
if [ "$dynv6_token" ]; then
_dns_dynv6_add_http
return $?
else
_info "using key file $dynv6_keyfile"
_your_hosts="$(ssh -i "$dynv6_keyfile" api@dynv6.com hosts)"
if ! _get_domain "$fulldomain" "$_your_hosts"; then
_err "Host not found on your account"
return 1
fi
_debug "found host on your account"
returnval="$(ssh -i "$dynv6_keyfile" api@dynv6.com hosts \""$_host"\" records set \""$_record"\" txt data \""$txtvalue"\")"
_debug "Dynv6 returned this after record was added: $returnval"
if _contains "$returnval" "created"; then
return 0
elif _contains "$returnval" "updated"; then
return 0
else
_err "Something went wrong! it does not seem like the record was added successfully"
return 1
fi
return 1
fi
return 1
}
#Usage: fulldomain txtvalue
#Remove the txt record after validation.
dns_dynv6_rm() {
fulldomain=$1
txtvalue=$2
_info "Using dynv6 API"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
_get_authentication
if [ "$dynv6_token" ]; then
_dns_dynv6_rm_http
return $?
else
_info "using key file $dynv6_keyfile"
_your_hosts="$(ssh -i "$dynv6_keyfile" api@dynv6.com hosts)"
if ! _get_domain "$fulldomain" "$_your_hosts"; then
_err "Host not found on your account"
return 1
fi
_debug "found host on your account"
_info "$(ssh -i "$dynv6_keyfile" api@dynv6.com hosts "\"$_host\"" records del "\"$_record\"" txt)"
return 0
fi
}
#################### Private functions below ##################################
#Usage: No Input required
#returns
#dynv6_keyfile the path to the new key file that has been generated
_generate_new_key() {
dynv6_keyfile="$(eval echo ~"$USER")/.ssh/dynv6"
_info "Path to key file used: $dynv6_keyfile"
if [ ! -f "$dynv6_keyfile" ] && [ ! -f "$dynv6_keyfile.pub" ]; then
_debug "generating key in $dynv6_keyfile and $dynv6_keyfile.pub"
ssh-keygen -f "$dynv6_keyfile" -t ssh-ed25519 -N ''
else
_err "There is already a file in $dynv6_keyfile or $dynv6_keyfile.pub"
return 1
fi
}
#Usage: _acme-challenge.www.example.dynv6.net "$_your_hosts"
#where _your_hosts is the output of ssh -i ~/.ssh/dynv6.pub api@dynv6.com hosts
#returns
#_host= example.dynv6.net
#_record=_acme-challenge.www
#aborts if not a valid domain
_get_domain() {
#_your_hosts="$(ssh -i ~/.ssh/dynv6.pub api@dynv6.com hosts)"
_full_domain="$1"
_your_hosts="$2"
_your_hosts="$(echo "$_your_hosts" | awk '/\./ {print $1}')"
for l in $_your_hosts; do
#echo "host: $l"
if test "${_full_domain#*$l}" != "$_full_domain"; then
_record="${_full_domain%.$l}"
_host=$l
_debug "The host is $_host and the record $_record"
return 0
fi
done
_err "Either their is no such host on your dnyv6 account or it cannot be accessed with this key"
return 1
}
# Usage: No input required
#returns
#dynv6_keyfile path to the key that will be used
_get_authentication() {
dynv6_token="${DYNV6_TOKEN:-$(_readaccountconf_mutable dynv6_token)}"
if [ "$dynv6_token" ]; then
_debug "Found HTTP Token. Going to use the HTTP API and not the SSH API"
if [ "$DYNV6_TOKEN" ]; then
_saveaccountconf_mutable dynv6_token "$dynv6_token"
fi
else
_debug "no HTTP token found. Looking for an SSH key"
dynv6_keyfile="${dynv6_keyfile:-$(_readaccountconf_mutable dynv6_keyfile)}"
_debug "Your key is $dynv6_keyfile"
if [ -z "$dynv6_keyfile" ]; then
if [ -z "$KEY" ]; then
_err "You did not specify a key to use with dynv6"
_info "Creating new dynv6 API key to add to dynv6.com"
_generate_new_key
_info "Please add this key to dynv6.com $(cat "$dynv6_keyfile.pub")"
_info "Hit Enter to continue"
read -r _
#save the credentials to the account conf file.
else
dynv6_keyfile="$KEY"
fi
_saveaccountconf_mutable dynv6_keyfile "$dynv6_keyfile"
fi
fi
}
_dns_dynv6_add_http() {
_debug "Got HTTP token form _get_authentication method. Going to use the HTTP API"
if ! _get_zone_id "$fulldomain"; then
_err "Could not find a matching zone for $fulldomain. Maybe your HTTP Token is not authorized to access the zone"
return 1
fi
_get_zone_name "$_zone_id"
record="${fulldomain%%.$_zone_name}"
_set_record TXT "$record" "$txtvalue"
if _contains "$response" "$txtvalue"; then
_info "Successfully added record"
return 0
else
_err "Something went wrong while adding the record"
return 1
fi
}
_dns_dynv6_rm_http() {
_debug "Got HTTP token form _get_authentication method. Going to use the HTTP API"
if ! _get_zone_id "$fulldomain"; then
_err "Could not find a matching zone for $fulldomain. Maybe your HTTP Token is not authorized to access the zone"
return 1
fi
_get_zone_name "$_zone_id"
record="${fulldomain%%.$_zone_name}"
_get_record_id "$_zone_id" "$record" "$txtvalue"
_del_record "$_zone_id" "$_record_id"
if [ -z "$response" ]; then
_info "Successfully deleted record"
return 0
else
_err "Something went wrong while deleting the record"
return 1
fi
}
#get the zoneid for a specifc record or zone
#usage: _get_zone_id §record
#where $record is the record to get the id for
#returns _zone_id the id of the zone
_get_zone_id() {
record="$1"
_debug "getting zone id for $record"
_dynv6_rest GET zones
zones="$(echo "$response" | tr '}' '\n' | tr ',' '\n' | grep name | sed 's/\[//g' | tr -d '{' | tr -d '"')"
#echo $zones
selected=""
for z in $zones; do
z="${z#name:}"
_debug zone: "$z"
if _contains "$record" "$z"; then
_debug "$z found in $record"
selected="$z"
fi
done
if [ -z "$selected" ]; then
_err "no zone found"
return 1
fi
zone_id="$(echo "$response" | tr '}' '\n' | grep "$selected" | tr ',' '\n' | grep id | tr -d '"')"
_zone_id="${zone_id#id:}"
_debug "zone id: $_zone_id"
}
_get_zone_name() {
_zone_id="$1"
_dynv6_rest GET zones/"$_zone_id"
_zone_name="$(echo "$response" | tr ',' '\n' | tr -d '{' | grep name | tr -d '"')"
_zone_name="${_zone_name#name:}"
}
#usaage _get_record_id $zone_id $record
# where zone_id is thevalue returned by _get_zone_id
# and record ist in the form _acme.www for an fqdn of _acme.www.example.com
# returns _record_id
_get_record_id() {
_zone_id="$1"
record="$2"
value="$3"
_dynv6_rest GET "zones/$_zone_id/records"
if ! _get_record_id_from_response "$response"; then
_err "no such record $record found in zone $_zone_id"
return 1
fi
}
_get_record_id_from_response() {
response="$1"
_record_id="$(echo "$response" | tr '}' '\n' | grep "\"name\":\"$record\"" | grep "\"data\":\"$value\"" | tr ',' '\n' | grep id | tr -d '"' | tr -d 'id:')"
#_record_id="${_record_id#id:}"
if [ -z "$_record_id" ]; then
_err "no such record: $record found in zone $_zone_id"
return 1
fi
_debug "record id: $_record_id"
return 0
}
#usage: _set_record TXT _acme_challenge.www longvalue 12345678
#zone id is optional can also be set as vairable bevor calling this method
_set_record() {
type="$1"
record="$2"
value="$3"
if [ "$4" ]; then
_zone_id="$4"
fi
data="{\"name\": \"$record\", \"data\": \"$value\", \"type\": \"$type\"}"
#data='{ "name": "acme.test.thorn.dynv6.net", "type": "A", "data": "192.168.0.1"}'
echo "$data"
#"{\"type\":\"TXT\",\"name\":\"$fulldomain\",\"content\":\"$txtvalue\",\"ttl\":120}"
_dynv6_rest POST "zones/$_zone_id/records" "$data"
}
_del_record() {
_zone_id=$1
_record_id=$2
_dynv6_rest DELETE zones/"$_zone_id"/records/"$_record_id"
}
_dynv6_rest() {
m=$1 #method GET,POST,DELETE or PUT
ep="$2" #the endpoint
data="$3"
_debug "$ep"
token_trimmed=$(echo "$dynv6_token" | tr -d '"')
export _H1="Authorization: Bearer $token_trimmed"
export _H2="Content-Type: application/json"
if [ "$m" != "GET" ]; then
_debug data "$data"
response="$(_post "$data" "$dynv6_api/$ep" "" "$m")"
else
response="$(_get "$dynv6_api/$ep")"
fi
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}

171
dnsapi/dns_easydns.sh Normal file
View File

@@ -0,0 +1,171 @@
#!/usr/bin/env sh
#######################################################
#
# easyDNS REST API for acme.sh by Neilpang based on dns_cf.sh
#
# API Documentation: https://sandbox.rest.easydns.net:3001/
#
# Author: wurzelpanzer [wurzelpanzer@maximolider.net]
# Report Bugs here: https://github.com/acmesh-official/acme.sh/issues/2647
#
#################### Public functions #################
#EASYDNS_Key="xxxxxxxxxxxxxxxxxxxxxxxx"
#EASYDNS_Token="xxxxxxxxxxxxxxxxxxxxxxxx"
EASYDNS_Api="https://rest.easydns.net"
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_easydns_add() {
fulldomain=$1
txtvalue=$2
EASYDNS_Token="${EASYDNS_Token:-$(_readaccountconf_mutable EASYDNS_Token)}"
EASYDNS_Key="${EASYDNS_Key:-$(_readaccountconf_mutable EASYDNS_Key)}"
if [ -z "$EASYDNS_Token" ] || [ -z "$EASYDNS_Key" ]; then
_err "You didn't specify an easydns.net token or api key. Signup at https://cp.easydns.com/manage/security/api/signup.php"
return 1
else
_saveaccountconf_mutable EASYDNS_Token "$EASYDNS_Token"
_saveaccountconf_mutable EASYDNS_Key "$EASYDNS_Key"
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 "Getting txt records"
_EASYDNS_rest GET "zones/records/all/${_domain}/search/${_sub_domain}"
if ! printf "%s" "$response" | grep \"status\":200 >/dev/null; then
_err "Error"
return 1
fi
_info "Adding record"
if _EASYDNS_rest PUT "zones/records/add/$_domain/TXT" "{\"host\":\"$_sub_domain\",\"rdata\":\"$txtvalue\"}"; then
if _contains "$response" "\"status\":201"; then
_info "Added, OK"
return 0
elif _contains "$response" "Record already exists"; then
_info "Already exists, OK"
return 0
else
_err "Add txt record error."
return 1
fi
fi
_err "Add txt record error."
return 1
}
dns_easydns_rm() {
fulldomain=$1
txtvalue=$2
EASYDNS_Token="${EASYDNS_Token:-$(_readaccountconf_mutable EASYDNS_Token)}"
EASYDNS_Key="${EASYDNS_Key:-$(_readaccountconf_mutable EASYDNS_Key)}"
_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 "Getting txt records"
_EASYDNS_rest GET "zones/records/all/${_domain}/search/${_sub_domain}"
if ! printf "%s" "$response" | grep \"status\":200 >/dev/null; then
_err "Error"
return 1
fi
count=$(printf "%s\n" "$response" | _egrep_o "\"count\":[^,]*" | cut -d : -f 2)
_debug count "$count"
if [ "$count" = "0" ]; then
_info "Don't need to remove."
else
record_id=$(printf "%s\n" "$response" | _egrep_o "\"id\":\"[^\"]*\"" | cut -d : -f 2 | tr -d \" | head -n 1)
_debug "record_id" "$record_id"
if [ -z "$record_id" ]; then
_err "Can not get record id to remove."
return 1
fi
if ! _EASYDNS_rest DELETE "zones/records/$_domain/$record_id"; then
_err "Delete record error."
return 1
fi
_contains "$response" "\"status\":200"
fi
}
#################### Private functions below ##################################
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
_get_root() {
domain=$1
i=1
p=1
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
if ! _EASYDNS_rest GET "zones/records/all/$h"; then
return 1
fi
if _contains "$response" "\"status\":200"; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain=$h
return 0
fi
p=$i
i=$(_math "$i" + 1)
done
return 1
}
_EASYDNS_rest() {
m=$1
ep="$2"
data="$3"
_debug "$ep"
basicauth=$(printf "%s" "$EASYDNS_Token":"$EASYDNS_Key" | _base64)
export _H1="accept: application/json"
if [ "$basicauth" ]; then
export _H2="Authorization: Basic $basicauth"
fi
if [ "$m" != "GET" ]; then
export _H3="Content-Type: application/json"
_debug data "$data"
response="$(_post "$data" "$EASYDNS_Api/$ep" "" "$m")"
else
response="$(_get "$EASYDNS_Api/$ep")"
fi
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}

466
dnsapi/dns_edgedns.sh Executable file
View File

@@ -0,0 +1,466 @@
#!/usr/bin/env sh
# Akamai Edge DNS v2 API
# User must provide Open Edgegrid API credentials to the EdgeDNS installation. The remote user in EdgeDNS must have CRUD access to
# Edge DNS Zones and Recordsets, e.g. DNS—Zone Record Management authorization
# Report bugs to https://control.akamai.com/apps/support-ui/#/contact-support
# Values to export:
# --EITHER--
# *** TBD. NOT IMPLEMENTED YET ***
# specify Edgegrid credentials file and section
# AKAMAI_EDGERC=<full file path>
# AKAMAI_EDGERC_SECTION="default"
## --OR--
# specify indiviual credentials
# export AKAMAI_HOST = <host>
# export AKAMAI_ACCESS_TOKEN = <access token>
# export AKAMAI_CLIENT_TOKEN = <client token>
# export AKAMAI_CLIENT_SECRET = <client secret>
ACME_EDGEDNS_VERSION="0.1.0"
######## Public functions #####################
# Usage: dns_edgedns_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
# Used to add txt record
#
dns_edgedns_add() {
fulldomain=$1
txtvalue=$2
_debug "ENTERING DNS_EDGEDNS_ADD"
_debug2 "fulldomain" "$fulldomain"
_debug2 "txtvalue" "$txtvalue"
if ! _EDGEDNS_credentials; then
_err "$@"
return 1
fi
if ! _EDGEDNS_getZoneInfo "$fulldomain"; then
_err "Invalid domain"
return 1
fi
_debug2 "Add: zone" "$zone"
acmeRecordURI=$(printf "%s/%s/names/%s/types/TXT" "$edge_endpoint" "$zone" "$fulldomain")
_debug3 "Add URL" "$acmeRecordURI"
# Get existing TXT record
_edge_result=$(_edgedns_rest GET "$acmeRecordURI")
_api_status="$?"
_debug3 "_edge_result" "$_edge_result"
if [ "$_api_status" -ne 0 ]; then
if [ "$curResult" = "FATAL" ]; then
_err "$(printf "Fatal error: acme API function call : %s" "$retVal")"
fi
if [ "$_edge_result" != "404" ]; then
_err "$(printf "Failure accessing Akamai Edge DNS API Server. Error: %s" "$_edge_result")"
return 1
fi
fi
rdata="\"${txtvalue}\""
record_op="POST"
if [ "$_api_status" -eq 0 ]; then
# record already exists. Get existing record data and update
record_op="PUT"
rdlist="${_edge_result#*\"rdata\":[}"
rdlist="${rdlist%%]*}"
rdlist=$(echo "$rdlist" | tr -d '"' | tr -d "\\\\")
_debug3 "existing TXT found"
_debug3 "record data" "$rdlist"
# value already there?
if _contains "$rdlist" "$txtvalue"; then
return 0
fi
_txt_val=""
while [ "$_txt_val" != "$rdlist" ] && [ "${rdlist}" ]; do
_txt_val="${rdlist%%,*}"
rdlist="${rdlist#*,}"
rdata="${rdata},\"${_txt_val}\""
done
fi
# Add the txtvalue TXT Record
body="{\"name\":\"$fulldomain\",\"type\":\"TXT\",\"ttl\":600, \"rdata\":"[${rdata}]"}"
_debug3 "Add body '${body}'"
_edge_result=$(_edgedns_rest "$record_op" "$acmeRecordURI" "$body")
_api_status="$?"
if [ "$_api_status" -eq 0 ]; then
_log "$(printf "Text value %s added to recordset %s" "$txtvalue" "$fulldomain")"
return 0
else
_err "$(printf "error adding TXT record for validation. Error: %s" "$_edge_result")"
return 1
fi
}
# Usage: dns_edgedns_rm _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
# Used to delete txt record
#
dns_edgedns_rm() {
fulldomain=$1
txtvalue=$2
_debug "ENTERING DNS_EDGEDNS_RM"
_debug2 "fulldomain" "$fulldomain"
_debug2 "txtvalue" "$txtvalue"
if ! _EDGEDNS_credentials; then
_err "$@"
return 1
fi
if ! _EDGEDNS_getZoneInfo "$fulldomain"; then
_err "Invalid domain"
return 1
fi
_debug2 "RM: zone" "${zone}"
acmeRecordURI=$(printf "%s/%s/names/%s/types/TXT" "${edge_endpoint}" "$zone" "$fulldomain")
_debug3 "RM URL" "$acmeRecordURI"
# Get existing TXT record
_edge_result=$(_edgedns_rest GET "$acmeRecordURI")
_api_status="$?"
if [ "$_api_status" -ne 0 ]; then
if [ "$curResult" = "FATAL" ]; then
_err "$(printf "Fatal error: acme API function call : %s" "$retVal")"
fi
if [ "$_edge_result" != "404" ]; then
_err "$(printf "Failure accessing Akamai Edge DNS API Server. Error: %s" "$_edge_result")"
return 1
fi
fi
_debug3 "_edge_result" "$_edge_result"
record_op="DELETE"
body=""
if [ "$_api_status" -eq 0 ]; then
# record already exists. Get existing record data and update
rdlist="${_edge_result#*\"rdata\":[}"
rdlist="${rdlist%%]*}"
rdlist=$(echo "$rdlist" | tr -d '"' | tr -d "\\\\")
_debug3 "rdlist" "$rdlist"
if [ -n "$rdlist" ]; then
record_op="PUT"
comma=""
rdata=""
_txt_val=""
while [ "$_txt_val" != "$rdlist" ] && [ "$rdlist" ]; do
_txt_val="${rdlist%%,*}"
rdlist="${rdlist#*,}"
_debug3 "_txt_val" "$_txt_val"
_debug3 "txtvalue" "$txtvalue"
if ! _contains "$_txt_val" "$txtvalue"; then
rdata="${rdata}${comma}\"${_txt_val}\""
comma=","
fi
done
if [ -z "$rdata" ]; then
record_op="DELETE"
else
# Recreate the txtvalue TXT Record
body="{\"name\":\"$fulldomain\",\"type\":\"TXT\",\"ttl\":600, \"rdata\":"[${rdata}]"}"
_debug3 "body" "$body"
fi
fi
fi
_edge_result=$(_edgedns_rest "$record_op" "$acmeRecordURI" "$body")
_api_status="$?"
if [ "$_api_status" -eq 0 ]; then
_log "$(printf "Text value %s removed from recordset %s" "$txtvalue" "$fulldomain")"
return 0
else
_err "$(printf "error removing TXT record for validation. Error: %s" "$_edge_result")"
return 1
fi
}
#################### Private functions below ##################################
_EDGEDNS_credentials() {
_debug "GettingEdge DNS credentials"
_log "$(printf "ACME DNSAPI Edge DNS version %s" ${ACME_EDGEDNS_VERSION})"
args_missing=0
if [ -z "$AKAMAI_ACCESS_TOKEN" ]; then
AKAMAI_ACCESS_TOKEN=""
AKAMAI_CLIENT_TOKEN=""
AKAMAI_HOST=""
AKAMAI_CLIENT_SECRET=""
_err "AKAMAI_ACCESS_TOKEN is missing"
args_missing=1
fi
if [ -z "$AKAMAI_CLIENT_TOKEN" ]; then
AKAMAI_ACCESS_TOKEN=""
AKAMAI_CLIENT_TOKEN=""
AKAMAI_HOST=""
AKAMAI_CLIENT_SECRET=""
_err "AKAMAI_CLIENT_TOKEN is missing"
args_missing=1
fi
if [ -z "$AKAMAI_HOST" ]; then
AKAMAI_ACCESS_TOKEN=""
AKAMAI_CLIENT_TOKEN=""
AKAMAI_HOST=""
AKAMAI_CLIENT_SECRET=""
_err "AKAMAI_HOST is missing"
args_missing=1
fi
if [ -z "$AKAMAI_CLIENT_SECRET" ]; then
AKAMAI_ACCESS_TOKEN=""
AKAMAI_CLIENT_TOKEN=""
AKAMAI_HOST=""
AKAMAI_CLIENT_SECRET=""
_err "AKAMAI_CLIENT_SECRET is missing"
args_missing=1
fi
if [ "$args_missing" = 1 ]; then
_err "You have not properly specified the EdgeDNS Open Edgegrid API credentials. Please try again."
return 1
else
_saveaccountconf_mutable AKAMAI_ACCESS_TOKEN "$AKAMAI_ACCESS_TOKEN"
_saveaccountconf_mutable AKAMAI_CLIENT_TOKEN "$AKAMAI_CLIENT_TOKEN"
_saveaccountconf_mutable AKAMAI_HOST "$AKAMAI_HOST"
_saveaccountconf_mutable AKAMAI_CLIENT_SECRET "$AKAMAI_CLIENT_SECRET"
# Set whether curl should use secure or insecure mode
fi
export HTTPS_INSECURE=0 # All Edgegrid API calls are secure
edge_endpoint=$(printf "https://%s/config-dns/v2/zones" "$AKAMAI_HOST")
_debug3 "Edge API Endpoint:" "$edge_endpoint"
}
_EDGEDNS_getZoneInfo() {
_debug "Getting Zoneinfo"
zoneEnd=false
curZone=$1
while [ -n "$zoneEnd" ]; do
# we can strip the first part of the fulldomain, since its just the _acme-challenge string
curZone="${curZone#*.}"
# suffix . needed for zone -> domain.tld.
# create zone get url
get_zone_url=$(printf "%s/%s" "$edge_endpoint" "$curZone")
_debug3 "Zone Get: " "${get_zone_url}"
curResult=$(_edgedns_rest GET "$get_zone_url")
retVal=$?
if [ "$retVal" -ne 0 ]; then
if [ "$curResult" = "FATAL" ]; then
_err "$(printf "Fatal error: acme API function call : %s" "$retVal")"
fi
if [ "$curResult" != "404" ]; then
_err "$(printf "Managed zone validation failed. Error response: %s" "$retVal")"
return 1
fi
fi
if _contains "$curResult" "\"zone\":"; then
_debug2 "Zone data" "${curResult}"
zone=$(echo "${curResult}" | _egrep_o "\"zone\"\\s*:\\s*\"[^\"]*\"" | _head_n 1 | cut -d : -f 2 | tr -d "\"")
_debug3 "Zone" "${zone}"
zoneEnd=""
return 0
fi
if [ "${curZone#*.}" != "$curZone" ]; then
_debug3 "$(printf "%s still contains a '.' - so we can check next higher level" "$curZone")"
else
zoneEnd=true
_err "Couldn't retrieve zone data."
return 1
fi
done
_err "Failed to retrieve zone data."
return 2
}
_edgedns_headers=""
_edgedns_rest() {
_debug "Handling API Request"
m=$1
# Assume endpoint is complete path, including query args if applicable
ep=$2
body_data=$3
_edgedns_content_type=""
_request_url_path="$ep"
_request_body="$body_data"
_request_method="$m"
_edgedns_headers=""
tab=""
_edgedns_headers="${_edgedns_headers}${tab}Host: ${AKAMAI_HOST}"
tab="\t"
# Set in acme.sh _post/_get
#_edgedns_headers="${_edgedns_headers}${tab}User-Agent:ACME DNSAPI Edge DNS version ${ACME_EDGEDNS_VERSION}"
_edgedns_headers="${_edgedns_headers}${tab}Accept: application/json,*/*"
if [ "$m" != "GET" ] && [ "$m" != "DELETE" ]; then
_edgedns_content_type="application/json"
_debug3 "_request_body" "$_request_body"
_body_len=$(echo "$_request_body" | tr -d "\n\r" | awk '{print length}')
_edgedns_headers="${_edgedns_headers}${tab}Content-Length: ${_body_len}"
fi
_edgedns_make_auth_header
_edgedns_headers="${_edgedns_headers}${tab}Authorization: ${_signed_auth_header}"
_secure_debug2 "Made Auth Header" "$_signed_auth_header"
hdr_indx=1
work_header="${_edgedns_headers}${tab}"
_debug3 "work_header" "$work_header"
while [ "$work_header" ]; do
entry="${work_header%%\\t*}"
work_header="${work_header#*\\t}"
export "$(printf "_H%s=%s" "$hdr_indx" "$entry")"
_debug2 "Request Header " "$entry"
hdr_indx=$((hdr_indx + 1))
done
# clear headers from previous request to avoid getting wrong http code on timeouts
: >"$HTTP_HEADER"
_debug2 "$ep"
if [ "$m" != "GET" ]; then
_debug3 "Method data" "$data"
# body url [needbase64] [POST|PUT|DELETE] [ContentType]
response=$(_post "$_request_body" "$ep" false "$m" "$_edgedns_content_type")
else
response=$(_get "$ep")
fi
_ret="$?"
if [ "$_ret" -ne 0 ]; then
_err "$(printf "acme.sh API function call failed. Error: %s" "$_ret")"
echo "FATAL"
return "$_ret"
fi
_debug2 "response" "${response}"
_code="$(grep "^HTTP" "$HTTP_HEADER" | _tail_n 1 | cut -d " " -f 2 | tr -d "\\r\\n")"
_debug2 "http response code" "$_code"
if [ "$_code" = "200" ] || [ "$_code" = "201" ]; then
# All good
response="$(echo "${response}" | _normalizeJson)"
echo "$response"
return 0
fi
if [ "$_code" = "204" ]; then
# Success, no body
echo "$_code"
return 0
fi
if [ "$_code" = "400" ]; then
_err "Bad request presented"
_log "$(printf "Headers: %s" "$_edgedns_headers")"
_log "$(printf "Method: %s" "$_request_method")"
_log "$(printf "URL: %s" "$ep")"
_log "$(printf "Data: %s" "$data")"
fi
if [ "$_code" = "403" ]; then
_err "access denied make sure your Edgegrid cedentials are correct."
fi
echo "$_code"
return 1
}
_edgedns_eg_timestamp() {
_debug "Generating signature Timestamp"
_debug3 "Retriving ntp time"
_timeheaders="$(_get "https://www.ntp.org" "onlyheader")"
_debug3 "_timeheaders" "$_timeheaders"
_ntpdate="$(echo "$_timeheaders" | grep -i "Date:" | _head_n 1 | cut -d ':' -f 2- | tr -d "\r\n")"
_debug3 "_ntpdate" "$_ntpdate"
_ntpdate="$(echo "${_ntpdate}" | sed -e 's/^[[:space:]]*//')"
_debug3 "_NTPDATE" "$_ntpdate"
_ntptime="$(echo "${_ntpdate}" | _head_n 1 | cut -d " " -f 5 | tr -d "\r\n")"
_debug3 "_ntptime" "$_ntptime"
_eg_timestamp=$(date -u "+%Y%m%dT")
_eg_timestamp="$(printf "%s%s+0000" "$_eg_timestamp" "$_ntptime")"
_debug "_eg_timestamp" "$_eg_timestamp"
}
_edgedns_new_nonce() {
_debug "Generating Nonce"
_nonce=$(echo "EDGEDNS$(_time)" | _digest sha1 hex | cut -c 1-32)
_debug3 "_nonce" "$_nonce"
}
_edgedns_make_auth_header() {
_debug "Constructing Auth Header"
_edgedns_new_nonce
_edgedns_eg_timestamp
# "Unsigned authorization header: 'EG1-HMAC-SHA256 client_token=block;access_token=block;timestamp=20200806T14:16:33+0000;nonce=72cde72c-82d9-4721-9854-2ba057929d67;'"
_auth_header="$(printf "EG1-HMAC-SHA256 client_token=%s;access_token=%s;timestamp=%s;nonce=%s;" "$AKAMAI_CLIENT_TOKEN" "$AKAMAI_ACCESS_TOKEN" "$_eg_timestamp" "$_nonce")"
_secure_debug2 "Unsigned Auth Header: " "$_auth_header"
_edgedns_sign_request
_signed_auth_header="$(printf "%ssignature=%s" "$_auth_header" "$_signed_req")"
_secure_debug2 "Signed Auth Header: " "${_signed_auth_header}"
}
_edgedns_sign_request() {
_debug2 "Signing http request"
_edgedns_make_data_to_sign "$_auth_header"
_secure_debug2 "Returned signed data" "$_mdata"
_edgedns_make_signing_key "$_eg_timestamp"
_edgedns_base64_hmac_sha256 "$_mdata" "$_signing_key"
_signed_req="$_hmac_out"
_secure_debug2 "Signed Request" "$_signed_req"
}
_edgedns_make_signing_key() {
_debug2 "Creating sigining key"
ts=$1
_edgedns_base64_hmac_sha256 "$ts" "$AKAMAI_CLIENT_SECRET"
_signing_key="$_hmac_out"
_secure_debug2 "Signing Key" "$_signing_key"
}
_edgedns_make_data_to_sign() {
_debug2 "Processing data to sign"
hdr=$1
_secure_debug2 "hdr" "$hdr"
_edgedns_make_content_hash
path="$(echo "$_request_url_path" | tr -d "\n\r" | sed 's/https\?:\/\///')"
path="${path#*$AKAMAI_HOST}"
_debug "hier path" "$path"
# dont expose headers to sign so use MT string
_mdata="$(printf "%s\thttps\t%s\t%s\t%s\t%s\t%s" "$_request_method" "$AKAMAI_HOST" "$path" "" "$_hash" "$hdr")"
_secure_debug2 "Data to Sign" "$_mdata"
}
_edgedns_make_content_hash() {
_debug2 "Generating content hash"
_hash=""
_debug2 "Request method" "${_request_method}"
if [ "$_request_method" != "POST" ] || [ -z "$_request_body" ]; then
return 0
fi
_debug2 "Req body" "$_request_body"
_edgedns_base64_sha256 "$_request_body"
_hash="$_sha256_out"
_debug2 "Content hash" "$_hash"
}
_edgedns_base64_hmac_sha256() {
_debug2 "Generating hmac"
data=$1
key=$2
encoded_data="$(echo "$data" | iconv -t utf-8)"
encoded_key="$(echo "$key" | iconv -t utf-8)"
_secure_debug2 "encoded data" "$encoded_data"
_secure_debug2 "encoded key" "$encoded_key"
encoded_key_hex=$(printf "%s" "$encoded_key" | _hex_dump | tr -d ' ')
data_sig="$(echo "$encoded_data" | tr -d "\n\r" | _hmac sha256 "$encoded_key_hex" | _base64)"
_secure_debug2 "data_sig:" "$data_sig"
_hmac_out="$(echo "$data_sig" | tr -d "\n\r" | iconv -f utf-8)"
_secure_debug2 "hmac" "$_hmac_out"
}
_edgedns_base64_sha256() {
_debug2 "Creating sha256 digest"
trg=$1
_secure_debug2 "digest data" "$trg"
digest="$(echo "$trg" | tr -d "\n\r" | _digest "sha256")"
_sha256_out="$(echo "$digest" | tr -d "\n\r" | iconv -f utf-8)"
_secure_debug2 "digest decode" "$_sha256_out"
}
#_edgedns_parse_edgerc() {
# filepath=$1
# section=$2
#}

358
dnsapi/dns_euserv.sh Normal file
View File

@@ -0,0 +1,358 @@
#!/usr/bin/env sh
#This is the euserv.eu api wrapper for acme.sh
#
#Author: Michael Brueckner
#Report Bugs: https://www.github.com/initit/acme.sh or mbr@initit.de
#
#EUSERV_Username="username"
#
#EUSERV_Password="password"
#
# Dependencies:
# -------------
# - none -
EUSERV_Api="https://api.euserv.net"
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_euserv_add() {
fulldomain="$(echo "$1" | _lower_case)"
txtvalue=$2
EUSERV_Username="${EUSERV_Username:-$(_readaccountconf_mutable EUSERV_Username)}"
EUSERV_Password="${EUSERV_Password:-$(_readaccountconf_mutable EUSERV_Password)}"
if [ -z "$EUSERV_Username" ] || [ -z "$EUSERV_Password" ]; then
EUSERV_Username=""
EUSERV_Password=""
_err "You don't specify euserv user and password yet."
_err "Please create your key and try again."
return 1
fi
#save the user and email to the account conf file.
_saveaccountconf_mutable EUSERV_Username "$EUSERV_Username"
_saveaccountconf_mutable EUSERV_Password "$EUSERV_Password"
_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"
_info "Adding record"
if ! _euserv_add_record "$_domain" "$_sub_domain" "$txtvalue"; then
return 1
fi
}
#fulldomain txtvalue
dns_euserv_rm() {
fulldomain="$(echo "$1" | _lower_case)"
txtvalue=$2
EUSERV_Username="${EUSERV_Username:-$(_readaccountconf_mutable EUSERV_Username)}"
EUSERV_Password="${EUSERV_Password:-$(_readaccountconf_mutable EUSERV_Password)}"
if [ -z "$EUSERV_Username" ] || [ -z "$EUSERV_Password" ]; then
EUSERV_Username=""
EUSERV_Password=""
_err "You don't specify euserv user and password yet."
_err "Please create your key and try again."
return 1
fi
#save the user and email to the account conf file.
_saveaccountconf_mutable EUSERV_Username "$EUSERV_Username"
_saveaccountconf_mutable EUSERV_Password "$EUSERV_Password"
_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 "Getting txt records"
xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>domain.dns_get_active_records</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>login</name>
<value>
<string>%s</string>
</value>
</member>
<member>
<name>password</name>
<value>
<string>%s</string>
</value>
</member>
<member>
<name>domain_id</name>
<value>
<int>%s</int>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>' "$EUSERV_Username" "$EUSERV_Password" "$_euserv_domain_id")
export _H1="Content-Type: text/xml"
response="$(_post "$xml_content" "$EUSERV_Api" "" "POST")"
if ! _contains "$response" "<member><name>status</name><value><i4>100</i4></value></member>"; then
_err "Error could not get txt records"
_debug "xml_content" "$xml_content"
_debug "response" "$response"
return 1
fi
if ! echo "$response" | grep '>dns_record_content<.*>'"$txtvalue"'<' >/dev/null; then
_info "Do not need to delete record"
else
# find XML block where txtvalue is in. The record_id is allways prior this line!
_endLine=$(echo "$response" | grep -n '>dns_record_content<.*>'"$txtvalue"'<' | cut -d ':' -f 1)
# record_id is the last <name> Tag with a number before the row _endLine, identified by </name><value><struct>
_record_id=$(echo "$response" | sed -n '1,'"$_endLine"'p' | grep '</name><value><struct>' | _tail_n 1 | sed 's/.*<name>\([0-9]*\)<\/name>.*/\1/')
_info "Deleting record"
_euserv_delete_record "$_record_id"
fi
}
#################### Private functions below ##################################
_get_root() {
domain=$1
_debug "get root"
# Just to read the domain_orders once
domain=$1
i=2
p=1
if ! _euserv_get_domain_orders; then
return 1
fi
# Get saved response with domain_orders
response="$_euserv_domain_orders"
while true; do
h=$(echo "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
if _contains "$response" "$h"; then
_sub_domain=$(echo "$domain" | cut -d . -f 1-$p)
_domain="$h"
if ! _euserv_get_domain_id "$_domain"; then
_err "invalid domain"
return 1
fi
return 0
fi
p=$i
i=$(_math "$i" + 1)
done
return 1
}
_euserv_get_domain_orders() {
# returns: _euserv_domain_orders
_debug "get domain_orders"
xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>domain.get_domain_orders</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>login</name>
<value><string>%s</string></value>
</member>
<member>
<name>password</name>
<value><string>%s</string></value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>' "$EUSERV_Username" "$EUSERV_Password")
export _H1="Content-Type: text/xml"
response="$(_post "$xml_content" "$EUSERV_Api" "" "POST")"
if ! _contains "$response" "<member><name>status</name><value><i4>100</i4></value></member>"; then
_err "Error could not get domain orders"
_debug "xml_content" "$xml_content"
_debug "response" "$response"
return 1
fi
# save response to reduce API calls
_euserv_domain_orders="$response"
return 0
}
_euserv_get_domain_id() {
# returns: _euserv_domain_id
domain=$1
_debug "get domain_id"
# find line where the domain name is within the $response
_startLine=$(echo "$_euserv_domain_orders" | grep -n '>domain_name<.*>'"$domain"'<' | cut -d ':' -f 1)
# next occurency of domain_id after the domain_name is the correct one
_euserv_domain_id=$(echo "$_euserv_domain_orders" | sed -n "$_startLine"',$p' | grep '>domain_id<' | _head_n 1 | sed 's/.*<i4>\([0-9]*\)<\/i4>.*/\1/')
if [ -z "$_euserv_domain_id" ]; then
_err "Could not find domain_id for domain $domain"
_debug "_euserv_domain_orders" "$_euserv_domain_orders"
return 1
fi
return 0
}
_euserv_delete_record() {
record_id=$1
xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>domain.dns_delete_record</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>login</name>
<value>
<string>%s</string>
</value>
</member>
<member>
<name>password</name>
<value>
<string>%s</string>
</value>
</member>
<member>
<name>dns_record_id</name>
<value>
<int>%s</int>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>' "$EUSERV_Username" "$EUSERV_Password" "$record_id")
export _H1="Content-Type: text/xml"
response="$(_post "$xml_content" "$EUSERV_Api" "" "POST")"
if ! _contains "$response" "<member><name>status</name><value><i4>100</i4></value></member>"; then
_err "Error deleting record"
_debug "xml_content" "$xml_content"
_debug "response" "$response"
return 1
fi
return 0
}
_euserv_add_record() {
domain=$1
sub_domain=$2
txtval=$3
xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>domain.dns_create_record</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>login</name>
<value>
<string>%s</string>
</value>
</member>
<member>
<name>password</name>
<value>
<string>%s</string></value>
</member>
<member>
<name>domain_id</name>
<value>
<int>%s</int>
</value>
</member>
<member>
<name>dns_record_subdomain</name>
<value>
<string>%s</string>
</value>
</member>
<member>
<name>dns_record_type</name>
<value>
<string>TXT</string>
</value>
</member>
<member>
<name>dns_record_value</name>
<value>
<string>%s</string>
</value>
</member>
<member>
<name>dns_record_ttl</name>
<value>
<int>300</int>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>' "$EUSERV_Username" "$EUSERV_Password" "$_euserv_domain_id" "$sub_domain" "$txtval")
export _H1="Content-Type: text/xml"
response="$(_post "$xml_content" "$EUSERV_Api" "" "POST")"
if ! _contains "$response" "<member><name>status</name><value><i4>100</i4></value></member>"; then
_err "Error could not create record"
_debug "xml_content" "$xml_content"
_debug "response" "$response"
return 1
fi
return 0
}

168
dnsapi/dns_exoscale.sh Executable file
View File

@@ -0,0 +1,168 @@
#!/usr/bin/env sh
EXOSCALE_API=https://api.exoscale.com/dns/v1
######## Public functions #####################
# Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
# Used to add txt record
dns_exoscale_add() {
fulldomain=$1
txtvalue=$2
if ! _checkAuth; then
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"
_info "Adding record"
if _exoscale_rest POST "domains/$_domain_id/records" "{\"record\":{\"name\":\"$_sub_domain\",\"record_type\":\"TXT\",\"content\":\"$txtvalue\",\"ttl\":120}}" "$_domain_token"; then
if _contains "$response" "$txtvalue"; then
_info "Added, OK"
return 0
fi
fi
_err "Add txt record error."
return 1
}
# Usage: fulldomain txtvalue
# Used to remove the txt record after validation
dns_exoscale_rm() {
fulldomain=$1
txtvalue=$2
if ! _checkAuth; then
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 "Getting txt records"
_exoscale_rest GET "domains/${_domain_id}/records?type=TXT&name=$_sub_domain" "" "$_domain_token"
if _contains "$response" "\"name\":\"$_sub_domain\"" >/dev/null; then
_record_id=$(echo "$response" | tr '{' "\n" | grep "\"content\":\"$txtvalue\"" | _egrep_o "\"id\":[^,]+" | _head_n 1 | cut -d : -f 2 | tr -d \")
fi
if [ -z "$_record_id" ]; then
_err "Can not get record id to remove."
return 1
fi
_debug "Deleting record $_record_id"
if ! _exoscale_rest DELETE "domains/$_domain_id/records/$_record_id" "" "$_domain_token"; then
_err "Delete record error."
return 1
fi
return 0
}
#################### Private functions below ##################################
_checkAuth() {
EXOSCALE_API_KEY="${EXOSCALE_API_KEY:-$(_readaccountconf_mutable EXOSCALE_API_KEY)}"
EXOSCALE_SECRET_KEY="${EXOSCALE_SECRET_KEY:-$(_readaccountconf_mutable EXOSCALE_SECRET_KEY)}"
if [ -z "$EXOSCALE_API_KEY" ] || [ -z "$EXOSCALE_SECRET_KEY" ]; then
EXOSCALE_API_KEY=""
EXOSCALE_SECRET_KEY=""
_err "You don't specify Exoscale application key and application secret yet."
_err "Please create you key and try again."
return 1
fi
_saveaccountconf_mutable EXOSCALE_API_KEY "$EXOSCALE_API_KEY"
_saveaccountconf_mutable EXOSCALE_SECRET_KEY "$EXOSCALE_SECRET_KEY"
return 0
}
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
# _domain_token=sdjkglgdfewsdfg
_get_root() {
if ! _exoscale_rest GET "domains"; then
return 1
fi
domain=$1
i=2
p=1
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
if _contains "$response" "\"name\":\"$h\"" >/dev/null; then
_domain_id=$(echo "$response" | tr '{' "\n" | grep "\"name\":\"$h\"" | _egrep_o "\"id\":[^,]+" | _head_n 1 | cut -d : -f 2 | tr -d \")
_domain_token=$(echo "$response" | tr '{' "\n" | grep "\"name\":\"$h\"" | _egrep_o "\"token\":\"[^\"]*\"" | _head_n 1 | cut -d : -f 2 | tr -d \")
if [ "$_domain_token" ] && [ "$_domain_id" ]; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain=$h
return 0
fi
return 1
fi
p=$i
i=$(_math "$i" + 1)
done
return 1
}
# returns response
_exoscale_rest() {
method=$1
path="$2"
data="$3"
token="$4"
request_url="$EXOSCALE_API/$path"
_debug "$path"
export _H1="Accept: application/json"
if [ "$token" ]; then
export _H2="X-DNS-Domain-Token: $token"
else
export _H2="X-DNS-Token: $EXOSCALE_API_KEY:$EXOSCALE_SECRET_KEY"
fi
if [ "$data" ] || [ "$method" = "DELETE" ]; then
export _H3="Content-Type: application/json"
_debug data "$data"
response="$(_post "$data" "$request_url" "" "$method")"
else
response="$(_get "$request_url" "" "" "$method")"
fi
if [ "$?" != "0" ]; then
_err "error $request_url"
return 1
fi
_debug2 response "$response"
return 0
}

146
dnsapi/dns_fornex.sh Normal file
View File

@@ -0,0 +1,146 @@
#!/usr/bin/env sh
#Author: Timur Umarov <inbox@tumarov.com>
FORNEX_API_URL="https://fornex.com/api/dns/v0.1"
######## Public functions #####################
#Usage: dns_fornex_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_fornex_add() {
fulldomain=$1
txtvalue=$2
if ! _Fornex_API; then
return 1
fi
if ! _get_root "$fulldomain"; then
_err "Unable to determine root domain"
return 1
else
_debug _domain "$_domain"
fi
_info "Adding record"
if _rest POST "$_domain/entry_set/add/" "host=$fulldomain&type=TXT&value=$txtvalue&apikey=$FORNEX_API_KEY"; then
_debug _response "$response"
if _contains "$response" '"ok": true' || _contains "$response" 'Такая запись уже существует.'; then
_info "Added, OK"
return 0
fi
fi
_err "Add txt record error."
return 1
}
#Usage: dns_fornex_rm _acme-challenge.www.domain.com
dns_fornex_rm() {
fulldomain=$1
txtvalue=$2
if ! _Fornex_API; then
return 1
fi
if ! _get_root "$fulldomain"; then
_err "Unable to determine root domain"
return 1
else
_debug _domain "$_domain"
fi
_debug "Getting txt records"
_rest GET "$_domain/entry_set.json?apikey=$FORNEX_API_KEY"
if ! _contains "$response" "$txtvalue"; then
_err "Txt record not found"
return 1
fi
_record_id="$(echo "$response" | _egrep_o "{[^{]*\"value\"*:*\"$txtvalue\"[^}]*}" | sed -n -e 's#.*"id": \([0-9]*\).*#\1#p')"
_debug "_record_id" "$_record_id"
if [ -z "$_record_id" ]; then
_err "can not find _record_id"
return 1
fi
if ! _rest POST "$_domain/entry_set/$_record_id/delete/" "apikey=$FORNEX_API_KEY"; then
_err "Delete record error."
return 1
fi
return 0
}
#################### Private functions below ##################################
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
_get_root() {
domain=$1
i=1
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
if ! _rest GET "domain_list.json?q=$h&apikey=$FORNEX_API_KEY"; then
return 1
fi
if _contains "$response" "\"$h\"" >/dev/null; then
_domain=$h
return 0
else
_debug "$h not found"
fi
i=$(_math "$i" + 1)
done
return 1
}
_Fornex_API() {
FORNEX_API_KEY="${FORNEX_API_KEY:-$(_readaccountconf_mutable FORNEX_API_KEY)}"
if [ -z "$FORNEX_API_KEY" ]; then
FORNEX_API_KEY=""
_err "You didn't specify the Fornex API key yet."
_err "Please create your key and try again."
return 1
fi
_saveaccountconf_mutable FORNEX_API_KEY "$FORNEX_API_KEY"
}
#method method action data
_rest() {
m=$1
ep="$2"
data="$3"
_debug "$ep"
export _H1="Accept: application/json"
if [ "$m" != "GET" ]; then
_debug data "$data"
response="$(_post "$data" "$FORNEX_API_URL/$ep" "" "$m")"
else
response="$(_get "$FORNEX_API_URL/$ep" | _normalizeJson)"
fi
_ret="$?"
if [ "$_ret" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}

View File

@@ -7,6 +7,7 @@
#
#Author: David Kerr
#Report Bugs here: https://github.com/dkerr64/acme.sh
#or here... https://github.com/acmesh-official/acme.sh/issues/2305
#
######## Public functions #####################
@@ -46,132 +47,38 @@ dns_freedns_add() {
_saveaccountconf FREEDNS_COOKIE "$FREEDNS_COOKIE"
# We may have to cycle through the domain name to find the
# TLD that we own...
i=1
wmax="$(echo "$fulldomain" | tr '.' ' ' | wc -w)"
while [ "$i" -lt "$wmax" ]; do
# split our full domain name into two parts...
i="$(echo "$fulldomain" | tr '.' ' ' | wc -w)"
i="$(_math "$i" - 1)"
top_domain="$(echo "$fulldomain" | cut -d. -f "$i"-100)"
i="$(_math "$i" - 1)"
sub_domain="$(echo "$fulldomain" | cut -d. -f -"$i")"
_debug top_domain "$top_domain"
_debug sub_domain "$sub_domain"
# Sometimes FreeDNS does not return the subdomain page but rather
# returns a page regarding becoming a premium member. This usually
# happens after a period of inactivity. Immediately trying again
# returns the correct subdomain page. So, we will try twice to
# load the page and obtain our domain ID
attempts=2
while [ "$attempts" -gt "0" ]; do
attempts="$(_math "$attempts" - 1)"
htmlpage="$(_freedns_retrieve_subdomain_page "$FREEDNS_COOKIE")"
if [ "$?" != "0" ]; then
if [ "$using_cached_cookies" = "true" ]; then
_err "Has your FreeDNS username and password changed? If so..."
_err "Please export as FREEDNS_User / FREEDNS_Password and try again."
fi
return 1
fi
_debug2 htmlpage "$htmlpage"
subdomain_csv="$(echo "$htmlpage" | tr -d "\n\r" | _egrep_o '<form .*</form>' | sed 's/<tr>/@<tr>/g' | tr '@' '\n' | grep edit.php | grep "$top_domain")"
_debug2 subdomain_csv "$subdomain_csv"
# The above beauty ends with striping out rows that do not have an
# href to edit.php and do not have the top domain we are looking for.
# So all we should be left with is CSV of table of subdomains we are
# interested in.
# Now we have to read through this table and extract the data we need
lines="$(echo "$subdomain_csv" | wc -l)"
i=0
found=0
while [ "$i" -lt "$lines" ]; do
i="$(_math "$i" + 1)"
line="$(echo "$subdomain_csv" | sed -n "${i}p")"
_debug2 line "$line"
if [ $found = 0 ] && _contains "$line" "<td>$top_domain</td>"; then
# this line will contain DNSdomainid for the top_domain
DNSdomainid="$(echo "$line" | _egrep_o "edit_domain_id *= *.*>" | cut -d = -f 2 | cut -d '>' -f 1)"
_debug2 DNSdomainid "$DNSdomainid"
found=1
else
# lines contain DNS records for all subdomains
DNSname="$(echo "$line" | _egrep_o 'edit.php.*</a>' | cut -d '>' -f 2 | cut -d '<' -f 1)"
_debug2 DNSname "$DNSname"
DNStype="$(echo "$line" | sed 's/<td/@<td/g' | tr '@' '\n' | sed -n '4p' | cut -d '>' -f 2 | cut -d '<' -f 1)"
_debug2 DNStype "$DNStype"
if [ "$DNSname" = "$fulldomain" ] && [ "$DNStype" = "TXT" ]; then
DNSdataid="$(echo "$line" | _egrep_o 'data_id=.*' | cut -d = -f 2 | cut -d '>' -f 1)"
# Now get current value for the TXT record. This method may
# not produce accurate results as the value field is truncated
# on this webpage. To get full value we would need to load
# another page. However we don't really need this so long as
# there is only one TXT record for the acme challenge subdomain.
DNSvalue="$(echo "$line" | sed 's/<td/@<td/g' | tr '@' '\n' | sed -n '5p' | cut -d '>' -f 2 | cut -d '<' -f 1)"
_debug2 DNSvalue "$DNSvalue"
if [ $found != 0 ]; then
top_domain="$(echo "$fulldomain" | cut -d. -f "$i"-100)"
_debug "sub_domain: $sub_domain"
_debug "top_domain: $top_domain"
DNSdomainid="$(_freedns_domain_id "$top_domain")"
if [ "$?" = "0" ]; then
_info "Domain $top_domain found at FreeDNS, domain_id $DNSdomainid"
break
# we are breaking out of the loop at the first match of DNS name
# and DNS type (if we are past finding the domainid). This assumes
# that there is only ever one TXT record for the LetsEncrypt/acme
# challenge subdomain. This seems to be a reasonable assumption
# as the acme client deletes the TXT record on successful validation.
fi
else
DNSname=""
DNStype=""
fi
_info "Domain $top_domain not found at FreeDNS, try with next level of TLD"
fi
done
_debug "DNSname: $DNSname DNStype: $DNStype DNSdomainid: $DNSdomainid DNSdataid: $DNSdataid"
_debug "DNSvalue: $DNSvalue"
if [ -z "$DNSdomainid" ]; then
# If domain ID is empty then something went wrong (top level
# domain not found at FreeDNS).
if [ "$attempts" = "0" ]; then
# exhausted maximum retry attempts
_debug "$htmlpage"
_debug "$subdomain_csv"
_err "Domain $top_domain not found at FreeDNS"
return 1
fi
else
# break out of the 'retry' loop... we have found our domain ID
break
fi
_info "Domain $top_domain not found at FreeDNS"
_info "Retry loading subdomain page ($attempts attempts remaining)"
done
if [ -z "$DNSdataid" ]; then
# If data ID is empty then specific subdomain does not exist yet, need
# to create it this should always be the case as the acme client
# deletes the entry after domain is validated.
# Add in new TXT record with the value provided
_debug "Adding TXT record for $fulldomain, $txtvalue"
_freedns_add_txt_record "$FREEDNS_COOKIE" "$DNSdomainid" "$sub_domain" "$txtvalue"
return $?
else
if [ "$txtvalue" = "$DNSvalue" ]; then
# if value in TXT record matches value requested then DNS record
# does not need to be updated. But...
# Testing value match fails. Website is truncating the value field.
# So for now we will always go down the else path. Though in theory
# should never come here anyway as the acme client deletes
# the TXT record on successful validation, so we should not even
# have found a TXT record !!
_info "No update necessary for $fulldomain at FreeDNS"
return 0
else
# Delete the old TXT record (with the wrong value)
if _freedns_delete_txt_record "$FREEDNS_COOKIE" "$DNSdataid"; then
# And add in new TXT record with the value provided
_freedns_add_txt_record "$FREEDNS_COOKIE" "$DNSdomainid" "$sub_domain" "$txtvalue"
fi
return $?
fi
fi
return 0
}
#Usage: fulldomain txtvalue
@@ -186,65 +93,48 @@ dns_freedns_rm() {
# Need to read cookie from conf file again in case new value set
# during login to FreeDNS when TXT record was created.
# acme.sh does not have a _readaccountconf() function
FREEDNS_COOKIE="$(_read_conf "$ACCOUNT_CONF_PATH" "FREEDNS_COOKIE")"
FREEDNS_COOKIE="$(_readaccountconf "FREEDNS_COOKIE")"
_debug "FreeDNS login cookies: $FREEDNS_COOKIE"
# Sometimes FreeDNS does not return the subdomain page but rather
# returns a page regarding becoming a premium member. This usually
# happens after a period of inactivity. Immediately trying again
# returns the correct subdomain page. So, we will try twice to
# load the page and obtain our TXT record.
attempts=2
while [ "$attempts" -gt "0" ]; do
attempts="$(_math "$attempts" - 1)"
htmlpage="$(_freedns_retrieve_subdomain_page "$FREEDNS_COOKIE")"
TXTdataid="$(_freedns_data_id "$fulldomain" "TXT")"
if [ "$?" != "0" ]; then
_info "Cannot delete TXT record for $fulldomain, record does not exist at FreeDNS"
return 1
fi
_debug "Data ID's found, $TXTdataid"
# now we have one (or more) TXT record data ID's. Load the page
# for that record and search for the record txt value. If match
# then we can delete it.
lines="$(echo "$TXTdataid" | wc -l)"
_debug "Found $lines TXT data records for $fulldomain"
i=0
while [ "$i" -lt "$lines" ]; do
i="$(_math "$i" + 1)"
dataid="$(echo "$TXTdataid" | sed -n "${i}p")"
_debug "$dataid"
htmlpage="$(_freedns_retrieve_data_page "$FREEDNS_COOKIE" "$dataid")"
if [ "$?" != "0" ]; then
if [ "$using_cached_cookies" = "true" ]; then
_err "Has your FreeDNS username and password changed? If so..."
_err "Please export as FREEDNS_User / FREEDNS_Password and try again."
fi
return 1
fi
subdomain_csv="$(echo "$htmlpage" | tr -d "\n\r" | _egrep_o '<form .*</form>' | sed 's/<tr>/@<tr>/g' | tr '@' '\n' | grep edit.php | grep "$fulldomain")"
_debug2 subdomain_csv "$subdomain_csv"
# The above beauty ends with striping out rows that do not have an
# href to edit.php and do not have the domain name we are looking for.
# So all we should be left with is CSV of table of subdomains we are
# interested in.
# Now we have to read through this table and extract the data we need
lines="$(echo "$subdomain_csv" | wc -l)"
i=0
found=0
while [ "$i" -lt "$lines" ]; do
i="$(_math "$i" + 1)"
line="$(echo "$subdomain_csv" | sed -n "${i}p")"
_debug2 line "$line"
DNSname="$(echo "$line" | _egrep_o 'edit.php.*</a>' | cut -d '>' -f 2 | cut -d '<' -f 1)"
_debug2 DNSname "$DNSname"
DNStype="$(echo "$line" | sed 's/<td/@<td/g' | tr '@' '\n' | sed -n '4p' | cut -d '>' -f 2 | cut -d '<' -f 1)"
_debug2 DNStype "$DNStype"
if [ "$DNSname" = "$fulldomain" ] && [ "$DNStype" = "TXT" ]; then
DNSdataid="$(echo "$line" | _egrep_o 'data_id=.*' | cut -d = -f 2 | cut -d '>' -f 1)"
_debug2 DNSdataid "$DNSdataid"
DNSvalue="$(echo "$line" | sed 's/<td/@<td/g' | tr '@' '\n' | sed -n '5p' | cut -d '>' -f 2 | cut -d '<' -f 1)"
_debug2 DNSvalue "$DNSvalue"
# if [ "$DNSvalue" = "$txtvalue" ]; then
# Testing value match fails. Website is truncating the value
# field. So for now we will assume that there is only one TXT
# field for the sub domain and just delete it. Currently this
# is a safe assumption.
_freedns_delete_txt_record "$FREEDNS_COOKIE" "$DNSdataid"
echo "$htmlpage" | grep "value=\"&quot;$txtvalue&quot;\"" >/dev/null
if [ "$?" = "0" ]; then
# Found a match... delete the record and return
_info "Deleting TXT record for $fulldomain, $txtvalue"
_freedns_delete_txt_record "$FREEDNS_COOKIE" "$dataid"
return $?
# fi
fi
done
done
# If we get this far we did not find a match (after two attempts)
# If we get this far we did not find a match
# Not necessarily an error, but log anyway.
_debug2 "$subdomain_csv"
_info "Cannot delete TXT record for $fulldomain/$txtvalue. Does not exist at FreeDNS"
_info "Cannot delete TXT record for $fulldomain, $txtvalue. Does not exist at FreeDNS"
return 0
}
@@ -272,7 +162,7 @@ _freedns_login() {
# if cookies is not empty then logon successful
if [ -z "$cookies" ]; then
_debug "$htmlpage"
_debug3 "htmlpage: $htmlpage"
_err "FreeDNS login failed for user $username. Check $HTTP_HEADER file"
return 1
fi
@@ -301,7 +191,34 @@ _freedns_retrieve_subdomain_page() {
return 1
fi
_debug2 "$htmlpage"
_debug3 "htmlpage: $htmlpage"
printf "%s" "$htmlpage"
return 0
}
# usage _freedns_retrieve_data_page login_cookies data_id
# echo page retrieved (html)
# returns 0 success
_freedns_retrieve_data_page() {
export _H1="Cookie:$1"
export _H2="Accept-Language:en-US"
data_id="$2"
url="https://freedns.afraid.org/subdomain/edit.php?data_id=$2"
_debug "Retrieve data page for ID $data_id from FreeDNS"
htmlpage="$(_get "$url")"
if [ "$?" != "0" ]; then
_err "FreeDNS retrieve data page failed bad RC from _get"
return 1
elif [ -z "$htmlpage" ]; then
_err "FreeDNS returned empty data page"
return 1
fi
_debug3 "htmlpage: $htmlpage"
printf "%s" "$htmlpage"
return 0
@@ -315,7 +232,7 @@ _freedns_add_txt_record() {
domain_id="$2"
subdomain="$3"
value="$(printf '%s' "$4" | _url_encode)"
url="http://freedns.afraid.org/subdomain/save.php?step=2"
url="https://freedns.afraid.org/subdomain/save.php?step=2"
htmlpage="$(_post "type=TXT&domain_id=$domain_id&subdomain=$subdomain&address=%22$value%22&send=Save%21" "$url")"
@@ -323,17 +240,17 @@ _freedns_add_txt_record() {
_err "FreeDNS failed to add TXT record for $subdomain bad RC from _post"
return 1
elif ! grep "200 OK" "$HTTP_HEADER" >/dev/null; then
_debug "$htmlpage"
_debug3 "htmlpage: $htmlpage"
_err "FreeDNS failed to add TXT record for $subdomain. Check $HTTP_HEADER file"
return 1
elif _contains "$htmlpage" "security code was incorrect"; then
_debug "$htmlpage"
_debug3 "htmlpage: $htmlpage"
_err "FreeDNS failed to add TXT record for $subdomain as FreeDNS requested security code"
_err "Note that you cannot use automatic DNS validation for FreeDNS public domains"
return 1
fi
_debug2 "$htmlpage"
_debug3 "htmlpage: $htmlpage"
_info "Added acme challenge TXT record for $fulldomain at FreeDNS"
return 0
}
@@ -352,7 +269,7 @@ _freedns_delete_txt_record() {
_err "FreeDNS failed to delete TXT record for $data_id bad RC from _get"
return 1
elif ! _contains "$htmlheader" "200 OK"; then
_debug "$htmlheader"
_debug2 "htmlheader: $htmlheader"
_err "FreeDNS failed to delete TXT record $data_id"
return 1
fi
@@ -360,3 +277,95 @@ _freedns_delete_txt_record() {
_info "Deleted acme challenge TXT record for $fulldomain at FreeDNS"
return 0
}
# usage _freedns_domain_id domain_name
# echo the domain_id if found
# return 0 success
_freedns_domain_id() {
# Start by escaping the dots in the domain name
search_domain="$(echo "$1" | sed 's/\./\\./g')"
# Sometimes FreeDNS does not return the subdomain page but rather
# returns a page regarding becoming a premium member. This usually
# happens after a period of inactivity. Immediately trying again
# returns the correct subdomain page. So, we will try twice to
# load the page and obtain our domain ID
attempts=2
while [ "$attempts" -gt "0" ]; do
attempts="$(_math "$attempts" - 1)"
htmlpage="$(_freedns_retrieve_subdomain_page "$FREEDNS_COOKIE")"
if [ "$?" != "0" ]; then
if [ "$using_cached_cookies" = "true" ]; then
_err "Has your FreeDNS username and password changed? If so..."
_err "Please export as FREEDNS_User / FREEDNS_Password and try again."
fi
return 1
fi
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>" |
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
# before each table row <tr>
# search for the domain within each row (which may or may not have
# a text string in brackets (.*) after it.
# And finally extract the domain ID.
if [ -n "$domain_id" ]; then
printf "%s" "$domain_id"
return 0
fi
_debug "Domain $search_domain not found. Retry loading subdomain page ($attempts attempts remaining)"
done
_debug "Domain $search_domain not found after retry"
return 1
}
# usage _freedns_data_id domain_name record_type
# echo the data_id(s) if found
# return 0 success
_freedns_data_id() {
# Start by escaping the dots in the domain name
search_domain="$(echo "$1" | sed 's/\./\\./g')"
record_type="$2"
# Sometimes FreeDNS does not return the subdomain page but rather
# returns a page regarding becoming a premium member. This usually
# happens after a period of inactivity. Immediately trying again
# returns the correct subdomain page. So, we will try twice to
# load the page and obtain our domain ID
attempts=2
while [ "$attempts" -gt "0" ]; do
attempts="$(_math "$attempts" - 1)"
htmlpage="$(_freedns_retrieve_subdomain_page "$FREEDNS_COOKIE")"
if [ "$?" != "0" ]; then
if [ "$using_cached_cookies" = "true" ]; then
_err "Has your FreeDNS username and password changed? If so..."
_err "Please export as FREEDNS_User / FREEDNS_Password and try again."
fi
return 1
fi
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>" |
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
# before each table row <tr>
# search for the record type withing each row (e.g. TXT)
# search for the domain within each row (which is within a <a..>
# </a> anchor. And finally extract the domain ID.
if [ -n "$data_id" ]; then
printf "%s" "$data_id"
return 0
fi
_debug "Domain $search_domain not found. Retry loading subdomain page ($attempts attempts remaining)"
done
_debug "Domain $search_domain not found after retry"
return 1
}

60
dnsapi/dns_gandi_livedns.sh Executable file → Normal file
View File

@@ -7,6 +7,7 @@
# Requires GANDI API KEY set in GANDI_LIVEDNS_KEY set as environment variable
#
#Author: Frédéric Crozat <fcrozat@suse.com>
# Dominik Röttsches <drott@google.com>
#Report Bugs here: https://github.com/fcrozat/acme.sh
#
######## Public functions #####################
@@ -36,9 +37,7 @@ dns_gandi_livedns_add() {
_debug domain "$_domain"
_debug sub_domain "$_sub_domain"
_gandi_livedns_rest PUT "domains/$_domain/records/$_sub_domain/TXT" "{\"rrset_ttl\": 300, \"rrset_values\":[\"$txtvalue\"]}" \
&& _contains "$response" '{"message": "DNS Record Created"}' \
&& _info "Add $(__green "success")"
_dns_gandi_append_record "$_domain" "$_sub_domain" "$txtvalue"
}
#Usage: fulldomain txtvalue
@@ -56,9 +55,23 @@ dns_gandi_livedns_rm() {
_debug fulldomain "$fulldomain"
_debug domain "$_domain"
_debug sub_domain "$_sub_domain"
_debug txtvalue "$txtvalue"
_gandi_livedns_rest DELETE "domains/$_domain/records/$_sub_domain/TXT" ""
if ! _dns_gandi_existing_rrset_values "$_domain" "$_sub_domain"; then
return 1
fi
_new_rrset_values=$(echo "$_rrset_values" | sed "s/...$txtvalue...//g")
# Cleanup dangling commata.
_new_rrset_values=$(echo "$_new_rrset_values" | sed "s/, ,/ ,/g")
_new_rrset_values=$(echo "$_new_rrset_values" | sed "s/, *\]/\]/g")
_new_rrset_values=$(echo "$_new_rrset_values" | sed "s/\[ *,/\[/g")
_debug "New rrset_values" "$_new_rrset_values"
_gandi_livedns_rest PUT \
"domains/$_domain/records/$_sub_domain/TXT" \
"{\"rrset_ttl\": 300, \"rrset_values\": $_new_rrset_values}" &&
_contains "$response" '{"message": "DNS Record Created"}' &&
_info "Removing record $(__green "success")"
}
#################### Private functions below ##################################
@@ -98,6 +111,45 @@ _get_root() {
return 1
}
_dns_gandi_append_record() {
domain=$1
sub_domain=$2
txtvalue=$3
if _dns_gandi_existing_rrset_values "$domain" "$sub_domain"; then
_debug "Appending new value"
_rrset_values=$(echo "$_rrset_values" | sed "s/\"]/\",\"$txtvalue\"]/")
else
_debug "Creating new record" "$_rrset_values"
_rrset_values="[\"$txtvalue\"]"
fi
_debug new_rrset_values "$_rrset_values"
_gandi_livedns_rest PUT "domains/$_domain/records/$sub_domain/TXT" \
"{\"rrset_ttl\": 300, \"rrset_values\": $_rrset_values}" &&
_contains "$response" '{"message": "DNS Record Created"}' &&
_info "Adding record $(__green "success")"
}
_dns_gandi_existing_rrset_values() {
domain=$1
sub_domain=$2
if ! _gandi_livedns_rest GET "domains/$domain/records/$sub_domain"; then
return 1
fi
if ! _contains "$response" '"rrset_type": "TXT"'; then
_debug "Does not have a _acme-challenge TXT record yet."
return 1
fi
if _contains "$response" '"rrset_values": \[\]'; then
_debug "Empty rrset_values for TXT record, no previous TXT record."
return 1
fi
_debug "Already has TXT record."
_rrset_values=$(echo "$response" | _egrep_o 'rrset_values.*\[.*\]' |
_egrep_o '\[".*\"]')
return 0
}
_gandi_livedns_rest() {
m=$1
ep="$2"

170
dnsapi/dns_gcloud.sh Executable file
View File

@@ -0,0 +1,170 @@
#!/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 -r 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 -r 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) AND visibility=public"
_debug filter "$filter"
# List domains and find the zone with the deepest sub-domain (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" "$(echo "$name" | awk -F"." '{print NF-1}')" "$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)
# starting with version 353.0.0 gcloud seems to
# separate records with a semicolon instead of commas
# see also https://cloud.google.com/sdk/docs/release-notes#35300_2021-08-17
rrdatas=$(echo "$rrdatas" | cut -f2 | sed 's/"[,;]"/"\n"/g')
}

View File

@@ -59,19 +59,13 @@ dns_gd_add() {
_info "Adding record"
if _gd_rest PUT "domains/$_domain/records/TXT/$_sub_domain" "[$_add_data]"; then
if [ "$response" = "{}" ]; then
_info "Added, sleeping 10 seconds"
_sleep 10
#todo: check if the record takes effect
return 0
else
fi
_err "Add txt record error."
_err "$response"
return 1
fi
fi
_err "Add txt record error."
}
#fulldomain
@@ -97,7 +91,7 @@ dns_gd_rm() {
fi
if ! _contains "$response" "$txtvalue"; then
_info "The record is not existing, skip"
_info "The record does not exist, skip"
return 0
fi
@@ -174,5 +168,9 @@ _gd_rest() {
return 1
fi
_debug2 response "$response"
if _contains "$response" "UNABLE_TO_AUTHENTICATE"; then
_err "It seems that your api key or secret is not correct."
return 1
fi
return 0
}

232
dnsapi/dns_geoscaling.sh Executable file
View File

@@ -0,0 +1,232 @@
#!/usr/bin/env sh
########################################################################
# Geoscaling hook script for acme.sh
#
# Environment variables:
#
# - $GEOSCALING_Username (your Geoscaling username - this is usually NOT an amail address)
# - $GEOSCALING_Password (your Geoscaling password)
#-- dns_geoscaling_add() - Add TXT record --------------------------------------
# Usage: dns_geoscaling_add _acme-challenge.subdomain.domain.com "XyZ123..."
dns_geoscaling_add() {
full_domain=$1
txt_value=$2
_info "Using DNS-01 Geoscaling DNS2 hook"
GEOSCALING_Username="${GEOSCALING_Username:-$(_readaccountconf_mutable GEOSCALING_Username)}"
GEOSCALING_Password="${GEOSCALING_Password:-$(_readaccountconf_mutable GEOSCALING_Password)}"
if [ -z "$GEOSCALING_Username" ] || [ -z "$GEOSCALING_Password" ]; then
GEOSCALING_Username=
GEOSCALING_Password=
_err "No auth details provided. Please set user credentials using the \$GEOSCALING_Username and \$GEOSCALING_Password environment variables."
return 1
fi
_saveaccountconf_mutable GEOSCALING_Username "${GEOSCALING_Username}"
_saveaccountconf_mutable GEOSCALING_Password "${GEOSCALING_Password}"
# Fills in the $zone_id and $zone_name
find_zone "${full_domain}" || return 1
_debug "Zone id '${zone_id}' will be used."
# We're logged in here
# we should add ${full_domain} minus the trailing ${zone_name}
prefix=$(echo "${full_domain}" | sed "s|\\.${zone_name}\$||")
body="id=${zone_id}&name=${prefix}&type=TXT&content=${txt_value}&ttl=300&prio=0"
do_post "$body" "https://www.geoscaling.com/dns2/ajax/add_record.php"
exit_code="$?"
if [ "${exit_code}" -eq 0 ]; then
_info "TXT record added successfully."
else
_err "Couldn't add the TXT record."
fi
do_logout
return "${exit_code}"
}
#-- dns_geoscaling_rm() - Remove TXT record ------------------------------------
# Usage: dns_geoscaling_rm _acme-challenge.subdomain.domain.com "XyZ123..."
dns_geoscaling_rm() {
full_domain=$1
txt_value=$2
_info "Cleaning up after DNS-01 Geoscaling DNS2 hook"
GEOSCALING_Username="${GEOSCALING_Username:-$(_readaccountconf_mutable GEOSCALING_Username)}"
GEOSCALING_Password="${GEOSCALING_Password:-$(_readaccountconf_mutable GEOSCALING_Password)}"
if [ -z "$GEOSCALING_Username" ] || [ -z "$GEOSCALING_Password" ]; then
GEOSCALING_Username=
GEOSCALING_Password=
_err "No auth details provided. Please set user credentials using the \$GEOSCALING_Username and \$GEOSCALING_Password environment variables."
return 1
fi
_saveaccountconf_mutable GEOSCALING_Username "${GEOSCALING_Username}"
_saveaccountconf_mutable GEOSCALING_Password "${GEOSCALING_Password}"
# fills in the $zone_id
find_zone "${full_domain}" || return 1
_debug "Zone id '${zone_id}' will be used."
# Here we're logged in
# Find the record id to clean
# get the domain
response=$(do_get "https://www.geoscaling.com/dns2/index.php?module=domain&id=${zone_id}")
_debug2 "response" "$response"
table="$(echo "${response}" | tr -d '\n' | sed 's|.*<div class="box"><div class="boxtitle">Basic Records</div><div class="boxtext"><table|<table|; s|</table>.*|</table>|')"
_debug2 table "${table}"
names=$(echo "${table}" | _egrep_o 'id="[0-9]+\.name">[^<]*</td>' | sed 's|</td>||; s|.*>||')
ids=$(echo "${table}" | _egrep_o 'id="[0-9]+\.name">[^<]*</td>' | sed 's|\.name">.*||; s|id="||')
types=$(echo "${table}" | _egrep_o 'id="[0-9]+\.type">[^<]*</td>' | sed 's|</td>||; s|.*>||')
values=$(echo "${table}" | _egrep_o 'id="[0-9]+\.content">[^<]*</td>' | sed 's|</td>||; s|.*>||')
_debug2 names "${names}"
_debug2 ids "${ids}"
_debug2 types "${types}"
_debug2 values "${values}"
# look for line whose name is ${full_domain}, whose type is TXT, and whose value is ${txt_value}
line_num="$(echo "${values}" | grep -F -n -- "${txt_value}" | _head_n 1 | cut -d ':' -f 1)"
_debug2 line_num "${line_num}"
found_id=
if [ -n "$line_num" ]; then
type=$(echo "${types}" | sed -n "${line_num}p")
name=$(echo "${names}" | sed -n "${line_num}p")
id=$(echo "${ids}" | sed -n "${line_num}p")
_debug2 type "$type"
_debug2 name "$name"
_debug2 id "$id"
_debug2 full_domain "$full_domain"
if [ "${type}" = "TXT" ] && [ "${name}" = "${full_domain}" ]; then
found_id=${id}
fi
fi
if [ "${found_id}" = "" ]; then
_err "Can not find record id."
return 0
fi
# Remove the record
body="id=${zone_id}&record_id=${found_id}"
response=$(do_post "$body" "https://www.geoscaling.com/dns2/ajax/delete_record.php")
exit_code="$?"
if [ "$exit_code" -eq 0 ]; then
_info "Record removed successfully."
else
_err "Could not clean (remove) up the record. Please go to Geoscaling administration interface and clean it by hand."
fi
do_logout
return "${exit_code}"
}
########################## PRIVATE FUNCTIONS ###########################
do_get() {
_url=$1
export _H1="Cookie: $geoscaling_phpsessid_cookie"
_get "${_url}"
}
do_post() {
_body=$1
_url=$2
export _H1="Cookie: $geoscaling_phpsessid_cookie"
_post "${_body}" "${_url}"
}
do_login() {
_info "Logging in..."
username_encoded="$(printf "%s" "${GEOSCALING_Username}" | _url_encode)"
password_encoded="$(printf "%s" "${GEOSCALING_Password}" | _url_encode)"
body="username=${username_encoded}&password=${password_encoded}"
response=$(_post "$body" "https://www.geoscaling.com/dns2/index.php?module=auth")
_debug2 response "${response}"
#retcode=$(grep '^HTTP[^ ]*' "${HTTP_HEADER}" | _head_n 1 | _egrep_o '[0-9]+$')
retcode=$(grep '^HTTP[^ ]*' "${HTTP_HEADER}" | _head_n 1 | cut -d ' ' -f 2)
if [ "$retcode" != "302" ]; then
_err "Geoscaling login failed for user ${GEOSCALING_Username}. Check ${HTTP_HEADER} file"
return 1
fi
geoscaling_phpsessid_cookie="$(grep -i '^set-cookie:' "${HTTP_HEADER}" | _egrep_o 'PHPSESSID=[^;]*;' | tr -d ';')"
return 0
}
do_logout() {
_info "Logging out."
response="$(do_get "https://www.geoscaling.com/dns2/index.php?module=auth")"
_debug2 response "$response"
return 0
}
find_zone() {
domain="$1"
# do login
do_login || return 1
# get zones
response="$(do_get "https://www.geoscaling.com/dns2/index.php?module=domains")"
table="$(echo "${response}" | tr -d '\n' | sed 's|.*<div class="box"><div class="boxtitle">Your domains</div><div class="boxtext"><table|<table|; s|</table>.*|</table>|')"
_debug2 table "${table}"
zone_names="$(echo "${table}" | _egrep_o '<b>[^<]*</b>' | sed 's|<b>||;s|</b>||')"
_debug2 _matches "${zone_names}"
# Zone names and zone IDs are in same order
zone_ids=$(echo "${table}" | _egrep_o '<a href=.index\.php\?module=domain&id=[0-9]+. onclick="javascript:show_loader\(\);">' | sed 's|.*id=||;s|. .*||')
_debug2 "These are the zones on this Geoscaling account:"
_debug2 "zone_names" "${zone_names}"
_debug2 "And these are their respective IDs:"
_debug2 "zone_ids" "${zone_ids}"
if [ -z "${zone_names}" ] || [ -z "${zone_ids}" ]; then
_err "Can not get zone names or IDs."
return 1
fi
# Walk through all possible zone names
strip_counter=1
while true; do
attempted_zone=$(echo "${domain}" | cut -d . -f ${strip_counter}-)
# All possible zone names have been tried
if [ -z "${attempted_zone}" ]; then
_err "No zone for domain '${domain}' found."
return 1
fi
_debug "Looking for zone '${attempted_zone}'"
line_num="$(echo "${zone_names}" | grep -n "^${attempted_zone}\$" | _head_n 1 | cut -d : -f 1)"
_debug2 line_num "${line_num}"
if [ "$line_num" ]; then
zone_id=$(echo "${zone_ids}" | sed -n "${line_num}p")
zone_name=$(echo "${zone_names}" | sed -n "${line_num}p")
if [ -z "${zone_id}" ]; then
_err "Can not find zone id."
return 1
fi
_debug "Found relevant zone '${attempted_zone}' with id '${zone_id}' - will be used for domain '${domain}'."
return 0
fi
_debug "Zone '${attempted_zone}' doesn't exist, let's try a less specific zone."
strip_counter=$(_math "${strip_counter}" + 1)
done
}
# vim: et:ts=2:sw=2:

View File

@@ -24,7 +24,7 @@ dns_he_add() {
if [ -z "$HE_Username" ] || [ -z "$HE_Password" ]; then
HE_Username=
HE_Password=
_err "No auth details provided. Please set user credentials using the \$HE_Username and \$HE_Password envoronment variables."
_err "No auth details provided. Please set user credentials using the \$HE_Username and \$HE_Password environment variables."
return 1
fi
_saveaccountconf_mutable HE_Username "$HE_Username"
@@ -33,8 +33,9 @@ dns_he_add() {
# Fills in the $_zone_id
_find_zone "$_full_domain" || return 1
_debug "Zone id \"$_zone_id\" will be used."
body="email=${HE_Username}&pass=${HE_Password}"
username_encoded="$(printf "%s" "${HE_Username}" | _url_encode)"
password_encoded="$(printf "%s" "${HE_Password}" | _url_encode)"
body="email=${username_encoded}&pass=${password_encoded}"
body="$body&account="
body="$body&menu=edit_zone"
body="$body&Type=TXT"
@@ -71,7 +72,9 @@ dns_he_rm() {
_debug "Zone id \"$_zone_id\" will be used."
# Find the record id to clean
body="email=${HE_Username}&pass=${HE_Password}"
username_encoded="$(printf "%s" "${HE_Username}" | _url_encode)"
password_encoded="$(printf "%s" "${HE_Password}" | _url_encode)"
body="email=${username_encoded}&pass=${password_encoded}"
body="$body&hosted_dns_zoneid=$_zone_id"
body="$body&menu=edit_zone"
body="$body&hosted_dns_editzone="
@@ -82,22 +85,24 @@ dns_he_rm() {
_debug "The txt record is not found, just skip"
return 0
fi
_record_id="$(echo "$response" | tr -d "#" | sed "s/<tr/#<tr/g" | tr -d "\n" | tr "#" "\n" | grep "$_full_domain" | grep '"dns_tr"' | grep "$_txt_value" | cut -d '"' -f 4)"
_record_id="$(echo "$response" | tr -d "#" | sed "s/<tr/#<tr/g" | tr -d "\n" | tr "#" "\n" | grep "$_full_domain" | grep '"dns_tr"' | grep -- "$_txt_value" | cut -d '"' -f 4)"
_debug2 _record_id "$_record_id"
if [ -z "$_record_id" ]; then
_err "Can not find record id"
return 1
fi
# Remove the record
body="email=${HE_Username}&pass=${HE_Password}"
username_encoded="$(printf "%s" "${HE_Username}" | _url_encode)"
password_encoded="$(printf "%s" "${HE_Password}" | _url_encode)"
body="email=${username_encoded}&pass=${password_encoded}"
body="$body&menu=edit_zone"
body="$body&hosted_dns_zoneid=$_zone_id"
body="$body&hosted_dns_recordid=$_record_id"
body="$body&hosted_dns_editzone=1"
body="$body&hosted_dns_delrecord=1"
body="$body&hosted_dns_delconfirm=delete"
_post "$body" "https://dns.he.net/" \
| grep '<div id="dns_status" onClick="hideThis(this);">Successfully removed record.</div>' \
_post "$body" "https://dns.he.net/" |
grep '<div id="dns_status" onClick="hideThis(this);">Successfully removed record.</div>' \
>/dev/null
exit_code="$?"
if [ "$exit_code" -eq 0 ]; then
@@ -112,20 +117,26 @@ dns_he_rm() {
_find_zone() {
_domain="$1"
body="email=${HE_Username}&pass=${HE_Password}"
username_encoded="$(printf "%s" "${HE_Username}" | _url_encode)"
password_encoded="$(printf "%s" "${HE_Password}" | _url_encode)"
body="email=${username_encoded}&pass=${password_encoded}"
response="$(_post "$body" "https://dns.he.net/")"
_debug2 response "$response"
if _contains "$response" '>Incorrect<'; then
_err "Unable to login to dns.he.net please check username and password"
return 1
fi
_table="$(echo "$response" | tr -d "#" | sed "s/<table/#<table/g" | tr -d "\n" | tr "#" "\n" | grep 'id="domains_table"')"
_debug2 _table "$_table"
_matches="$(echo "$_table" | sed "s/<tr/#<tr/g" | tr "#" "\n" | grep 'alt="edit"' | tr -d " " | sed "s/<td/#<td/g" | tr "#" "\n" | sed -n 3p)"
_matches="$(echo "$_table" | sed "s/<tr/#<tr/g" | tr "#" "\n" | grep 'alt="edit"' | tr -d " " | sed "s/<td/#<td/g" | tr "#" "\n" | grep 'hosted_dns_zoneid')"
_debug2 _matches "$_matches"
# Zone names and zone IDs are in same order
_zone_ids=$(echo "$_matches" | _egrep_o "hosted_dns_zoneid=[0-9]*&" | cut -d = -f 2 | tr -d '&')
_zone_names=$(echo "$_matches" | _egrep_o "name=.*onclick" | cut -d '"' -f 2)
_debug2 "These are the zones on this HE account:"
_debug2 "$_zone_names"
_debug2 "_zone_names" "$_zone_names"
_debug2 "And these are their respective IDs:"
_debug2 "$_zone_ids"
_debug2 "_zone_ids" "$_zone_ids"
if [ -z "$_zone_names" ] || [ -z "$_zone_ids" ]; then
_err "Can not get zone names."
return 1
@@ -143,10 +154,14 @@ _find_zone() {
_debug "Looking for zone \"${_attempted_zone}\""
line_num="$(echo "$_zone_names" | grep -n "$_attempted_zone" | cut -d : -f 1)"
line_num="$(echo "$_zone_names" | grep -n "^$_attempted_zone\$" | _head_n 1 | cut -d : -f 1)"
_debug2 line_num "$line_num"
if [ "$line_num" ]; then
_zone_id=$(echo "$_zone_ids" | sed -n "${line_num}p")
if [ -z "$_zone_id" ]; then
_err "Can not find zone id."
return 1
fi
_debug "Found relevant zone \"$_attempted_zone\" with id \"$_zone_id\" - will be used for domain \"$_domain\"."
return 0
fi

252
dnsapi/dns_hetzner.sh Normal file
View File

@@ -0,0 +1,252 @@
#!/usr/bin/env sh
#
#HETZNER_Token="sdfsdfsdfljlbjkljlkjsdfoiwje"
#
HETZNER_Api="https://dns.hetzner.com/api/v1"
######## Public functions #####################
# Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
# Used to add txt record
# Ref: https://dns.hetzner.com/api-docs/
dns_hetzner_add() {
full_domain=$1
txt_value=$2
HETZNER_Token="${HETZNER_Token:-$(_readaccountconf_mutable HETZNER_Token)}"
if [ -z "$HETZNER_Token" ]; then
HETZNER_Token=""
_err "You didn't specify a Hetzner api token."
_err "You can get yours from here https://dns.hetzner.com/settings/api-token."
return 1
fi
#save the api key and email to the account conf file.
_saveaccountconf_mutable HETZNER_Token "$HETZNER_Token"
_debug "First detect the root zone"
if ! _get_root "$full_domain"; then
_err "Invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_debug "Getting TXT records"
if ! _find_record "$_sub_domain" "$txt_value"; then
return 1
fi
if [ -z "$_record_id" ]; then
_info "Adding record"
if _hetzner_rest POST "records" "{\"zone_id\":\"${HETZNER_Zone_ID}\",\"type\":\"TXT\",\"name\":\"$_sub_domain\",\"value\":\"$txt_value\",\"ttl\":120}"; then
if _contains "$response" "$txt_value"; then
_info "Record added, OK"
_sleep 2
return 0
fi
fi
_err "Add txt record error${_response_error}"
return 1
else
_info "Found record id: $_record_id."
_info "Record found, do nothing."
return 0
# we could modify a record, if the names for txt records for *.example.com and example.com would be not the same
#if _hetzner_rest PUT "records/${_record_id}" "{\"zone_id\":\"${HETZNER_Zone_ID}\",\"type\":\"TXT\",\"name\":\"$full_domain\",\"value\":\"$txt_value\",\"ttl\":120}"; then
# if _contains "$response" "$txt_value"; then
# _info "Modified, OK"
# return 0
# fi
#fi
#_err "Add txt record error (modify)."
#return 1
fi
}
# Usage: full_domain txt_value
# Used to remove the txt record after validation
dns_hetzner_rm() {
full_domain=$1
txt_value=$2
HETZNER_Token="${HETZNER_Token:-$(_readaccountconf_mutable HETZNER_Token)}"
_debug "First detect the root zone"
if ! _get_root "$full_domain"; then
_err "Invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_debug "Getting TXT records"
if ! _find_record "$_sub_domain" "$txt_value"; then
return 1
fi
if [ -z "$_record_id" ]; then
_info "Remove not needed. Record not found."
else
if ! _hetzner_rest DELETE "records/$_record_id"; then
_err "Delete record error${_response_error}"
return 1
fi
_sleep 2
_info "Record deleted"
fi
}
#################### Private functions below ##################################
#returns
# _record_id=a8d58f22d6931bf830eaa0ec6464bf81 if found; or 1 if error
_find_record() {
unset _record_id
_record_name=$1
_record_value=$2
if [ -z "$_record_value" ]; then
_record_value='[^"]*'
fi
_debug "Getting all records"
_hetzner_rest GET "records?zone_id=${_domain_id}"
if _response_has_error; then
_err "Error${_response_error}"
return 1
else
_record_id=$(
echo "$response" |
grep -o "{[^\{\}]*\"name\":\"$_record_name\"[^\}]*}" |
grep "\"value\":\"$_record_value\"" |
while read -r record; do
# test for type and
if [ -n "$(echo "$record" | _egrep_o '"type":"TXT"')" ]; then
echo "$record" | _egrep_o '"id":"[^"]*"' | cut -d : -f 2 | tr -d \"
break
fi
done
)
fi
}
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
_get_root() {
domain=$1
i=1
p=1
domain_without_acme=$(echo "$domain" | cut -d . -f 2-)
domain_param_name=$(echo "HETZNER_Zone_ID_for_${domain_without_acme}" | sed 's/[\.\-]/_/g')
_debug "Reading zone_id for '$domain_without_acme' from config..."
HETZNER_Zone_ID=$(_readdomainconf "$domain_param_name")
if [ "$HETZNER_Zone_ID" ]; then
_debug "Found, using: $HETZNER_Zone_ID"
if ! _hetzner_rest GET "zones/${HETZNER_Zone_ID}"; then
_debug "Zone with id '$HETZNER_Zone_ID' does not exist."
_cleardomainconf "$domain_param_name"
unset HETZNER_Zone_ID
else
if _contains "$response" "\"id\":\"$HETZNER_Zone_ID\""; then
_domain=$(printf "%s\n" "$response" | _egrep_o '"name":"[^"]*"' | cut -d : -f 2 | tr -d \" | head -n 1)
if [ "$_domain" ]; then
_cut_length=$((${#domain} - ${#_domain} - 1))
_sub_domain=$(printf "%s" "$domain" | cut -c "1-$_cut_length")
_domain_id="$HETZNER_Zone_ID"
return 0
else
return 1
fi
else
return 1
fi
fi
fi
_debug "Trying to get zone id by domain name for '$domain_without_acme'."
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
if [ -z "$h" ]; then
#not valid
return 1
fi
_debug h "$h"
_hetzner_rest GET "zones?name=$h"
if _contains "$response" "\"name\":\"$h\"" || _contains "$response" '"total_entries":1'; then
_domain_id=$(echo "$response" | _egrep_o "\[.\"id\":\"[^\"]*\"" | _head_n 1 | cut -d : -f 2 | tr -d \")
if [ "$_domain_id" ]; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain=$h
HETZNER_Zone_ID=$_domain_id
_savedomainconf "$domain_param_name" "$HETZNER_Zone_ID"
return 0
fi
return 1
fi
p=$i
i=$(_math "$i" + 1)
done
return 1
}
#returns
# _response_error
_response_has_error() {
unset _response_error
err_part="$(echo "$response" | _egrep_o '"error":{[^}]*}')"
if [ -n "$err_part" ]; then
err_code=$(echo "$err_part" | _egrep_o '"code":[0-9]+' | cut -d : -f 2)
err_message=$(echo "$err_part" | _egrep_o '"message":"[^"]+"' | cut -d : -f 2 | tr -d \")
if [ -n "$err_code" ] && [ -n "$err_message" ]; then
_response_error=" - message: ${err_message}, code: ${err_code}"
return 0
fi
fi
return 1
}
#returns
# response
_hetzner_rest() {
m=$1
ep="$2"
data="$3"
_debug "$ep"
key_trimmed=$(echo "$HETZNER_Token" | tr -d \")
export _H1="Content-TType: application/json"
export _H2="Auth-API-Token: $key_trimmed"
if [ "$m" != "GET" ]; then
_debug data "$data"
response="$(_post "$data" "$HETZNER_Api/$ep" "" "$m")"
else
response="$(_get "$HETZNER_Api/$ep")"
fi
if [ "$?" != "0" ] || _response_has_error; then
_debug "Error$_response_error"
return 1
fi
_debug2 response "$response"
return 0
}

156
dnsapi/dns_hexonet.sh Executable file
View File

@@ -0,0 +1,156 @@
#!/usr/bin/env sh
#
# Hexonet_Login="username!roleId"
#
# Hexonet_Password="rolePassword"
Hexonet_Api="https://coreapi.1api.net/api/call.cgi"
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_hexonet_add() {
fulldomain=$1
txtvalue=$2
Hexonet_Login="${Hexonet_Login:-$(_readaccountconf_mutable Hexonet_Login)}"
Hexonet_Password="${Hexonet_Password:-$(_readaccountconf_mutable Hexonet_Password)}"
if [ -z "$Hexonet_Login" ] || [ -z "$Hexonet_Password" ]; then
Hexonet_Login=""
Hexonet_Password=""
_err "You must export variables: Hexonet_Login and Hexonet_Password"
return 1
fi
if ! _contains "$Hexonet_Login" "!"; then
_err "It seems that the Hexonet_Login=$Hexonet_Login is not a restrivteed user."
_err "Please check and retry."
return 1
fi
#save the username and password to the account conf file.
_saveaccountconf_mutable Hexonet_Login "$Hexonet_Login"
_saveaccountconf_mutable Hexonet_Password "$Hexonet_Password"
_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 "Getting txt records"
_hexonet_rest "command=QueryDNSZoneRRList&dnszone=${h}.&RRTYPE=TXT"
if ! _contains "$response" "CODE=200"; then
_err "Error"
return 1
fi
_info "Adding record"
if _hexonet_rest "command=UpdateDNSZone&dnszone=${_domain}.&addrr0=${_sub_domain}%20IN%20TXT%20${txtvalue}"; then
if _contains "$response" "CODE=200"; then
_info "Added, OK"
return 0
else
_err "Add txt record error."
return 1
fi
fi
_err "Add txt record error."
return 1
}
#fulldomain txtvalue
dns_hexonet_rm() {
fulldomain=$1
txtvalue=$2
Hexonet_Login="${Hexonet_Login:-$(_readaccountconf_mutable Hexonet_Login)}"
Hexonet_Password="${Hexonet_Password:-$(_readaccountconf_mutable Hexonet_Password)}"
if [ -z "$Hexonet_Login" ] || [ -z "$Hexonet_Password" ]; then
Hexonet_Login=""
Hexonet_Password=""
_err "You must export variables: Hexonet_Login and Hexonet_Password"
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 "Getting txt records"
_hexonet_rest "command=QueryDNSZoneRRList&dnszone=${h}.&RRTYPE=TXT&RR=${_sub_domain}%20IN%20TXT%20\"${txtvalue}\""
if ! _contains "$response" "CODE=200"; then
_err "Error"
return 1
fi
count=$(printf "%s\n" "$response" | _egrep_o "PROPERTY[TOTAL][0]=" | cut -d = -f 2)
_debug count "$count"
if [ "$count" = "0" ]; then
_info "Don't need to remove."
else
if ! _hexonet_rest "command=UpdateDNSZone&dnszone=${_domain}.&delrr0=${_sub_domain}%20IN%20TXT%20\"${txtvalue}\""; then
_err "Delete record error."
return 1
fi
_contains "$response" "CODE=200"
fi
}
#################### Private functions below ##################################
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
_get_root() {
domain=$1
i=1
p=1
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
if ! _hexonet_rest "command=QueryDNSZoneRRList&dnszone=${h}."; then
return 1
fi
if _contains "$response" "CODE=200"; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain=$h
return 0
fi
p=$i
i=$(_math "$i" + 1)
done
return 1
}
_hexonet_rest() {
query_params="$1"
_debug "$query_params"
response="$(_get "${Hexonet_Api}?s_login=${Hexonet_Login}&s_pw=${Hexonet_Password}&${query_params}")"
if [ "$?" != "0" ]; then
_err "error $query_params"
return 1
fi
_debug2 response "$response"
return 0
}

178
dnsapi/dns_hostingde.sh Normal file
View File

@@ -0,0 +1,178 @@
#!/usr/bin/env sh
# hosting.de API
# Values to export:
# export HOSTINGDE_ENDPOINT='https://secure.hosting.de'
# export HOSTINGDE_APIKEY='xxxxx'
######## Public functions #####################
dns_hostingde_add() {
fulldomain="${1}"
txtvalue="${2}"
_debug "Calling: _hostingde_addRecord() '${fulldomain}' '${txtvalue}'"
_hostingde_apiKey && _hostingde_getZoneConfig && _hostingde_addRecord
return $?
}
dns_hostingde_rm() {
fulldomain="${1}"
txtvalue="${2}"
_debug "Calling: _hostingde_removeRecord() '${fulldomain}' '${txtvalue}'"
_hostingde_apiKey && _hostingde_getZoneConfig && _hostingde_removeRecord
return $?
}
#################### own Private functions below ##################################
_hostingde_apiKey() {
HOSTINGDE_APIKEY="${HOSTINGDE_APIKEY:-$(_readaccountconf_mutable HOSTINGDE_APIKEY)}"
HOSTINGDE_ENDPOINT="${HOSTINGDE_ENDPOINT:-$(_readaccountconf_mutable HOSTINGDE_ENDPOINT)}"
if [ -z "$HOSTINGDE_APIKEY" ] || [ -z "$HOSTINGDE_ENDPOINT" ]; then
HOSTINGDE_APIKEY=""
HOSTINGDE_ENDPOINT=""
_err "You haven't specified hosting.de API key or endpoint yet."
_err "Please create your key and try again."
return 1
fi
_saveaccountconf_mutable HOSTINGDE_APIKEY "$HOSTINGDE_APIKEY"
_saveaccountconf_mutable HOSTINGDE_ENDPOINT "$HOSTINGDE_ENDPOINT"
}
_hostingde_parse() {
find="${1}"
if [ "${2}" ]; then
notfind="${2}"
fi
if [ "${notfind}" ]; then
_egrep_o \""${find}\":.*" | grep -v "${notfind}" | cut -d ':' -f 2 | cut -d ',' -f 1 | tr -d ' '
else
_egrep_o \""${find}\":.*" | cut -d ':' -f 2 | cut -d ',' -f 1 | tr -d ' '
fi
}
_hostingde_getZoneConfig() {
_info "Getting ZoneConfig"
curZone="${fulldomain#*.}"
returnCode=1
while _contains "${curZone}" "\\."; do
curData="{\"filter\":{\"field\":\"zoneName\",\"value\":\"${curZone}\"},\"limit\":1,\"authToken\":\"${HOSTINGDE_APIKEY}\"}"
curResult="$(_post "${curData}" "${HOSTINGDE_ENDPOINT}/api/dns/v1/json/zoneConfigsFind")"
_debug "Calling zoneConfigsFind: '${curData}' '${HOSTINGDE_ENDPOINT}/api/dns/v1/json/zoneConfigsFind'"
_debug "Result of zoneConfigsFind: '$curResult'"
if _contains "${curResult}" '"status": "error"'; then
if _contains "${curResult}" '"code": 10109'; then
_err "The API-Key is invalid or could not be found"
else
_err "UNKNOWN API ERROR"
fi
returnCode=1
break
fi
if _contains "${curResult}" '"totalEntries": 1'; then
_info "Retrieved zone data."
_debug "Zone data: '${curResult}'"
zoneConfigId=$(echo "${curResult}" | _hostingde_parse "id")
zoneConfigName=$(echo "${curResult}" | _hostingde_parse "name")
zoneConfigType=$(echo "${curResult}" | _hostingde_parse "type" "FindZoneConfigsResult")
zoneConfigExpire=$(echo "${curResult}" | _hostingde_parse "expire")
zoneConfigNegativeTtl=$(echo "${curResult}" | _hostingde_parse "negativeTtl")
zoneConfigRefresh=$(echo "${curResult}" | _hostingde_parse "refresh")
zoneConfigRetry=$(echo "${curResult}" | _hostingde_parse "retry")
zoneConfigTtl=$(echo "${curResult}" | _hostingde_parse "ttl")
zoneConfigDnsServerGroupId=$(echo "${curResult}" | _hostingde_parse "dnsServerGroupId")
zoneConfigEmailAddress=$(echo "${curResult}" | _hostingde_parse "emailAddress")
zoneConfigDnsSecMode=$(echo "${curResult}" | _hostingde_parse "dnsSecMode")
zoneConfigTemplateValues=$(echo "${curResult}" | _hostingde_parse "templateValues")
if [ "$zoneConfigTemplateValues" != "null" ]; then
_debug "Zone is tied to a template."
zoneConfigTemplateValuesTemplateId=$(echo "${curResult}" | _hostingde_parse "templateId")
zoneConfigTemplateValuesTemplateName=$(echo "${curResult}" | _hostingde_parse "templateName")
zoneConfigTemplateValuesTemplateReplacementsIPv4=$(echo "${curResult}" | _hostingde_parse "ipv4Replacement")
zoneConfigTemplateValuesTemplateReplacementsIPv6=$(echo "${curResult}" | _hostingde_parse "ipv6Replacement")
zoneConfigTemplateValuesTemplateReplacementsMailIPv4=$(echo "${curResult}" | _hostingde_parse "mailIpv4Replacement")
zoneConfigTemplateValuesTemplateReplacementsMailIPv6=$(echo "${curResult}" | _hostingde_parse "mailIpv6Replacement")
zoneConfigTemplateValuesTemplateTieToTemplate=$(echo "${curResult}" | _hostingde_parse "tieToTemplate")
zoneConfigTemplateValues="{\"templateId\":${zoneConfigTemplateValuesTemplateId},\"templateName\":${zoneConfigTemplateValuesTemplateName},\"templateReplacements\":{\"ipv4Replacement\":${zoneConfigTemplateValuesTemplateReplacementsIPv4},\"ipv6Replacement\":${zoneConfigTemplateValuesTemplateReplacementsIPv6},\"mailIpv4Replacement\":${zoneConfigTemplateValuesTemplateReplacementsMailIPv4},\"mailIpv6Replacement\":${zoneConfigTemplateValuesTemplateReplacementsMailIPv6}},\"tieToTemplate\":${zoneConfigTemplateValuesTemplateTieToTemplate}}"
_debug "Template values: '{$zoneConfigTemplateValues}'"
fi
if [ "${zoneConfigType}" != "\"NATIVE\"" ]; then
_err "Zone is not native"
returnCode=1
break
fi
_debug "zoneConfigId '${zoneConfigId}'"
returnCode=0
break
fi
curZone="${curZone#*.}"
done
if [ $returnCode -ne 0 ]; then
_info "ZoneEnd reached, Zone ${curZone} not found in hosting.de API"
fi
return $returnCode
}
_hostingde_getZoneStatus() {
_debug "Checking Zone status"
curData="{\"filter\":{\"field\":\"zoneConfigId\",\"value\":${zoneConfigId}},\"limit\":1,\"authToken\":\"${HOSTINGDE_APIKEY}\"}"
curResult="$(_post "${curData}" "${HOSTINGDE_ENDPOINT}/api/dns/v1/json/zonesFind")"
_debug "Calling zonesFind '${curData}' '${HOSTINGDE_ENDPOINT}/api/dns/v1/json/zonesFind'"
_debug "Result of zonesFind '$curResult'"
zoneStatus=$(echo "${curResult}" | _hostingde_parse "status" "success")
_debug "zoneStatus '${zoneStatus}'"
return 0
}
_hostingde_addRecord() {
_info "Adding record to zone"
_hostingde_getZoneStatus
_debug "Result of zoneStatus: '${zoneStatus}'"
while [ "${zoneStatus}" != "\"active\"" ]; do
_sleep 5
_hostingde_getZoneStatus
_debug "Result of zoneStatus: '${zoneStatus}'"
done
curData="{\"authToken\":\"${HOSTINGDE_APIKEY}\",\"zoneConfig\":{\"id\":${zoneConfigId},\"name\":${zoneConfigName},\"type\":${zoneConfigType},\"dnsServerGroupId\":${zoneConfigDnsServerGroupId},\"dnsSecMode\":${zoneConfigDnsSecMode},\"emailAddress\":${zoneConfigEmailAddress},\"soaValues\":{\"expire\":${zoneConfigExpire},\"negativeTtl\":${zoneConfigNegativeTtl},\"refresh\":${zoneConfigRefresh},\"retry\":${zoneConfigRetry},\"ttl\":${zoneConfigTtl}},\"templateValues\":${zoneConfigTemplateValues}},\"recordsToAdd\":[{\"name\":\"${fulldomain}\",\"type\":\"TXT\",\"content\":\"\\\"${txtvalue}\\\"\",\"ttl\":3600}]}"
curResult="$(_post "${curData}" "${HOSTINGDE_ENDPOINT}/api/dns/v1/json/zoneUpdate")"
_debug "Calling zoneUpdate: '${curData}' '${HOSTINGDE_ENDPOINT}/api/dns/v1/json/zoneUpdate'"
_debug "Result of zoneUpdate: '$curResult'"
if _contains "${curResult}" '"status": "error"'; then
if _contains "${curResult}" '"code": 10109'; then
_err "The API-Key is invalid or could not be found"
else
_err "UNKNOWN API ERROR"
fi
return 1
fi
return 0
}
_hostingde_removeRecord() {
_info "Removing record from zone"
_hostingde_getZoneStatus
_debug "Result of zoneStatus: '$zoneStatus'"
while [ "$zoneStatus" != "\"active\"" ]; do
_sleep 5
_hostingde_getZoneStatus
_debug "Result of zoneStatus: '$zoneStatus'"
done
curData="{\"authToken\":\"${HOSTINGDE_APIKEY}\",\"zoneConfig\":{\"id\":${zoneConfigId},\"name\":${zoneConfigName},\"type\":${zoneConfigType},\"dnsServerGroupId\":${zoneConfigDnsServerGroupId},\"dnsSecMode\":${zoneConfigDnsSecMode},\"emailAddress\":${zoneConfigEmailAddress},\"soaValues\":{\"expire\":${zoneConfigExpire},\"negativeTtl\":${zoneConfigNegativeTtl},\"refresh\":${zoneConfigRefresh},\"retry\":${zoneConfigRetry},\"ttl\":${zoneConfigTtl}},\"templateValues\":${zoneConfigTemplateValues}},\"recordsToDelete\":[{\"name\":\"${fulldomain}\",\"type\":\"TXT\",\"content\":\"\\\"${txtvalue}\\\"\"}]}"
curResult="$(_post "${curData}" "${HOSTINGDE_ENDPOINT}/api/dns/v1/json/zoneUpdate")"
_debug "Calling zoneUpdate: '${curData}' '${HOSTINGDE_ENDPOINT}/api/dns/v1/json/zoneUpdate'"
_debug "Result of zoneUpdate: '$curResult'"
if _contains "${curResult}" '"status": "error"'; then
if _contains "${curResult}" '"code": 10109'; then
_err "The API-Key is invalid or could not be found"
else
_err "UNKNOWN API ERROR"
fi
return 1
fi
return 0
}

289
dnsapi/dns_huaweicloud.sh Normal file
View File

@@ -0,0 +1,289 @@
#!/usr/bin/env sh
# HUAWEICLOUD_Username
# HUAWEICLOUD_Password
# HUAWEICLOUD_ProjectID
iam_api="https://iam.myhuaweicloud.com"
dns_api="https://dns.ap-southeast-1.myhuaweicloud.com" # Should work
######## Public functions #####################
# Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
# Used to add txt record
#
# Ref: https://support.huaweicloud.com/intl/zh-cn/api-dns/zh-cn_topic_0132421999.html
#
dns_huaweicloud_add() {
fulldomain=$1
txtvalue=$2
HUAWEICLOUD_Username="${HUAWEICLOUD_Username:-$(_readaccountconf_mutable HUAWEICLOUD_Username)}"
HUAWEICLOUD_Password="${HUAWEICLOUD_Password:-$(_readaccountconf_mutable HUAWEICLOUD_Password)}"
HUAWEICLOUD_ProjectID="${HUAWEICLOUD_ProjectID:-$(_readaccountconf_mutable HUAWEICLOUD_ProjectID)}"
# Check information
if [ -z "${HUAWEICLOUD_Username}" ] || [ -z "${HUAWEICLOUD_Password}" ] || [ -z "${HUAWEICLOUD_ProjectID}" ]; then
_err "Not enough information provided to dns_huaweicloud!"
return 1
fi
unset token # Clear token
token="$(_get_token "${HUAWEICLOUD_Username}" "${HUAWEICLOUD_Password}" "${HUAWEICLOUD_ProjectID}")"
if [ -z "${token}" ]; then # Check token
_err "dns_api(dns_huaweicloud): Error getting token."
return 1
fi
_secure_debug "Access token is:" "${token}"
unset zoneid
zoneid="$(_get_zoneid "${token}" "${fulldomain}")"
if [ -z "${zoneid}" ]; then
_err "dns_api(dns_huaweicloud): Error getting zone id."
return 1
fi
_debug "Zone ID is:" "${zoneid}"
_debug "Adding Record"
_add_record "${token}" "${fulldomain}" "${txtvalue}"
ret="$?"
if [ "${ret}" != "0" ]; then
_err "dns_api(dns_huaweicloud): Error adding record."
return 1
fi
# Do saving work if all succeeded
_saveaccountconf_mutable HUAWEICLOUD_Username "${HUAWEICLOUD_Username}"
_saveaccountconf_mutable HUAWEICLOUD_Password "${HUAWEICLOUD_Password}"
_saveaccountconf_mutable HUAWEICLOUD_ProjectID "${HUAWEICLOUD_ProjectID}"
return 0
}
# Usage: fulldomain txtvalue
# Used to remove the txt record after validation
#
# Ref: https://support.huaweicloud.com/intl/zh-cn/api-dns/dns_api_64005.html
#
dns_huaweicloud_rm() {
fulldomain=$1
txtvalue=$2
HUAWEICLOUD_Username="${HUAWEICLOUD_Username:-$(_readaccountconf_mutable HUAWEICLOUD_Username)}"
HUAWEICLOUD_Password="${HUAWEICLOUD_Password:-$(_readaccountconf_mutable HUAWEICLOUD_Password)}"
HUAWEICLOUD_ProjectID="${HUAWEICLOUD_ProjectID:-$(_readaccountconf_mutable HUAWEICLOUD_ProjectID)}"
# Check information
if [ -z "${HUAWEICLOUD_Username}" ] || [ -z "${HUAWEICLOUD_Password}" ] || [ -z "${HUAWEICLOUD_ProjectID}" ]; then
_err "Not enough information provided to dns_huaweicloud!"
return 1
fi
unset token # Clear token
token="$(_get_token "${HUAWEICLOUD_Username}" "${HUAWEICLOUD_Password}" "${HUAWEICLOUD_ProjectID}")"
if [ -z "${token}" ]; then # Check token
_err "dns_api(dns_huaweicloud): Error getting token."
return 1
fi
_secure_debug "Access token is:" "${token}"
unset zoneid
zoneid="$(_get_zoneid "${token}" "${fulldomain}")"
if [ -z "${zoneid}" ]; then
_err "dns_api(dns_huaweicloud): Error getting zone id."
return 1
fi
_debug "Zone ID is:" "${zoneid}"
# Remove all records
# Therotically HuaweiCloud does not allow more than one record set
# But remove them recurringly to increase robusty
while [ "${record_id}" != "0" ]; do
_debug "Removing Record"
_rm_record "${token}" "${zoneid}" "${record_id}"
record_id="$(_get_recordset_id "${token}" "${fulldomain}" "${zoneid}")"
done
return 0
}
################### Private functions below ##################################
# _get_zoneid
#
# _token=$1
# _domain_string=$2
#
# printf "%s" "${_zoneid}"
_get_zoneid() {
_token=$1
_domain_string=$2
export _H1="X-Auth-Token: ${_token}"
i=1
while true; do
h=$(printf "%s" "${_domain_string}" | cut -d . -f $i-100)
if [ -z "$h" ]; then
#not valid
return 1
fi
_debug "$h"
response=$(_get "${dns_api}/v2/zones?name=${h}")
_debug2 "$response"
if _contains "${response}" '"id"'; then
zoneidlist=$(echo "${response}" | _egrep_o "\"id\": *\"[^\"]*\"" | cut -d : -f 2 | tr -d \" | tr -d " ")
zonenamelist=$(echo "${response}" | _egrep_o "\"name\": *\"[^\"]*\"" | cut -d : -f 2 | tr -d \" | tr -d " ")
_debug2 "Return Zone ID(s):" "${zoneidlist}"
_debug2 "Return Zone Name(s):" "${zonenamelist}"
zoneidnum=0
zoneidcount=$(echo "${zoneidlist}" | grep -c '^')
_debug "Retund Zone ID(s) Count:" "${zoneidcount}"
while [ "${zoneidnum}" -lt "${zoneidcount}" ]; do
zoneidnum=$(_math "$zoneidnum" + 1)
_zoneid=$(echo "${zoneidlist}" | sed -n "${zoneidnum}p")
zonename=$(echo "${zonenamelist}" | sed -n "${zoneidnum}p")
_debug "Check Zone Name" "${zonename}"
if [ "${zonename}" = "${h}." ]; then
_debug "Get Zone ID Success."
_debug "ZoneID:" "${_zoneid}"
printf "%s" "${_zoneid}"
return 0
fi
done
fi
i=$(_math "$i" + 1)
done
return 1
}
_get_recordset_id() {
_token=$1
_domain=$2
_zoneid=$3
export _H1="X-Auth-Token: ${_token}"
response=$(_get "${dns_api}/v2/zones/${_zoneid}/recordsets?name=${_domain}")
if _contains "${response}" '"id"'; then
_id="$(echo "${response}" | _egrep_o "\"id\": *\"[^\"]*\"" | cut -d : -f 2 | tr -d \" | tr -d " ")"
printf "%s" "${_id}"
return 0
fi
printf "%s" "0"
return 1
}
_add_record() {
_token=$1
_domain=$2
_txtvalue=$3
# Get Existing Records
export _H1="X-Auth-Token: ${_token}"
response=$(_get "${dns_api}/v2/zones/${zoneid}/recordsets?name=${_domain}")
_debug2 "${response}"
_exist_record=$(echo "${response}" | _egrep_o '"records":[^]]*' | sed 's/\"records\"\:\[//g')
_debug "${_exist_record}"
# Check if record exist
# Generate body data
if [ -z "${_exist_record}" ]; then
_post_body="{
\"name\": \"${_domain}.\",
\"description\": \"ACME Challenge\",
\"type\": \"TXT\",
\"ttl\": 1,
\"records\": [
\"\\\"${_txtvalue}\\\"\"
]
}"
else
_post_body="{
\"name\": \"${_domain}.\",
\"description\": \"ACME Challenge\",
\"type\": \"TXT\",
\"ttl\": 1,
\"records\": [
${_exist_record},
\"\\\"${_txtvalue}\\\"\"
]
}"
fi
_record_id="$(_get_recordset_id "${_token}" "${_domain}" "${zoneid}")"
_debug "Record Set ID is:" "${_record_id}"
# Remove all records
while [ "${_record_id}" != "0" ]; do
_debug "Removing Record"
_rm_record "${_token}" "${zoneid}" "${_record_id}"
_record_id="$(_get_recordset_id "${_token}" "${_domain}" "${zoneid}")"
done
# Add brand new records with all old and new records
export _H2="Content-Type: application/json"
export _H1="X-Auth-Token: ${_token}"
_debug2 "${_post_body}"
_post "${_post_body}" "${dns_api}/v2/zones/${zoneid}/recordsets" >/dev/null
_code="$(grep "^HTTP" "$HTTP_HEADER" | _tail_n 1 | cut -d " " -f 2 | tr -d "\\r\\n")"
if [ "$_code" != "202" ]; then
_err "dns_huaweicloud: http code ${_code}"
return 1
fi
return 0
}
# _rm_record $token $zoneid $recordid
# assume ${dns_api} exist
# no output
# return 0
_rm_record() {
_token=$1
_zone_id=$2
_record_id=$3
export _H2="Content-Type: application/json"
export _H1="X-Auth-Token: ${_token}"
_post "" "${dns_api}/v2/zones/${_zone_id}/recordsets/${_record_id}" false "DELETE" >/dev/null
return $?
}
_get_token() {
_username=$1
_password=$2
_project=$3
_debug "Getting Token"
body="{
\"auth\": {
\"identity\": {
\"methods\": [
\"password\"
],
\"password\": {
\"user\": {
\"name\": \"${_username}\",
\"password\": \"${_password}\",
\"domain\": {
\"name\": \"${_username}\"
}
}
}
},
\"scope\": {
\"project\": {
\"id\": \"${_project}\"
}
}
}
}"
export _H1="Content-Type: application/json;charset=utf8"
_post "${body}" "${iam_api}/v3/auth/tokens" >/dev/null
_code=$(grep "^HTTP" "$HTTP_HEADER" | _tail_n 1 | cut -d " " -f 2 | tr -d "\\r\\n")
_token=$(grep "^X-Subject-Token" "$HTTP_HEADER" | cut -d " " -f 2-)
_secure_debug "${_code}"
printf "%s" "${_token}"
return 0
}

Some files were not shown because too many files have changed in this diff Show More