Compare commits

..

174 Commits
2.7.2 ... 2.7.4

Author SHA1 Message Date
neil
b6c2fc5a69 Merge pull request #1001 from Neilpang/socat
Socat
2017-09-02 17:56:15 +08:00
neilpang
cc6610edc2 add socat 2017-09-02 17:32:40 +08:00
neilpang
7b8ddfdd96 use socat 2017-09-02 08:59:30 +08:00
neilpang
443a5ca0c2 socat tls mode 2017-09-01 23:44:52 +08:00
neilpang
3794b5cb58 fix changes for :https://community.letsencrypt.org/t/acme-sh-standalone-fails-multiple-validation-requests-staging-multi-va/41249/8
use socat instead of nc.
2017-09-01 23:01:37 +08:00
neil
2068efdb38 Merge pull request #995 from Neilpang/dev
Dev
2017-08-30 22:22:50 +08:00
neil
258ca1b434 Merge pull request #991 from fritteli/fritteli-typos
Fritteli typos
2017-08-30 21:57:30 +08:00
fritteli
88bb7b780d Typos 2017-08-29 22:35:11 +02:00
neil
3805e5d37e Merge pull request #988 from Neilpang/dev
Dev
2017-08-25 20:56:23 +08:00
neilpang
a2d6daaef4 fix cpanel_uapi.sh 2017-08-25 20:54:10 +08:00
neilpang
48e9006cd1 fix cpanel uapi 2017-08-25 20:51:31 +08:00
neil
a25a4b5d11 Merge pull request #986 from Neilpang/dev
Dev
2017-08-22 20:28:35 +08:00
neilpang
309bec474f add warning for dns manual mode 2017-08-22 20:27:13 +08:00
neil
d36440a06d Merge pull request #940 from 2globalnomads/patch-1
cpanel_uapi.sh
2017-08-22 09:17:07 +08:00
neil
2a2f772412 Merge pull request #975 from Neilpang/dev
Dev
2017-08-17 22:06:10 +08:00
neil
6a524bff9d Merge pull request #973 from mvanini/master
Support for busybox in time2str()
2017-08-17 22:04:49 +08:00
neil
5def1169db Merge pull request #974 from Neilpang/dev
Dev
2017-08-17 21:52:33 +08:00
Michele
a07395fb56 Added support for busybox in time2str()
awk fallback if none of preceding method works
2017-08-17 12:50:28 +02:00
neil
e25a375f43 Merge pull request #969 from abelbeck/dns_duckdns
Update DuckDNS support, fix failure on first call, no longer save the…
2017-08-14 21:36:43 +08:00
Lonnie Abelbeck
96801e3478 Update DuckDNS support, fix failure on first call, no longer save the domain/username as a global, and other tweaks 2017-08-11 16:46:29 -05:00
neil
90100aa169 Merge pull request #967 from Neilpang/dev
support fcrontab, fix https://github.com/Neilpang/acme.sh/issues/966
2017-08-10 21:38:12 +08:00
neilpang
415f375ce6 support fcrontab, fix https://github.com/Neilpang/acme.sh/issues/966 2017-08-10 21:31:28 +08:00
neil
50d238b60f Merge pull request #963 from Neilpang/dev
format
2017-08-04 21:58:55 +08:00
neilpang
5c3b41bd93 format 2017-08-04 21:57:45 +08:00
neil
3e0971c159 Merge pull request #961 from Neilpang/dev
Dev
2017-08-03 23:40:05 +08:00
neil
57740fbd18 Merge pull request #960 from jfro/dev
Fix Linode DNS API to work on BSD
2017-08-03 22:38:17 +08:00
neil
16bc8f7040 Merge pull request #949 from candlerb/candlerb/unifi
Candlerb/unifi
2017-08-03 21:52:28 +08:00
Jeremy Knope
c145f24621 Remove extra space 2017-08-03 09:47:45 -04:00
Jeremy Knope
cd3a4573f2 Fix shell check errors 2017-07-31 08:37:30 -04:00
Brian Candler
8eab77f3c6 Add deployment script for unifi controller 2017-07-30 12:21:20 +01:00
neil
4af339424a Merge pull request #953 from angel333/master
Add DNS API script for Hurricane Electric DNS service
2017-07-30 10:45:40 +08:00
Ondrej Simek
4dd69a8b1a Exit codes, exit codes... Exit codes everywhere... 2017-07-29 14:40:56 +02:00
Ondrej Simek
baa1160594 Make Shellcheck happier about exit codes 2017-07-29 14:31:27 +02:00
Ondrej Simek
f438ff4bab Fix an improbable corner case. 2017-07-29 14:29:13 +02:00
Ondrej Simek
a25b2af66c Get rid of _find_num 2017-07-29 14:25:07 +02:00
Ondrej Simek
31b67ab92e Few non-critical fixes. 2017-07-29 13:52:28 +02:00
neil
5303b36913 Merge pull request #958 from Neilpang/dev
Dev
2017-07-29 15:25:16 +08:00
neilpang
a5c56c547d minor, fix dns param 2017-07-29 15:23:50 +08:00
Ondrej Simek
ccf9a9976c Fix the previous rushed commit. 2017-07-28 18:33:25 +02:00
Jeremy Knope
ab1efd923b back to sed 2017-07-28 10:26:56 -04:00
Ondrej Simek
d6780f9e49 Retain an exit code 2017-07-28 15:29:35 +02:00
Ondrej Simek
8534e3b2f7 Make shellcheck happier 2017-07-28 13:58:47 +02:00
Jeremy Knope
8e6cf669ad Try awk instead for \n replacements 2017-07-27 14:15:19 -04:00
Ondrej Simek
577380e98e Few fixes for shellcheck 2017-07-27 18:44:55 +02:00
Ondrej Simek
235b5b0c15 Small cosmetic fixes. 2017-07-27 18:06:19 +02:00
Ondrej Simek
aefed1d1b9 Get rid of shell arrays. 2017-07-27 18:04:53 +02:00
Jeremy Knope
d39649f30d Revert non-linode scripts since they're untested 2017-07-27 08:52:46 -04:00
Ondrej Simek
1546b7e5a9 Missing quotes 2017-07-26 20:21:36 +02:00
Ondrej Simek
ff74778dea Fix few issues from Travis 2017-07-26 20:15:34 +02:00
Jeremy Knope
29b21b828b Fix DNS API scripts on *BSD
\n isn't available in all regex/sed
2017-07-26 09:44:11 -04:00
neil
a6a0495392 Merge pull request #952 from candlerb/candlerb/isecc
Clarify keylength parameter to _isEccKey() and _initpath()
2017-07-25 19:05:51 +08:00
Brian Candler
3281043e27 Clarify keylength parameter to _isEccKey() and _initpath()
Closes #950
2017-07-25 09:39:19 +01:00
Ondrej Simek
f7299403f7 Incorporate Neilpang's comments 2017-07-23 07:31:55 +02:00
Ondrej Simek
a0d251a336 Merge remote-tracking branch 'upstream/dev' 2017-07-23 05:15:27 +02:00
Ondrej Simek
8ca45d3d03 Add HE to README 2017-07-23 05:13:33 +02:00
Ondrej Simek
d988542afc Sync with upstream 2017-07-23 05:09:48 +02:00
Ondrej Simek
4285d81ca9 Get rid of curl. 2017-07-23 05:00:02 +02:00
Santeri
4286b2917e renamed function 2017-07-19 12:22:00 +04:00
Santeri
d09b5cb80e Rename cpanel_uapi.sh to cpanel_deploy.sh 2017-07-19 07:39:21 +04:00
Santeri
90fd18bf42 Renamed script to cpanel_uapi.sh
As per Neil's request.
2017-07-18 15:48:17 +04:00
neil
cae6c8e5f5 Merge pull request #943 from Neilpang/dev
Dev
2017-07-14 20:38:11 +08:00
neil
473340c53b Merge pull request #936 from non7top/yandex
Add pdd.yandex.ru dns api support
2017-07-14 20:28:29 +08:00
Vladimir Berezhnoy
ae302ee600 reformat docs 2017-07-14 03:51:08 +03:00
Vladimir Berezhnoy
27934ac4ca Merge branch 'yandex' of github.com:non7top/acme.sh into yandex 2017-07-14 03:27:11 +03:00
Vladimir Berezhnoy
283ef9adb7 minor fixes 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy
377fe5ecde add documentation 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy
c848d3ee22 fix formatting 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy
eb6be88fac rework root domain detection 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy
fceb728501 fix egrep and exit 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy
a0df46258d remove python 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy
57d1db58db shfmt fixes 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy
d61b687853 remove awk 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy
42ab7a5d72 add newline and checks 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy
18cb11dcbf fix formatting 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy
e9d5407792 fix syntax 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy
a09b2c0074 fix syntax 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy
a460ac021f add pdd.yandex.ru dns api 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy
bdee66fe29 minor fixes 2017-07-13 18:37:13 +03:00
Vladimir Berezhnoy
84a251c8c7 add documentation 2017-07-13 17:05:57 +03:00
neil
cea763bb11 Merge pull request #942 from Neilpang/dev
output log
2017-07-13 20:56:53 +08:00
neilpang
accbda9d2f output log 2017-07-13 20:52:44 +08:00
Ondrej Simek
7d64e141e4 Add dns_he - DNS API script for Hurricane Electric DNS service
... Although not yet fully Posix compatible.
2017-07-12 20:24:54 +02:00
Vladimir Berezhnoy
6a9b4db448 fix formatting 2017-07-12 04:07:18 +03:00
Vladimir Berezhnoy
e6a95ecd08 rework root domain detection 2017-07-12 03:51:48 +03:00
Vladimir Berezhnoy
10cb7585a7 fix egrep and exit 2017-07-11 02:19:39 +03:00
Santeri
a577c7215f One more change to pass the check shellcheck test
Now it is tested and works also when run as a root.
2017-07-10 16:43:42 +04:00
neil
e5244cf3c0 Merge pull request #941 from Neilpang/dev
do not retry for a invalid cert in cronjob.
2017-07-10 19:58:22 +08:00
neilpang
c4d0aec536 do not retry for a invalid cert in cronjob.
fix https://github.com/Neilpang/acme.sh/issues/939
2017-07-10 19:51:55 +08:00
Santeri
796647158e Removed double quotes from _opt
Broke GoDaddy cpanel causing error (thanks Hedgehog)
2017-07-10 15:36:16 +04:00
Vladimir Berezhnoy
266e9d0619 remove python 2017-07-09 20:00:02 +03:00
Vladimir Berezhnoy
9ec54ef89b shfmt fixes 2017-07-09 13:21:55 +03:00
Vladimir Berezhnoy
256cb90f3c remove awk 2017-07-09 13:15:01 +03:00
Vladimir Berezhnoy
8f3a3b293d add newline and checks 2017-07-09 13:00:42 +03:00
neil
975a7359a2 Merge pull request #937 from Neilpang/dev
Dev
2017-07-09 09:48:37 +08:00
neil
ac7361a55e Merge pull request #935 from abelbeck/dns_dyn
Add 'dns_dyn' DNS challenge validation script for Dyn Managed DNS API, Issue #594
2017-07-09 09:20:34 +08:00
Vladimir Berezhnoy
bd41f50ba5 fix formatting 2017-07-08 22:02:34 +03:00
Vladimir Berezhnoy
a2038ab07e fix syntax 2017-07-08 21:57:27 +03:00
Vladimir Berezhnoy
6445a7674b fix syntax 2017-07-08 21:52:47 +03:00
Vladimir Berezhnoy
3bf2e89a1a add pdd.yandex.ru dns api 2017-07-08 21:35:22 +03:00
Lonnie Abelbeck
e6a13bf386 Merge branch 'dns_dyn' of github.com:abelbeck/acme.sh into dns_dyn 2017-07-08 07:10:09 -05:00
Lonnie Abelbeck
42b2adc03e Add 'dns_dyn' DNS challenge validation script for Dyn Managed DNS API
dns_dyn.sh, remove empty line at end

dns_dyn.sh, remove trailing spaces at end of line

Replace 'head -n' with the '_head_n' function

Update main README.md DNS API list
2017-07-08 07:06:51 -05:00
Lonnie Abelbeck
f2b9af01e8 Merge remote-tracking branch 'upstream/dev' into dns_dyn 2017-07-08 06:48:25 -05:00
Lonnie Abelbeck
9bd2d92755 Update main README.md DNS API list 2017-07-08 06:43:21 -05:00
Lonnie Abelbeck
babe884b7c Replace 'head -n' with the '_head_n' function 2017-07-08 06:39:18 -05:00
neilpang
200287254b add deactivate-account 2017-07-08 17:25:01 +08:00
neilpang
0b797f5964 fix new shellcheck error 2017-07-08 14:12:31 +08:00
neilpang
13a8c309f5 fix new shellcheck errors 2017-07-08 09:20:12 +08:00
Lonnie Abelbeck
528d2f29d3 dns_dyn.sh, remove trailing spaces at end of line 2017-07-07 10:33:24 -05:00
Lonnie Abelbeck
0aba5dc8de dns_dyn.sh, remove empty line at end 2017-07-07 10:22:20 -05:00
Lonnie Abelbeck
72fcf5ab85 Add 'dns_dyn' DNS challenge validation script for Dyn Managed DNS API 2017-07-07 09:51:43 -05:00
neil
dd9df068b0 Merge pull request #928 from Neilpang/dev
minor, fix format
2017-07-04 09:10:00 +08:00
neil
81772fb703 minor, fix format 2017-07-04 09:08:54 +08:00
neil
6304566603 Merge pull request #927 from Neilpang/dev
Dev
2017-07-04 08:29:38 +08:00
neilpang
5f8b60a0e5 fix https://github.com/Neilpang/acme.sh/issues/926
don't trigger validation for dns manually mode
2017-07-04 08:24:30 +08:00
neil
e2accaf70e Merge pull request #925 from raidenii/master
Fix for Name.com API
2017-07-03 20:55:36 +08:00
RaidenII
7b32bbfc26 Fix for SC2086. 2017-07-03 08:22:16 -04:00
RaidenII
6963f3880d Fixes the get_root function so that when domain doesn't exist it will correctly return error. 2017-07-03 03:28:28 -07:00
2globalnomads
6c3430b6e5 Wrote missing cpanel.sh
This script I wrote works for me on GoDaddy, but I don't have any other hosting services or cpanel version to test it. Hope it's better than nothing for you. Thanks for your great script!
Cheers,
Santeri
2017-07-02 23:24:14 +04:00
neil
c53f36a777 Merge pull request #920 from Neilpang/dev
Dev
2017-07-02 21:52:30 +08:00
neil
bb4d378733 Merge pull request #921 from raidenii/master
Fix README.md for DNS API.
2017-07-02 21:49:17 +08:00
RaidenII
333090a967 Fix README.md for DNS API. 2017-07-02 06:38:25 -07:00
neil
c8f5646d53 Merge pull request #919 from raidenii/master
Updated README.md for Name.com API application.
2017-07-02 21:34:19 +08:00
RaidenII
3002f6dfd5 Updated README.md for Name.com API application. 2017-07-02 06:02:44 -07:00
neil
3f8a50e2ae Merge pull request #909 from raidenii/master
DuckDNS.org and Name.com DNS API support
2017-07-02 20:13:12 +08:00
RaidenII
1a504118e5 Updated DNS API support list. 2017-07-02 04:55:06 -07:00
RaidenII
2e602ef6b0 Added ret value verification. 2017-07-02 04:45:07 -07:00
neil
d55c3faaeb Merge pull request #918 from Neilpang/dev
Dev
2017-07-02 19:20:59 +08:00
neilpang
6b185d20c0 fix format 2017-07-02 18:40:11 +08:00
neilpang
1bbc33a0cf minor fix CA_DIR 2017-07-02 18:24:55 +08:00
neilpang
a71eba07a1 minor, fix resource name 2017-07-02 18:05:55 +08:00
neilpang
422dd1fa4f Implement deactivate account: --deactivate-account 2017-07-02 17:02:54 +08:00
neilpang
c4b2e5829e add always-force-new-domain-key. fix https://github.com/Neilpang/acme.sh/issues/914 2017-07-02 15:25:35 +08:00
neilpang
1be222f6ed minor 2017-07-02 13:38:44 +08:00
neil
5463f459e6 Merge pull request #917 from Neilpang/dev
Dev
2017-07-01 22:44:29 +08:00
neilpang
14d7bfdab2 fix deactivate for lower rate limit 2017-07-01 21:47:30 +08:00
neilpang
ea722da3de add debug info 2017-07-01 20:31:42 +08:00
RaidenII
9aed1e2d17 Argh. Double quotes. 2017-07-01 05:18:12 -07:00
RaidenII
63c6ed3fd0 Fixes to follow coding standards. 2017-07-01 05:14:52 -07:00
neil
744bfc1982 Merge pull request #915 from Neilpang/dev
fix alias
2017-07-01 12:31:42 +08:00
neilpang
d04434e3ec fix alias 2017-07-01 10:54:14 +08:00
RaidenII
dc3b7b5775 Merge remote-tracking branch 'upstream/master' 2017-06-30 09:39:13 -04:00
RaidenII
17fbfd14db Minor fixes. 2017-06-30 08:32:39 -04:00
RaidenII
d0f5aece5f Fix SC2170. 2017-06-29 15:43:58 -04:00
RaidenII
eeda3062e1 Fix against POSIX standard. 2017-06-29 15:40:29 -04:00
RaidenII
168d712dec Fixed URL of Name.com API and removed useless debug for retcode. 2017-06-29 09:43:11 -04:00
RaidenII
e64ad5176e Added Name.com API support.
Minor change to DuckDNS API support.
2017-06-28 16:15:57 -04:00
neil
0e1469f359 Merge pull request #907 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/905
2017-06-28 19:47:40 +08:00
neilpang
7d2b6cfeaf fix https://github.com/Neilpang/acme.sh/issues/905 2017-06-28 19:46:51 +08:00
neil
8e7d029946 Merge pull request #906 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/900
2017-06-28 19:21:45 +08:00
neilpang
9dd62ae0f8 fix https://github.com/Neilpang/acme.sh/issues/900 2017-06-28 19:21:03 +08:00
RaidenII
e7dff4756f Using HTTPS for DuckDNS API and added instruction. 2017-06-27 15:28:10 -04:00
RaidenII
fa98d72f3a Added preliminary support for DuckDNS TXT record API, a free Dynamic DNS provider 2017-06-27 09:21:39 -04:00
neil
ccf0492890 Merge pull request #904 from Neilpang/dev
Dev
2017-06-27 19:57:50 +08:00
neilpang
eb0ef6bd3d fix https://github.com/Neilpang/acme.sh/issues/614#issuecomment-311160843 2017-06-27 19:56:43 +08:00
neil
841b762796 minor 2017-06-23 18:11:11 +08:00
neil
63fb90806c Merge pull request #896 from Neilpang/dev
support --server
2017-06-20 21:59:08 +08:00
neilpang
88ada80686 step to 2.7.3 2017-06-20 21:51:18 +08:00
neilpang
7d5ddf5e6a Merge branch 'server' of https://github.com/Neilpang/acme.sh into server 2017-06-19 20:36:33 +08:00
neilpang
8f01919f62 minor 2017-06-19 20:34:49 +08:00
neilpang
98394f99b5 fix server host 2017-06-19 20:34:49 +08:00
neilpang
cae50e16a7 fix https://github.com/Neilpang/acme.sh/issues/882#issuecomment-309383956 2017-06-19 20:34:48 +08:00
neilpang
4a2ac7bd2e fix renew for stage cert 2017-06-19 20:34:48 +08:00
neilpang
a3bdaa85f2 minor 2017-06-19 20:34:47 +08:00
neilpang
40ef86f475 fix for deactivate function 2017-06-19 20:34:47 +08:00
neilpang
4cee14f3c5 fix format 2017-06-19 20:34:47 +08:00
neilpang
48d9a8c180 support --server 2017-06-19 20:34:46 +08:00
neilpang
1d384e3192 minor 2017-06-19 20:24:31 +08:00
neilpang
87f3dc4558 fix server host 2017-06-19 20:19:30 +08:00
neilpang
8afec596aa fix https://github.com/Neilpang/acme.sh/issues/882#issuecomment-309383956 2017-06-19 20:05:43 +08:00
neilpang
ce59fc6c10 fix renew for stage cert 2017-06-17 17:15:37 +08:00
neilpang
cbb74c984f minor 2017-06-17 16:30:04 +08:00
neilpang
287623df58 fix for deactivate function 2017-06-17 16:20:32 +08:00
neilpang
f8c1d97a25 fix format 2017-06-17 15:59:27 +08:00
neilpang
2a188905da support --server 2017-06-17 15:49:45 +08:00
17 changed files with 1632 additions and 228 deletions

View File

@@ -18,7 +18,7 @@ addons:
install: install:
- if [ "$TRAVIS_OS_NAME" = 'osx' ]; then - if [ "$TRAVIS_OS_NAME" = 'osx' ]; then
brew update && brew install openssl; brew update && brew install openssl socat;
brew info openssl; brew info openssl;
ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/; ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/;
ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/; ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/;
@@ -30,6 +30,7 @@ install:
openssl version 2>&1 || true; openssl version 2>&1 || true;
$ACME_OPENSSL_BIN version 2>&1 || true; $ACME_OPENSSL_BIN version 2>&1 || true;
export PATH="$_old_path"; export PATH="$_old_path";
else sudo apt-get install socat;
fi fi
script: script:
@@ -40,7 +41,7 @@ script:
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then ~/shfmt -l -w -i 2 . ; 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 git diff --exit-code && echo "shfmt OK" ; fi
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then shellcheck -V ; fi - if [ "$TRAVIS_OS_NAME" = "linux" ]; then shellcheck -V ; fi
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then shellcheck **/*.sh && echo "shellcheck OK" ; fi - if [ "$TRAVIS_OS_NAME" = "linux" ]; then shellcheck -e SC2181 **/*.sh && echo "shellcheck OK" ; fi
- cd .. - cd ..
- git clone https://github.com/Neilpang/acmetest.git && cp -r acme.sh acmetest/ && cd acmetest - 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" ./letest.sh ; fi - if [ "$TRAVIS_OS_NAME" = "linux" -a "$NGROK_TOKEN" ]; then sudo TEST_LOCAL="$TEST_LOCAL" NGROK_TOKEN="$NGROK_TOKEN" ./letest.sh ; fi

View File

@@ -16,7 +16,7 @@ ADD ./ /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/ 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/
RUN ln -s /root/.acme.sh/acme.sh /usr/local/bin/acme.sh RUN ln -s /root/.acme.sh/acme.sh /usr/local/bin/acme.sh && crontab -l | sed 's#> /dev/null##' | crontab -
RUN for verb in help \ RUN for verb in help \
version \ version \
@@ -44,15 +44,17 @@ RUN for verb in help \
create-domain-key \ create-domain-key \
createCSR \ createCSR \
deactivate \ deactivate \
deactivate-account \
; do \ ; 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} \ 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 ; done
RUN printf "%b" '#!'"/usr/bin/env sh\n \ RUN printf "%b" '#!'"/usr/bin/env sh\n \
if [ \"\$1\" = \"daemon\" ]; then \n \ if [ \"\$1\" = \"daemon\" ]; then \n \
crond -f\n \ trap \"echo stop && killall crond && exit 0\" SIGTERM SIGINT \n \
crond && while true; do sleep 1; done;\n \
else \n \ else \n \
/root/.acme.sh/acme.sh --config-home /acme.sh \"\$@\"\n \ exec -- \"\$@\"\n \
fi" >/entry.sh && chmod +x /entry.sh fi" >/entry.sh && chmod +x /entry.sh
VOLUME /acme.sh VOLUME /acme.sh

View File

@@ -296,6 +296,9 @@ acme.sh --renew -d example.com
Ok, it's finished. Ok, it's finished.
**Take care, this is dns manual mode, it can not be renewed automatically. you will have to add a new txt record to your domain by your hand when you renew your cert.**
**Please use dns api mode instead.**
# 9. Automatic DNS API integration # 9. Automatic DNS API integration
@@ -331,7 +334,11 @@ You don't have to do anything manually!
1. Dynu API (https://www.dynu.com) 1. Dynu API (https://www.dynu.com)
1. DNSimple API 1. DNSimple API
1. NS1.com 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)
And: And:

567
acme.sh

File diff suppressed because it is too large Load Diff

View File

@@ -80,3 +80,21 @@ acme.sh --deploy -d ftp.example.com --deploy-hook exim4
```sh ```sh
acme.sh --deploy -d ftp.example.com --deploy-hook keychain acme.sh --deploy -d ftp.example.com --deploy-hook keychain
``` ```
## 7. Deploy to cpanel host.
```
acme.sh --deploy -d example.com --deploy-hook cpanel_uapi
```
If you are login as root, please specify the username to deploy cert to:
```sh
export DEPLOY_CPANEL_USER=username
acme.sh --deploy -d example.com --deploy-hook cpanel_uapi
```

View File

@@ -1,29 +0,0 @@
#!/usr/bin/env sh
#Here is the script to deploy the cert to your cpanel account by the cpanel APIs.
#returns 0 means success, otherwise error.
#export DEPLOY_CPANEL_USER=myusername
#export DEPLOY_CPANEL_PASSWORD=PASSWORD
######## Public functions #####################
#domain keyfile certfile cafile fullchain
cpanel_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"
_err "Not implemented yet"
return 1
}

64
deploy/cpanel_uapi.sh Normal file
View File

@@ -0,0 +1,64 @@
#!/usr/bin/env sh
# 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
#export DEPLOY_CPANEL_USER=myusername
######## Public functions #####################
#domain keyfile certfile cafile fullchain
cpanel_uapi_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 uapi; then
_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\");")
_debug _cert "$_cert"
_debug _key "$_key"
if [ "$(id -u)" = 0 ]; then
if [ -z "$DEPLOY_CPANEL_USER" ]; then
_err "It seems that you are root, please define the target user name: export DEPLOY_CPANEL_USER=username"
return 1
fi
_savedomainconf DEPLOY_CPANEL_USER "$DEPLOY_CPANEL_USER"
_response=$(uapi --user="$DEPLOY_CPANEL_USER" SSL install_ssl domain="$_cdomain" cert="$_cert" key="$_key")
else
_response=$(uapi SSL install_ssl domain="$_cdomain" cert="$_cert" key="$_key")
fi
if [ $? -ne 0 ]; then
_err "Error in deploying certificate:"
_err "$_response"
return 1
fi
_debug response "$_response"
_info "Certificate successfully deployed"
return 0
}

100
deploy/unifi.sh Normal file
View File

@@ -0,0 +1,100 @@
#!/usr/bin/env sh
#Here is a script to deploy cert to unifi server.
#returns 0 means success, otherwise error.
#DEPLOY_UNIFI_KEYSTORE="/usr/lib/unifi/data/keystore"
#DEPLOY_UNIFI_KEYPASS="aircontrolenterprise"
#DEPLOY_UNIFI_RELOAD="service unifi restart"
######## Public functions #####################
#domain keyfile certfile cafile fullchain
unifi_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 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"
_import_pkcs12="$(_mktemp)"
_toPkcs "$_import_pkcs12" "$_ckey" "$_ccert" "$_cca" "$_unifi_keypass" unifi root
if [ "$?" != "0" ]; then
_err "Oops, error creating import pkcs12, please report bug to us."
return 1
fi
_info "Modify unifi 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!"
rm "$_import_pkcs12"
else
_err "Import unifi keystore error, please report bug to us."
rm "$_import_pkcs12"
return 1
fi
_info "Run reload: $_reload"
if eval "$_reload"; 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
}

View File

@@ -505,6 +505,102 @@ Ok, let's issue a cert now:
acme.sh --issue --dns dns_nsone -d example.com -d www.example.com 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 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>.
# Use custom API # Use custom API
If your API is not supported yet, you can write your own DNS API. If your API is not supported yet, you can write your own DNS API.

View File

@@ -208,7 +208,7 @@ aws_rest() {
kServiceH="$(printf "$Service%s" | _hmac "$Hash" "$kRegionH" hex)" kServiceH="$(printf "$Service%s" | _hmac "$Hash" "$kRegionH" hex)"
_debug2 kServiceH "$kServiceH" _debug2 kServiceH "$kServiceH"
kSigningH="$(printf "aws4_request%s" | _hmac "$Hash" "$kServiceH" hex)" kSigningH="$(printf "%s" "aws4_request" | _hmac "$Hash" "$kServiceH" hex)"
_debug2 kSigningH "$kSigningH" _debug2 kSigningH "$kSigningH"
signature="$(printf "$StringToSign%s" | _hmac "$Hash" "$kSigningH" hex)" signature="$(printf "$StringToSign%s" | _hmac "$Hash" "$kSigningH" hex)"

128
dnsapi/dns_duckdns.sh Executable file
View File

@@ -0,0 +1,128 @@
#!/usr/bin/env sh
#Created by RaidenII, to use DuckDNS's API to add/remove text records
#06/27/2017
# Pass credentials before "acme.sh --issue --dns dns_duckdns ..."
# --
# export DuckDNS_Token="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
# --
#
# Due to the fact that DuckDNS uses StartSSL as cert provider, --insecure may need to be used with acme.sh
DuckDNS_API="https://www.duckdns.org/update"
######## Public functions #####################
#Usage: dns_duckdns_add _acme-challenge.domain.duckdns.org "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_duckdns_add() {
fulldomain=$1
txtvalue=$2
DuckDNS_Token="${DuckDNS_Token:-$(_readaccountconf_mutable DuckDNS_Token)}"
if [ -z "$DuckDNS_Token" ]; then
_err "You must export variable: DuckDNS_Token"
_err "The token for your DuckDNS account is necessary."
_err "You can look it up in your DuckDNS account."
return 1
fi
# Now save the credentials.
_saveaccountconf_mutable DuckDNS_Token "$DuckDNS_Token"
# Unfortunately, DuckDNS 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 DuckDNS
if ! _duckdns_get_domain; then
return 1
fi
# Now add the TXT record to DuckDNS
_info "Trying to add TXT record"
if _duckdns_rest GET "domains=$_duckdns_domain&token=$DuckDNS_Token&txt=$txtvalue"; then
if [ "$response" = "OK" ]; then
_info "TXT record has been successfully added to your DuckDNS 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_duckdns_rm() {
fulldomain=$1
txtvalue=$2
DuckDNS_Token="${DuckDNS_Token:-$(_readaccountconf_mutable DuckDNS_Token)}"
if [ -z "$DuckDNS_Token" ]; then
_err "You must export variable: DuckDNS_Token"
_err "The token for your DuckDNS account is necessary."
_err "You can look it up in your DuckDNS account."
return 1
fi
if ! _duckdns_get_domain; then
return 1
fi
# Now remove the TXT record from DuckDNS
_info "Trying to remove TXT record"
if _duckdns_rest GET "domains=$_duckdns_domain&token=$DuckDNS_Token&txt=&clear=true"; then
if [ "$response" = "OK" ]; then
_info "TXT record has been successfully removed from your DuckDNS 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.duckdns.org
#returns
# _duckdns_domain=domain
_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)"
if [ -z "$_duckdns_domain" ]; then
_err "Error extracting the domain."
return 1
fi
return 0
}
#Usage: method URI
_duckdns_rest() {
method=$1
param="$2"
_debug param "$param"
url="$DuckDNS_API?$param"
_debug url "$url"
# DuckDNS uses GET to update domain info
if [ "$method" = "GET" ]; then
response="$(_get "$url")"
else
_err "Unsupported method"
return 1
fi
_debug2 response "$response"
return 0
}

339
dnsapi/dns_dyn.sh Normal file
View File

@@ -0,0 +1,339 @@
#!/usr/bin/env sh
#
# Dyn.com Domain API
#
# Author: Gerd Naschenweng
# https://github.com/magicdude4eva
#
# Dyn Managed DNS API
# https://help.dyn.com/dns-api-knowledge-base/
#
# It is recommended to add a "Dyn Managed DNS" user specific for API access.
# The "Zones & Records Permissions" required by this script are:
# --
# RecordAdd
# RecordUpdate
# RecordDelete
# RecordGet
# ZoneGet
# ZoneAddNode
# ZoneRemoveNode
# ZonePublish
# --
#
# Pass credentials before "acme.sh --issue --dns dns_dyn ..."
# --
# export DYN_Customer="customer"
# export DYN_Username="apiuser"
# export DYN_Password="secret"
# --
DYN_API="https://api.dynect.net/REST"
#REST_API
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "Challenge-code"
dns_dyn_add() {
fulldomain="$1"
txtvalue="$2"
DYN_Customer="${DYN_Customer:-$(_readaccountconf_mutable DYN_Customer)}"
DYN_Username="${DYN_Username:-$(_readaccountconf_mutable DYN_Username)}"
DYN_Password="${DYN_Password:-$(_readaccountconf_mutable DYN_Password)}"
if [ -z "$DYN_Customer" ] || [ -z "$DYN_Username" ] || [ -z "$DYN_Password" ]; then
DYN_Customer=""
DYN_Username=""
DYN_Password=""
_err "You must export variables: DYN_Customer, DYN_Username and DYN_Password"
return 1
fi
#save the config variables to the account conf file.
_saveaccountconf_mutable DYN_Customer "$DYN_Customer"
_saveaccountconf_mutable DYN_Username "$DYN_Username"
_saveaccountconf_mutable DYN_Password "$DYN_Password"
if ! _dyn_get_authtoken; then
return 1
fi
if [ -z "$_dyn_authtoken" ]; then
_dyn_end_session
return 1
fi
if ! _dyn_get_zone; then
_dyn_end_session
return 1
fi
if ! _dyn_add_record; then
_dyn_end_session
return 1
fi
if ! _dyn_publish_zone; then
_dyn_end_session
return 1
fi
_dyn_end_session
return 0
}
#Usage: fulldomain txtvalue
#Remove the txt record after validation.
dns_dyn_rm() {
fulldomain="$1"
txtvalue="$2"
DYN_Customer="${DYN_Customer:-$(_readaccountconf_mutable DYN_Customer)}"
DYN_Username="${DYN_Username:-$(_readaccountconf_mutable DYN_Username)}"
DYN_Password="${DYN_Password:-$(_readaccountconf_mutable DYN_Password)}"
if [ -z "$DYN_Customer" ] || [ -z "$DYN_Username" ] || [ -z "$DYN_Password" ]; then
DYN_Customer=""
DYN_Username=""
DYN_Password=""
_err "You must export variables: DYN_Customer, DYN_Username and DYN_Password"
return 1
fi
if ! _dyn_get_authtoken; then
return 1
fi
if [ -z "$_dyn_authtoken" ]; then
_dyn_end_session
return 1
fi
if ! _dyn_get_zone; then
_dyn_end_session
return 1
fi
if ! _dyn_get_record_id; then
_dyn_end_session
return 1
fi
if [ -z "$_dyn_record_id" ]; then
_dyn_end_session
return 1
fi
if ! _dyn_rm_record; then
_dyn_end_session
return 1
fi
if ! _dyn_publish_zone; then
_dyn_end_session
return 1
fi
_dyn_end_session
return 0
}
#################### Private functions below ##################################
#get Auth-Token
_dyn_get_authtoken() {
_info "Start Dyn API Session"
data="{\"customer_name\":\"$DYN_Customer\", \"user_name\":\"$DYN_Username\", \"password\":\"$DYN_Password\"}"
dyn_url="$DYN_API/Session/"
method="POST"
_debug data "$data"
_debug dyn_url "$dyn_url"
export _H1="Content-Type: application/json"
response="$(_post "$data" "$dyn_url" "" "$method")"
sessionstatus="$(printf "%s\n" "$response" | _egrep_o '"status" *: *"[^"]*' | _head_n 1 | sed 's#^"status" *: *"##')"
_debug response "$response"
_debug sessionstatus "$sessionstatus"
if [ "$sessionstatus" = "success" ]; then
_dyn_authtoken="$(printf "%s\n" "$response" | _egrep_o '"token" *: *"[^"]*' | _head_n 1 | sed 's#^"token" *: *"##')"
_info "Token received"
_debug _dyn_authtoken "$_dyn_authtoken"
return 0
fi
_dyn_authtoken=""
_err "get token failed"
return 1
}
#fulldomain=_acme-challenge.www.domain.com
#returns
# _dyn_zone=domain.com
_dyn_get_zone() {
i=2
while true; do
domain="$(printf "%s" "$fulldomain" | cut -d . -f "$i-100")"
if [ -z "$domain" ]; then
break
fi
dyn_url="$DYN_API/Zone/$domain/"
export _H1="Auth-Token: $_dyn_authtoken"
export _H2="Content-Type: application/json"
response="$(_get "$dyn_url" "" "")"
sessionstatus="$(printf "%s\n" "$response" | _egrep_o '"status" *: *"[^"]*' | _head_n 1 | sed 's#^"status" *: *"##')"
_debug dyn_url "$dyn_url"
_debug response "$response"
_debug sessionstatus "$sessionstatus"
if [ "$sessionstatus" = "success" ]; then
_dyn_zone="$domain"
return 0
fi
i=$(_math "$i" + 1)
done
_dyn_zone=""
_err "get zone failed"
return 1
}
#add TXT record
_dyn_add_record() {
_info "Adding TXT record"
data="{\"rdata\":{\"txtdata\":\"$txtvalue\"},\"ttl\":\"300\"}"
dyn_url="$DYN_API/TXTRecord/$_dyn_zone/$fulldomain/"
method="POST"
export _H1="Auth-Token: $_dyn_authtoken"
export _H2="Content-Type: application/json"
response="$(_post "$data" "$dyn_url" "" "$method")"
sessionstatus="$(printf "%s\n" "$response" | _egrep_o '"status" *: *"[^"]*' | _head_n 1 | sed 's#^"status" *: *"##')"
_debug response "$response"
_debug sessionstatus "$sessionstatus"
if [ "$sessionstatus" = "success" ]; then
_info "TXT Record successfully added"
return 0
fi
_err "add TXT record failed"
return 1
}
#publish the zone
_dyn_publish_zone() {
_info "Publishing zone"
data="{\"publish\":\"true\"}"
dyn_url="$DYN_API/Zone/$_dyn_zone/"
method="PUT"
export _H1="Auth-Token: $_dyn_authtoken"
export _H2="Content-Type: application/json"
response="$(_post "$data" "$dyn_url" "" "$method")"
sessionstatus="$(printf "%s\n" "$response" | _egrep_o '"status" *: *"[^"]*' | _head_n 1 | sed 's#^"status" *: *"##')"
_debug response "$response"
_debug sessionstatus "$sessionstatus"
if [ "$sessionstatus" = "success" ]; then
_info "Zone published"
return 0
fi
_err "publish zone failed"
return 1
}
#get record_id of TXT record so we can delete the record
_dyn_get_record_id() {
_info "Getting record_id of TXT record"
dyn_url="$DYN_API/TXTRecord/$_dyn_zone/$fulldomain/"
export _H1="Auth-Token: $_dyn_authtoken"
export _H2="Content-Type: application/json"
response="$(_get "$dyn_url" "" "")"
sessionstatus="$(printf "%s\n" "$response" | _egrep_o '"status" *: *"[^"]*' | _head_n 1 | sed 's#^"status" *: *"##')"
_debug response "$response"
_debug sessionstatus "$sessionstatus"
if [ "$sessionstatus" = "success" ]; then
_dyn_record_id="$(printf "%s\n" "$response" | _egrep_o "\"data\" *: *\[\"/REST/TXTRecord/$_dyn_zone/$fulldomain/[^\"]*" | _head_n 1 | sed "s#^\"data\" *: *\[\"/REST/TXTRecord/$_dyn_zone/$fulldomain/##")"
_debug _dyn_record_id "$_dyn_record_id"
return 0
fi
_dyn_record_id=""
_err "getting record_id failed"
return 1
}
#delete TXT record
_dyn_rm_record() {
_info "Deleting TXT record"
dyn_url="$DYN_API/TXTRecord/$_dyn_zone/$fulldomain/$_dyn_record_id/"
method="DELETE"
_debug dyn_url "$dyn_url"
export _H1="Auth-Token: $_dyn_authtoken"
export _H2="Content-Type: application/json"
response="$(_post "" "$dyn_url" "" "$method")"
sessionstatus="$(printf "%s\n" "$response" | _egrep_o '"status" *: *"[^"]*' | _head_n 1 | sed 's#^"status" *: *"##')"
_debug response "$response"
_debug sessionstatus "$sessionstatus"
if [ "$sessionstatus" = "success" ]; then
_info "TXT record successfully deleted"
return 0
fi
_err "delete TXT record failed"
return 1
}
#logout
_dyn_end_session() {
_info "End Dyn API Session"
dyn_url="$DYN_API/Session/"
method="DELETE"
_debug dyn_url "$dyn_url"
export _H1="Auth-Token: $_dyn_authtoken"
export _H2="Content-Type: application/json"
response="$(_post "" "$dyn_url" "" "$method")"
_debug response "$response"
_dyn_authtoken=""
return 0
}

175
dnsapi/dns_he.sh Executable file
View File

@@ -0,0 +1,175 @@
#!/usr/bin/env sh
########################################################################
# Hurricane Electric hook script for acme.sh
#
# Environment variables:
#
# - $HE_Username (your dns.he.net username)
# - $HE_Password (your dns.he.net password)
#
# Author: Ondrej Simek <me@ondrejsimek.com>
# Git repo: https://github.com/angel333/acme.sh
#-- dns_he_add() - Add TXT record --------------------------------------
# Usage: dns_he_add _acme-challenge.subdomain.domain.com "XyZ123..."
dns_he_add() {
_full_domain=$1
_txt_value=$2
_info "Using DNS-01 Hurricane Electric hook"
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."
return 1
fi
_saveaccountconf HE_Username "$HE_Username"
_saveaccountconf HE_Password "$HE_Password"
# 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}"
body="$body&account="
body="$body&menu=edit_zone"
body="$body&Type=TXT"
body="$body&hosted_dns_zoneid=$_zone_id"
body="$body&hosted_dns_recordid="
body="$body&hosted_dns_editzone=1"
body="$body&Priority="
body="$body&Name=$_full_domain"
body="$body&Content=$_txt_value"
body="$body&TTL=300"
body="$body&hosted_dns_editrecord=Submit"
response="$(_post "$body" "https://dns.he.net/")"
exit_code="$?"
if [ "$exit_code" -eq 0 ]; then
_info "TXT record added successfully."
else
_err "Couldn't add the TXT record."
fi
_debug2 response "$response"
return "$exit_code"
}
#-- dns_he_rm() - Remove TXT record ------------------------------------
# Usage: dns_he_rm _acme-challenge.subdomain.domain.com "XyZ123..."
dns_he_rm() {
_full_domain=$1
_txt_value=$2
_info "Cleaning up after DNS-01 Hurricane Electric hook"
# fills in the $_zone_id
_find_zone "$_full_domain" || return 1
_debug "Zone id \"$_zone_id\" will be used."
# Find the record id to clean
body="email=${HE_Username}&pass=${HE_Password}"
body="$body&hosted_dns_zoneid=$_zone_id"
body="$body&menu=edit_zone"
body="$body&hosted_dns_editzone="
domain_regex="$(echo "$_full_domain" | sed 's/\./\\./g')" # escape dots
_record_id=$(_post "$body" "https://dns.he.net/" \
| tr -d '\n' \
| _egrep_o "data=\"&quot;${_txt_value}&quot;([^>]+>){6}[^<]+<[^;]+;deleteRecord\('[0-9]+','${domain_regex}','TXT'\)" \
| _egrep_o "[0-9]+','${domain_regex}','TXT'\)$" \
| _egrep_o "^[0-9]+"
)
# The series of egreps above could have been done a bit shorter but
# I wanted to double-check whether it's the correct record (in case
# HE changes their website somehow).
# Remove the record
body="email=${HE_Username}&pass=${HE_Password}"
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>' \
>/dev/null
exit_code="$?"
if [ "$exit_code" -eq 0 ]; then
_info "Record removed successfully."
else
_err "Could not clean (remove) up the record. Please go to HE administration interface and clean it by hand."
return "$exit_code"
fi
}
########################## PRIVATE FUNCTIONS ###########################
#-- _find_zone() -------------------------------------------------------
# Returns the most specific zone found in administration interface.
#
# Example:
#
# _find_zone first.second.third.co.uk
#
# ... will return the first zone that exists in admin out of these:
# - "first.second.third.co.uk"
# - "second.third.co.uk"
# - "third.co.uk"
# - "co.uk" <-- unlikely
# - "uk" <-'
#
# (another approach would be something like this:
# https://github.com/hlandau/acme/blob/master/_doc/dns.hook
# - that's better if there are multiple pages. It's so much simpler.
# )
_find_zone() {
_domain="$1"
body="email=${HE_Username}&pass=${HE_Password}"
_matches=$(_post "$body" "https://dns.he.net/" \
| _egrep_o "delete_dom.*name=\"[^\"]+\" value=\"[0-9]+"
)
# Zone names and zone IDs are in same order
_zone_ids=$(echo "$_matches" | cut -d '"' -f 5)
_zone_names=$(echo "$_matches" | cut -d '"' -f 3)
_debug2 "These are the zones on this HE account:"
_debug2 "$_zone_names"
_debug2 "And these are their respective IDs:"
_debug2 "$_zone_ids"
# 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}\""
# Take care of "." and only match whole lines. Note that grep -F
# cannot be used because there's no way to make it match whole
# lines.
regex="^$(echo "$_attempted_zone" | sed 's/\./\\./g')$"
line_num=$(echo "$_zone_names" \
| grep -n "$regex" \
| cut -d : -f 1
)
if [ -n "$line_num" ]; then
_zone_id=$(echo "$_zone_ids" | sed "${line_num}q;d")
_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

@@ -41,10 +41,10 @@ dns_infoblox_add() {
export _H2="Authorization: Basic $Infoblox_CredsEncoded" export _H2="Authorization: Basic $Infoblox_CredsEncoded"
## Add the challenge record to the Infoblox grid member ## Add the challenge record to the Infoblox grid member
result=$(_post "" "$baseurlnObject" "" "POST") result="$(_post "" "$baseurlnObject" "" "POST")"
## Let's see if we get something intelligible back from the unit ## Let's see if we get something intelligible back from the unit
if echo "$result" | egrep "record:txt/.*:.*/$Infoblox_View"; then if [ "$(echo "$result" | _egrep_o "record:txt/.*:.*/$Infoblox_View")" ]; then
_info "Successfully created the txt record" _info "Successfully created the txt record"
return 0 return 0
else else
@@ -66,7 +66,7 @@ dns_infoblox_rm() {
_debug txtvalue "$txtvalue" _debug txtvalue "$txtvalue"
## Base64 encode the credentials ## Base64 encode the credentials
Infoblox_CredsEncoded=$(printf "%b" "$Infoblox_Creds" | _base64) Infoblox_CredsEncoded="$(printf "%b" "$Infoblox_Creds" | _base64)"
## Construct the HTTP Authorization header ## Construct the HTTP Authorization header
export _H1="Accept-Language:en-US" export _H1="Accept-Language:en-US"
@@ -74,17 +74,17 @@ dns_infoblox_rm() {
## Does the record exist? Let's check. ## Does the record exist? Let's check.
baseurlnObject="https://$Infoblox_Server/wapi/v2.2.2/record:txt?name=$fulldomain&text=$txtvalue&view=$Infoblox_View&_return_type=xml-pretty" baseurlnObject="https://$Infoblox_Server/wapi/v2.2.2/record:txt?name=$fulldomain&text=$txtvalue&view=$Infoblox_View&_return_type=xml-pretty"
result=$(_get "$baseurlnObject") result="$(_get "$baseurlnObject")"
## Let's see if we get something intelligible back from the grid ## Let's see if we get something intelligible back from the grid
if echo "$result" | egrep "record:txt/.*:.*/$Infoblox_View"; then if [ "$(echo "$result" | _egrep_o "record:txt/.*:.*/$Infoblox_View")" ]; then
## Extract the object reference ## Extract the object reference
objRef=$(printf "%b" "$result" | _egrep_o "record:txt/.*:.*/$Infoblox_View") objRef="$(printf "%b" "$result" | _egrep_o "record:txt/.*:.*/$Infoblox_View")"
objRmUrl="https://$Infoblox_Server/wapi/v2.2.2/$objRef" objRmUrl="https://$Infoblox_Server/wapi/v2.2.2/$objRef"
## Delete them! All the stale records! ## Delete them! All the stale records!
rmResult=$(_post "" "$objRmUrl" "" "DELETE") rmResult="$(_post "" "$objRmUrl" "" "DELETE")"
## Let's see if that worked ## Let's see if that worked
if echo "$rmResult" | egrep "record:txt/.*:.*/$Infoblox_View"; then if [ "$(echo "$rmResult" | _egrep_o "record:txt/.*:.*/$Infoblox_View")" ]; then
_info "Successfully deleted $objRef" _info "Successfully deleted $objRef"
return 0 return 0
else else

View File

@@ -68,7 +68,7 @@ dns_linode_rm() {
_parameters="&DomainID=$_domain_id" _parameters="&DomainID=$_domain_id"
if _rest GET "domain.resource.list" "$_parameters" && [ -n "$response" ]; then if _rest GET "domain.resource.list" "$_parameters" && [ -n "$response" ]; then
response="$(echo "$response" | tr -d "\n" | sed 's/{/\n&/g')" response="$(echo "$response" | tr -d "\n" | tr '{' "|" | sed 's/|/&{/g' | tr "|" "\n")"
resource="$(echo "$response" | _egrep_o "{.*\"NAME\":\s*\"$_sub_domain\".*}")" resource="$(echo "$response" | _egrep_o "{.*\"NAME\":\s*\"$_sub_domain\".*}")"
if [ "$resource" ]; then if [ "$resource" ]; then
@@ -128,7 +128,7 @@ _get_root() {
p=1 p=1
if _rest GET "domain.list"; then if _rest GET "domain.list"; then
response="$(echo "$response" | tr -d "\n" | sed 's/{/\n&/g')" response="$(echo "$response" | tr -d "\n" | tr '{' "|" | sed 's/|/&{/g' | tr "|" "\n")"
while true; do while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100) h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h" _debug h "$h"

193
dnsapi/dns_namecom.sh Executable file
View File

@@ -0,0 +1,193 @@
#!/usr/bin/env sh
#Author: RaidneII
#Created 06/28/2017
#Utilize name.com API to finish dns-01 verifications.
######## Public functions #####################
Namecom_API="https://api.name.com/api"
#Usage: dns_namecom_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_namecom_add() {
fulldomain=$1
txtvalue=$2
# First we need name.com credentials.
if [ -z "$Namecom_Username" ]; then
Namecom_Username=""
_err "Username for name.com is missing."
_err "Please specify that in your environment variable."
return 1
fi
if [ -z "$Namecom_Token" ]; then
Namecom_Token=""
_err "API token for name.com is missing."
_err "Please specify that in your environment variable."
return 1
fi
# Save them in configuration.
_saveaccountconf Namecom_Username "$Namecom_Username"
_saveaccountconf Namecom_Token "$Namecom_Token"
# Login in using API
if ! _namecom_login; then
return 1
fi
# Find domain in domain list.
if ! _namecom_get_root "$fulldomain"; then
_err "Unable to find domain specified."
_namecom_logout
return 1
fi
# Add TXT record.
_namecom_addtxt_json="{\"hostname\":\"$_sub_domain\",\"type\":\"TXT\",\"content\":\"$txtvalue\",\"ttl\":\"300\",\"priority\":\"10\"}"
if _namecom_rest POST "dns/create/$_domain" "$_namecom_addtxt_json"; then
retcode=$(printf "%s\n" "$response" | _egrep_o "\"code\":100")
if [ "$retcode" ]; then
_info "Successfully added TXT record, ready for validation."
_namecom_logout
return 0
else
_err "Unable to add the DNS record."
_namecom_logout
return 1
fi
fi
}
#Usage: fulldomain txtvalue
#Remove the txt record after validation.
dns_namecom_rm() {
fulldomain=$1
txtvalue=$2
if ! _namecom_login; then
return 1
fi
# Find domain in domain list.
if ! _namecom_get_root "$fulldomain"; then
_err "Unable to find domain specified."
_namecom_logout
return 1
fi
# Get the record id.
if _namecom_rest GET "dns/list/$_domain"; then
retcode=$(printf "%s\n" "$response" | _egrep_o "\"code\":100")
if [ "$retcode" ]; then
_record_id=$(printf "%s\n" "$response" | _egrep_o "\"record_id\":\"[0-9]+\",\"name\":\"$fulldomain\",\"type\":\"TXT\"" | cut -d \" -f 4)
_debug record_id "$_record_id"
_info "Successfully retrieved the record id for ACME challenge."
else
_err "Unable to retrieve the record id."
_namecom_logout
return 1
fi
fi
# Remove the DNS record using record id.
_namecom_rmtxt_json="{\"record_id\":\"$_record_id\"}"
if _namecom_rest POST "dns/delete/$_domain" "$_namecom_rmtxt_json"; then
retcode=$(printf "%s\n" "$response" | _egrep_o "\"code\":100")
if [ "$retcode" ]; then
_info "Successfully removed the TXT record."
_namecom_logout
return 0
else
_err "Unable to remove the DNS record."
_namecom_logout
return 1
fi
fi
}
#################### Private functions below ##################################
_namecom_rest() {
method=$1
param=$2
data=$3
export _H1="Content-Type: application/json"
export _H2="Api-Session-Token: $sessionkey"
if [ "$method" != "GET" ]; then
response="$(_post "$data" "$Namecom_API/$param" "" "$method")"
else
response="$(_get "$Namecom_API/$param")"
fi
if [ "$?" != "0" ]; then
_err "error $param"
return 1
fi
_debug2 response "$response"
return 0
}
_namecom_login() {
namecom_login_json="{\"username\":\"$Namecom_Username\",\"api_token\":\"$Namecom_Token\"}"
if _namecom_rest POST "login" "$namecom_login_json"; then
retcode=$(printf "%s\n" "$response" | _egrep_o "\"code\":100")
if [ "$retcode" ]; then
_info "Successfully logged in. Fetching session token..."
sessionkey=$(printf "%s\n" "$response" | _egrep_o "\"session_token\":\".+" | cut -d \" -f 4)
if [ ! -z "$sessionkey" ]; then
_debug sessionkey "$sessionkey"
_info "Session key obtained."
else
_err "Unable to get session key."
return 1
fi
else
_err "Logging in failed."
return 1
fi
fi
}
_namecom_logout() {
if _namecom_rest GET "logout"; then
retcode=$(printf "%s\n" "$response" | _egrep_o "\"code\":100")
if [ "$retcode" ]; then
_info "Successfully logged out."
else
_err "Error logging out."
return 1
fi
fi
}
_namecom_get_root() {
domain=$1
i=2
p=1
if ! _namecom_rest GET "domain/list"; then
return 1
fi
# Need to exclude the last field (tld)
numfields=$(echo "$domain" | _egrep_o "\." | wc -l)
while [ $i -le "$numfields" ]; do
host=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug host "$host"
if [ -z "$host" ]; then
return 1
fi
if _contains "$response" "$host"; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain="$host"
return 0
fi
p=$i
i=$(_math "$i" + 1)
done
return 1
}

107
dnsapi/dns_yandex.sh Executable file
View File

@@ -0,0 +1,107 @@
#!/usr/bin/env sh
# Author: non7top@gmail.com
# 07 Jul 2017
# report bugs at https://github.com/non7top/acme.sh
# Values to export:
# export PDD_Token="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
######## Public functions #####################
#Usage: dns_myapi_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_yandex_add() {
fulldomain="${1}"
txtvalue="${2}"
_debug "Calling: dns_yandex_add() '${fulldomain}' '${txtvalue}'"
_PDD_credentials || return 1
export _H1="PddToken: $PDD_Token"
curDomain=$(_PDD_get_domain "$fulldomain")
_debug "Found suitable domain in pdd: $curDomain"
curSubdomain="$(echo "${fulldomain}" | sed -e "s@.${curDomain}\$@@")"
curData="domain=${curDomain}&type=TXT&subdomain=${curSubdomain}&ttl=360&content=${txtvalue}"
curUri="https://pddimp.yandex.ru/api2/admin/dns/add"
curResult="$(_post "${curData}" "${curUri}")"
_debug "Result: $curResult"
}
#Usage: dns_myapi_rm _acme-challenge.www.domain.com
dns_yandex_rm() {
fulldomain="${1}"
_debug "Calling: dns_yandex_rm() '${fulldomain}'"
_PDD_credentials || return 1
export _H1="PddToken: $PDD_Token"
record_id=$(pdd_get_record_id "${fulldomain}")
_debug "Result: $record_id"
curDomain=$(_PDD_get_domain "$fulldomain")
_debug "Found suitable domain in pdd: $curDomain"
curSubdomain="$(echo "${fulldomain}" | sed -e "s@.${curDomain}\$@@")"
curUri="https://pddimp.yandex.ru/api2/admin/dns/del"
curData="domain=${curDomain}&record_id=${record_id}"
curResult="$(_post "${curData}" "${curUri}")"
_debug "Result: $curResult"
}
#################### Private functions below ##################################
_PDD_get_domain() {
fulldomain="${1}"
__page=1
__last=0
while [ $__last -eq 0 ]; do
uri1="https://pddimp.yandex.ru/api2/admin/domain/domains?page=${__page}&on_page=20"
res1=$(_get "$uri1" | _normalizeJson)
#_debug "$res1"
__found=$(echo "$res1" | sed -n -e 's#.* "found": \([^,]*\),.*#\1#p')
_debug "found: $__found results on page"
if [ "$__found" -lt 20 ]; then
_debug "last page: $__page"
__last=1
fi
__all_domains="$__all_domains $(echo "$res1" | sed -e "s@,@\n@g" | grep '"name"' | cut -d: -f2 | sed -e 's@"@@g')"
__page=$(_math $__page + 1)
done
k=2
while [ $k -lt 10 ]; do
__t=$(echo "$fulldomain" | cut -d . -f $k-100)
_debug "finding zone for domain $__t"
for d in $__all_domains; do
if [ "$d" = "$__t" ]; then
echo "$__t"
return
fi
done
k=$(_math $k + 1)
done
_err "No suitable domain found in your account"
return 1
}
_PDD_credentials() {
if [ -z "${PDD_Token}" ]; then
PDD_Token=""
_err "You need to export PDD_Token=xxxxxxxxxxxxxxxxx"
_err "You can get it at https://pddimp.yandex.ru/api2/admin/get_token"
return 1
else
_saveaccountconf PDD_Token "${PDD_Token}"
fi
}
pdd_get_record_id() {
fulldomain="${1}"
curDomain=$(_PDD_get_domain "$fulldomain")
_debug "Found suitable domain in pdd: $curDomain"
curSubdomain="$(echo "${fulldomain}" | sed -e "s@.${curDomain}\$@@")"
curUri="https://pddimp.yandex.ru/api2/admin/dns/list?domain=${curDomain}"
curResult="$(_get "${curUri}" | _normalizeJson)"
_debug "Result: $curResult"
echo "$curResult" | _egrep_o "{[^{]*\"content\":[^{]*\"subdomain\":\"${curSubdomain}\"" | sed -n -e 's#.* "record_id": \(.*\),[^,]*#\1#p'
}