240 Commits
2.3.0 ... 2.6.4

Author SHA1 Message Date
neil
a2e62f8e1d Update README.md 2016-11-09 23:44:24 +08:00
neil
4da493f3f3 Merge pull request #376 from Neilpang/dev
Dev
2016-11-09 23:17:02 +08:00
neilpang
dec90f7e5e format dns_me api 2016-11-09 23:15:08 +08:00
nytral
2ea5b283a8 _hmac use and generic date 2016-11-09 23:11:20 +08:00
nytral
eb23549cd6 s/bash/sh/ 2016-11-09 23:11:19 +08:00
nytral
cd90062850 better bugfix 2016-11-09 23:11:19 +08:00
nytral
3ec72fcee9 bugfix 2016-11-09 23:11:19 +08:00
nytral
b9091e14b3 adding DNSMadeEasy API 2016-11-09 23:11:19 +08:00
neil
5daefc0194 Merge pull request #375 from Neilpang/dev
Add shfmt to format source code
2016-11-09 23:08:07 +08:00
neilpang
44edb2bd2f fix shellcheck warnings 2016-11-09 22:35:30 +08:00
neilpang
201aa24448 fix shellcheck warnings. 2016-11-09 22:28:12 +08:00
neilpang
e799ef2977 fix shellcheck warnings. 2016-11-09 22:09:30 +08:00
neilpang
0c538f7527 fix shellcheck warnings 2016-11-09 22:07:32 +08:00
neilpang
ca7202eb0a fix shellcheck warnings 2016-11-09 21:56:50 +08:00
neilpang
d5ec5f80ff fix shellcheck warnings 2016-11-09 21:44:46 +08:00
neilpang
0c944a03fe fix shellcheck warnings 2016-11-09 21:26:35 +08:00
neilpang
79a267ab08 fix for shellcheck 2016-11-09 21:18:47 +08:00
neilpang
f9a6988ece fix for shellcheck 2016-11-09 21:06:22 +08:00
neilpang
95e06de5de fix for shellcheck 2016-11-09 20:45:57 +08:00
neilpang
f530a5074b fix CI exit code 2016-11-09 20:05:52 +08:00
root
439580b91b apply shfmt to dns_dp api. 2016-11-09 20:01:27 +08:00
neilpang
4c2a384159 Add shfmt to format source code 2016-11-09 19:30:39 +08:00
neil
cfd0b040e4 Merge pull request #373 from Neilpang/dev
Dev
2016-11-08 21:28:46 +08:00
neilpang
b001840dee minor: add _hmac function 2016-11-08 21:27:39 +08:00
neilpang
20a6ab3d1a find hook file in current dir first 2016-11-07 20:59:10 +08:00
neil
21f16b50f3 Merge pull request #368 from justmwa/master
bash support for luadns api
2016-11-07 00:00:49 +08:00
nytral
f58e83ee87 READMEs edit 2016-11-06 16:52:43 +01:00
neil
a9b4a2a1ac Merge pull request #370 from Neilpang/dev
add APACHE_HTTPD_CONF
2016-11-06 23:27:42 +08:00
neilpang
5be1449db5 add APACHE_HTTPD_CONF
https://github.com/Neilpang/acme.sh/issues/363
2016-11-06 23:26:38 +08:00
neil
37d7f89c6d Merge pull request #369 from Neilpang/dev
set default account key to 2048.
2016-11-06 23:15:32 +08:00
neilpang
57e58ce76c set default account key to 2048.
Some old platforms doesn't support ecc signing.
2016-11-06 23:08:45 +08:00
nytral
1d9f76e2c8 working email contact added 2016-11-06 15:24:23 +01:00
nytral
56e0269e5e email contact added 2016-11-06 15:12:25 +01:00
nytral
662df85e54 s/bash/sh/ 2016-11-06 15:09:08 +01:00
nytral
2be4a5e486 use _base64 2016-11-06 14:39:22 +01:00
nytral
a43d697225 cleanup 2016-11-06 12:42:27 +01:00
nytral
f06c1e6c78 luadns bash script 2016-11-06 12:37:13 +01:00
neil
b5d1918401 Merge pull request #367 from Neilpang/dev
Dev
2016-11-04 23:49:47 +08:00
neilpang
d018be5d36 hide private key from the log 2016-11-04 23:45:08 +08:00
neilpang
67184d7b20 add more error check 2016-11-04 23:34:06 +08:00
neil
dfdd48b990 Merge pull request #366 from Neilpang/dev
Dev
2016-11-04 22:54:40 +08:00
neilpang
cae9cee295 add debug info 2016-11-04 22:53:33 +08:00
neilpang
067d586c1c typo 2016-11-04 22:47:45 +08:00
neilpang
d22b7938da fix old version openssl issue for ecc key 2016-11-04 22:45:50 +08:00
neilpang
29b7510957 add sign error check. 2016-11-04 22:22:01 +08:00
neilpang
9d548d81ac add more debug info 2016-11-04 22:03:41 +08:00
neil
3c33cdfa3d Update README.md 2016-11-03 19:19:51 +08:00
neil
288485b209 Merge pull request #362 from Neilpang/dev
minor, add more log
2016-11-02 23:27:04 +08:00
neilpang
1cbf416b10 minor, add more log 2016-11-02 23:22:36 +08:00
neil
3b46d3dd74 Merge pull request #361 from Neilpang/dev
add issue template
2016-11-02 23:04:10 +08:00
neilpang
c243829234 add issue template 2016-11-02 23:02:42 +08:00
neil
fd80faa389 Merge pull request #357 from Neilpang/dev
Dev
2016-11-01 20:57:27 +08:00
neilpang
e7d4352292 minor 2016-11-01 20:38:00 +08:00
neilpang
610e0f21d6 fix apache error checks 2016-11-01 20:29:58 +08:00
neilpang
7e512bad96 fix apache mode 2016-11-01 19:31:20 +08:00
neil
98c4ce0c45 Merge pull request #356 from Neilpang/dev
add more error check
2016-11-01 19:15:01 +08:00
neilpang
93fc48a2db add more error check 2016-11-01 19:14:33 +08:00
neil
d7eea12a6f Merge pull request #353 from Neilpang/dev
Dev
2016-10-31 21:31:13 +08:00
neilpang
2a1e06f8a9 add --quiet for idn 2016-10-31 21:22:04 +08:00
neilpang
02d54a783a fix for idn on solaris 2016-10-31 21:12:11 +08:00
neil
5961d44339 Update README.md 2016-10-30 17:26:00 +08:00
neil
fb3be8509d Add gentoo linux 2016-10-29 22:59:53 +08:00
neil
97be53741d Merge pull request #352 from Neilpang/dev
minor
2016-10-29 22:44:05 +08:00
neilpang
0d2c26735e minor 2016-10-29 21:33:34 +08:00
neil
2d0a8ddb58 Merge pull request #351 from Neilpang/dev
fix performance
2016-10-29 17:44:37 +08:00
neilpang
72518d4827 fix performance 2016-10-29 17:43:38 +08:00
neil
c6cd744186 Merge pull request #350 from Neilpang/dev
Dev
2016-10-29 12:15:29 +08:00
neilpang
ae2db62f1c fix issues for ECC account key. 2016-10-29 12:14:48 +08:00
neilpang
8c76b8bc36 do not cache thumbprint for issues for ecc account key 2016-10-29 11:15:45 +08:00
neilpang
18256c4923 fix issue cache jwk for ecc key only 2016-10-29 11:08:18 +08:00
neil
f345cc66cf Dev (#349)
* rename JWK_HEADER

* fix performance

* fix performance, use cached nonce

* do not register account if already registered

* fix thumbprint

* minor, reduce the sleep time.
2016-10-29 10:55:16 +08:00
neilpang
5dbf664a6b minor, reduce the sleep time. 2016-10-29 10:53:45 +08:00
neil
d7c6679d70 fix issue performance. Reduce the time cost from about 20 seconds down to 8 seconds (#348)
* rename JWK_HEADER

* fix performance

* fix performance, use cached nonce

* do not register account if already registered

* fix thumbprint
2016-10-28 23:58:01 +08:00
neilpang
cae203be71 fix thumbprint 2016-10-28 23:30:32 +08:00
neilpang
8a29fbc850 do not register account if already registered 2016-10-28 22:45:19 +08:00
neilpang
00bcbd367f fix performance, use cached nonce 2016-10-28 21:30:40 +08:00
neilpang
1befee5aca fix performance 2016-10-28 20:56:18 +08:00
neil
5982f4bcf0 rename JWK_HEADER 2016-10-28 18:07:04 +08:00
neil
2399476a21 Merge pull request #347 from Neilpang/dev
minor, add message
2016-10-27 22:48:39 +08:00
neilpang
9e45ac939b minor, add message 2016-10-27 22:47:19 +08:00
neil
34f231f9f3 Merge pull request #346 from Neilpang/dev
add retry to deactivate command
2016-10-27 22:16:14 +08:00
neilpang
f940b2a58e add retry to deactivate command 2016-10-27 22:10:58 +08:00
neil
0383c33558 Merge pull request #345 from Neilpang/dev
add retry for temp authz request error
2016-10-27 20:26:27 +08:00
neilpang
3afa4b210d add retry for temp authz request error 2016-10-27 20:07:20 +08:00
neilpang
998783eb9d Support ECC account key.
fix https://github.com/Neilpang/acme.sh/issues/76

https://tools.ietf.org/html/rfc3278#section-8.2
http://bitcoin.stackexchange.com/questions/2376/ecdsa-r-s-encoding-as-a-signature
http://davidederosa.com/basic-blockchain-programming/elliptic-curve-digital-signatures/
2016-10-27 00:06:03 +08:00
neilpang
5d6fd8099f add dns_xxx_rm function
https://github.com/Neilpang/acme.sh/issues/79
2016-10-25 23:08:02 +08:00
neilpang
800e3f4599 support dns_xxx_rm function
fix https://github.com/Neilpang/acme.sh/issues/79
2016-10-25 23:02:49 +08:00
neil
35c61f52fe Merge pull request #339 from Neilpang/deploy
add deploy command
2016-10-25 21:19:24 +08:00
neilpang
3db446633c add deploy api 2016-10-25 21:09:01 +08:00
neilpang
e3b4a0213c Merge branch 'master' into deploy 2016-10-25 20:55:18 +08:00
Armando Lüscher
9910ff5fa1 Allow saved password strings to have special characters. (#334) 2016-10-25 20:49:22 +08:00
neilpang
049be10406 fix idn to support European chars
https://github.com/Neilpang/acme.sh/issues/331#issuecomment-255583889
2016-10-23 20:36:32 +08:00
neilpang
9aa3be7f9f add _uninstallalias 2016-10-23 15:10:09 +08:00
neilpang
aba5c634ae minor, add output info for installing alias.
fix https://github.com/Neilpang/acme.sh/issues/332
2016-10-23 15:04:52 +08:00
neil
9774b01b0e 2.6.1 support IDN (#335)
* Support IDN

* fix deactivate idn name

* 2.6.1 support IDN
2016-10-23 14:56:52 +08:00
neil
ecf0a710e1 fix typo 2016-10-21 18:26:35 +08:00
neil
c9febbdd87 fix for centos ncat and debian default netcat (#330) 2016-10-19 22:14:42 +08:00
Peter Lyons
caa2e45a8c use RFC2606 example.com domain in docs (#327)
https://www.rfc-editor.org/rfc/rfc2606.txt
2016-10-13 10:14:36 +08:00
neilpang
d9130c9852 minor 2016-10-12 22:38:28 +08:00
neilpang
661f05837c minor 2016-10-12 21:48:18 +08:00
neilpang
a61fe418b2 support deploy api 2016-10-11 20:56:59 +08:00
neil
b15cfc2c5a minor 2016-10-11 18:30:38 +08:00
neil
c575c9af3d Merge branch 'master' of https://github.com/Neilpang/acme.sh 2016-10-11 18:06:35 +08:00
neil
81f27e9077 minor, get the error info, if it contains CRLF 2016-10-11 18:05:32 +08:00
neil
f78babfaa0 nc (#324) 2016-10-10 19:47:16 +08:00
neilpang
66990cf872 minor 2016-10-09 22:27:25 +08:00
root
095fe2ed1b minor 2016-10-09 22:19:35 +08:00
neil
483ebc8141 Update README.md 2016-10-09 22:17:45 +08:00
neilpang
b9311282eb minor fix pdns api 2016-10-09 22:15:15 +08:00
Maxim Zalysin
d6f0c2b52b Add support PowerDNS API (#322)
* Add support PowerDNS API

* Small fixes
2016-10-09 21:56:04 +08:00
neil
bb25febd70 Checkdomain (#317)
* check if domains are changed

* fix output info
2016-10-05 22:09:15 +08:00
neil
19ab2a29ce fix tail for solaris 2016-10-05 13:03:45 +08:00
neil
24b4fe9867 Merge branch 'master' of https://github.com/Neilpang/acme.sh 2016-10-05 12:16:14 +08:00
neil
aa7b82de04 minor 2016-10-05 12:15:06 +08:00
neil
3d826bed3a fix for ncat on centos, try without '-p' first (#315) 2016-10-04 23:35:56 +08:00
neil
d2ae7e78ef 60 days 2016-10-04 21:17:19 +08:00
neil
656bd330f8 change default renew days o 60.
fix https://github.com/Neilpang/acme.sh/issues/314
https://github.com/Neilpang/acme.sh/issues/281
2016-10-04 20:55:31 +08:00
neil
c2c8f32010 fix for wget 2016-10-03 22:29:48 +08:00
neil
9f43c270e6 fix wget 2016-10-03 22:08:40 +08:00
neil
50827188ff minor: save on success 2016-10-02 23:54:21 +08:00
neil
6ae0f7f5c6 support "--listen-v4" and "--listen-v6" (#311)
https://github.com/Neilpang/acme.sh/issues/310
2016-10-02 23:37:37 +08:00
neil
c583d6bb49 fix sleep display 2016-09-30 22:43:24 +08:00
neil
fdcb6b721c fix for busybox 2016-09-30 22:13:27 +08:00
neil
ef858ef062 use head -n 2016-09-30 21:37:39 +08:00
neil
fe04faf675 Add Chinese link 2016-09-30 21:27:23 +08:00
neil
ad752b317d support csr that contains empty CN field. fix https://github.com/Neilpang/acme.sh/issues/306 2016-09-29 22:19:03 +08:00
neil
59649e9b1e support --auto-upgrade 2016-09-28 22:11:00 +08:00
neil
6bf281f905 support '--auto-upgrade' 2016-09-28 22:05:43 +08:00
neil
4dfc8b262c support individual ca path 2016-09-28 13:27:32 +08:00
neil
f08ffe9feb v2.6.0 2016-09-28 13:26:02 +08:00
neil
65de3110a9 minor, fix error message 2016-09-28 13:13:08 +08:00
neil
f6dcd98995 save api first 2016-09-28 13:07:51 +08:00
neil
950172dc01 debug info 2016-09-27 23:52:52 +08:00
neil
5c48e139d4 support individual ca accounts 2016-09-27 23:43:18 +08:00
neil
150e9c8a48 Update README.md 2016-09-27 22:03:42 +08:00
neil
b19ba13aff fix for Mac osx 2016-09-27 21:27:43 +08:00
neil
30bfc2cea7 fix https://github.com/Neilpang/acme.sh/issues/304 2016-09-27 13:11:08 +08:00
neil
30c2d84c6d minor: remove useless hook. 2016-09-26 13:33:09 +08:00
neil
fbd2038fa7 minor 2016-09-26 13:08:19 +08:00
neil
e4b8d9b9d6 minor, No need to save ACCOUNT_URL 2016-09-25 22:54:58 +08:00
neil
6b50003697 minor 2016-09-25 22:26:41 +08:00
neil
a73c5b3355 support log level 2016-09-25 21:58:59 +08:00
neil
eb59817e81 Support updateaccount and registeraccount. fix https://github.com/Neilpang/acme.sh/issues/70 2016-09-25 10:56:06 +08:00
neil
d404e92d16 Fetch agreement tos dynamically, fix https://github.com/Neilpang/acme.sh/issues/253 2016-09-24 23:53:53 +08:00
neil
86c017ec9d fix deactivate return code 2016-09-24 14:17:04 +08:00
neil
0407c4e0f7 minor 2016-09-24 14:01:28 +08:00
neil
0ba95a3dd4 fix auto upgrade 2016-09-24 13:43:08 +08:00
neil
0463b5d6cd support "--local-address" to specify a listening ip address in standalone mode if the server have multiple ips. By default, the standalone server listens to 0.0.0.0 2016-09-23 23:14:03 +08:00
neil
3f4513b3a9 Support deactivate in bulk 2016-09-23 22:35:13 +08:00
neil
fb2029e717 add more info 2016-09-22 23:25:32 +08:00
neil
48f02fb61b minor 2016-09-22 23:23:27 +08:00
neil
0c00e870c6 Support Authorization deactivation
https://github.com/Neilpang/acme.sh/issues/291
2016-09-22 23:17:50 +08:00
neil
7da50703fb minor 2016-09-22 21:38:11 +08:00
neil
cfdaff5a46 fix cf 2016-09-22 20:36:33 +08:00
neil
18e46962c2 fix https://github.com/Neilpang/acme.sh/issues/297 2016-09-22 13:15:25 +08:00
neil
319e0ae3cf fix auto upgrade 2016-09-21 13:39:39 +08:00
neil
e69a7c38d9 fix auto upgrade 2016-09-21 13:27:05 +08:00
neil
ecd685755b fix auto upgrade 2016-09-21 13:18:46 +08:00
neil
276b51d927 minor 2016-09-21 13:09:22 +08:00
neil
251d1c5c9f minor 2016-09-20 22:23:49 +08:00
neil
028e17475f minor, renew time minus 1 day 2016-09-20 21:03:43 +08:00
neil
1ab630435d fix color when upgrade in cronjob 2016-09-20 20:34:33 +08:00
neil
89002ed298 support AUTO_UPGRADE. In the cron job, try to upgrade acme.sh if "AUTO_UPGRADE" is set. 2016-09-20 20:22:25 +08:00
neil
d0871bdae3 rename "--logfile" to "--log", and give a default log file 2016-09-20 19:08:02 +08:00
neil
5ea6e9c9c0 support "--logfile" 2016-09-19 23:07:43 +08:00
neil
267f283a31 fix bug, upgrade in current dir without installation. 2016-09-18 13:06:15 +08:00
neil
3324c0ae79 opps 2016-09-17 12:52:47 +08:00
neil
811bff6db0 minor, hide debug info 2016-09-17 12:29:50 +08:00
neil
0c9546ccb0 fix https://github.com/Neilpang/acme.sh/issues/288
add --ocsp-must-staple, --ocsp
2016-09-15 10:41:47 +08:00
neil
7b16442656 minor 2016-09-10 18:04:59 +08:00
neil
b0070f03af support '--pre-hook', '--post-hook' and '--renew-hook' 2016-09-06 23:26:22 +08:00
neil
08ee072f11 minor, fix color 2016-09-06 19:37:41 +08:00
neil
f3e4cea34f work in the current dir, without installation (#279) 2016-09-02 22:37:49 +08:00
neil
2d12b68952 minor 2016-09-02 20:55:11 +08:00
neil
1643b476eb fix bugs. 2016-08-27 20:00:47 +08:00
neil
5980ebc79a minor, do not output the key file if using signcsr 2016-08-27 15:44:03 +08:00
neil
8371b030cf Issue a cert from existing CSR 2016-08-27 14:00:26 +08:00
neil
10afcaca2f Support issue cert from existing CSR (#276)
fix https://github.com/Neilpang/acme.sh/issues/212
2016-08-27 13:52:13 +08:00
neil
2fb4b62330 Merge branch 'master' of https://github.com/Neilpang/acme.sh 2016-08-25 22:28:15 +08:00
neil
cbcd7e0f86 minor, fix format 2016-08-25 22:27:48 +08:00
neil
df1c9d88a8 Update README.md 2016-08-25 22:13:34 +08:00
neil
3aae1ae3d9 minor, fix _mktemp 2016-08-25 21:46:31 +08:00
neil
775bd1abd0 minor 2016-08-25 13:17:42 +08:00
Patrick Sodré
78009539d1 Add option for a custom ca-bundle file. (#274)
* Add option for a custom ca-bundle file.

* Renamed option cacert to ca-bundle.

* Save CA_BUNDLE path in configuration file.

* Store absolule path to ca-bundle file
2016-08-25 13:14:56 +08:00
neil
36246ad9ac Add OVH, kimsufi, soyoustart and runabove api 2016-08-25 13:10:13 +08:00
neil
e2053b22b4 minor, fix format 2016-08-25 13:06:04 +08:00
neil
dfdc402fbb fix typo 2016-08-25 12:03:19 +08:00
neil
73ba54a502 Support OVH domain api 2016-08-25 11:03:25 +08:00
neil
690a5e205d Support Ovh domain api (#273)
* support ovh

* fix success link

* fix OVH issues.

* v2.4.3 Support OVH domain api
2016-08-25 10:45:41 +08:00
neil
a6014bf04e support sha1 2016-08-24 18:46:23 +08:00
neil
d4d1f0f4a9 Add donate list 2016-08-23 23:16:19 +08:00
neil
5fbc47eb3a fixd createAccountKey https://github.com/Neilpang/acme.sh/issues/271 2016-08-23 22:53:43 +08:00
neil
6d4e903b08 https://github.com/Neilpang/acme.sh/issues/270 2016-08-23 10:03:50 +08:00
neil
66f08eb236 minor format output 2016-08-22 13:36:39 +08:00
neil
933c169da5 minor 2016-08-17 13:17:06 +08:00
neil
a8df88ab91 https://github.com/Neilpang/acme.sh/issues/263 2016-08-15 21:14:36 +08:00
neil
df9547ae39 minor 2016-08-15 19:15:19 +08:00
neil
d529eb6d00 minor 2016-08-14 23:20:53 +08:00
neil
fac1e367c9 2.4.1 fix bug. 2016-08-14 22:37:21 +08:00
neil
31a5487cba fix dual certs 2016-08-13 20:37:52 +08:00
neil
43822d37a7 Support RSA and ECDSA dual certs (#262)
* Support RSA and ECDSA dual certs

* minor

* fix RSA and ECC dual certs

* minor
2016-08-13 19:22:25 +08:00
neil
527dd31c70 Support SunOS, Solaris 2016-08-11 13:47:38 +08:00
neil
e3c66532c5 Support Solaris 2016-08-10 23:13:14 +08:00
neil
22ea4004e1 Support SunOS/Solaris (#260)
Support SunOS/Solaris 

* Support Solaris

* Support SunOS/Open Solaris
2016-08-10 21:54:08 +08:00
neil
d190a43e0a https://github.com/Neilpang/acme.sh/issues/258 2016-08-08 10:19:51 +08:00
neil
bd5e57d879 https://github.com/Neilpang/acme.sh/issues/258 2016-08-08 10:17:10 +08:00
neil
08928b486b minor: add version to useragent 2016-08-07 14:47:57 +08:00
neil
75da0713d2 tls mode: -naccept is not supported by many old openssl versions. (#257)
So I remove it.  and use 2 GET requests to make openssl sever exit.
2016-08-07 14:25:55 +08:00
neil
d35bf51780 2.3.5: skip domain verify if the authorization is already valid, add to production server. 2016-08-07 10:23:52 +08:00
neil
ec603beeb0 skip verify (#256)
skip domain verify if the authorization is already valid
2016-08-07 10:21:27 +08:00
neil
7820467d59 Merge pull request #255 from jim3mar/master
dns_cx.sh prefix and suffix domain bug fixed
2016-08-05 21:44:22 +08:00
Jim Ma
fe09757cb3 dns_cx.sh prefix and suffix domain bug fixed 2016-08-05 21:31:12 +08:00
neil
1e6b68f5d1 fix https://github.com/Neilpang/acme.sh/issues/244
Update renew days for renew/renewall
2016-08-02 21:47:35 +08:00
neil
f574e5813f add the new reg hash 2016-08-02 10:56:40 +08:00
neil
30684246d2 new version number 2.3.4 for LE-SA-v1.1.1-August-1-2016.pdf
agreement to LE-SA-v1.1.1-August-1-2016.pdf
2016-08-02 10:04:29 +08:00
neil
8bdf5cf854 Merge pull request #248 from Acris/master
Update agreement to LE-SA-v1.1.1-August-1-2016.pdf
2016-08-02 03:06:16 +08:00
Acris Liu
c93ec9331b Update agreement to LE-SA-v1.1.1-August-1-2016.pdf 2016-08-02 01:21:00 +08:00
root
0886e67df7 chmod +x 2016-08-01 17:08:01 +08:00
neil
30de13b4df support Godaddy domaain api 2016-07-29 18:07:16 +08:00
neil
7a60c14b31 Merge pull request #243 from t413/master
Support for shells without 'stat' (busybox ash)
2016-07-26 13:18:41 +08:00
Tim O'Brien
3ad08e9515 Changed _stat exit code, added line return, added README link to wiki 2016-07-25 11:07:34 -07:00
Tim O'Brien
32fdc19697 Support for shells without 'stat' (busybox ash)
- the _stat command can now return an error
- the issue() command chown command isn't run if _stat fails
2016-07-22 14:17:33 -07:00
neil
c9c31c04c3 typos 2016-07-21 10:48:37 +08:00
neil
c3dd3ef0d7 typos 2016-07-20 22:18:07 +08:00
neil
fa989a554d Update README.md 2016-07-16 21:57:29 +08:00
neil
4a4dacb52c minor, change default dns sleep time from 60 seconds to 120 seconds. 2016-07-15 22:56:16 +08:00
neil
dcf9cb581d minor, add more debug info 2016-07-15 16:40:03 +08:00
neil
1a6305c93f Merge pull request #236 from tohojo/regexp-escape
Add missing escape in regular expression.
2016-07-09 18:35:50 +08:00
neil
bdbf323fee remove the default value 'no' 2016-07-09 17:25:27 +08:00
neil
7270f277a7 minor: less debug message 2016-07-09 15:55:36 +08:00
Toke Høiland-Jørgensen
32dfc387c8 Add missing escape in regular expression.
There was a missing escape of a { character in one of the regular
expressions passed to grep. This adds that.

Signed-off-by: Toke Høiland-Jørgensen <toke@toke.dk>
2016-07-08 15:42:21 +02:00
neil
b3752e78b6 minor, remove error message. 2016-07-08 12:29:47 +08:00
neil
4c0d3f1b75 minor. remove the ugly return code for installcert. 2016-07-08 11:50:47 +08:00
neil
2e3cb75530 Merge pull request #234 from tgoodyear/patch-1
Update README.md to fix typo: scrypt -> script
2016-07-05 13:28:06 +08:00
Trevor Goodyear
3e99ffe692 Update README.md to fix typo: scrypt -> script 2016-07-04 13:00:17 -04:00
neil
096d8992a1 fix upgrade issue 2016-07-04 20:40:29 +08:00
neil
0bbe6eef89 minor 2016-07-03 12:46:18 +08:00
neil
d0b748a4f2 add more debug message. 2016-07-02 13:46:35 +08:00
neil
58f41a194a minor 2016-07-02 13:21:22 +08:00
neil
d8d10bc478 opps 2016-07-02 13:13:41 +08:00
16 changed files with 4156 additions and 1473 deletions

25
.github/ISSUE_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,25 @@
<!--
If it is a bug report:
- make sure you are able to repro it on the latest released version.
You can install the latest version by: `acme.sh --upgrade`
- Search the existing issues.
- Refer to the [WIKI](https://wiki.acme.sh).
- Debug info [Debug](https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh).
-->
Steps to reproduce
------------------
Debug log
-----------------
```
acme.sh --issue ..... --debug 2
```

11
.travis.yml Normal file
View File

@@ -0,0 +1,11 @@
language: bash
env:
global:
- SHFMT_URL=https://github.com/mvdan/sh/releases/download/v0.4.0/shfmt_v0.4.0_linux_amd64
script:
- curl -sSL $SHFMT_URL -o ~/shfmt
- chmod +x ~/shfmt
- ~/shfmt -l -w -i 2 .
- git diff --exit-code || (echo "Run shfmt to fix the formatting issues" && false)

147
README.md
View File

@@ -1,4 +1,4 @@
# An ACME Shell script: acme.sh
# An ACME Shell script: acme.sh [![Build Status](https://travis-ci.org/Neilpang/acme.sh.svg?branch=master)](https://travis-ci.org/Neilpang/acme.sh)
- An ACME protocol client written purely in Shell (Unix shell) language.
- Fully ACME protocol implementation.
- Simple, powerful and very easy to use. You only need 3 minutes to learn.
@@ -13,6 +13,8 @@ It's probably the `easiest&smallest&smartest` shell script to automatically issu
Wiki: https://github.com/Neilpang/acme.sh/wiki
# [中文说明](https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E)
#Tested OS
| NO | Status| Platform|
|----|-------|---------|
@@ -32,6 +34,9 @@ Wiki: https://github.com/Neilpang/acme.sh/wiki
|14|-----| Cloud Linux https://github.com/Neilpang/le/issues/111
|15|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/openbsd.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|OpenBSD
|16|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/mageia.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Mageia
|17|-----| OpenWRT: Tested and working. See [wiki page](https://github.com/Neilpang/acme.sh/wiki/How-to-run-on-OpenWRT)
|18|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/solaris.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|SunOS/Solaris
|19|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/gentoo-stage3-amd64.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Gentoo Linux
For all build statuses, check our [daily build project](https://github.com/Neilpang/acmetest):
@@ -44,17 +49,9 @@ https://github.com/Neilpang/acmetest
3. Apache mode
4. Dns mode
# Upgrade from 1.x to 2.x
You can simply uninstall 1.x and re-install 2.x.
2.x is 100% compatible to 1.x. You will feel right at home as if nothing has changed.
# le.sh renamed to acme.sh NOW!
All configurations are 100% compatible between `le.sh` and `acme.sh`. You just need to uninstall `le.sh` and re-install `acme.sh` again.
Nothing will be broken during the process.
# How to install
# 1. How to install
### 1. Install online:
@@ -111,66 +108,75 @@ root@v1:~# acme.sh -h
```
# Just issue a cert:
# 2. Just issue a cert:
**Example 1:** Single domain.
```bash
acme.sh --issue -d aa.com -w /home/wwwroot/aa.com
acme.sh --issue -d example.com -w /home/wwwroot/example.com
```
**Example 2:** Multiple domains in the same cert.
```bash
acme.sh --issue -d aa.com -d www.aa.com -d cp.aa.com -w /home/wwwroot/aa.com
acme.sh --issue -d example.com -d www.example.com -d cp.example.com -w /home/wwwroot/example.com
```
The parameter `/home/wwwroot/aa.com` is the web root folder. You **MUST** have `write access` to this folder.
The parameter `/home/wwwroot/example.com` is the web root folder. You **MUST** have `write access` to this folder.
Second argument **"aa.com"** is the main domain you want to issue cert for.
Second argument **"example.com"** is the main domain you want to issue cert for.
You must have at least a domain there.
You must point and bind all the domains to the same webroot dir: `/home/wwwroot/aa.com`.
You must point and bind all the domains to the same webroot dir: `/home/wwwroot/example.com`.
Generate/issued certs will be placed in `~/.acme.sh/aa.com/`
Generate/issued certs will be placed in `~/.acme.sh/example.com/`
The issued cert will be renewed every 80 days automatically.
The issued cert will be renewed every **60** days automatically.
More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
# Install issued cert to apache/nginx etc.
# 3. Install the issued cert to apache/nginx etc.
After you issue a cert, you probably want to install the cert with your nginx/apache or other servers you may be using.
After you issue a cert, you probably want to install/copy the cert to your nginx/apache or other servers.
You **MUST** use this command to copy the certs to the target files, **Do NOT** use the certs files in **.acme.sh/** folder, they are for internal use only, the folder structure may change in future.
**nginx** example
```bash
acme.sh --installcert -d aa.com \
--certpath /path/to/certfile/in/apache/nginx \
--keypath /path/to/keyfile/in/apache/nginx \
--capath /path/to/ca/certfile/apache/nginx \
--fullchainpath path/to/fullchain/certfile/apache/nginx \
--reloadcmd "service apache2|nginx reload"
acme.sh --installcert -d example.com \
--keypath /path/to/keyfile/in/nginx/key.pem \
--fullchainpath path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx restart"
```
**apache** example
```bash
acme.sh --installcert -d example.com \
--certpath /path/to/certfile/in/apache/cert.pem \
--keypath /path/to/keyfile/in/apache/key.pem \
--fullchainpath path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd "service apache2 restart"
```
Only the domain is required, all the other parameters are optional.
Install the issued cert/key to the production apache or nginx path.
Install/copy the issued cert/key to the production apache or nginx path.
The cert will be `renewed every 80 days by default` (which is configurable). Once the cert is renewed, the apache/nginx will be automatically reloaded by the command: `service apache2 reload` or `service nginx reload`.
The cert will be `renewed every **60** days by default` (which is configurable). Once the cert is renewed, the apache/nginx will be automatically reloaded by the command: `service apache2 reload` or `service nginx reload`.
# Use Standalone server to issue cert
# 4. Use Standalone server to issue cert
**(requires you be root/sudoer, or you have permission to listen tcp 80 port)**
The tcp `80` port **MUST** be free to listen, otherwise you will be prompted to free the `80` port and try again.
```bash
acme.sh --issue --standalone -d aa.com -d www.aa.com -d cp.aa.com
acme.sh --issue --standalone -d example.com -d www.example.com -d cp.example.com
```
More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
# Use Standalone tls server to issue cert
# 5. Use Standalone tls server to issue cert
**(requires you be root/sudoer, or you have permission to listen tcp 443 port)**
@@ -179,12 +185,12 @@ acme.sh supports `tls-sni-01` validation.
The tcp `443` port **MUST** be free to listen, otherwise you will be prompted to free the `443` port and try again.
```bash
acme.sh --issue --tls -d aa.com -d www.aa.com -d cp.aa.com
acme.sh --issue --tls -d example.com -d www.example.com -d cp.example.com
```
More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
# Use Apache mode
# 6. Use Apache mode
**(requires you be root/sudoer, since it is required to interact with apache server)**
@@ -195,28 +201,28 @@ Particularly, if you are running an apache server, you should use apache mode in
Just set string "apache" as the second argument, it will force use of apache plugin automatically.
```
acme.sh --issue --apache -d aa.com -d www.aa.com -d user.aa.com
acme.sh --issue --apache -d example.com -d www.example.com -d user.example.com
```
More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
# Use DNS mode:
# 7. Use DNS mode:
Support the `dns-01` challenge.
```bash
acme.sh --issue --dns -d aa.com -d www.aa.com -d user.aa.com
acme.sh --issue --dns -d example.com -d www.example.com -d user.example.com
```
You should get the output like below:
```
Add the following txt record:
Domain:_acme-challenge.aa.com
Domain:_acme-challenge.example.com
Txt value:9ihDbjYfTExAYeDs4DBUeuTo18KBzwvTEjUnSwd32-c
Add the following txt record:
Domain:_acme-challenge.www.aa.com
Domain:_acme-challenge.www.example.com
Txt value:9ihDbjxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Please add those txt records to the domains. Waiting for the dns to take effect.
@@ -226,12 +232,12 @@ Please add those txt records to the domains. Waiting for the dns to take effect.
Then just rerun with `renew` argument:
```bash
acme.sh --renew -d aa.com
acme.sh --renew -d example.com
```
Ok, it's finished.
# Automatic DNS API integration
# 8. Automatic DNS API integration
If your DNS provider supports API access, we can use API to automatically issue the certs.
@@ -242,9 +248,14 @@ You don't have do anything manually!
1. Cloudflare.com API
2. Dnspod.cn API
3. Cloudxns.com API
4. AWS Route 53, see: https://github.com/Neilpang/acme.sh/issues/65
5. lexicon dns api: https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api
4. Godaddy.com API
5. OVH, kimsufi, soyoustart and runabove API
6. AWS Route 53, see: https://github.com/Neilpang/acme.sh/issues/65
7. PowerDNS API
8. lexicon dns api: https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api
(DigitalOcean, DNSimple, DnsMadeEasy, DNSPark, EasyDNS, Namesilo, NS1, PointHQ, Rage4 and Vultr etc.)
9. LuaDNS.com API
10. DNSMadeEasy.com API
##### More APIs are coming soon...
@@ -252,7 +263,7 @@ If your DNS provider is not on the supported list above, you can write your own
For more details: [How to use dns api](dnsapi)
# Issue ECC certificate:
# 9. Issue ECC certificate:
`Let's Encrypt` now can issue **ECDSA** certificates.
@@ -265,13 +276,13 @@ For example:
### Single domain ECC cerfiticate:
```bash
acme.sh --issue -w /home/wwwroot/aa.com -d aa.com --keylength ec-256
acme.sh --issue -w /home/wwwroot/example.com -d example.com --keylength ec-256
```
SAN multi domain ECC certificate:
```bash
acme.sh --issue -w /home/wwwroot/aa.com -d aa.com -d www.aa.com --keylength ec-256
acme.sh --issue -w /home/wwwroot/example.com -d example.com -d www.example.com --keylength ec-256
```
Please look at the last parameter above.
@@ -282,6 +293,46 @@ Valid values are:
2. **ec-384 (secp384r1, "ECDSA P-384")**
3. **ec-521 (secp521r1, "ECDSA P-521", which is not supported by Let's Encrypt yet.)**
# 10. How to renew the cert
No, you don't need to renew the certs manually. All the certs will be renewed automatically every **60** days.
However, you can also force to renew any cert:
```
acme.sh --renew -d example.com --force
```
or, for ECC cert:
```
acme.sh --renew -d example.com --force --ecc
```
# 11. How to upgrade `acme.sh`
acme.sh is in developing, it's strongly recommended to use the latest code.
You can update acme.sh to the latest code:
```
acme.sh --upgrade
```
You can enable auto upgrade:
```
acme.sh --upgrade --auto-upgrade
```
Then **acme.sh** will keep up to date automatically.
Disable auto upgrade:
```
acme.sh --upgrade --auto-upgrade 0
```
# 12. Issue a cert from an existing CSR
https://github.com/Neilpang/acme.sh/wiki/Issue-a-cert-from-existing-CSR
# Under the Hood
Speak ACME language using shell, directly to "Let's Encrypt".
@@ -293,7 +344,7 @@ TODO:
2. ACME protocol: https://github.com/ietf-wg-acme/acme
3. Certbot: https://github.com/certbot/certbot
# License & Other
# License & Others
License is GPLv3
@@ -302,4 +353,8 @@ Please Star and Fork me.
[Issues](https://github.com/Neilpang/acme.sh/issues) and [pull requests](https://github.com/Neilpang/acme.sh/pulls) are welcomed.
# Donate
1. PayPal: donate@acme.sh
[Donate List](https://github.com/Neilpang/acme.sh/wiki/Donate-list)

4135
acme.sh

File diff suppressed because it is too large Load Diff

28
deploy/myapi.sh Normal file
View File

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

View File

@@ -15,7 +15,7 @@ export CF_Email="xxxx@sss.com"
Ok, let's issue cert now:
```
acme.sh --issue --dns dns_cf -d aa.com -d www.aa.com
acme.sh --issue --dns dns_cf -d example.com -d www.example.com
```
The `CF_Key` and `CF_Email` will be saved in `~/.acme.sh/account.conf`, when next time you use cloudflare api, it will reuse this key.
@@ -37,7 +37,7 @@ export DP_Key="sADDsdasdgdsf"
Ok, let's issue cert now:
```
acme.sh --issue --dns dns_dp -d aa.com -d www.aa.com
acme.sh --issue --dns dns_dp -d example.com -d www.example.com
```
The `DP_Id` and `DP_Key` will be saved in `~/.acme.sh/account.conf`, when next time you use dnspod.cn api, it will reuse this key.
@@ -58,12 +58,63 @@ export CX_Secret="sADDsdasdgdsf"
Ok, let's issue cert now:
```
acme.sh --issue --dns dns_cx -d aa.com -d www.aa.com
acme.sh --issue --dns dns_cx -d example.com -d www.example.com
```
The `CX_Key` and `CX_Secret` will be saved in `~/.acme.sh/account.conf`, when next time you use Cloudxns.com api, it will reuse this key.
## Use Godaddy.com domain api to automatically issue cert
We support Godaddy integration.
First you need to login to your Godaddy account to get your api key and api secret.
https://developer.godaddy.com/keys/
Please Create a Production key, instead of a Test key.
```
export GD_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export GD_Secret="asdfsdafdsfdsfdsfdsfdsafd"
```
Ok, let's issue cert now:
```
acme.sh --issue --dns dns_gd -d example.com -d www.example.com
```
The `GD_Key` and `GD_Secret` will be saved in `~/.acme.sh/account.conf`, when next time you use cloudflare api, it will reuse this key.
## Use PowerDNS embedded api to automatically issue cert
We support PowerDNS embedded API integration.
First you need to enable api and set your api-token in PowerDNS configuration.
https://doc.powerdns.com/md/httpapi/README/
```
export PDNS_Url="http://ns.example.com:8081"
export PDNS_ServerId="localhost"
export PDNS_Token="0123456789ABCDEF"
export PDNS_Ttl=60
```
Ok, let's issue cert now:
```
acme.sh --issue --dns dns_pdns -d example.com -d www.example.com
```
The `PDNS_Url`, `PDNS_ServerId`, `PDNS_Token` and `PDNS_Ttl` will be saved in `~/.acme.sh/account.conf`.
## Use OVH/kimsufi/soyoustart/runabove API
https://github.com/Neilpang/acme.sh/wiki/How-to-use-OVH-domain-api
# Use custom api
@@ -72,19 +123,54 @@ If your api is not supported yet, you can write your own dns api.
Let's assume you want to name it 'myapi',
1. Create a bash script named `~/.acme.sh/dns_myapi.sh`,
2. In the scrypt, you must have a function named `dns_myapi_add()`. Which will be called by acme.sh to add dns records.
2. In the script, you must have a function named `dns_myapi_add()`. Which will be called by acme.sh to add dns records.
3. Then you can use your api to issue cert like:
```
acme.sh --issue --dns dns_myapi -d aa.com -d www.aa.com
acme.sh --issue --dns dns_myapi -d example.com -d www.example.com
```
For more details, please check our sample script: [dns_myapi.sh](dns_myapi.sh)
# Use lexicon dns api
https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api
## Use LuaDNS domain API
Get your API token at https://api.luadns.com/settings
```
export LUA_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export LUA_Email="xxxx@sss.com"
```
To issue a cert:
```
acme.sh --issue --dns dns_lua --dnssleep 3 -d example.com -d www.example.com
```
The `LUA_Key` and `LUA_Email` will be saved in `~/.acme.sh/account.conf`, and will be reused when needed.
## Use DNSMadeEasy domain API
Get your API credentials at https://cp.dnsmadeeasy.com/account/info
```
export ME_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export ME_Secret="qdfqsdfkjdskfj"
```
To issue a cert:
```
acme.sh --issue --dns dns_me --dnssleep 3 -d example.com -d www.example.com
```
The `ME_Key` and `ME_Secret` will be saved in `~/.acme.sh/account.conf`, and will be reused when needed.

View File

@@ -1,54 +1,52 @@
#!/usr/bin/env sh
#
#CF_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
#
#CF_Email="xxxx@sss.com"
CF_Api="https://api.cloudflare.com/client/v4"
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_cf_add(){
dns_cf_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$CF_Key" ] || [ -z "$CF_Email" ] ; then
if [ -z "$CF_Key" ] || [ -z "$CF_Email" ]; then
_err "You don't specify cloudflare api key and email yet."
_err "Please create you key and try again."
return 1
fi
#save the api key and email to the account conf file.
_saveaccountconf CF_Key "$CF_Key"
_saveaccountconf CF_Email "$CF_Email"
_debug "First detect the root zone"
if ! _get_root $fulldomain ; then
if ! _get_root $fulldomain; then
_err "invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_debug "Getting txt records"
_cf_rest GET "zones/${_domain_id}/dns_records?type=TXT&name=$fulldomain"
if ! printf "$response" | grep \"success\":true > /dev/null ; then
if ! printf "$response" | grep \"success\":true >/dev/null; then
_err "Error"
return 1
fi
count=$(printf "$response" | grep -o \"count\":[^,]* | cut -d : -f 2)
count=$(printf "%s\n" "$response" | _egrep_o \"count\":[^,]* | cut -d : -f 2)
_debug count "$count"
if [ "$count" = "0" ] ; then
if [ "$count" = "0" ]; then
_info "Adding record"
if _cf_rest POST "zones/$_domain_id/dns_records" "{\"type\":\"TXT\",\"name\":\"$fulldomain\",\"content\":\"$txtvalue\",\"ttl\":120}"; then
if printf $response | grep $fulldomain > /dev/null ; then
if _cf_rest POST "zones/$_domain_id/dns_records" "{\"type\":\"TXT\",\"name\":\"$fulldomain\",\"content\":\"$txtvalue\",\"ttl\":120}"; then
if printf -- "%s" "$response" | grep $fulldomain >/dev/null; then
_info "Added, sleeping 10 seconds"
sleep 10
#todo: check if the record takes effect
@@ -61,25 +59,27 @@ dns_cf_add(){
_err "Add txt record error."
else
_info "Updating record"
record_id=$(printf "$response" | grep -o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \"| head -1)
record_id=$(printf "%s\n" "$response" | _egrep_o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \" | head -n 1)
_debug "record_id" $record_id
_cf_rest PUT "zones/$_domain_id/dns_records/$record_id" "{\"id\":\"$record_id\",\"type\":\"TXT\",\"name\":\"$fulldomain\",\"content\":\"$txtvalue\",\"zone_id\":\"$_domain_id\",\"zone_name\":\"$_domain\"}"
_cf_rest PUT "zones/$_domain_id/dns_records/$record_id" "{\"id\":\"$record_id\",\"type\":\"TXT\",\"name\":\"$fulldomain\",\"content\":\"$txtvalue\",\"zone_id\":\"$_domain_id\",\"zone_name\":\"$_domain\"}"
if [ "$?" = "0" ]; then
_info "Updated, sleeping 10 seconds"
sleep 10
#todo: check if the record takes effect
return 0;
return 0
fi
_err "Update error"
return 1
fi
}
#fulldomain
dns_cf_rm() {
fulldomain=$1
}
#################### Private functions bellow ##################################
#_acme-challenge.www.domain.com
@@ -91,20 +91,20 @@ _get_root() {
domain=$1
i=2
p=1
while [ '1' ] ; do
while [ '1' ]; do
h=$(printf $domain | cut -d . -f $i-100)
if [ -z "$h" ] ; then
if [ -z "$h" ]; then
#not valid
return 1;
fi
if ! _cf_rest GET "zones?name=$h" ; then
return 1
fi
if printf $response | grep \"name\":\"$h\" >/dev/null ; then
_domain_id=$(printf "$response" | grep -o \"id\":\"[^\"]*\" | head -1 | cut -d : -f 2 | tr -d \")
if [ "$_domain_id" ] ; then
if ! _cf_rest GET "zones?name=$h"; then
return 1
fi
if printf $response | grep \"name\":\"$h\" >/dev/null; then
_domain_id=$(printf "%s\n" "$response" | _egrep_o \"id\":\"[^\"]*\" | head -n 1 | cut -d : -f 2 | tr -d \")
if [ "$_domain_id" ]; then
_sub_domain=$(printf $domain | cut -d . -f 1-$p)
_domain=$h
return 0
@@ -122,24 +122,22 @@ _cf_rest() {
ep="$2"
data="$3"
_debug $ep
_H1="X-Auth-Email: $CF_Email"
_H2="X-Auth-Key: $CF_Key"
_H3="Content-Type: application/json"
if [ "$data" ] ; then
if [ "$data" ]; then
_debug data "$data"
response="$(_post "$data" "$CF_Api/$ep" "" $m)"
else
response="$(_get "$CF_Api/$ep")"
fi
if [ "$?" != "0" ] ; then
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}

View File

@@ -6,10 +6,8 @@
#
#CX_Secret="sADDsdasdgdsf"
CX_Api="https://www.cloudxns.net/api2"
#REST_API
######## Public functions #####################
@@ -17,45 +15,50 @@ CX_Api="https://www.cloudxns.net/api2"
dns_cx_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$CX_Key" ] || [ -z "$CX_Secret" ] ; then
if [ -z "$CX_Key" ] || [ -z "$CX_Secret" ]; then
_err "You don't specify cloudxns.com api key or secret yet."
_err "Please create you key and try again."
return 1
fi
REST_API=$CX_Api
#save the api key and email to the account conf file.
_saveaccountconf CX_Key "$CX_Key"
_saveaccountconf CX_Secret "$CX_Secret"
_debug "First detect the root zone"
if ! _get_root $fulldomain ; then
if ! _get_root $fulldomain; then
_err "invalid domain"
return 1
fi
existing_records $_domain $_sub_domain
existing_records $_domain $_sub_domain
_debug count "$count"
if [ "$?" != "0" ] ; then
if [ "$?" != "0" ]; then
_err "Error get existing records."
return 1
fi
if [ "$count" = "0" ] ; then
if [ "$count" = "0" ]; then
add_record $_domain $_sub_domain $txtvalue
else
update_record $_domain $_sub_domain $txtvalue
fi
if [ "$?" = "0" ] ; then
if [ "$?" = "0" ]; then
return 0
fi
return 1
}
#fulldomain
dns_cx_rm() {
fulldomain=$1
}
#usage: root sub
#return if the sub record already exists.
#echos the existing records count.
@@ -64,24 +67,24 @@ existing_records() {
_debug "Getting txt records"
root=$1
sub=$2
if ! _rest GET "record/$_domain_id?:domain_id?host_id=0&offset=0&row_num=100" ; then
if ! _rest GET "record/$_domain_id?:domain_id?host_id=0&offset=0&row_num=100"; then
return 1
fi
count=0
seg=$(printf "$response" | grep -o "{[^{]*host\":\"$_sub_domain\"[^}]*}")
seg=$(printf "%s\n" "$response" | _egrep_o "{[^\{]*host\":\"$_sub_domain\"[^\}]*\}")
_debug seg "$seg"
if [ -z "$seg" ] ; then
if [ -z "$seg" ]; then
return 0
fi
if printf "$response" | grep '"type":"TXT"' > /dev/null ; then
if printf "$response" | grep '"type":"TXT"' >/dev/null; then
count=1
record_id=$(printf "$seg" | grep -o \"record_id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \")
record_id=$(printf "%s\n" "$seg" | _egrep_o \"record_id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \")
_debug record_id "$record_id"
return 0
return 0
fi
}
#add the txt record.
@@ -91,13 +94,13 @@ add_record() {
sub=$2
txtvalue=$3
fulldomain=$sub.$root
_info "Adding record"
if ! _rest POST "record" "{\"domain_id\": $_domain_id, \"host\":\"$_sub_domain\", \"value\":\"$txtvalue\", \"type\":\"TXT\",\"ttl\":600, \"line_id\":1}"; then
return 1
fi
return 0
}
@@ -108,19 +111,16 @@ update_record() {
sub=$2
txtvalue=$3
fulldomain=$sub.$root
_info "Updating record"
if _rest PUT "record/$record_id" "{\"domain_id\": $_domain_id, \"host\":\"$_sub_domain\", \"value\":\"$txtvalue\", \"type\":\"TXT\",\"ttl\":600, \"line_id\":1}" ; then
if _rest PUT "record/$record_id" "{\"domain_id\": $_domain_id, \"host\":\"$_sub_domain\", \"value\":\"$txtvalue\", \"type\":\"TXT\",\"ttl\":600, \"line_id\":1}"; then
return 0
fi
return 1
}
#################### Private functions bellow ##################################
#_acme-challenge.www.domain.com
#returns
@@ -131,25 +131,25 @@ _get_root() {
domain=$1
i=2
p=1
if ! _rest GET "domain" ; then
if ! _rest GET "domain"; then
return 1
fi
while [ '1' ] ; do
while [ '1' ]; do
h=$(printf $domain | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ] ; then
if [ -z "$h" ]; then
#not valid
return 1;
return 1
fi
if printf "$response" | grep "$h." >/dev/null ; then
seg=$(printf "$response" | grep -o "{[^{]*$h\.[^}]*\}" )
if printf "$response" | grep "$h." >/dev/null; then
seg=$(printf "%s" "$response" | _egrep_o "\{[^\{]*\"$h\.\"[^\}]*\}")
_debug seg "$seg"
_domain_id=$(printf "$seg" | grep -o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \")
_domain_id=$(printf "%s" "$seg" | _egrep_o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \")
_debug _domain_id "$_domain_id"
if [ "$_domain_id" ] ; then
if [ "$_domain_id" ]; then
_sub_domain=$(printf $domain | cut -d . -f 1-$p)
_debug _sub_domain $_sub_domain
_domain=$h
@@ -164,7 +164,6 @@ _get_root() {
return 1
}
#Usage: method URI data
_rest() {
m=$1
@@ -172,38 +171,36 @@ _rest() {
_debug $ep
url="$REST_API/$ep"
_debug url "$url"
cdate=$(date -u "+%Y-%m-%d %H:%M:%S UTC")
cdate=$(date -u "+%Y-%m-%d %H:%M:%S UTC")
_debug cdate "$cdate"
data="$3"
_debug data "$data"
sec="$CX_Key$url$data$cdate$CX_Secret"
_debug sec "$sec"
hmac=$(printf "$sec"| openssl md5 |cut -d " " -f 2)
hmac=$(printf "$sec" | openssl md5 | cut -d " " -f 2)
_debug hmac "$hmac"
_H1="API-KEY: $CX_Key"
_H2="API-REQUEST-DATE: $cdate"
_H3="API-HMAC: $hmac"
_H4="Content-Type: application/json"
if [ "$data" ] ; then
if [ "$data" ]; then
response="$(_post "$data" "$url" "" $m)"
else
response="$(_get "$url")"
fi
if [ "$?" != "0" ] ; then
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
if ! printf "$response" | grep '"message":"success"' > /dev/null ; then
if ! printf "$response" | grep '"message":"success"' >/dev/null; then
return 1
fi
return 0
}

View File

@@ -6,10 +6,8 @@
#
#DP_Key="sADDsdasdgdsf"
DP_Api="https://dnsapi.cn"
#REST_API
######## Public functions #####################
@@ -17,40 +15,45 @@ DP_Api="https://dnsapi.cn"
dns_dp_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$DP_Id" ] || [ -z "$DP_Key" ] ; then
if [ -z "$DP_Id" ] || [ -z "$DP_Key" ]; then
_err "You don't specify dnspod api key and key id yet."
_err "Please create you key and try again."
return 1
fi
REST_API=$DP_Api
#save the api key and email to the account conf file.
_saveaccountconf DP_Id "$DP_Id"
_saveaccountconf DP_Key "$DP_Key"
_debug "First detect the root zone"
if ! _get_root $fulldomain ; then
if ! _get_root $fulldomain; then
_err "invalid domain"
return 1
fi
existing_records $_domain $_sub_domain
existing_records $_domain $_sub_domain
_debug count "$count"
if [ "$?" != "0" ] ; then
if [ "$?" != "0" ]; then
_err "Error get existing records."
return 1
fi
if [ "$count" = "0" ] ; then
if [ "$count" = "0" ]; then
add_record $_domain $_sub_domain $txtvalue
else
update_record $_domain $_sub_domain $txtvalue
fi
}
#fulldomain
dns_dp_rm() {
fulldomain=$1
}
#usage: root sub
#return if the sub record already exists.
#echos the existing records count.
@@ -59,26 +62,25 @@ existing_records() {
_debug "Getting txt records"
root=$1
sub=$2
if ! _rest POST "Record.List" "login_token=$DP_Id,$DP_Key&domain_id=$_domain_id&sub_domain=$_sub_domain"; then
return 1
return 1
fi
if printf "$response" | grep 'No records' ; then
count=0;
return 0
if printf "$response" | grep 'No records'; then
count=0
return 0
fi
if printf "$response" | grep "Action completed successful" >/dev/null ; then
if printf "$response" | grep "Action completed successful" >/dev/null; then
count=$(printf "$response" | grep '<type>TXT</type>' | wc -l)
record_id=$(printf "$response" | grep '^<id>' | tail -1 | cut -d '>' -f 2 | cut -d '<' -f 1)
return 0
return 0
else
_err "get existing records error."
return 1
fi
count=0
}
@@ -89,19 +91,18 @@ add_record() {
sub=$2
txtvalue=$3
fulldomain=$sub.$root
_info "Adding record"
if ! _rest POST "Record.Create" "login_token=$DP_Id,$DP_Key&format=json&domain_id=$_domain_id&sub_domain=$_sub_domain&record_type=TXT&value=$txtvalue&record_line=默认"; then
return 1
fi
if printf "$response" | grep "Action completed successful" ; then
if printf "$response" | grep "Action completed successful"; then
return 0
fi
return 1 #error
}
@@ -112,24 +113,21 @@ update_record() {
sub=$2
txtvalue=$3
fulldomain=$sub.$root
_info "Updating record"
if ! _rest POST "Record.Modify" "login_token=$DP_Id,$DP_Key&format=json&domain_id=$_domain_id&sub_domain=$_sub_domain&record_type=TXT&value=$txtvalue&record_line=默认&record_id=$record_id"; then
return 1
fi
if printf "$response" | grep "Action completed successful" ; then
if printf "$response" | grep "Action completed successful"; then
return 0
fi
return 1 #error
}
#################### Private functions bellow ##################################
#_acme-challenge.www.domain.com
#returns
@@ -140,21 +138,21 @@ _get_root() {
domain=$1
i=2
p=1
while [ '1' ] ; do
while [ '1' ]; do
h=$(printf $domain | cut -d . -f $i-100)
if [ -z "$h" ] ; then
if [ -z "$h" ]; then
#not valid
return 1;
return 1
fi
if ! _rest POST "Domain.Info" "login_token=$DP_Id,$DP_Key&format=json&domain=$h"; then
return 1
fi
if printf "$response" | grep "Action completed successful" >/dev/null ; then
_domain_id=$(printf "$response" | grep -o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \")
if printf "$response" | grep "Action completed successful" >/dev/null; then
_domain_id=$(printf "%s\n" "$response" | _egrep_o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \")
_debug _domain_id "$_domain_id"
if [ "$_domain_id" ] ; then
if [ "$_domain_id" ]; then
_sub_domain=$(printf $domain | cut -d . -f 1-$p)
_debug _sub_domain $_sub_domain
_domain=$h
@@ -169,7 +167,6 @@ _get_root() {
return 1
}
#Usage: method URI data
_rest() {
m=$1
@@ -177,22 +174,20 @@ _rest() {
data="$3"
_debug $ep
url="$REST_API/$ep"
_debug url "$url"
if [ "$data" ] ; then
if [ "$data" ]; then
_debug2 data "$data"
response="$(_post $data "$url")"
else
response="$(_get "$url")"
fi
if [ "$?" != "0" ] ; then
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}

116
dnsapi/dns_gd.sh Executable file
View File

@@ -0,0 +1,116 @@
#!/usr/bin/env sh
#Godaddy domain api
#
#GD_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
#
#GD_Secret="asdfsdfsfsdfsdfdfsdf"
GD_Api="https://api.godaddy.com/v1"
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_gd_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$GD_Key" ] || [ -z "$GD_Secret" ]; then
_err "You don't specify godaddy api key and secret yet."
_err "Please create you key and try again."
return 1
fi
#save the api key and email to the account conf file.
_saveaccountconf GD_Key "$GD_Key"
_saveaccountconf GD_Secret "$GD_Secret"
_debug "First detect the root zone"
if ! _get_root $fulldomain; then
_err "invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_info "Adding record"
if _gd_rest PUT "domains/$_domain/records/TXT/$_sub_domain" "[{\"data\":\"$txtvalue\"}]"; then
if [ "$response" = "{}" ]; then
_info "Added, sleeping 10 seconds"
sleep 10
#todo: check if the record takes effect
return 0
else
_err "Add txt record error."
_err "$response"
return 1
fi
fi
_err "Add txt record error."
}
#fulldomain
dns_gd_rm() {
fulldomain=$1
}
#################### Private functions bellow ##################################
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
_get_root() {
domain=$1
i=2
p=1
while [ '1' ]; do
h=$(printf $domain | cut -d . -f $i-100)
if [ -z "$h" ]; then
#not valid
return 1
fi
if ! _gd_rest GET "domains/$h"; then
return 1
fi
if printf "$response" | grep '"code":"NOT_FOUND"' >/dev/null; then
_debug "$h not found"
else
_sub_domain=$(printf $domain | cut -d . -f 1-$p)
_domain=$h
return 0
fi
p=$i
i=$(expr $i + 1)
done
return 1
}
_gd_rest() {
m=$1
ep="$2"
data="$3"
_debug $ep
_H1="Authorization: sso-key $GD_Key:$GD_Secret"
_H2="Content-Type: application/json"
if [ "$data" ]; then
_debug data "$data"
response="$(_post "$data" "$GD_Api/$ep" "" $m)"
else
response="$(_get "$GD_Api/$ep")"
fi
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}

View File

@@ -13,15 +13,15 @@ wiki="https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api"
dns_lexicon_add() {
fulldomain=$1
txtvalue=$2
domain=$(printf "$fulldomain" | cut -d . -f 2-999)
if ! _exists $lexicon_cmd ; then
if ! _exists $lexicon_cmd; then
_err "Please install $lexicon_cmd first: $wiki"
return 1
fi
if [ -z "$PROVIDER" ] ; then
if [ -z "$PROVIDER" ]; then
_err "Please define env PROVIDER first: $wiki"
return 1
fi
@@ -29,34 +29,34 @@ dns_lexicon_add() {
_savedomainconf PROVIDER "$PROVIDER"
export PROVIDER
Lx_name=$(echo LEXICON_${PROVIDER}_USERNAME | tr [a-z] [A-Z])
Lx_name=$(echo LEXICON_${PROVIDER}_USERNAME | tr [a-z] [A-Z])
eval Lx_name_v="\$$Lx_name"
_debug "$Lx_name" "$Lx_name_v"
if [ "$Lx_name_v" ] ; then
if [ "$Lx_name_v" ]; then
_saveaccountconf $Lx_name "$Lx_name_v"
export "$Lx_name"
fi
Lx_token=$(echo LEXICON_${PROVIDER}_TOKEN | tr [a-z] [A-Z])
Lx_token=$(echo LEXICON_${PROVIDER}_TOKEN | tr [a-z] [A-Z])
eval Lx_token_v="\$$Lx_token"
_debug "$Lx_token" "$Lx_token_v"
if [ "$Lx_token_v" ] ; then
if [ "$Lx_token_v" ]; then
_saveaccountconf $Lx_token "$Lx_token_v"
export "$Lx_token"
fi
Lx_password=$(echo LEXICON_${PROVIDER}_PASSWORD | tr [a-z] [A-Z])
Lx_password=$(echo LEXICON_${PROVIDER}_PASSWORD | tr [a-z] [A-Z])
eval Lx_password_v="\$$Lx_password"
_debug "$Lx_password" "$Lx_password_v"
if [ "$Lx_password_v" ] ; then
if [ "$Lx_password_v" ]; then
_saveaccountconf $Lx_password "$Lx_password_v"
export "$Lx_password"
fi
Lx_domaintoken=$(echo LEXICON_${PROVIDER}_DOMAINTOKEN | tr [a-z] [A-Z])
Lx_domaintoken=$(echo LEXICON_${PROVIDER}_DOMAINTOKEN | tr [a-z] [A-Z])
eval Lx_domaintoken_v="\$$Lx_domaintoken"
_debug "$Lx_domaintoken" "$Lx_domaintoken_v"
if [ "$Lx_domaintoken_v" ] ; then
if [ "$Lx_domaintoken_v" ]; then
export "$Lx_domaintoken"
_saveaccountconf $Lx_domaintoken "$Lx_domaintoken_v"
fi
@@ -65,5 +65,8 @@ dns_lexicon_add() {
}
#fulldomain
dns_lexicon_rm() {
fulldomain=$1
}

141
dnsapi/dns_lua.sh Executable file
View File

@@ -0,0 +1,141 @@
#!/usr/bin/env sh
# bug reports to dev@1e.ca
#
#LUA_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
#
#LUA_Email="user@luadns.net"
LUA_Api="https://api.luadns.com/v1"
LUA_auth=$(printf $LUA_Email:$LUA_Key | _base64)
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_lua_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$LUA_Key" ] || [ -z "$LUA_Email" ]; then
_err "You don't specify luadns api key and email yet."
_err "Please create you key and try again."
return 1
fi
#save the api key and email to the account conf file.
_saveaccountconf LUA_Key "$LUA_Key"
_saveaccountconf LUA_Email "$LUA_Email"
_debug "First detect the root zone"
if ! _get_root $fulldomain; then
_err "invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_debug "Getting txt records"
_LUA_rest GET "zones/${_domain_id}/records"
if ! printf "$response" | grep \"id\": >/dev/null; then
_err "Error"
return 1
fi
count=$(printf "%s\n" "$response" | _egrep_o \"name\":\"$fulldomain\" | wc -l)
_debug count "$count"
if [ "$count" = "0" ]; then
_info "Adding record"
if _LUA_rest POST "zones/$_domain_id/records" "{\"type\":\"TXT\",\"name\":\"$fulldomain.\",\"content\":\"$txtvalue\",\"ttl\":120}"; then
if printf -- "%s" "$response" | grep $fulldomain >/dev/null; then
_info "Added"
#todo: check if the record takes effect
return 0
else
_err "Add txt record error."
return 1
fi
fi
_err "Add txt record error."
else
_info "Updating record"
record_id=$(printf "%s\n" "$response" | _egrep_o \"id\":[^,]*,\"name\":\"$fulldomain.\",\"type\":\"TXT\" | cut -d: -f2 | cut -d, -f1)
_debug "record_id" $record_id
_LUA_rest PUT "zones/$_domain_id/records/$record_id" "{\"id\":\"$record_id\",\"type\":\"TXT\",\"name\":\"$fulldomain.\",\"content\":\"$txtvalue\",\"zone_id\":\"$_domain_id\",\"ttl\":120}"
if [ "$?" = "0" ]; then
_info "Updated!"
#todo: check if the record takes effect
return 0
fi
_err "Update error"
return 1
fi
}
#fulldomain
dns_lua_rm() {
fulldomain=$1
}
#################### Private functions bellow ##################################
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
_get_root() {
domain=$1
i=2
p=1
if ! _LUA_rest GET "zones"; then
return 1
fi
while [ '1' ]; do
h=$(printf $domain | cut -d . -f $i-100)
if [ -z "$h" ]; then
#not valid
return 1
fi
if printf $response | grep \"name\":\"$h\" >/dev/null; then
_domain_id=$(printf "%s\n" "$response" | _egrep_o \"id\":[^,]*,\"name\":\"$h\" | cut -d : -f 2 | cut -d , -f 1)
if [ "$_domain_id" ]; then
_sub_domain=$(printf $domain | cut -d . -f 1-$p)
_domain=$h
return 0
fi
return 1
fi
p=$i
i=$(expr $i + 1)
done
return 1
}
_LUA_rest() {
m=$1
ep="$2"
data="$3"
_debug $ep
_H1="Accept: application/json"
_H2="Authorization: Basic $LUA_auth"
if [ "$data" ]; then
_debug data "$data"
response="$(_post "$data" "$LUA_Api/$ep" "" $m)"
else
response="$(_get "$LUA_Api/$ep")"
fi
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}

144
dnsapi/dns_me.sh Executable file
View File

@@ -0,0 +1,144 @@
#!/usr/bin/env sh
# bug reports to dev@1e.ca
# ME_Key=qmlkdjflmkqdjf
# ME_Secret=qmsdlkqmlksdvnnpae
ME_Api=https://api.dnsmadeeasy.com/V2.0/dns/managed
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_me_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$ME_Key" ] || [ -z "$ME_Secret" ]; then
_err "You didn't specify DNSMadeEasy api key and secret yet."
_err "Please create you key and try again."
return 1
fi
#save the api key and email to the account conf file.
_saveaccountconf ME_Key "$ME_Key"
_saveaccountconf ME_Secret "$ME_Secret"
_debug "First detect the root zone"
if ! _get_root $fulldomain; then
_err "invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_debug "Getting txt records"
_me_rest GET "${_domain_id}/records?recordName=$_sub_domain&type=TXT"
if ! printf "$response" | grep \"totalRecords\": >/dev/null; then
_err "Error"
return 1
fi
count=$(printf "%s\n" "$response" | _egrep_o \"totalRecords\":[^,]* | cut -d : -f 2)
_debug count "$count"
if [ "$count" = "0" ]; then
_info "Adding record"
if _me_rest POST "$_domain_id/records/" "{\"type\":\"TXT\",\"name\":\"$_sub_domain\",\"value\":\"$txtvalue\",\"gtdLocation\":\"DEFAULT\",\"ttl\":120}"; then
if printf -- "%s" "$response" | grep \"id\": >/dev/null; then
_info "Added"
#todo: check if the record takes effect
return 0
else
_err "Add txt record error."
return 1
fi
fi
_err "Add txt record error."
else
_info "Updating record"
record_id=$(printf "%s\n" "$response" | _egrep_o \"id\":[^,]* | cut -d : -f 2 | head -n 1)
_debug "record_id" $record_id
_me_rest PUT "$_domain_id/records/$record_id/" "{\"id\":\"$record_id\",\"type\":\"TXT\",\"name\":\"$_sub_domain\",\"value\":\"$txtvalue\",\"gtdLocation\":\"DEFAULT\",\"ttl\":120}"
if [ "$?" = "0" ]; then
_info "Updated"
#todo: check if the record takes effect
return 0
fi
_err "Update error"
return 1
fi
}
#fulldomain
dns_me_rm() {
fulldomain=$1
}
#################### Private functions bellow ##################################
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
_get_root() {
domain=$1
i=2
p=1
while [ '1' ]; do
h=$(printf $domain | cut -d . -f $i-100)
if [ -z "$h" ]; then
#not valid
return 1
fi
if ! _me_rest GET "name?domainname=$h"; then
return 1
fi
if printf $response | grep \"name\":\"$h\" >/dev/null; then
_domain_id=$(printf "%s\n" "$response" | _egrep_o \"id\":[^,]* | head -n 1 | cut -d : -f 2)
if [ "$_domain_id" ]; then
_sub_domain=$(printf $domain | cut -d . -f 1-$p)
_domain=$h
return 0
fi
return 1
fi
p=$i
i=$(expr $i + 1)
done
return 1
}
_me_rest() {
m=$1
ep="$2"
data="$3"
_debug $ep
cdate=$(date -u +"%a, %d %b %Y %T %Z")
hmac=$(printf "$cdate" | _hmac sha1 "$ME_Secret" 1)
_H1="x-dnsme-apiKey: $ME_Key"
_H2="x-dnsme-requestDate: $cdate"
_H3="x-dnsme-hmac: $hmac"
if [ "$data" ]; then
_debug data "$data"
response="$(_post "$data" "$ME_Api/$ep" "" $m)"
else
response="$(_get "$ME_Api/$ep")"
fi
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}

View File

@@ -6,8 +6,6 @@
#Which will be called by acme.sh to add the txt record to your api system.
#returns 0 means success, otherwise error.
######## Public functions #####################
#Usage: dns_myapi_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
@@ -15,16 +13,18 @@ dns_myapi_add() {
fulldomain=$1
txtvalue=$2
_err "Not implemented!"
return 1;
return 1
}
#fulldomain
dns_myapi_rm() {
fulldomain=$1
}
#################### Private functions bellow ##################################
_info() {
if [ -z "$2" ] ; then
if [ -z "$2" ]; then
echo "[$(date)] $1"
else
echo "[$(date)] $1='$2'"
@@ -37,7 +37,7 @@ _err() {
}
_debug() {
if [ -z "$DEBUG" ] ; then
if [ -z "$DEBUG" ]; then
return
fi
_err "$@"
@@ -45,8 +45,8 @@ _debug() {
}
_debug2() {
if [ "$DEBUG" ] && [ "$DEBUG" -ge "2" ] ; then
if [ "$DEBUG" ] && [ "$DEBUG" -ge "2" ]; then
_debug "$@"
fi
return
}
}

294
dnsapi/dns_ovh.sh Executable file
View File

@@ -0,0 +1,294 @@
#!/usr/bin/env sh
#Applcation Key
#OVH_AK="sdfsdfsdfljlbjkljlkjsdfoiwje"
#
#Application Secret
#OVH_AS="sdfsafsdfsdfdsfsdfsa"
#
#Consumer Key
#OVH_CK="sdfsdfsdfsdfsdfdsf"
#OVH_END_POINT=ovh-eu
#'ovh-eu'
OVH_EU='https://eu.api.ovh.com/1.0'
#'ovh-ca':
OVH_CA='https://ca.api.ovh.com/1.0'
#'kimsufi-eu'
KSF_EU='https://eu.api.kimsufi.com/1.0'
#'kimsufi-ca'
KSF_CA='https://ca.api.kimsufi.com/1.0'
#'soyoustart-eu'
SYS_EU='https://eu.api.soyoustart.com/1.0'
#'soyoustart-ca'
SYS_CA='https://ca.api.soyoustart.com/1.0'
#'runabove-ca'
RAV_CA='https://api.runabove.com/1.0'
wiki="https://github.com/Neilpang/acme.sh/wiki/How-to-use-OVH-domain-api"
ovh_success="https://github.com/Neilpang/acme.sh/wiki/OVH-Success"
_ovh_get_api() {
_ogaep="$1"
case "${_ogaep}" in
ovh-eu | ovheu)
printf "%s" $OVH_EU
return
;;
ovh-ca | ovhca)
printf "%s" $OVH_CA
return
;;
kimsufi-eu | kimsufieu)
printf "%s" $KSF_EU
return
;;
kimsufi-ca | kimsufica)
printf "%s" $KSF_CA
return
;;
soyoustart-eu | soyoustarteu)
printf "%s" $SYS_EU
return
;;
soyoustart-ca | soyoustartca)
printf "%s" $SYS_CA
return
;;
runabove-ca | runaboveca)
printf "%s" $RAV_CA
return
;;
*)
_err "Unknown parameter : $1"
return 1
;;
esac
}
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_ovh_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$OVH_AK" ] || [ -z "$OVH_AS" ]; then
_err "You don't specify OVH application key and application secret yet."
_err "Please create you key and try again."
return 1
fi
#save the api key and email to the account conf file.
_saveaccountconf OVH_AK "$OVH_AK"
_saveaccountconf OVH_AS "$OVH_AS"
if [ -z "$OVH_END_POINT" ]; then
OVH_END_POINT="ovh-eu"
fi
_info "Using OVH endpoint: $OVH_END_POINT"
if [ "$OVH_END_POINT" != "ovh-eu" ]; then
_saveaccountconf OVH_END_POINT "$OVH_END_POINT"
fi
OVH_API="$(_ovh_get_api $OVH_END_POINT)"
_debug OVH_API "$OVH_API"
if [ -z "$OVH_CK" ]; then
_info "OVH consumer key is empty, Let's get one:"
if ! _ovh_authentication; then
_err "Can not get consumer key."
fi
#return and wait for retry.
return 1
fi
_info "Checking authentication"
response="$(_ovh_rest GET "domain/")"
if _contains "$response" "INVALID_CREDENTIAL"; then
_err "The consumer key is invalid: $OVH_CK"
_err "Please retry to create a new one."
_clearaccountconf OVH_CK
return 1
fi
_info "Consumer key is ok."
_debug "First detect the root zone"
if ! _get_root $fulldomain; then
_err "invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_debug "Getting txt records"
_ovh_rest GET "domain/zone/$_domain/record?fieldType=TXT&subDomain=$_sub_domain"
if _contains "$response" '\[\]' || _contains "$response" "This service does not exist"; then
_info "Adding record"
if _ovh_rest POST "domain/zone/$_domain/record" "{\"fieldType\":\"TXT\",\"subDomain\":\"$_sub_domain\",\"target\":\"$txtvalue\",\"ttl\":60}"; then
if _contains "$response" "$txtvalue"; then
_ovh_rest POST "domain/zone/$_domain/refresh"
_debug "Refresh:$response"
_info "Added, sleeping 10 seconds"
sleep 10
return 0
fi
fi
_err "Add txt record error."
else
_info "Updating record"
record_id=$(printf "%s" "$response" | tr -d "[]" | cut -d , -f 1)
if [ -z "$record_id" ]; then
_err "Can not get record id."
return 1
fi
_debug "record_id" $record_id
if _ovh_rest PUT "domain/zone/$_domain/record/$record_id" "{\"target\":\"$txtvalue\",\"subDomain\":\"$_sub_domain\",\"ttl\":60}"; then
if _contains "$response" "null"; then
_ovh_rest POST "domain/zone/$_domain/refresh"
_debug "Refresh:$response"
_info "Updated, sleeping 10 seconds"
sleep 10
return 0
fi
fi
_err "Update error"
return 1
fi
}
#fulldomain
dns_ovh_rm() {
fulldomain=$1
}
#################### Private functions bellow ##################################
_ovh_authentication() {
_H1="X-Ovh-Application: $OVH_AK"
_H2="Content-type: application/json"
_H3=""
_H4=""
_ovhdata='{"accessRules": [{"method": "GET","path": "/*"},{"method": "POST","path": "/*"},{"method": "PUT","path": "/*"},{"method": "DELETE","path": "/*"}],"redirection":"'$ovh_success'"}'
response="$(_post "$_ovhdata" "$OVH_API/auth/credential")"
_debug3 response "$response"
validationUrl="$(echo "$response" | _egrep_o "validationUrl\":\"[^\"]*\"" | _egrep_o "http.*\"" | tr -d '"')"
if [ -z "$validationUrl" ]; then
_err "Unable to get validationUrl"
return 1
fi
_debug validationUrl "$validationUrl"
consumerKey="$(echo "$response" | _egrep_o "consumerKey\":\"[^\"]*\"" | cut -d : -f 2 | tr -d '"')"
if [ -z "$consumerKey" ]; then
_err "Unable to get consumerKey"
return 1
fi
_debug consumerKey "$consumerKey"
OVH_CK="$consumerKey"
_saveaccountconf OVH_CK "$OVH_CK"
_info "Please open this link to do authentication: $(__green "$validationUrl")"
_info "Here is a guide for you: $(__green "$wiki")"
_info "Please retry after the authentication is done."
}
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
_get_root() {
domain=$1
i=2
p=1
while [ '1' ]; do
h=$(printf $domain | cut -d . -f $i-100)
if [ -z "$h" ]; then
#not valid
return 1
fi
if ! _ovh_rest GET "domain/zone/$h"; then
return 1
fi
if ! _contains "$response" "This service does not exist" >/dev/null; then
_sub_domain=$(printf $domain | cut -d . -f 1-$p)
_domain=$h
return 0
fi
p=$i
i=$(expr $i + 1)
done
return 1
}
_ovh_timestamp() {
_H1=""
_H2=""
_H3=""
_H4=""
_H5=""
_get "$OVH_API/auth/time" "" 30
}
_ovh_rest() {
m=$1
ep="$2"
data="$3"
_debug $ep
_ovh_url="$OVH_API/$ep"
_debug2 _ovh_url "$_ovh_url"
_ovh_t="$(_ovh_timestamp)"
_debug2 _ovh_t "$_ovh_t"
_ovh_p="$OVH_AS+$OVH_CK+$m+$_ovh_url+$data+$_ovh_t"
_debug _ovh_p "$_ovh_p"
_ovh_hex="$(printf "%s" "$_ovh_p" | _digest sha1 hex)"
_debug2 _ovh_hex "$_ovh_hex"
_H1="X-Ovh-Application: $OVH_AK"
_H2="X-Ovh-Signature: \$1\$$_ovh_hex"
_debug2 _H2 "$_H2"
_H3="X-Ovh-Timestamp: $_ovh_t"
_H4="X-Ovh-Consumer: $OVH_CK"
_H5="Content-Type: application/json;charset=utf-8"
if [ "$data" ] || [ "$m" = "POST" ] || [ "$m" = "PUT" ]; then
_debug data "$data"
response="$(_post "$data" "$_ovh_url" "" $m)"
else
response="$(_get "$_ovh_url")"
fi
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}

139
dnsapi/dns_pdns.sh Executable file
View File

@@ -0,0 +1,139 @@
#!/usr/bin/env sh
#PowerDNS Emdedded API
#https://doc.powerdns.com/md/httpapi/api_spec/
#
#PDNS_Url="http://ns.example.com:8081"
#PDNS_ServerId="localhost"
#PDNS_Token="0123456789ABCDEF"
#PDNS_Ttl=60
DEFAULT_PDNS_TTL=60
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "123456789ABCDEF0000000000000000000000000000000000000"
dns_pdns_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$PDNS_Url" ]; then
_err "You don't specify PowerDNS address."
_err "Please set PDNS_Url and try again."
return 1
fi
if [ -z "$PDNS_ServerId" ]; then
_err "You don't specify PowerDNS server id."
_err "Please set you PDNS_ServerId and try again."
return 1
fi
if [ -z "$PDNS_Token" ]; then
_err "You don't specify PowerDNS token."
_err "Please create you PDNS_Token and try again."
return 1
fi
if [ -z "$PDNS_Ttl" ]; then
PDNS_Ttl=$DEFAULT_PDNS_TTL
fi
#save the api addr and key to the account conf file.
_saveaccountconf PDNS_Url "$PDNS_Url"
_saveaccountconf PDNS_ServerId "$PDNS_ServerId"
_saveaccountconf PDNS_Token "$PDNS_Token"
if [ "$PDNS_Ttl" != "$DEFAULT_PDNS_TTL" ]; then
_saveaccountconf PDNS_Ttl "$PDNS_Ttl"
fi
_debug "First detect the root zone"
if ! _get_root $fulldomain; then
_err "invalid domain"
return 1
fi
_debug _domain "$_domain"
if ! set_record "$_domain" "$fulldomain" "$txtvalue"; then
return 1
fi
return 0
}
#fulldomain
dns_pdns_rm() {
fulldomain=$1
}
set_record() {
_info "Adding record"
root=$1
full=$2
txtvalue=$3
if ! _pdns_rest "PATCH" "/api/v1/servers/$PDNS_ServerId/zones/$root." "{\"rrsets\": [{\"name\": \"$full.\", \"changetype\": \"REPLACE\", \"type\": \"TXT\", \"ttl\": $PDNS_Ttl, \"records\": [{\"name\": \"$full.\", \"type\": \"TXT\", \"content\": \"\\\"$txtvalue\\\"\", \"disabled\": false, \"ttl\": $PDNS_Ttl}]}]}"; then
_err "Set txt record error."
return 1
fi
if ! _pdns_rest "PUT" "/api/v1/servers/$PDNS_ServerId/zones/$root./notify"; then
_err "Notify servers error."
return 1
fi
return 0
}
#################### Private functions bellow ##################################
#_acme-challenge.www.domain.com
#returns
# _domain=domain.com
_get_root() {
domain=$1
i=1
p=1
if _pdns_rest "GET" "/api/v1/servers/$PDNS_ServerId/zones"; then
_zones_response=$response
fi
while [ '1' ]; do
h=$(printf $domain | cut -d . -f $i-100)
if [ -z "$h" ]; then
return 1
fi
if printf "$_zones_response" | grep "\"name\": \"$h.\"" >/dev/null; then
_domain=$h
return 0
fi
p=$i
i=$(expr $i + 1)
done
_debug "$domain not found"
return 1
}
_pdns_rest() {
method=$1
ep=$2
data=$3
_H1="X-API-Key: $PDNS_Token"
if [ ! "$method" = "GET" ]; then
_debug data "$data"
response="$(_post "$data" "$PDNS_Url$ep" "" "$method")"
else
response="$(_get "$PDNS_Url$ep")"
fi
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}