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:
- if [ "$TRAVIS_OS_NAME" = 'osx' ]; then
brew update && brew install openssl;
brew update && brew install openssl socat;
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/libssl.1.0.0.dylib /usr/local/lib/;
@@ -30,6 +30,7 @@ install:
openssl version 2>&1 || true;
$ACME_OPENSSL_BIN version 2>&1 || true;
export PATH="$_old_path";
else sudo apt-get install socat;
fi
script:
@@ -40,7 +41,7 @@ script:
- 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 **/*.sh && echo "shellcheck OK" ; 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" ./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 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 \
version \
@@ -44,15 +44,17 @@ RUN for verb in help \
create-domain-key \
createCSR \
deactivate \
deactivate-account \
; 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
RUN printf "%b" '#!'"/usr/bin/env sh\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 \
/root/.acme.sh/acme.sh --config-home /acme.sh \"\$@\"\n \
exec -- \"\$@\"\n \
fi" >/entry.sh && chmod +x /entry.sh
VOLUME /acme.sh

View File

@@ -296,6 +296,9 @@ acme.sh --renew -d example.com
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
@@ -331,7 +334,11 @@ You don't have to do anything manually!
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)
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
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
```
## 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
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)"
_debug2 kServiceH "$kServiceH"
kSigningH="$(printf "aws4_request%s" | _hmac "$Hash" "$kServiceH" hex)"
kSigningH="$(printf "%s" "aws4_request" | _hmac "$Hash" "$kServiceH" hex)"
_debug2 kSigningH "$kSigningH"
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"
## 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
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"
return 0
else
@@ -66,7 +66,7 @@ dns_infoblox_rm() {
_debug txtvalue "$txtvalue"
## Base64 encode the credentials
Infoblox_CredsEncoded=$(printf "%b" "$Infoblox_Creds" | _base64)
Infoblox_CredsEncoded="$(printf "%b" "$Infoblox_Creds" | _base64)"
## Construct the HTTP Authorization header
export _H1="Accept-Language:en-US"
@@ -74,17 +74,17 @@ dns_infoblox_rm() {
## 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"
result=$(_get "$baseurlnObject")
result="$(_get "$baseurlnObject")"
## 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
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"
## Delete them! All the stale records!
rmResult=$(_post "" "$objRmUrl" "" "DELETE")
rmResult="$(_post "" "$objRmUrl" "" "DELETE")"
## 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"
return 0
else

View File

@@ -68,7 +68,7 @@ dns_linode_rm() {
_parameters="&DomainID=$_domain_id"
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\".*}")"
if [ "$resource" ]; then
@@ -128,7 +128,7 @@ _get_root() {
p=1
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
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_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'
}