Compare commits

..
424 Commits
Author SHA1 Message Date
neil 26e3263aec Merge pull request #894 from Neilpang/dev
Dev
2017-06-18 22:16:34 +08:00
neilpang 08b4e1a744 add ACME_NO_COLOR and --no-color not to ouput color text 2017-06-18 22:13:33 +08:00
neil d68f0999a4 Merge pull request #891 from Neilpang/aix
fix https://github.com/Neilpang/acme.sh/issues/805
2017-06-18 10:19:25 +08:00
neilpang 2c9ed4c565 check invalid subject cn in the csr
fix https://github.com/Neilpang/acme.sh/issues/805
2017-06-18 10:18:20 +08:00
neil be4f87c760 Merge pull request #890 from Neilpang/dev
fix format
2017-06-18 10:08:10 +08:00
neilpang b963dadc14 fix format 2017-06-18 10:07:23 +08:00
neil 26e7fd8b80 Merge pull request #889 from Neilpang/dev
fix openssl 1.1.0 for https://github.com/Neilpang/acme.sh/issues/888
2017-06-18 09:56:11 +08:00
neilpang b9a972bccd fix openssl 1.1.0 for https://github.com/Neilpang/acme.sh/issues/888 2017-06-18 09:52:59 +08:00
neil bb7b9280d3 Merge pull request #887 from Neilpang/dev
fix cron
2017-06-17 20:50:43 +08:00
neilpang 395fbbfd14 fix cron 2017-06-17 20:49:45 +08:00
neil 896dfe3def Merge pull request #886 from Neilpang/dev
Dev
2017-06-17 17:31:32 +08:00
neil 6c4f33910c Merge pull request #871 from hajhatten/master
Added views to infoblox dnsapi script
2017-06-17 17:30:51 +08:00
Rikard Gynnerstedt 0a301cdd21 added new line at the end of the file 2017-06-17 11:28:49 +02:00
neil c2b1e38d7f Merge pull request #884 from Neilpang/dev
Dev
2017-06-17 11:41:16 +08:00
neilpang fcc0aef7f4 start 2.7.2 2017-06-16 22:41:33 +08:00
neil eaa3de2dce Merge pull request #883 from Neilpang/url
fix https://github.com/Neilpang/acme.sh/issues/881#issuecomment-30902…
2017-06-16 22:38:39 +08:00
neilpang f3dc5dd12f fix https://github.com/Neilpang/acme.sh/issues/881#issuecomment-309026385 2017-06-16 21:45:14 +08:00
neil d2f0178fab Merge pull request #879 from Neilpang/dev
add debug message
2017-06-15 22:25:18 +08:00
neilpang 326c386b2e add debug message 2017-06-15 21:44:10 +08:00
neil 6e68c4e2d6 Merge pull request #878 from Neilpang/dev
Dev
2017-06-15 21:28:22 +08:00
neil a79e96802f Merge pull request #877 from Neilpang/master
sync
2017-06-15 21:27:30 +08:00
neilpang 65b22b493c minor, debug info 2017-06-15 21:26:14 +08:00
Rikard Gynnerstedt b73f5a4e94 missed one egrep command 2017-06-15 00:16:26 +02:00
Rikard Gynnerstedt 3b74ac841e save Infoblox_View to account config 2017-06-14 23:52:48 +02:00
neil 253bf776b5 Merge pull request #876 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/874
2017-06-14 23:31:58 +08:00
neilpang eef4acd07d fix https://github.com/Neilpang/acme.sh/issues/874 2017-06-14 23:25:20 +08:00
Rikard Gynnerstedt b6f00ea241 changed path to env 2017-06-08 13:35:27 +02:00
Rikard Gynnerstedt 0bd4a4f98f formated for sh instead of bash 2017-06-08 13:34:29 +02:00
Rikard Gynnerstedt 0b52645bb6 added view variable to infoblox integration script 2017-06-08 13:32:05 +02:00
neil 8e845d9f21 make install command respect LE_CONFIG_HOME env 2017-06-06 10:08:09 +08:00
neil d29aa43ba4 Merge pull request #869 from Neilpang/dev
Dev
2017-06-05 22:59:41 +08:00
neilpang 450efea191 fix format 2017-06-05 22:55:16 +08:00
neilpang 241cfc4342 fix nginx mode issue for multiple entries 2017-06-05 22:29:21 +08:00
neilpang 7c67e3d7e2 fix typo 2017-06-05 22:18:03 +08:00
neilpang 674790a511 add more detect for nginx mode 2017-06-05 22:14:58 +08:00
neil 4e3c82e329 Merge pull request #868 from Neilpang/dev
minor, add debug info
2017-06-05 21:02:38 +08:00
neilpang df711b0ea2 minor, add debug info 2017-06-04 22:04:43 +08:00
neil 1019fd9a9d Merge pull request #866 from Neilpang/dev
Dev
2017-05-29 18:02:43 +08:00
neilpang 8a420dd853 fix https://github.com/Neilpang/acme.sh/issues/865#issuecomment-304599955 2017-05-29 17:17:14 +08:00
neilpang f8bcfeb2ab fix xargs issue for freebsd
https://github.com/Neilpang/acme.sh/issues/865#issuecomment-304599955
2017-05-29 17:07:59 +08:00
neil 34e5beda6a Merge pull request #864 from Neilpang/dev
fix doc
2017-05-27 19:29:13 +08:00
neilpang 6185244754 fix doc 2017-05-27 19:28:12 +08:00
neil 60d9509e39 Merge branch 'dev' 2017-05-26 15:02:30 +08:00
neil ded4469efe fix for openbsd, sed doesn't support I option. 2017-05-26 14:58:52 +08:00
neil 1f95d8eedf Merge pull request #863 from Neilpang/dev
Dev
2017-05-25 21:08:04 +08:00
neilpang aa66dfff57 fix doc 2017-05-25 21:06:59 +08:00
neil 25263ce40f Merge pull request #862 from Neilpang/master
sync
2017-05-23 20:46:50 +08:00
neil e85deb54e1 Merge pull request #860 from feld/patch-1
Update README.md
2017-05-23 20:43:33 +08:00
neil 4750fd159e Merge pull request #861 from Neilpang/dev
Dev
2017-05-23 09:15:18 +08:00
Mark Felder 7eea9533e8 Update README.md
Fix usage documentation for dns_nsupdate. The NSUPDATE_KEY env needs to be a path to a file.
2017-05-22 14:53:26 -05:00
neil ec675b9ad2 Merge pull request #858 from yadutaf/jt-dns-ovh-scoped-credentials
Support OVH credentials scoped to a specific zone
2017-05-22 21:40:15 +08:00
Jean-Tiare Le Bigot 486e77f474 Support OVH credentials scoped to a specific zone
When creating OVH API credentials, one can scope them to a specific subset of routes. Specifically, this allows to limit acme.sh to a specific zone as the zone is part of the URL. This is an important security/safety net feature.
2017-05-22 14:16:08 +02:00
neil 048059ba1f Merge pull request #854 from Neilpang/dev
Dev
2017-05-20 11:28:26 +08:00
neilpang ed3dda7da9 fix format 2017-05-20 11:15:26 +08:00
neilpang fa93d68b08 promote performance 2017-05-20 11:02:48 +08:00
neil 4e20d89d9c Merge pull request #851 from Neilpang/dev
fix for performance of _h2b() function
2017-05-17 13:26:54 +08:00
neil b420ec6cb9 fix for performance of _h2b() function 2017-05-17 13:16:53 +08:00
neil 375f6101e9 Merge pull request #848 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/844
2017-05-15 20:50:35 +08:00
neil 2844d73dc7 fix https://github.com/Neilpang/acme.sh/issues/844 2017-05-15 20:46:02 +08:00
neil 6c1176f853 Merge pull request #843 from Neilpang/dev
Dev
2017-05-14 10:24:19 +08:00
neilpang df037db0bb clean cache 2017-05-14 10:15:40 +08:00
neil 949cc7d21b Merge pull request #841 from Neilpang/master
gitter
2017-05-12 13:40:01 +08:00
neil 9244529007 Merge pull request #840 from gitter-badger/gitter-badge
Add a Gitter chat badge to README.md
2017-05-12 13:39:01 +08:00
The Gitter Badger 319d49ddbe Add Gitter badge 2017-05-12 05:37:15 +00:00
neil 96fcfdb6c6 Merge branch 'dev' 2017-05-12 11:30:49 +08:00
neil d61ef6b49a gandi dns api updated. 2017-05-12 11:27:06 +08:00
neil 804a6c8d47 Merge pull request #838 from Neilpang/dev
add VOLUME
2017-05-11 20:56:48 +08:00
neilpang c487cd6af2 add VOLUME 2017-05-11 20:51:16 +08:00
neil 6a2592a9d9 Merge pull request #835 from Neilpang/dev
update doc
2017-05-09 13:34:39 +08:00
neil 0f48b15695 update doc 2017-05-09 13:33:54 +08:00
neil 4320b8a5a5 Merge pull request #833 from Neilpang/dev
Dev
2017-05-08 22:58:00 +08:00
neilpang a20707cd73 fix format 2017-05-08 22:57:23 +08:00
neilpang 5da1d3b73b minor fix format 2017-05-08 22:55:21 +08:00
neil be15e63d41 Merge pull request #832 from Neilpang/dev
fix list order
2017-05-08 22:25:56 +08:00
neilpang 9bc5f686eb fix list order 2017-05-08 22:25:06 +08:00
neil 5bed21dace Merge pull request #831 from Neilpang/dev
Dev
2017-05-08 22:15:32 +08:00
neil a97e651582 Merge pull request #714 from justmwa/master
NS1. API support
2017-05-08 22:13:42 +08:00
nytral dff641a665 I can do it... just discovered vmdiff 2017-05-08 16:07:45 +02:00
nytral 47a25cc3e8 Merge github.com:justmwa/acme.sh
Conflicts:
	dnsapi/README.md
	dnsapi/dns_nsone.sh
2017-05-08 16:02:31 +02:00
nytral 5e3a5f627a last but not least 2017-05-08 15:51:01 +02:00
justmwa 9201e0a5b9 Merge branch 'dev' into master 2017-05-08 15:32:02 +02:00
neil 4c80ed3208 Merge pull request #827 from Neilpang/dev
Dev
2017-05-05 20:26:32 +08:00
neil f34579e921 Merge pull request #826 from wizard1024/patch-1
Update dns_aws.sh to work only with public zones
2017-05-05 20:25:52 +08:00
wizard1024 cc1d3b20b6 Update dns_aws.sh to work only with public zones 2017-05-05 14:55:51 +03:00
neil 8051b6e8b6 Merge pull request #822 from Neilpang/dev
update doc
2017-05-03 23:08:11 +08:00
neilpang 4c38fec3b5 update doc 2017-05-03 23:07:30 +08:00
neil c4cdcf44c5 Merge pull request #819 from Neilpang/dev
Dev
2017-05-03 13:16:09 +08:00
neil 347dab0c14 Merge pull request #443 from pho3nixf1re/dnsimple
include dnsimple api
2017-05-03 13:15:11 +08:00
neil a3d3ea2b4b Merge pull request #815 from ka2er/dev
less permissive permission on OVH API
2017-05-03 13:12:47 +08:00
Matthew Turney 5332387125 Use _post to send a DELETE request for DNSimple record removal. 2017-05-02 09:04:21 -05:00
Matthew Turney 5b21cbe0de Revert "provide a more general purpose request function"
This reverts commit aa86652db8d3132fb7fe0c0253dded7deb7dce2c.

This is not actually necessary and can be accomplished with the post
function.
2017-05-02 08:59:37 -05:00
Matthew Turney 2f4111a2e2 fixup shellcheck style issues 2017-05-02 08:59:37 -05:00
Matthew Turney 326ac485b3 link to repo for dnsimple integration support 2017-05-02 08:59:37 -05:00
Matthew Turney f9b419d1e4 cleanup dns in dnsimple api integration
Implement the `_rm()` method for the DNSimple integration. This also
required some changes and cleanup to DRY up the code.
2017-05-02 08:59:37 -05:00
Matthew Turney f4e81953ce provide a more general purpose request function
This allows for more flexibility in the future. Most importantly being
able to do more than just GET requests but any HTTP method. Specifically
needed for DELETE requests.
2017-05-02 08:59:37 -05:00
Matthew Turney 2b09253961 link to contributor repo for support issues relating to the dnsimple API integration 2017-05-02 08:59:37 -05:00
Matthew Turney 1994c6828e include dnsimple api
Even though DNSimple is technically covered with lexicon not all
systems can install python pip's easily. For these systems it is useful
to have pure shell script API interactions.
2017-05-02 08:59:37 -05:00
ka2er f5c381d5b4 less permissive permission on OVH API
restrict authorization request to OVH /domain API and not whole OVH API.
Not perfect due to some limitations in regex with *, but better security as the token don't give full access to the API.
2017-05-02 00:45:29 +02:00
neil 7e2af8364f Merge pull request #814 from Neilpang/dev
Dev
2017-05-01 13:54:45 +08:00
neil 0a2ab2aed2 Merge pull request #813 from shar0119/patch-4
Removed grep -Po
2017-05-01 13:54:10 +08:00
shar0119 2310a9bbc0 Removed grep -Po
Removed usage of grep -Po.
2017-04-30 10:32:56 -07:00
neilpang 5b3e3d9cf4 fix https://github.com/Neilpang/acme.sh/issues/812 2017-04-30 16:29:20 +08:00
neil c97c79ab2f Merge pull request #809 from thecantero/patch-1
Update to support Kong-v0.10.x
2017-04-28 10:14:53 +08:00
Andre Cantero 1231b71245 Update the notes 2017-04-28 00:25:30 +08:00
Andre Cantero 824ffa24f4 Add shebang 2017-04-28 00:21:21 +08:00
neilpang 148f869bec fix https://github.com/Neilpang/acme.sh/issues/805 2017-04-27 22:21:59 +08:00
thecantero c140fe9bae Typo Fix 2017-04-27 20:51:02 +08:00
thecantero 4b02ee5b46 Typo fix 2017-04-27 20:38:08 +08:00
thecantero de3bac53bf update README 2017-04-27 20:06:47 +08:00
neil 3f1a76d9e4 fix https://github.com/Neilpang/acme.sh/issues/808 2017-04-27 18:29:29 +08:00
thecantero 0138e167e9 Update to support Kong-v0.10.x
The previous one is for Kong-v0.9.x only.

This change will allow it to work with v0.10.x.

More info at:
https://github.com/Mashape/kong/blob/4f960abe33fe3d45510944f062e571d63dc3a673/UPGRADE.md#upgrade-to-010x
https://getkong.org/docs/0.10.x/admin-api/#add-certificate
2017-04-27 18:23:43 +08:00
neil bcd2ee6204 Merge pull request #768 from shar0119/patch-2
Updated Readme.md file (1 of 2)
2017-04-27 11:11:34 +08:00
neil 4c1d521711 Merge pull request #767 from shar0119/patch-3
Patch 3
2017-04-27 11:11:12 +08:00
shar0119 90c70fa5bf Merge branch 'dev' into patch-3 2017-04-26 15:58:58 -07:00
shar0119 8e15c48092 Merge branch 'master' into patch-2 2017-04-26 15:51:03 -07:00
shar0119 9cf65e31cd Resolved conflict.
Resolved conflict.
2017-04-25 19:37:56 -07:00
shar0119 a6e5876d96 Resolved conflict.
Resolved conflict.
2017-04-25 19:33:54 -07:00
neil 937e723036 Merge pull request #726 from shar0119/patch-1
Create dns_dynu.sh
2017-04-26 09:24:48 +08:00
neil 12d876a005 Merge pull request #804 from Neilpang/dev
Dev
2017-04-21 20:19:13 +08:00
neil 4e2426a2b4 Merge pull request #803 from LAV45/dev
small Fix readme [skip ci]
2017-04-21 18:52:00 +08:00
Aleksey Loban 020f9cd2a6 small Fix readme [skip ci] 2017-04-21 13:15:39 +03:00
neil d7eebe9df0 Merge pull request #802 from Neilpang/dev
Dev
2017-04-21 17:53:14 +08:00
neil cebc5bf9fc Merge pull request #792 from LAV45/dev
Add dns_vscale.sh
2017-04-21 17:52:21 +08:00
Aleksey Loban dbe68684a0 Fix readme 'Use VSCALE API' [skip ci] 2017-04-21 12:30:21 +03:00
LAV45 27a05ff271 Add dns_vscale.sh 2017-04-19 23:34:14 +03:00
neil 1489ddc49a Merge pull request #800 from Neilpang/dev
update doc
2017-04-19 23:14:06 +08:00
neilpang 9be2c1beb9 update doc 2017-04-19 23:12:37 +08:00
neil 8bcc19d91e Merge pull request #797 from Neilpang/dev
minor remove spaces
2017-04-17 19:09:28 +08:00
neil 3c07f57aad minor remove spaces 2017-04-17 19:08:34 +08:00
neil 3262a916e0 Merge pull request #796 from Neilpang/dev
fix docker cronjob
2017-04-16 11:27:00 +08:00
neilpang 7883cc5891 fix docker cronjob 2017-04-16 11:16:48 +08:00
neil ded7a5438c Merge pull request #795 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/794#issuecomment-29431…
2017-04-16 09:42:08 +08:00
neilpang cd98951001 fix https://github.com/Neilpang/acme.sh/issues/794#issuecomment-294314606 2017-04-16 09:36:59 +08:00
shar0119 8470c60e06 Using _egrep_o() instead of grep -o -e
Modified code to use egrep instead of grep -o -e.
2017-04-14 12:46:00 -07:00
shar0119 394b1002b3 Corrected formatting error.
Part of dns_dynu_rm() impementation.
2017-04-13 20:54:57 -07:00
shar0119 9a61d6293d Implemented dns_dynu_rm()
Implemented dns_dynu_rm() method.
2017-04-13 20:48:39 -07:00
neil 192ad27f8f Merge pull request #786 from Neilpang/dev
fix format
2017-04-11 22:30:37 +08:00
neilpang eb0fc67461 fix format 2017-04-11 22:29:49 +08:00
neil adbe5e9048 Merge pull request #785 from Neilpang/dev
support change account conf from env
2017-04-11 21:39:33 +08:00
neilpang fcdf41ba29 support change account conf from env 2017-04-11 21:37:56 +08:00
neil 7b40cbe8c1 Merge pull request #778 from Neilpang/dev
Dev
2017-04-08 14:54:29 +08:00
neil 0933929cfe Merge pull request #777 from gidcs/fix-bug-of-if-statement
fix missing space bug on if statement
2017-04-08 14:54:00 +08:00
Kok Suan Lim 7f618e7ecc fix missing space bug on if statement 2017-04-08 14:50:39 +08:00
neilpang 482cb73702 fix https://github.com/Neilpang/acme.sh/issues/758 2017-04-06 19:29:09 +08:00
neil 96f79475f1 Merge pull request #774 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/549
2017-04-05 21:13:07 +08:00
neilpang 3576754c21 fix https://github.com/Neilpang/acme.sh/issues/549 2017-04-05 20:54:53 +08:00
neil 6c3a0bc72c Merge pull request #773 from Neilpang/dev
minor, add more error message
2017-04-05 20:48:21 +08:00
neilpang 49d75a0cd4 minor, add more error message 2017-04-05 20:46:17 +08:00
neil 756dbac39f Merge pull request #771 from Neilpang/dev
add more debug info
2017-04-04 22:34:19 +08:00
neilpang 7df062b7d7 add more debug info 2017-04-04 22:33:26 +08:00
neil e485e8f60d Merge pull request #770 from Neilpang/dev
Dev
2017-04-04 15:55:53 +08:00
neil fde8ea081a Merge pull request #769 from Neilpang/aws
Aws
2017-04-04 15:55:30 +08:00
neilpang f7217c5f26 fix format 2017-04-04 15:54:45 +08:00
neilpang fd77e463a1 fix aws 2017-04-04 14:34:23 +08:00
shar0119 6d7f6750e9 Updated author name and link to report bugs 2017-04-03 21:22:58 -07:00
shar0119 695482ded7 Added author name and link to report bugs 2017-04-03 21:21:50 -07:00
neilpang fc9649dbc4 fix aws 2017-04-04 10:02:45 +08:00
shar0119 afb67d375f Updated README.md (2 of 2) 2017-04-03 14:01:40 -07:00
shar0119 66e38ae69e Updated Readme.md file (1 of 2) 2017-04-03 13:46:39 -07:00
neilpang 1f4e64f81d Truncated request for more than 100 domains. 2017-04-04 00:21:39 +08:00
neil ad541f713d Merge pull request #764 from Neilpang/dev
v2.6.8 support Docker
2017-04-03 12:23:00 +08:00
neilpang f3b434397b v2.6.8 support Docker 2017-04-03 12:08:38 +08:00
neil 1d5d49312c Merge pull request #757 from Neilpang/dev
fix format
2017-03-30 21:34:50 +08:00
neilpang 232c7361a9 fix format 2017-03-30 21:34:15 +08:00
neil 721543653b Merge pull request #756 from Neilpang/dev
add retry for issuer cert
2017-03-30 21:26:23 +08:00
neilpang d8ba26e664 add retry for issuer cert 2017-03-30 21:16:25 +08:00
neil 7ecabeac97 Merge pull request #753 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/751
2017-03-29 10:02:55 +08:00
neil 6cf7be4b7e fix https://github.com/Neilpang/acme.sh/issues/751 2017-03-29 09:16:22 +08:00
neil 5f2e56674c Merge pull request #752 from Neilpang/dev
export Le_Domain for reloadcmd
2017-03-29 09:11:20 +08:00
neil 58d4c74b0b export Le_Domain for reloadcmd
fix https://github.com/Neilpang/acme.sh/issues/558#issuecomment-289926193
2017-03-29 09:10:42 +08:00
shar0119 e137792efd Commented out Dynu_ClientId and Dynu_Secret 2017-03-28 08:11:04 -07:00
shar0119 b7b934913e Removed unnecessary spaces 2017-03-27 13:39:31 -07:00
shar0119 cd8fcbf9c6 Spaces in assignment removed. 2017-03-27 12:38:12 -07:00
shar0119 d0300d4443 Changes as requested per Commit 9c90b21
In dnsapi/dns_dynu.sh line 115:
  export _H1="Authorization: Basic $(printf "%s" "$Dynu_ClientId:$Dynu_Secret" | _base64)"
         ^-- SC2155: Declare and assign separately to avoid masking return values.
2017-03-27 12:27:21 -07:00
neil 40acd9a4c3 Merge pull request #746 from Neilpang/dev
Dev
2017-03-26 14:02:38 +08:00
neil e66b4d5390 Merge pull request #745 from jsoref/spelling
Spelling fixes
2017-03-26 13:53:56 +08:00
Josh Soref f94433e504 spelling: validation 2017-03-26 05:32:29 +00:00
Josh Soref 7f32488b78 spelling: subdomain 2017-03-26 05:31:35 +00:00
Josh Soref 8f73e24175 spelling: specifies 2017-03-26 05:31:12 +00:00
Josh Soref f3c984281c spelling: specified 2017-03-26 05:30:58 +00:00
Josh Soref 00777a10ae spelling: security 2017-03-26 05:30:43 +00:00
Josh Soref 0d6ce9f977 spelling: satisfy 2017-03-26 05:30:26 +00:00
Josh Soref 997c517ba2 spelling: return 2017-03-26 05:30:15 +00:00
Josh Soref 849bed4bef spelling: requires 2017-03-26 05:30:03 +00:00
Josh Soref 61a48a5b9f spelling: please 2017-03-26 05:29:30 +00:00
Josh Soref df14085ec8 spelling: oops 2017-03-26 05:29:11 +00:00
Josh Soref 00b34eb2a4 spelling: occurred 2017-03-26 05:28:57 +00:00
Josh Soref 84a6730b1a spelling: obtain 2017-03-26 05:28:37 +00:00
Josh Soref 357b514bc9 spelling: lines 2017-03-26 05:28:04 +00:00
Josh Soref d39b108274 spelling: function 2017-03-26 05:27:04 +00:00
Josh Soref 39f3239682 spelling: following 2017-03-26 05:26:55 +00:00
Josh Soref 506f36b26d spelling: embedded 2017-03-26 05:26:43 +00:00
Josh Soref 4cedbf80df spelling: delimiter 2017-03-26 05:26:20 +00:00
Josh Soref b54ce31078 spelling: changing 2017-03-26 05:25:23 +00:00
Josh Soref 9b2aa974ba spelling: changed 2017-03-26 05:25:31 +00:00
Josh Soref 291c97dc81 spelling: challenge 2017-03-26 05:25:04 +00:00
Josh Soref bcbecff6f6 spelling: certificate 2017-03-26 05:24:52 +00:00
Josh Soref 3d22708f67 spelling: automatically 2017-03-26 05:24:38 +00:00
Josh Soref 8afd31902f spelling: application 2017-03-26 05:24:26 +00:00
neil d1a2208196 Merge pull request #744 from Neilpang/dev
Dev
2017-03-24 19:20:46 +08:00
neil 42d1fe5422 Merge pull request #742 from jasonkeller/dev
Add infoblox api support
2017-03-24 09:22:03 +08:00
Jason 1424e8a2de Added attribution 2017-03-23 20:20:04 -05:00
Jason 7dc548b4b8 MORE bs 2017-03-23 15:06:37 -05:00
Jason 2c37d94611 More bs 2017-03-23 14:40:09 -05:00
Jason b1e4a7c615 Fixed (hopefully) TravisCI errors 2017-03-23 14:34:29 -05:00
Jason b0561058c6 Infoblox API 2017-03-23 14:16:31 -05:00
Jason d039295070 Added Infoblox references 2017-03-23 14:15:17 -05:00
Jason 4ddafb8e84 Added Infoblox reference 2017-03-23 14:14:28 -05:00
neil a536231ded Merge pull request #741 from Neilpang/dev
update doc
2017-03-22 22:59:13 +08:00
neilpang 13fe54c938 update doc 2017-03-22 22:58:03 +08:00
neil d54ffdd187 Merge pull request #740 from Neilpang/dev
rename parameters
2017-03-22 21:53:36 +08:00
neilpang 5c539af7d7 rename parameters 2017-03-22 21:20:35 +08:00
neil 47d9a9cf20 Merge pull request #738 from Neilpang/dev
Dev
2017-03-22 20:54:21 +08:00
neil 7f25205aeb Merge pull request #732 from jtbr/curl-patch
--ca-path patch for curl/wget ssl support
2017-03-22 20:53:58 +08:00
neil 7ebecf3851 Merge pull request #737 from Neilpang/dev
Dev
2017-03-21 22:42:29 +08:00
neil 0a5eaec0f2 Merge pull request #733 from jtbr/busybox-netstat
Busybox netstat
2017-03-21 22:26:39 +08:00
jtbr 4bdab73dd5 formatting 2017-03-20 18:53:08 +01:00
jtbr f19f21007c formatting 2017-03-20 18:51:45 +01:00
jtbr f21dd9117d Handle case of busybox netstat, with no pid support 2017-03-19 17:55:26 +01:00
jtbr 2aa75f034f Adds support for --ca-path option for using non-default curl/wget CA certs 2017-03-19 16:10:09 +01:00
shar0119 5c78e0a462 removed source acme.sh 2017-03-16 13:42:30 -07:00
neil 52cdedcba0 Merge pull request #730 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/729 https://github.com…
2017-03-16 18:43:38 +08:00
neil c87cd0de73 fix https://github.com/Neilpang/acme.sh/issues/729 https://github.com/Neilpang/acme.sh/issues/721 2017-03-16 18:02:36 +08:00
neil 12530655df Merge pull request #727 from Neilpang/dev
Dev
2017-03-16 13:06:11 +08:00
neil 7479706b29 Merge pull request #723 from ClouDNS/master
Add DNS API support for ClouDNS
2017-03-16 13:05:12 +08:00
shar0119 7044236824 Create dns_dynu.sh
Add DNS API support for Dynu.
2017-03-15 11:40:32 -07:00
boyanpeychev 3e9478b58d Update README information for ClouDNS 2017-03-15 17:25:01 +02:00
boyanpeychev 5ffca2d138 Update cotnact details 2017-03-15 17:16:54 +02:00
neil a8d4a98621 Merge pull request #725 from Neilpang/dev
Dev
2017-03-15 23:09:55 +08:00
neilpang 905f7f4ecc Merge branch 'dev' of https://github.com/Neilpang/acme.sh into dev 2017-03-15 22:53:27 +08:00
neilpang 819d2bc560 fix for wget. fix https://github.com/Neilpang/acme.sh/issues/724#issuecomment-286761682 2017-03-15 22:52:57 +08:00
boyanpeychev c0b2027588 add ClouDNS to the list in the main README file 2017-03-15 15:58:04 +02:00
boyanpeychev 136d1b04b5 some additional fixes and removed awk 2017-03-15 15:52:05 +02:00
boyanpeychev f063dd195e some additional fixes and removed awk 2017-03-15 15:49:14 +02:00
boyanpeychev be972fc0b5 fixes for the comments in #723 2017-03-15 10:00:21 +02:00
boyanpeychev ac11ba3d60 Add DNS API for ClouDNS 2017-03-14 15:12:02 +02:00
boyanpeychev 3d8598654c Add DNS API for ClouDNS 2017-03-14 14:43:43 +02:00
boyanpeychev 55a5da2102 Add DNS API for ClouDNS 2017-03-14 14:42:51 +02:00
boyanpeychev f881d6c44f Add DNS API for ClouDNS 2017-03-14 14:40:18 +02:00
boyanpeychev 5df2ca3ef3 Add DNS API for ClouDNS 2017-03-14 14:38:02 +02:00
boyanpeychev a15f87ae39 Add DNS API for ClouDNS 2017-03-14 14:26:57 +02:00
boyanpeychev 0dd6377fe6 Add DNS API for ClouDNS 2017-03-14 14:25:50 +02:00
boyanpeychev c7257e0a3c Add DNS API for ClouDNS 2017-03-14 14:20:58 +02:00
boyanpeychev 3b7fbcd0c3 Add DNS API support for ClouDNS 2017-03-14 13:24:09 +02:00
neil 5fe91af6c3 Merge pull request #720 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/719
2017-03-13 11:21:33 +08:00
neil 4dd646a424 fix https://github.com/Neilpang/acme.sh/issues/719 2017-03-13 11:18:04 +08:00
neil dcbd90ce04 Merge pull request #718 from Neilpang/dev
fix cloudxns api https://github.com/Neilpang/acme.sh/issues/717
2017-03-11 10:08:00 +08:00
neilpang 04683338a2 fix cloudxns api https://github.com/Neilpang/acme.sh/issues/717 2017-03-11 10:06:40 +08:00
neil b778f9c40e Merge pull request #716 from Neilpang/dev
Dev
2017-03-09 21:29:11 +08:00
neil e0a96be378 Merge pull request #715 from gitwer/dev
Add DigitalOcean automatic DNS API support (native)
2017-03-09 21:27:06 +08:00
thewer ac690fceaf Added DigitalOcean (native) API that requires only a read/write API key for DigitalOcean, updated 2 reads files. 2017-03-09 22:28:30 +10:00
nytral 1e5e03cc46 typo... 2017-03-08 22:22:48 +01:00
nytral d3c4cd8270 bugfix 2017-03-08 22:21:25 +01:00
nytral 17361df66b cleanup 2017-03-08 22:15:07 +01:00
nytral 7d0452c7e3 added NS1. support 2017-03-08 22:12:37 +01:00
neilpang dd0b0cae93 Merge branch 'dev' of https://github.com/Neilpang/acme.sh into dev 2017-03-08 21:51:54 +08:00
neilpang c4bf5eef73 add _upper_case and _lower_case 2017-03-08 21:51:25 +08:00
neil 2587639914 Merge pull request #713 from Neilpang/dev
Dev
2017-03-08 21:36:45 +08:00
neil bfa1ae59cc Merge pull request #701 from csmk/knot_dns_api
Add support for Knot DNS API
2017-03-08 21:36:08 +08:00
neil 9e8575c315 Merge pull request #712 from Neilpang/dev
Dev
2017-03-08 21:24:33 +08:00
neil e36340ce64 Merge pull request #711 from Neilpang/links
Links
2017-03-08 21:24:13 +08:00
neilpang 63ec05a66c fix links 2017-03-08 21:23:12 +08:00
neilpang 6f1c72f5b4 add links 2017-03-08 21:21:15 +08:00
neil 27924ffd5b Merge pull request #710 from Neilpang/dev
Dev
2017-03-08 20:51:53 +08:00
neil 527029574c Merge pull request #702 from hiskang/deploy/keychain
deploy for OSX Keychain
2017-03-08 20:51:23 +08:00
neil cf3aeafcdb Merge pull request #709 from Neilpang/dev
fix nginx mode
2017-03-08 16:02:45 +08:00
neil f08a79d372 fix nginx mode 2017-03-08 16:01:14 +08:00
neil eb2a26cfaa Merge pull request #708 from Neilpang/dev
fix nginx mode
2017-03-08 13:57:01 +08:00
neil 5378d9ca26 fix nginx mode 2017-03-08 13:55:01 +08:00
hiska bce11af09a Update README.md for OSX Keychain 2017-03-08 08:00:17 +09:00
csmk f589a1d245 Fix format: use double quote to prevent globbing and word splitting 2017-03-07 22:21:22 +09:00
hiska 68eb627d62 deploy for OSX Keychain 2017-03-06 11:09:12 +09:00
csmk 9c87a5890d Add support for Knot DNS API
The script is actually an adapted version of the `dns_nsupdate.sh` script,
as the `knsupdate` utility is quite similar to `nsupdate`.
2017-03-05 22:18:31 +09:00
neil e538a13e28 Merge pull request #698 from Neilpang/dev
minor fix comments
2017-03-05 19:56:43 +08:00
neilpang 6fb2a1ed39 minor fix comments 2017-03-05 19:56:06 +08:00
neil 6b00787f45 Merge pull request #695 from Neilpang/dev
Dev
2017-03-03 22:04:09 +08:00
neilpang e735d8d4e5 minor 2017-03-03 22:03:19 +08:00
neil 8cd4fd0b50 Merge pull request #692 from fwolfst/issue690_COSMETIC-COMMENT-APACHE-FIX
Issue690 cosmetic comment apache fix
2017-03-02 16:00:08 +08:00
Felix Wolfsteller 8f4b0559ce Merge branch 'issue690_COSMETIC-COMMENT-APACHE-FIX' of github.com:fwolfst/acme.sh into issue690_COSMETIC-COMMENT-APACHE-FIX 2017-03-02 08:39:56 +01:00
Felix Wolfsteller 5288c54aad deploy apache script: fix comment (dovecot/apache)
Closes #690 .
2017-03-02 08:39:31 +01:00
Felix Wolfsteller 51f8bec81b deploy apache script: fix comment (dovecot/apache) 2017-03-02 08:38:25 +01:00
neil 49d3e5d324 Merge pull request #689 from Neilpang/dev
Dev
2017-03-02 13:19:29 +08:00
neil 1fff0e5592 Merge pull request #686 from justmwa/master
Adding delete support for DNSMadeEasy and LUA API
2017-03-02 13:18:29 +08:00
nytral 8d53ec5353 fixed validation, added LUA while I'm at it 2017-03-01 19:38:02 +01:00
nytral a1e1bfc71b removed useless code 2017-03-01 19:20:16 +01:00
nytral 29992f54a3 delete support for dns_me 2017-03-01 18:28:39 +01:00
nytral 4ab6786163 Merge remote-tracking branch 'upstream/master' 2017-03-01 18:03:39 +01:00
neil eaad34a69a Merge pull request #685 from Neilpang/dev
Dev
2017-03-01 19:20:12 +08:00
neilpang 839f18d052 fix format 2017-03-01 19:17:20 +08:00
neil 58ef6d8385 fix wget error message 2017-03-01 13:12:29 +08:00
neil a0037c9333 Merge pull request #683 from Neilpang/dev
Dev
2017-02-28 22:16:58 +08:00
neilpang 177b57e1c0 fix wget content on 404 error 2017-02-28 21:35:20 +08:00
neilpang 810c129ca9 minor fix error message 2017-02-28 21:08:20 +08:00
neilpang f731a4c704 fix 404 for wget 2017-02-28 21:06:02 +08:00
neilpang 39a1f1ef64 fix 404 for wget 2017-02-28 21:04:33 +08:00
neilpang d24a87caf1 minor 2017-02-28 20:56:11 +08:00
neilpang 9683ffe13a minor fix error message 2017-02-28 20:39:23 +08:00
Frederic Crozat fab2d9dc6a add API for Gandi LiveDNS (#680)
* add API for Gandi LiveDNS

* ensure Gandi API key is saved for renewing certificate.

* gandi_livedns: use PUT instead of POST for creating DNS record

* gandi_livedns: fix formatting

* dns_gandi_livedns: fix shellcheck errors
2017-02-28 19:58:04 +08:00
neil 59f7a2f6ef Wget (#678) (#679)
* --use-wget force to use wget

* fix force wget
2017-02-27 20:54:38 +08:00
neil 9b12407028 Wget (#678)
* --use-wget force to use wget

* fix force wget
2017-02-27 20:48:48 +08:00
neil 96c4bb7fd0 Merge pull request #677 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/667#issuecomment-28262…
2017-02-27 13:44:15 +08:00
neil 81532f375e fix https://github.com/Neilpang/acme.sh/issues/667#issuecomment-282629936 2017-02-27 13:38:29 +08:00
neil 79eb8e2b35 Merge pull request #676 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/675
2017-02-26 22:23:39 +08:00
neilpang 7c2e875494 fix https://github.com/Neilpang/acme.sh/issues/675 2017-02-26 22:20:08 +08:00
neil c715b4637d Merge pull request #674 from Neilpang/dev
Dev
2017-02-26 12:48:53 +08:00
neilpang c719a61ea7 fix format 2017-02-26 12:15:39 +08:00
neilpang 58e4d337e4 clear the pending authz when issue error
fix bug https://github.com/Neilpang/acme.sh/issues/663
2017-02-26 12:07:06 +08:00
neil 509c802045 Merge pull request #673 from Neilpang/dev
fix ci
2017-02-25 21:49:29 +08:00
neilpang 4fd63f4e30 fix ci 2017-02-25 21:22:56 +08:00
neil f5c28c72fd Merge pull request #672 from Neilpang/dev
fix format
2017-02-25 21:09:43 +08:00
neilpang 342128a457 fix format 2017-02-25 21:09:06 +08:00
neil b1931828e1 Merge pull request #671 from Neilpang/dev
add --toPkcs8 command
2017-02-25 19:34:29 +08:00
neilpang 4410226db1 add --toPkcs8 command
fix https://github.com/Neilpang/acme.sh/issues/664
2017-02-25 19:31:52 +08:00
neil 945bd4b1b0 Merge pull request #670 from Neilpang/dev
fix format
2017-02-25 19:12:47 +08:00
neilpang 77f1ea40cd fix format 2017-02-25 19:12:20 +08:00
neil 98c8c7ce0d Merge pull request #669 from Neilpang/dev
Dev
2017-02-25 19:10:19 +08:00
neilpang 795bf9e101 Merge branch 'dev' of https://github.com/Neilpang/acme.sh into dev 2017-02-25 19:08:16 +08:00
neilpang 851fedf751 rename OPENSSL_BIN to ACME_OPENSSL_BIN 2017-02-25 19:08:00 +08:00
neil 5be6ab8c89 Merge pull request #432 from seidler2547/dev
add API for www.do.de/www.resellerinterface.de
2017-02-25 18:27:59 +08:00
neil 3670412c7c Merge pull request #668 from Neilpang/dev
Dev
2017-02-25 18:03:38 +08:00
neilpang e6cd596dc9 add debug info 2017-02-25 18:02:23 +08:00
Stefan Seidel abf4278d09 resolve conflicts 2017-02-23 21:02:21 +00:00
seidler2547 2b2b65fe18 Declare and assign separately to avoid masking return values 2017-02-23 21:00:40 +00:00
Stefan Seidel 3d6a125bdc add documentation 2017-02-23 21:00:40 +00:00
seidler2547 9efd40a366 use export for headers 2017-02-23 20:59:12 +00:00
seidler2547 383fa8401d Remove stray characater
fixes issue where the first listed domain would not work
2017-02-23 20:59:12 +00:00
seidler2547 bf8ffade29 replace head -1, add link to GitHub 2017-02-23 20:59:12 +00:00
seidler2547 1633d14547 forgot dollar sign 2017-02-23 20:59:12 +00:00
seidler2547 e55605dbe9 remove _all_ mktemp 2017-02-23 20:59:12 +00:00
seidler2547 cdec38ba12 return error if any removal failed 2017-02-23 20:59:12 +00:00
seidler2547 1cb6e9e7d0 remove cookiejar file
d'oh
2017-02-23 20:59:12 +00:00
Stefan Seidel d1d2f6f451 avoid temp file for domain list 2017-02-23 20:59:12 +00:00
Stefan Seidel 743f821f1e improve error message on failed authentication 2017-02-23 20:59:12 +00:00
Stefan Seidel b95a99e0c2 remove cookiejar temp file 2017-02-23 20:59:12 +00:00
Stefan Seidel 3ebbeb103c old habits 2017-02-23 20:59:12 +00:00
Stefan Seidel 0d4035e996 remove fgrep, escape regex chars instead 2017-02-23 20:59:12 +00:00
Stefan Seidel 88ed5e506a fix whitespace and UUOC 2017-02-23 20:59:12 +00:00
Stefan Seidel 76a3371b40 remove non-POSIX sed -r and use built-in functions 2017-02-23 20:59:12 +00:00
Stefan Seidel 7b2fa1edb4 add API for www.do.de/www.resellerinterface.de 2017-02-23 20:59:12 +00:00
neilpang 1965035166 support exim4 deploy 2017-02-23 20:03:03 +08:00
neil 76d4ff056a Merge pull request #660 from Neilpang/dev
fix doc
2017-02-23 19:05:43 +08:00
neilpang a239a9efd5 fix doc 2017-02-23 19:04:08 +08:00
neil 4747e7c5b9 Merge pull request #659 from Neilpang/dev
fix doc
2017-02-23 19:02:38 +08:00
neilpang 35ca729cb9 fix doc 2017-02-23 19:01:48 +08:00
neil a0fa7421d1 Merge pull request #658 from Neilpang/dev
support deploy vsftpd
2017-02-23 19:00:38 +08:00
neilpang ddf293bbcd reload only for renewal 2017-02-22 20:40:33 +08:00
neilpang 45d6e00ff1 fix format 2017-02-22 20:17:36 +08:00
neilpang 6dfc8fe0ea support vsftpd hook 2017-02-21 23:18:11 +08:00
neil 96f106d6aa Merge pull request #654 from Neilpang/dev
change installcert parameter order
2017-02-21 21:40:09 +08:00
neilpang 044da37c95 change installcert parameter order 2017-02-21 21:34:43 +08:00
neil 086444c73a Merge pull request #650 from Neilpang/dev
Dev
2017-02-20 20:19:48 +08:00
neilpang 1efb2085e9 fix debug info 2017-02-20 20:18:58 +08:00
neil e1c42eb6cc Merge pull request #414 from noplanman/cyon_dns_api
Cyon.ch DNS API
2017-02-20 19:13:35 +08:00
neil a2da26cbdd Merge pull request #648 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/614
2017-02-20 19:11:22 +08:00
neil 8796adfd63 fix https://github.com/Neilpang/acme.sh/issues/614 2017-02-20 18:03:16 +08:00
neil 95a6c28d98 Merge pull request #645 from Neilpang/dev
Dev
2017-02-19 22:44:51 +08:00
neilpang 85e1f4ea13 refactor parameters 2017-02-19 22:09:22 +08:00
neilpang d9c9114b3b refactor key length 2017-02-19 21:21:11 +08:00
neilpang 02140ce763 refactor alt domains 2017-02-19 21:18:00 +08:00
neilpang af1cc3b331 refactor params 2017-02-19 21:13:00 +08:00
neil e852044b64 Merge pull request #644 from Neilpang/dev
Dev
2017-02-19 20:54:19 +08:00
neilpang f845b371ce fix format 2017-02-19 20:40:53 +08:00
neilpang 3a1bd3114b add hooks, not implemented yet. 2017-02-19 20:35:32 +08:00
Armando Lüscher a6d2e3a1e6 Suppress shellcheck warnings. 2017-02-19 13:26:32 +01:00
neilpang 93bce1b24c support multiple deploy hook
fix https://github.com/Neilpang/acme.sh/issues/508
2017-02-19 20:15:00 +08:00
neil 7b87f29c9c Merge pull request #643 from Neilpang/dev
Dev
2017-02-19 18:20:29 +08:00
neil cb6f622957 Update README.md 2017-02-19 18:19:24 +08:00
neil 43d3b51bde Update README.md 2017-02-19 18:16:12 +08:00
neil 57e015155a Merge pull request #642 from Neilpang/dev
Dev
2017-02-19 13:31:27 +08:00
neil 2436d7e0ba Merge pull request #641 from Neilpang/secure
secure debug message
2017-02-19 13:30:59 +08:00
neilpang e6e85b0c55 secure debug message 2017-02-19 13:24:00 +08:00
neil e43fd39594 Merge pull request #640 from Neilpang/dev
fix syslog doc
2017-02-19 12:56:07 +08:00
neilpang 52765466c1 fix syslog doc 2017-02-19 12:55:05 +08:00
neil e02bede4f5 Merge pull request #639 from Neilpang/dev
fix syslog level
2017-02-19 12:43:26 +08:00
neilpang 113089be5d fix syslog level 2017-02-19 12:42:37 +08:00
neil dca163f54d Merge pull request #638 from Neilpang/dev
fix syslog
2017-02-19 12:18:52 +08:00
neilpang fc6cf4d963 fix syslog 2017-02-19 12:13:18 +08:00
neil 4126c7e188 Merge pull request #636 from Neilpang/dev
minor use interactive _sleep
2017-02-18 12:04:11 +08:00
neilpang db50462920 minor use interactive _sleep 2017-02-18 12:03:21 +08:00
neil 9310b44cef Merge pull request #635 from Neilpang/dev
fix for freebsd
2017-02-18 10:32:51 +08:00
neilpang 6480250221 fix for freebsd 2017-02-18 10:31:18 +08:00
neil b88e64f0d0 Merge pull request #632 from Neilpang/dev
compatible to openssl 0.9 for hmac function
2017-02-17 23:20:59 +08:00
neilpang c70432996a compatible to openssl 0.9 for hmac function 2017-02-17 23:06:39 +08:00
neil c6dcf2a0e2 Merge pull request #631 from Neilpang/dev
Dev
2017-02-17 20:13:55 +08:00
neil 2aec627503 Merge pull request #630 from Neilpang/nonce
Nonce
2017-02-17 20:13:13 +08:00
neil b7924ce58b fix format 2017-02-17 14:40:58 +08:00
neil 0bc745f68f retry if nonce is invalid
fix https://github.com/Neilpang/acme.sh/issues/627
2017-02-17 13:51:17 +08:00
neil 8acdf823a2 Merge pull request #626 from Neilpang/dev
Dev
2017-02-16 22:56:19 +08:00
neilpang 52f8b787c9 fix https://github.com/Neilpang/acme.sh/issues/622 2017-02-16 22:37:32 +08:00
neilpang ad153ae041 fix https://github.com/Neilpang/acme.sh/issues/622 2017-02-16 22:29:08 +08:00
neil 2527f8f599 Merge pull request #621 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/614
2017-02-15 21:09:46 +08:00
neilpang 72af092cc1 fix https://github.com/Neilpang/acme.sh/issues/614 2017-02-15 21:09:01 +08:00
neil 2751060b91 Merge pull request #620 from Neilpang/dev
support nginx mode
2017-02-15 20:33:22 +08:00
neil b3449db2f8 Merge pull request #619 from Neilpang/nginx
support nginx mode
2017-02-15 20:31:02 +08:00
neilpang 7db28745c8 start v2.6.7 2017-02-15 20:28:50 +08:00
neilpang 6921211461 fix debug message 2017-02-15 20:24:24 +08:00
neilpang 9f90618a70 fix https://github.com/Neilpang/acme.sh/issues/617 2017-02-14 23:57:00 +08:00
neilpang 302c41edc9 fix format 2017-02-14 22:41:34 +08:00
neilpang 5d943a35f8 fix https://github.com/Neilpang/acme.sh/issues/616 2017-02-14 22:12:58 +08:00
neilpang 03f8d6e946 fix https://github.com/Neilpang/acme.sh/issues/615 2017-02-14 22:03:48 +08:00
neilpang 9d725af602 support nginx mode 2017-02-13 23:29:37 +08:00
Armando Lüscher 3e1418d662 Use gloo item key for environment change, to support different account types.
(this isn't working 100% yet, still looking for a solution)
2017-02-12 12:30:06 +01:00
Armando Lüscher 884f70fb39 Remove square brackets from ranges.
Export curl header variables.
2017-02-12 12:24:58 +01:00
Armando Lüscher 9499a1142b Remove custom URL encoding and use library's implementation. 2017-02-12 12:24:58 +01:00
Armando Lüscher 6e8dcdce78 Satisfy shellcheck. 2017-02-12 12:24:58 +01:00
Armando Lüscher ce9fae82bd Update cookie retrieval using _egrep_o (thanks @Neilpang) 2017-02-12 12:24:57 +01:00
Armando Lüscher afa3fc8bf9 Adapt to use general naming rule for account variables. 2017-02-12 12:24:57 +01:00
Armando Lüscher 09eccf6fc0 Use more flexible version of uppercase to lowercase conversion. 2017-02-12 12:24:57 +01:00
Armando Lüscher edfefb6763 Add usage instructions and repo link to post issues. 2017-02-12 12:24:57 +01:00
Armando Lüscher 98b3dcbf37 Prefix all private functions with _cyon.
Satisfy shellcheck.
2017-02-12 12:22:50 +01:00
Armando Lüscher 2698ef6c5f Return instead of exit.
Clear OTP secret if environment variable is set to empty. This is for when the 2FA is disabled.
Rename `_is_idn` function to `_is_idn_cyon`.
Remove usage of curl (except for URL encoding of data).
Instead of cleaning up the cookie jar, get rid of it completely and logout of cyon instead.
2017-02-12 12:22:49 +01:00
Armando Lüscher 46b2ee3bae Replace all echos with printf. 2017-02-12 12:22:49 +01:00
Armando Lüscher e7ee3a7dd5 Remove jq completely to not require it as a dependency. 2017-02-12 12:22:49 +01:00
Armando Lüscher 0085e6f83b Don't use jq to fetch list of DNS entries to be deleted. 2017-02-12 12:22:49 +01:00
Armando Lüscher c90fa3bcfc Fix problems found by travis. 2017-02-12 12:22:49 +01:00
Armando Lüscher 0ec9b9823f Add DNS API for cyon.ch 2017-02-12 12:22:48 +01:00
nytral e82ea94bb6 Merge remote-tracking branch 'upstream/master' 2017-02-05 13:56:10 +01:00
nytral a9b15f1c36 Merge remote-tracking branch 'upstream/master' 2016-11-14 22:06:58 +01:00
nytral 764963e986 sync upstream 2016-11-09 16:25:24 +01:00
nytral 22b83d7630 _hmac use and generic date 2016-11-08 15:56:46 +01:00
nytral 0b5bff01e1 s/bash/sh/ 2016-11-08 14:13:05 +01:00
nytral 4fe7b6cd65 better bugfix 2016-11-07 22:16:53 +01:00
nytral 49e1f7d8bf bugfix 2016-11-07 22:16:00 +01:00
nytral 803fb243bf adding DNSMadeEasy API 2016-11-07 21:50:59 +01:00
38 changed files with 3929 additions and 504 deletions

No files matched your search

+3 -3
View File
@@ -26,9 +26,9 @@ install:
_old_path="$PATH";
echo "PATH=$PATH";
export PATH="";
export OPENSSL_BIN="/usr/local/openssl";
export ACME_OPENSSL_BIN="/usr/local/openssl";
openssl version 2>&1 || true;
$OPENSSL_BIN version 2>&1 || true;
$ACME_OPENSSL_BIN version 2>&1 || true;
export PATH="$_old_path";
fi
@@ -44,7 +44,7 @@ script:
- 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
- if [ "$TRAVIS_OS_NAME" = "osx" -a "$NGROK_TOKEN" ]; then sudo TEST_LOCAL="$TEST_LOCAL" NGROK_TOKEN="$NGROK_TOKEN" OPENSSL_BIN="$OPENSSL_BIN" ./letest.sh ; fi
- if [ "$TRAVIS_OS_NAME" = "osx" -a "$NGROK_TOKEN" ]; then sudo TEST_LOCAL="$TEST_LOCAL" NGROK_TOKEN="$NGROK_TOKEN" ACME_OPENSSL_BIN="$ACME_OPENSSL_BIN" ./letest.sh ; fi
matrix:
+61
View File
@@ -0,0 +1,61 @@
FROM alpine
RUN apk update -f \
&& apk --no-cache add -f \
openssl \
curl \
netcat-openbsd \
&& rm -rf /var/cache/apk/*
ENV LE_CONFIG_HOME /acme.sh
ENV AUTO_UPGRADE 1
#Install
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 for verb in help \
version \
install \
uninstall \
upgrade \
issue \
signcsr \
deploy \
install-cert \
renew \
renew-all \
revoke \
remove \
list \
showcsr \
install-cronjob \
uninstall-cronjob \
cron \
toPkcs \
toPkcs8 \
update-account \
register-account \
create-account-key \
create-domain-key \
createCSR \
deactivate \
; 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 \
else \n \
/root/.acme.sh/acme.sh --config-home /acme.sh \"\$@\"\n \
fi" >/entry.sh && chmod +x /entry.sh
VOLUME /acme.sh
ENTRYPOINT ["/entry.sh"]
CMD ["--help"]
+96 -27
View File
@@ -1,4 +1,6 @@
# 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)
[![Join the chat at https://gitter.im/acme-sh/Lobby](https://badges.gitter.im/acme-sh/Lobby.svg)](https://gitter.im/acme-sh/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
- An ACME protocol client written purely in Shell (Unix shell) language.
- Full ACME protocol implementation.
- Simple, powerful and very easy to use. You only need 3 minutes to learn it.
@@ -7,17 +9,33 @@
- Purely written in Shell with no dependencies on python or the official Let's Encrypt client.
- Just one script to issue, renew and install your certificates automatically.
- DOES NOT require `root/sudoer` access.
- Docker friendly
- IPv6 support
It's probably the `easiest&smallest&smartest` shell script to automatically issue & renew the free certificates from Let's Encrypt.
It's probably the `easiest & smartest` shell script to automatically issue & renew the free certificates from Let's Encrypt.
Wiki: https://github.com/Neilpang/acme.sh/wiki
For Docker Fans: [acme.sh :two_hearts: Docker ](https://github.com/Neilpang/acme.sh/wiki/Run-acme.sh-in-docker)
Twitter: [@neilpangxa](https://twitter.com/neilpangxa)
# [中文说明](https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E)
# Who are using **acme.sh**
- [FreeBSD.org](https://blog.crashed.org/letsencrypt-in-freebsd-org/)
- [ruby-china.org](https://ruby-china.org/topics/31983)
- [Proxmox](https://pve.proxmox.com/wiki/HTTPS_Certificate_Configuration_(Version_4.x_and_newer))
- [pfsense](https://github.com/pfsense/FreeBSD-ports/pull/89)
- [webfaction](https://community.webfaction.com/questions/19988/using-letsencrypt)
- [Loadbalancer.org](https://www.loadbalancer.org/blog/loadbalancer-org-with-lets-encrypt-quick-and-dirty)
- [discourse.org](https://meta.discourse.org/t/setting-up-lets-encrypt/40709)
- [Centminmod](http://centminmod.com/letsencrypt-acmetool-https.html)
- [splynx](https://forum.splynx.com/t/free-ssl-cert-for-splynx-lets-encrypt/297)
- [archlinux](https://aur.archlinux.org/packages/acme.sh-git/)
- [opnsense.org](https://github.com/opnsense/plugins/tree/master/security/acme-client/src/opnsense/scripts/OPNsense/AcmeClient)
- [more...](https://github.com/Neilpang/acme.sh/wiki/Blogs-and-tutorials)
# Tested OS
@@ -44,7 +62,7 @@ Twitter: [@neilpangxa](https://twitter.com/neilpangxa)
|19|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/gentoo-stage3-amd64.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Gentoo Linux
|20|[![Build Status](https://travis-ci.org/Neilpang/acme.sh.svg?branch=master)](https://travis-ci.org/Neilpang/acme.sh)|Mac OSX
For all build statuses, check our [daily build project](https://github.com/Neilpang/acmetest):
For all build statuses, check our [weekly build project](https://github.com/Neilpang/acmetest):
https://github.com/Neilpang/acmetest
@@ -54,6 +72,7 @@ https://github.com/Neilpang/acmetest
- Webroot mode
- Standalone mode
- Apache mode
- Nginx mode ( Beta )
- DNS mode
- [Stateless mode](https://github.com/Neilpang/acme.sh/wiki/Stateless-Mode)
@@ -120,13 +139,25 @@ root@v1:~# acme.sh -h
acme.sh --issue -d example.com -w /home/wwwroot/example.com
```
or:
```bash
acme.sh --issue -d example.com -w /home/username/public_html
```
or:
```bash
acme.sh --issue -d example.com -w /var/www/html
```
**Example 2:** Multiple domains in the same cert.
```bash
acme.sh --issue -d example.com -d www.example.com -d cp.example.com -w /home/wwwroot/example.com
```
The parameter `/home/wwwroot/example.com` is the web root folder. You **MUST** have `write access` to this folder.
The parameter `/home/wwwroot/example.com` or `/home/username/public_html` or `/var/www/html` is the web root folder where you host your website files. You **MUST** have `write access` to this folder.
Second argument **"example.com"** is the main domain you want to issue the cert for.
You must have at least one domain there.
@@ -148,17 +179,17 @@ You **MUST** use this command to copy the certs to the target files, **DO NOT**
**Apache** example:
```bash
acme.sh --install-cert -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 \
--cert-file /path/to/certfile/in/apache/cert.pem \
--key-file /path/to/keyfile/in/apache/key.pem \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd "service apache2 force-reload"
```
**Nginx** example:
```bash
acme.sh --install-cert -d example.com \
--keypath /path/to/keyfile/in/nginx/key.pem \
--fullchainpath /path/to/fullchain/nginx/cert.pem \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx force-reload"
```
@@ -168,7 +199,7 @@ The ownership and permission info of existing files are preserved. You may want
Install/copy the issued cert/key to the production Apache or Nginx path.
The cert will be `renewed every **60** days by default` (which is configurable). Once the cert is renewed, the Apache/Nginx service will be restarted automatically by the command: `service apache2 restart` or `service nginx restart`.
The cert will be renewed every **60** days by default (which is configurable). Once the cert is renewed, the Apache/Nginx service will be reloaded automatically by the command: `service apache2 force-reload` or `service nginx force-reload`.
# 4. Use Standalone server to issue cert
@@ -215,8 +246,27 @@ acme.sh --issue --apache -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
# 7. Use Nginx mode
# 7. Use DNS mode:
**(requires you to be root/sudoer, since it is required to interact with Nginx server)**
If you are running a web server, Apache or Nginx, it is recommended to use the `Webroot mode`.
Particularly, if you are running an nginx server, you can use nginx mode instead. This mode doesn't write any files to your web root folder.
Just set string "nginx" as the second argument.
It will configure nginx server automatically to verify the domain and then restore the nginx config to the original version.
So, the config is not changed.
```
acme.sh --issue --nginx -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
# 8. Use DNS mode:
Support the `dns-01` challenge.
@@ -247,7 +297,7 @@ acme.sh --renew -d example.com
Ok, it's finished.
# 8. Automatic DNS API integration
# 9. Automatic DNS API integration
If your DNS provider supports API access, we can use that API to automatically issue the certs.
@@ -259,20 +309,38 @@ You don't have to do anything manually!
1. DNSPod.cn API
1. CloudXNS.com API
1. GoDaddy.com API
1. OVH, kimsufi, soyoustart and runabove API
1. AWS Route 53
1. PowerDNS.com API
1. 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.)
1. OVH, kimsufi, soyoustart and runabove API
1. nsupdate API
1. LuaDNS.com API
1. DNSMadeEasy.com API
1. nsupdate API
1. AWS Route 53
1. aliyun.com(阿里云) API
1. ISPConfig 3.1 API
1. Alwaysdata.com API
1. Linode.com API
1. FreeDNS (https://freedns.afraid.org/)
1. cyon.ch
1. Domain-Offensive/Resellerinterface/Domainrobot API
1. Gandi LiveDNS API
1. Knot DNS API
1. DigitalOcean API (native)
1. ClouDNS.net API
1. Infoblox NIOS API (https://www.infoblox.com/)
1. VSCALE (https://vscale.io/)
1. Dynu API (https://www.dynu.com)
1. DNSimple API
1. NS1.com API
And:
1. lexicon DNS API: https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api
(DigitalOcean, DNSimple, DNSMadeEasy, DNSPark, EasyDNS, Namesilo, NS1, PointHQ, Rage4 and Vultr etc.)
**More APIs coming soon...**
If your DNS provider is not on the supported list above, you can write your own DNS API script easily. If you do, please consider submitting a [Pull Request](https://github.com/Neilpang/acme.sh/pulls) and contribute it to the project.
@@ -280,7 +348,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)
# 9. Issue ECC certificates
# 10. Issue ECC certificates
`Let's Encrypt` can now issue **ECDSA** certificates.
@@ -290,7 +358,7 @@ Just set the `length` parameter with a prefix `ec-`.
For example:
### Single domain ECC cerfiticate
### Single domain ECC certificate
```bash
acme.sh --issue -w /home/wwwroot/example.com -d example.com --keylength ec-256
@@ -311,7 +379,7 @@ Valid values are:
3. **ec-521 (secp521r1, "ECDSA P-521", which is not supported by Let's Encrypt yet.)**
# 10. How to renew the issued certs
# 11. How to renew the issued certs
No, you don't need to renew the certs manually. All the certs will be renewed automatically every **60** days.
@@ -328,7 +396,7 @@ acme.sh --renew -d example.com --force --ecc
```
# 11. How to upgrade `acme.sh`
# 12. How to upgrade `acme.sh`
acme.sh is in constant development, so it's strongly recommended to use the latest code.
@@ -353,26 +421,26 @@ acme.sh --upgrade --auto-upgrade 0
```
# 12. Issue a cert from an existing CSR
# 13. Issue a cert from an existing CSR
https://github.com/Neilpang/acme.sh/wiki/Issue-a-cert-from-existing-CSR
# Under the Hood
# 14. Under the Hood
Speak ACME language using shell, directly to "Let's Encrypt".
TODO:
# Acknowledgments
# 15. Acknowledgments
1. Acme-tiny: https://github.com/diafygi/acme-tiny
2. ACME protocol: https://github.com/ietf-wg-acme/acme
3. Certbot: https://github.com/certbot/certbot
# License & Others
# 16. License & Others
License is GPLv3
@@ -381,8 +449,9 @@ Please Star and Fork me.
[Issues](https://github.com/Neilpang/acme.sh/issues) and [pull requests](https://github.com/Neilpang/acme.sh/pulls) are welcome.
# Donate
1. PayPal: donate@acme.sh
# 17. Donate
Your donation makes **acme.sh** better:
1. PayPal/Alipay(支付宝)/Wechat(微信): [https://donate.acme.sh/](https://donate.acme.sh/)
[Donate List](https://github.com/Neilpang/acme.sh/wiki/Donate-list)
+1006 -403
View File
File diff suppressed because it is too large. Load diff
+55 -3
View File
@@ -1,30 +1,82 @@
# Using deploy api
Before you can deploy your cert, you must [issue the cert first](https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert).
Here are the scripts to deploy the certs/key to the server/services.
## 1. Deploy the certs to your cpanel host.
(cpanel deploy hook is not finished yet, this is just an example.)
Before you can deploy your cert, you must [issue the cert first](https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert).
Then you can deploy now:
```sh
export DEPLOY_CPANEL_USER=myusername
export DEPLOY_CPANEL_PASSWORD=PASSWORD
acme.sh --deploy -d example.com --deploy --deploy-hook cpanel
acme.sh --deploy -d example.com --deploy-hook cpanel
```
## 2. Deploy ssl cert on kong proxy engine based on api.
Before you can deploy your cert, you must [issue the cert first](https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert).
Currently supports Kong-v0.10.x.
(TODO)
```sh
acme.sh --deploy -d ftp.example.com --deploy-hook kong
```
## 3. Deploy the cert to remote server through SSH access.
(TODO)
## 4. Deploy the cert to local vsftpd server.
```sh
acme.sh --deploy -d ftp.example.com --deploy-hook vsftpd
```
The default vsftpd conf file is `/etc/vsftpd.conf`, if your vsftpd conf is not in the default location, you can specify one:
```sh
export DEPLOY_VSFTPD_CONF="/etc/vsftpd.conf"
acme.sh --deploy -d ftp.example.com --deploy-hook vsftpd
```
The default command to restart vsftpd server is `service vsftpd restart`, if it doesn't work, you can specify one:
```sh
export DEPLOY_VSFTPD_RELOAD="/etc/init.d/vsftpd restart"
acme.sh --deploy -d ftp.example.com --deploy-hook vsftpd
```
## 5. Deploy the cert to local exim4 server.
```sh
acme.sh --deploy -d ftp.example.com --deploy-hook exim4
```
The default exim4 conf file is `/etc/exim/exim.conf`, if your exim4 conf is not in the default location, you can specify one:
```sh
export DEPLOY_EXIM4_CONF="/etc/exim4/exim4.conf.template"
acme.sh --deploy -d ftp.example.com --deploy-hook exim4
```
The default command to restart exim4 server is `service exim4 restart`, if it doesn't work, you can specify one:
```sh
export DEPLOY_EXIM4_RELOAD="/etc/init.d/exim4 restart"
acme.sh --deploy -d ftp.example.com --deploy-hook exim4
```
## 6. Deploy the cert to OSX Keychain
```sh
acme.sh --deploy -d ftp.example.com --deploy-hook keychain
```
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env sh
#Here is a script to deploy cert to apache server.
#returns 0 means success, otherwise error.
######## Public functions #####################
#domain keyfile certfile cafile fullchain
apache_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 "Deploy cert to apache server, Not implemented yet"
return 1
}
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env sh
#Here is a script to deploy cert to dovecot server.
#returns 0 means success, otherwise error.
######## Public functions #####################
#domain keyfile certfile cafile fullchain
dovecot_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
}
+114
View File
@@ -0,0 +1,114 @@
#!/usr/bin/env sh
#Here is a script to deploy cert to exim4 server.
#returns 0 means success, otherwise error.
#DEPLOY_EXIM4_CONF="/etc/exim/exim.conf"
#DEPLOY_EXIM4_RELOAD="service exim4 restart"
######## Public functions #####################
#domain keyfile certfile cafile fullchain
exim4_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"
_ssl_path="/etc/acme.sh/exim4"
if ! mkdir -p "$_ssl_path"; then
_err "Can not create folder:$_ssl_path"
return 1
fi
_info "Copying key and cert"
_real_key="$_ssl_path/exim4.key"
if ! cat "$_ckey" >"$_real_key"; then
_err "Error: write key file to: $_real_key"
return 1
fi
_real_fullchain="$_ssl_path/exim4.pem"
if ! cat "$_cfullchain" >"$_real_fullchain"; then
_err "Error: write key file to: $_real_fullchain"
return 1
fi
DEFAULT_EXIM4_RELOAD="service exim4 restart"
_reload="${DEPLOY_EXIM4_RELOAD:-$DEFAULT_EXIM4_RELOAD}"
if [ -z "$IS_RENEW" ]; then
DEFAULT_EXIM4_CONF="/etc/exim/exim.conf"
if [ ! -f "$DEFAULT_EXIM4_CONF" ]; then
DEFAULT_EXIM4_CONF="/etc/exim4/exim4.conf.template"
fi
_exim4_conf="${DEPLOY_EXIM4_CONF:-$DEFAULT_EXIM4_CONF}"
_debug _exim4_conf "$_exim4_conf"
if [ ! -f "$_exim4_conf" ]; then
if [ -z "$DEPLOY_EXIM4_CONF" ]; then
_err "exim4 conf is not found, please define DEPLOY_EXIM4_CONF"
return 1
else
_err "It seems that the specified exim4 conf is not valid, please check."
return 1
fi
fi
if [ ! -w "$_exim4_conf" ]; then
_err "The file $_exim4_conf is not writable, please change the permission."
return 1
fi
_backup_conf="$DOMAIN_BACKUP_PATH/exim4.conf.bak"
_info "Backup $_exim4_conf to $_backup_conf"
cp "$_exim4_conf" "$_backup_conf"
_info "Modify exim4 conf: $_exim4_conf"
if _setopt "$_exim4_conf" "tls_certificate" "=" "$_real_fullchain" \
&& _setopt "$_exim4_conf" "tls_privatekey" "=" "$_real_key"; then
_info "Set config success!"
else
_err "Config exim4 server error, please report bug to us."
_info "Restoring exim4 conf"
if cat "$_backup_conf" >"$_exim4_conf"; then
_info "Restore conf success"
eval "$_reload"
else
_err "Oops, error restore exim4 conf, please report bug to us."
fi
return 1
fi
fi
_info "Run reload: $_reload"
if eval "$_reload"; then
_info "Reload success!"
if [ "$DEPLOY_EXIM4_CONF" ]; then
_savedomainconf DEPLOY_EXIM4_CONF "$DEPLOY_EXIM4_CONF"
else
_cleardomainconf DEPLOY_EXIM4_CONF
fi
if [ "$DEPLOY_EXIM4_RELOAD" ]; then
_savedomainconf DEPLOY_EXIM4_RELOAD "$DEPLOY_EXIM4_RELOAD"
else
_cleardomainconf DEPLOY_EXIM4_RELOAD
fi
return 0
else
_err "Reload error, restoring"
if cat "$_backup_conf" >"$_exim4_conf"; then
_info "Restore conf success"
eval "$_reload"
else
_err "Oops, error restore exim4 conf, please report bug to us."
fi
return 1
fi
return 0
}
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env sh
#Here is a script to deploy cert to haproxy server.
#returns 0 means success, otherwise error.
######## Public functions #####################
#domain keyfile certfile cafile fullchain
haproxy_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 "deploy cert to haproxy server, Not implemented yet"
return 1
}
+31
View File
@@ -0,0 +1,31 @@
#!/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
keychain_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"
/usr/bin/security import "$_ckey" -k "/Library/Keychains/System.keychain"
/usr/bin/security import "$_ccert" -k "/Library/Keychains/System.keychain"
/usr/bin/security import "$_cca" -k "/Library/Keychains/System.keychain"
/usr/bin/security import "$_cfullchain" -k "/Library/Keychains/System.keychain"
return 0
}
+25 -29
View File
@@ -1,13 +1,7 @@
#!/usr/bin/env sh
# This deploy hook will deploy ssl cert on kong proxy engine based on api request_host parameter.
# Note that ssl plugin should be available on Kong instance
# The hook will match cdomain to request_host, in case of multiple domain it will always take the first
# one (acme.sh behaviour).
# If ssl config already exist it will update only cert and key not touching other parameter
# If ssl config doesn't exist it will only upload cert and key and not set other parameter
# Not that we deploy full chain
# See https://getkong.org/plugins/dynamic-ssl/ for other options
# If certificate already exist it will update only cert and key not touching other parameter
# If certificate doesn't exist it will only upload cert and key and not set other parameter
# Note that we deploy full chain
# Written by Geoffroi Genot <ggenot@voxbone.com>
######## Public functions #####################
@@ -31,29 +25,32 @@ kong_deploy() {
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
#Get uuid linked to the domain
uuid=$(_get "$KONG_URL/apis?request_host=$_cdomain" | _normalizeJson | _egrep_o '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')
if [ -z "$uuid" ]; then
_err "Unable to get Kong uuid for domain $_cdomain"
_err "Make sure that KONG_URL is correctly configured"
_err "Make sure that a Kong api request_host match the domain"
_err "Kong url: $KONG_URL"
return 1
#Get ssl_uuid linked to the domain
ssl_uuid=$(_get "$KONG_URL/certificates/$_cdomain" | _normalizeJson | _egrep_o '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')
if [ -z "$ssl_uuid" ]; then
_debug "Unable to get Kong ssl_uuid for domain $_cdomain"
_debug "Make sure that KONG_URL is correctly configured"
_debug "Make sure that a Kong certificate match the sni"
_debug "Kong url: $KONG_URL"
_info "No existing certificate, creating..."
#return 1
fi
#Save kong url if it's succesful (First run case)
_saveaccountconf KONG_URL "$KONG_URL"
#Generate DEIM
delim="-----MultipartDelimeter$(date "+%s%N")"
delim="-----MultipartDelimiter$(date "+%s%N")"
nl="\015\012"
#Set Header
_H1="Content-Type: multipart/form-data; boundary=$delim"
#Generate data for request (Multipart/form-data with mixed content)
#set name to ssl
content="--$delim${nl}Content-Disposition: form-data; name=\"name\"${nl}${nl}ssl"
if [ -z "$ssl_uuid" ]; then
#set sni to domain
content="--$delim${nl}Content-Disposition: form-data; name=\"snis\"${nl}${nl}$_cdomain"
fi
#add key
content="$content${nl}--$delim${nl}Content-Disposition: form-data; name=\"config.key\"; filename=\"$(basename "$_ckey")\"${nl}Content-Type: application/octet-stream${nl}${nl}$(cat "$_ckey")"
content="$content${nl}--$delim${nl}Content-Disposition: form-data; name=\"key\"; filename=\"$(basename "$_ckey")\"${nl}Content-Type: application/octet-stream${nl}${nl}$(cat "$_ckey")"
#Add cert
content="$content${nl}--$delim${nl}Content-Disposition: form-data; name=\"config.cert\"; filename=\"$(basename "$_cfullchain")\"${nl}Content-Type: application/octet-stream${nl}${nl}$(cat "$_cfullchain")"
content="$content${nl}--$delim${nl}Content-Disposition: form-data; name=\"cert\"; filename=\"$(basename "$_cfullchain")\"${nl}Content-Type: application/octet-stream${nl}${nl}$(cat "$_cfullchain")"
#Close multipart
content="$content${nl}--$delim--${nl}"
#Convert CRLF
@@ -61,18 +58,17 @@ kong_deploy() {
#DEBUG
_debug header "$_H1"
_debug content "$content"
#Check if ssl plugins is aready enabled (if not => POST else => PATCH)
ssl_uuid=$(_get "$KONG_URL/apis/$uuid/plugins" | _egrep_o '"id":"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"[a-zA-Z0-9\-\,\"_\:]*"name":"ssl"' | _egrep_o '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')
_debug ssl_uuid "$ssl_uuid"
#Check if sslcreated (if not => POST else => PATCH)
if [ -z "$ssl_uuid" ]; then
#Post certificate to Kong
response=$(_post "$content" "$KONG_URL/apis/$uuid/plugins" "" "POST")
response=$(_post "$content" "$KONG_URL/certificates" "" "POST")
else
#patch
response=$(_post "$content" "$KONG_URL/apis/$uuid/plugins/$ssl_uuid" "" "PATCH")
response=$(_post "$content" "$KONG_URL/certificates/$ssl_uuid" "" "PATCH")
fi
if ! [ "$(echo "$response" | _egrep_o "ssl")" = "ssl" ]; then
_err "An error occured with cert upload. Check response:"
if ! [ "$(echo "$response" | _egrep_o "created_at")" = "created_at" ]; then
_err "An error occurred with cert upload. Check response:"
_err "$response"
return 1
fi
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env sh
#Here is a script to deploy cert to mysqld server.
#returns 0 means success, otherwise error.
######## Public functions #####################
#domain keyfile certfile cafile fullchain
mysqld_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 "deploy cert to mysqld server, Not implemented yet"
return 1
}
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env sh
#Here is a script to deploy cert to nginx server.
#returns 0 means success, otherwise error.
######## Public functions #####################
#domain keyfile certfile cafile fullchain
nginx_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 "deploy cert to nginx server, Not implemented yet"
return 1
}
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env sh
#Here is a script to deploy cert to opensshd server.
#returns 0 means success, otherwise error.
######## Public functions #####################
#domain keyfile certfile cafile fullchain
opensshd_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 "deploy cert to opensshd server, Not implemented yet"
return 1
}
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env sh
#Here is a script to deploy cert to pureftpd server.
#returns 0 means success, otherwise error.
######## Public functions #####################
#domain keyfile certfile cafile fullchain
pureftpd_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 "deploy cert to pureftpd server, Not implemented yet"
return 1
}
+110
View File
@@ -0,0 +1,110 @@
#!/usr/bin/env sh
#Here is a script to deploy cert to vsftpd server.
#returns 0 means success, otherwise error.
#DEPLOY_VSFTPD_CONF="/etc/vsftpd.conf"
#DEPLOY_VSFTPD_RELOAD="service vsftpd restart"
######## Public functions #####################
#domain keyfile certfile cafile fullchain
vsftpd_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"
_ssl_path="/etc/acme.sh/vsftpd"
if ! mkdir -p "$_ssl_path"; then
_err "Can not create folder:$_ssl_path"
return 1
fi
_info "Copying key and cert"
_real_key="$_ssl_path/vsftpd.key"
if ! cat "$_ckey" >"$_real_key"; then
_err "Error: write key file to: $_real_key"
return 1
fi
_real_fullchain="$_ssl_path/vsftpd.chain.pem"
if ! cat "$_cfullchain" >"$_real_fullchain"; then
_err "Error: write key file to: $_real_fullchain"
return 1
fi
DEFAULT_VSFTPD_RELOAD="service vsftpd restart"
_reload="${DEPLOY_VSFTPD_RELOAD:-$DEFAULT_VSFTPD_RELOAD}"
if [ -z "$IS_RENEW" ]; then
DEFAULT_VSFTPD_CONF="/etc/vsftpd.conf"
_vsftpd_conf="${DEPLOY_VSFTPD_CONF:-$DEFAULT_VSFTPD_CONF}"
if [ ! -f "$_vsftpd_conf" ]; then
if [ -z "$DEPLOY_VSFTPD_CONF" ]; then
_err "vsftpd conf is not found, please define DEPLOY_VSFTPD_CONF"
return 1
else
_err "It seems that the specified vsftpd conf is not valid, please check."
return 1
fi
fi
if [ ! -w "$_vsftpd_conf" ]; then
_err "The file $_vsftpd_conf is not writable, please change the permission."
return 1
fi
_backup_conf="$DOMAIN_BACKUP_PATH/vsftpd.conf.bak"
_info "Backup $_vsftpd_conf to $_backup_conf"
cp "$_vsftpd_conf" "$_backup_conf"
_info "Modify vsftpd conf: $_vsftpd_conf"
if _setopt "$_vsftpd_conf" "rsa_cert_file" "=" "$_real_fullchain" \
&& _setopt "$_vsftpd_conf" "rsa_private_key_file" "=" "$_real_key" \
&& _setopt "$_vsftpd_conf" "ssl_enable" "=" "YES"; then
_info "Set config success!"
else
_err "Config vsftpd server error, please report bug to us."
_info "Restoring vsftpd conf"
if cat "$_backup_conf" >"$_vsftpd_conf"; then
_info "Restore conf success"
eval "$_reload"
else
_err "Oops, error restore vsftpd conf, please report bug to us."
fi
return 1
fi
fi
_info "Run reload: $_reload"
if eval "$_reload"; then
_info "Reload success!"
if [ "$DEPLOY_VSFTPD_CONF" ]; then
_savedomainconf DEPLOY_VSFTPD_CONF "$DEPLOY_VSFTPD_CONF"
else
_cleardomainconf DEPLOY_VSFTPD_CONF
fi
if [ "$DEPLOY_VSFTPD_RELOAD" ]; then
_savedomainconf DEPLOY_VSFTPD_RELOAD "$DEPLOY_VSFTPD_RELOAD"
else
_cleardomainconf DEPLOY_VSFTPD_RELOAD
fi
return 0
else
_err "Reload error, restoring"
if cat "$_backup_conf" >"$_vsftpd_conf"; then
_info "Restore conf success"
eval "$_reload"
else
_err "Oops, error restore vsftpd conf, please report bug to us."
fi
return 1
fi
return 0
}
+202 -2
View File
@@ -140,7 +140,7 @@ Finally, make the DNS server and update Key available to `acme.sh`
```
export NSUPDATE_SERVER="dns.example.com"
export NSUPDATE_KEY="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=="
export NSUPDATE_KEY="/path/to/your/nsupdate.key"
```
Ok, let's issue a cert now:
@@ -302,9 +302,209 @@ acme.sh --issue --dns dns_freedns -d example.com -d www.example.com
```
Note that you cannot use acme.sh automatic DNS validation for FreeDNS public domains or for a subdomain that
you create under a FreeDNS public domain. You must own the top level domain in order to automaitcally
you create under a FreeDNS public domain. You must own the top level domain in order to automatically
validate with acme.sh at FreeDNS.
## 16. Use cyon.ch
You only need to set your cyon.ch login credentials.
If you also have 2 Factor Authentication (OTP) enabled, you need to set your secret token too and have `oathtool` installed.
```
export CY_Username="your_cyon_username"
export CY_Password="your_cyon_password"
export CY_OTP_Secret="your_otp_secret" # Only required if using 2FA
```
To issue a cert:
```
acme.sh --issue --dns dns_cyon -d example.com -d www.example.com
```
The `CY_Username`, `CY_Password` and `CY_OTP_Secret` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 17. Use Domain-Offensive/Resellerinterface/Domainrobot API
You will need your login credentials (Partner ID+Password) to the Resellerinterface, and export them before you run `acme.sh`:
```
export DO_PID="KD-1234567"
export DO_PW="cdfkjl3n2"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_do -d example.com -d www.example.com
```
## 18. Use Gandi LiveDNS API
You must enable the new Gandi LiveDNS API first and the create your api key, See: http://doc.livedns.gandi.net/
```
export GANDI_LIVEDNS_KEY="fdmlfsdklmfdkmqsdfk"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_gandi_livedns -d example.com -d www.example.com
```
## 19. Use Knot (knsupdate) DNS API to automatically issue cert
First, generate a TSIG key for updating the zone.
```
keymgr tsig generate acme_key algorithm hmac-sha512 > /etc/knot/acme.key
```
Include this key in your knot configuration file.
```
include: /etc/knot/acme.key
```
Next, configure your zone to allow dynamic updates.
Dynamic updates for the zone are allowed via proper ACL rule with the `update` action. For in-depth instructions, please see [Knot DNS's documentation](https://www.knot-dns.cz/documentation/).
```
acl:
- id: acme_acl
address: 192.168.1.0/24
key: acme_key
action: update
zone:
- domain: example.com
file: example.com.zone
acl: acme_acl
```
Finally, make the DNS server and TSIG Key available to `acme.sh`
```
export KNOT_SERVER="dns.example.com"
export KNOT_KEY=`grep \# /etc/knot/acme.key | cut -d' ' -f2`
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_knot -d example.com -d www.example.com
```
The `KNOT_SERVER` and `KNOT_KEY` settings will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 20. Use DigitalOcean API (native)
You need to obtain a read and write capable API key from your DigitalOcean account. See: https://www.digitalocean.com/help/api/
```
export DO_API_KEY="75310dc4ca779ac39a19f6355db573b49ce92ae126553ebd61ac3a3ae34834cc"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_dgon -d example.com -d www.example.com
```
## 21. Use ClouDNS.net API
You need to set the HTTP API user ID and password credentials. See: https://www.cloudns.net/wiki/article/42/
```
export CLOUDNS_AUTH_ID=XXXXX
export CLOUDNS_AUTH_PASSWORD="YYYYYYYYY"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_cloudns -d example.com -d www.example.com
```
## 22. Use Infoblox API
First you need to create/obtain API credentials on your Infoblox appliance.
```
export Infoblox_Creds="username:password"
export Infoblox_Server="ip or fqdn of infoblox appliance"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_infoblox -d example.com -d www.example.com
```
Note: This script will automatically create and delete the ephemeral txt record.
The `Infoblox_Creds` and `Infoblox_Server` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 23. Use VSCALE API
First you need to create/obtain API tokens on your [settings panel](https://vscale.io/panel/settings/tokens/).
```
VSCALE_API_KEY="sdfsdfsdfljlbjkljlkjsdfoiwje"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_vscale -d example.com -d www.example.com
```
## 24. Use Dynu API
First you need to create/obtain API credentials from your Dynu account. See: https://www.dynu.com/resources/api/documentation
```
export Dynu_ClientId="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
export Dynu_Secret="yyyyyyyyyyyyyyyyyyyyyyyyy"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_dynu -d example.com -d www.example.com
```
The `Dynu_ClientId` and `Dynu_Secret` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 25. Use DNSimple API
First you need to login to your DNSimple account and generate a new oauth token.
https://dnsimple.com/a/{your account id}/account/access_tokens
Note that this is an _account_ token and not a user token. The account token is
needed to infer the `account_id` used in requests. A user token will not be able
to determine the correct account to use.
```
export DNSimple_OAUTH_TOKEN="sdfsdfsdfljlbjkljlkjsdfoiwje"
```
To issue the cert just specify the `dns_dnsimple` API.
```
acme.sh --issue --dns dns_dnsimple -d example.com
```
The `DNSimple_OAUTH_TOKEN` will be saved in `~/.acme.sh/account.conf` and will
be reused when needed.
If you have any issues with this integration please report them to
https://github.com/pho3nixf1re/acme.sh/issues.
## 26. Use NS1.com API
```
export NS1_Key="fdmlfsdklmfdkmqsdfk"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_nsone -d example.com -d www.example.com
```
# Use custom API
If your API is not supported yet, you can write your own DNS API.
+22 -6
View File
@@ -88,12 +88,25 @@ _get_root() {
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
if [ -z "$h" ]; then
if _contains "$response" "<IsTruncated>true</IsTruncated>" && _contains "$response" "<NextMarker>"; then
_debug "IsTruncated"
_nextMarker="$(echo "$response" | _egrep_o "<NextMarker>.*</NextMarker>" | cut -d '>' -f 2 | cut -d '<' -f 1)"
_debug "NextMarker" "$_nextMarker"
if aws_rest GET "2013-04-01/hostedzone" "marker=$_nextMarker"; then
_debug "Truncated request OK"
i=2
p=1
continue
else
_err "Truncated request error."
fi
fi
#not valid
return 1
fi
if _contains "$response" "<Name>$h.</Name>"; then
hostedzone="$(echo "$response" | sed 's/<HostedZone>/#&/g' | tr '#' '\n' | _egrep_o "<HostedZone><Id>[^<]*<.Id><Name>$h.<.Name>.*<.HostedZone>")"
hostedzone="$(echo "$response" | sed 's/<HostedZone>/#&/g' | tr '#' '\n' | _egrep_o "<HostedZone><Id>[^<]*<.Id><Name>$h.<.Name>.*<PrivateZone>false<.PrivateZone>.*<.HostedZone>")"
_debug hostedzone "$hostedzone"
if [ -z "$hostedzone" ]; then
_err "Error, can not get hostedzone."
@@ -143,7 +156,7 @@ aws_rest() {
CanonicalHeaders="host:$aws_host\nx-amz-date:$RequestDate\n"
SignedHeaders="host;x-amz-date"
if [ -n "$AWS_SESSION_TOKEN" ]; then
export _H2="x-amz-security-token: $AWS_SESSION_TOKEN"
export _H3="x-amz-security-token: $AWS_SESSION_TOKEN"
CanonicalHeaders="${CanonicalHeaders}x-amz-security-token:$AWS_SESSION_TOKEN\n"
SignedHeaders="${SignedHeaders};x-amz-security-token"
fi
@@ -181,10 +194,10 @@ aws_rest() {
#kSecret="wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" ############################
_debug2 kSecret "$kSecret"
_secure_debug2 kSecret "$kSecret"
kSecretH="$(printf "%s" "$kSecret" | _hex_dump | tr -d " ")"
_debug2 kSecretH "$kSecretH"
_secure_debug2 kSecretH "$kSecretH"
kDateH="$(printf "$RequestDateOnly%s" | _hmac "$Hash" "$kSecretH" hex)"
_debug2 kDateH "$kDateH"
@@ -204,10 +217,13 @@ aws_rest() {
Authorization="$Algorithm Credential=$AWS_ACCESS_KEY_ID/$CredentialScope, SignedHeaders=$SignedHeaders, Signature=$signature"
_debug2 Authorization "$Authorization"
_H3="Authorization: $Authorization"
_debug _H3 "$_H3"
_H2="Authorization: $Authorization"
_debug _H2 "$_H2"
url="$AWS_URL/$ep"
if [ "$qsr" ]; then
url="$AWS_URL/$ep?$qsr"
fi
if [ "$mtd" = "GET" ]; then
response="$(_get "$url")"
+15 -2
View File
@@ -14,6 +14,8 @@ dns_cf_add() {
fulldomain=$1
txtvalue=$2
CF_Key="${CF_Key:-$(_readaccountconf_mutable CF_Key)}"
CF_Email="${CF_Email:-$(_readaccountconf_mutable CF_Email)}"
if [ -z "$CF_Key" ] || [ -z "$CF_Email" ]; then
CF_Key=""
CF_Email=""
@@ -29,8 +31,8 @@ dns_cf_add() {
fi
#save the api key and email to the account conf file.
_saveaccountconf CF_Key "$CF_Key"
_saveaccountconf CF_Email "$CF_Email"
_saveaccountconf_mutable CF_Key "$CF_Key"
_saveaccountconf_mutable CF_Email "$CF_Email"
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
@@ -83,6 +85,17 @@ dns_cf_add() {
dns_cf_rm() {
fulldomain=$1
txtvalue=$2
CF_Key="${CF_Key:-$(_readaccountconf_mutable CF_Key)}"
CF_Email="${CF_Email:-$(_readaccountconf_mutable CF_Email)}"
if [ -z "$CF_Key" ] || [ -z "$CF_Email" ]; then
CF_Key=""
CF_Email=""
_err "You don't specify cloudflare api key and email yet."
_err "Please create you key and try again."
return 1
fi
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "invalid domain"
+170
View File
@@ -0,0 +1,170 @@
#!/usr/bin/env sh
# Author: Boyan Peychev <boyan at cloudns dot net>
# Repository: https://github.com/ClouDNS/acme.sh/
#CLOUDNS_AUTH_ID=XXXXX
#CLOUDNS_AUTH_PASSWORD="YYYYYYYYY"
CLOUDNS_API="https://api.cloudns.net"
######## Public functions #####################
#Usage: dns_cloudns_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_cloudns_add() {
_info "Using cloudns"
if ! _dns_cloudns_init_check; then
return 1
fi
zone="$(_dns_cloudns_get_zone_name "$1")"
if [ -z "$zone" ]; then
_err "Missing DNS zone at ClouDNS. Please log into your control panel and create the required DNS zone for the initial setup."
return 1
fi
host="$(echo "$1" | sed "s/\.$zone\$//")"
record=$2
record_id=$(_dns_cloudns_get_record_id "$zone" "$host")
_debug zone "$zone"
_debug host "$host"
_debug record "$record"
_debug record_id "$record_id"
if [ -z "$record_id" ]; then
_info "Adding the TXT record for $1"
_dns_cloudns_http_api_call "dns/add-record.json" "domain-name=$zone&record-type=TXT&host=$host&record=$record&ttl=60"
if ! _contains "$response" "\"status\":\"Success\""; then
_err "Record cannot be added."
return 1
fi
_info "Added."
else
_info "Updating the TXT record for $1"
_dns_cloudns_http_api_call "dns/mod-record.json" "domain-name=$zone&record-id=$record_id&record-type=TXT&host=$host&record=$record&ttl=60"
if ! _contains "$response" "\"status\":\"Success\""; then
_err "The TXT record for $1 cannot be updated."
return 1
fi
_info "Updated."
fi
return 0
}
#Usage: dns_cloudns_rm _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_cloudns_rm() {
_info "Using cloudns"
if ! _dns_cloudns_init_check; then
return 1
fi
if [ -z "$zone" ]; then
zone="$(_dns_cloudns_get_zone_name "$1")"
if [ -z "$zone" ]; then
_err "Missing DNS zone at ClouDNS. Please log into your control panel and create the required DNS zone for the initial setup."
return 1
fi
fi
host="$(echo "$1" | sed "s/\.$zone\$//")"
record=$2
record_id=$(_dns_cloudns_get_record_id "$zone" "$host")
_debug zone "$zone"
_debug host "$host"
_debug record "$record"
_debug record_id "$record_id"
if [ ! -z "$record_id" ]; then
_info "Deleting the TXT record for $1"
_dns_cloudns_http_api_call "dns/delete-record.json" "domain-name=$zone&record-id=$record_id"
if ! _contains "$response" "\"status\":\"Success\""; then
_err "The TXT record for $1 cannot be deleted."
return 1
fi
_info "Deleted."
fi
return 0
}
#################### Private functions below ##################################
_dns_cloudns_init_check() {
if [ ! -z "$CLOUDNS_INIT_CHECK_COMPLETED" ]; then
return 0
fi
if [ -z "$CLOUDNS_AUTH_ID" ]; then
_err "CLOUDNS_AUTH_ID is not configured"
return 1
fi
if [ -z "$CLOUDNS_AUTH_PASSWORD" ]; then
_err "CLOUDNS_AUTH_PASSWORD is not configured"
return 1
fi
_dns_cloudns_http_api_call "dns/login.json" ""
if ! _contains "$response" "\"status\":\"Success\""; then
_err "Invalid CLOUDNS_AUTH_ID or CLOUDNS_AUTH_PASSWORD. Please check your login credentials."
return 1
fi
CLOUDNS_INIT_CHECK_COMPLETED=1
return 0
}
_dns_cloudns_get_zone_name() {
i=2
while true; do
zoneForCheck=$(printf "%s" "$1" | cut -d . -f $i-100)
if [ -z "$zoneForCheck" ]; then
return 1
fi
_debug zoneForCheck "$zoneForCheck"
_dns_cloudns_http_api_call "dns/get-zone-info.json" "domain-name=$zoneForCheck"
if ! _contains "$response" "\"status\":\"Failed\""; then
echo "$zoneForCheck"
return 0
fi
i=$(_math "$i" + 1)
done
return 1
}
_dns_cloudns_get_record_id() {
_dns_cloudns_http_api_call "dns/records.json" "domain-name=$1&host=$2&type=TXT"
if _contains "$response" "\"id\":"; then
echo "$response" | cut -d '"' -f 2
return 0
fi
return 1
}
_dns_cloudns_http_api_call() {
method=$1
_debug CLOUDNS_AUTH_ID "$CLOUDNS_AUTH_ID"
_debug CLOUDNS_AUTH_PASSWORD "$CLOUDNS_AUTH_PASSWORD"
if [ -z "$2" ]; then
data="auth-id=$CLOUDNS_AUTH_ID&auth-password=$CLOUDNS_AUTH_PASSWORD"
else
data="auth-id=$CLOUDNS_AUTH_ID&auth-password=$CLOUDNS_AUTH_PASSWORD&$2"
fi
response="$(_get "$CLOUDNS_API/$method?$data")"
_debug2 response "$response"
return 0
}
+3 -4
View File
@@ -209,8 +209,7 @@ _rest() {
return 1
fi
_debug2 response "$response"
if ! _contains "$response" '"message":"success"'; then
return 1
fi
return 0
_contains "$response" '"code":1'
}
+328
View File
@@ -0,0 +1,328 @@
#!/usr/bin/env sh
########
# Custom cyon.ch DNS API for use with [acme.sh](https://github.com/Neilpang/acme.sh)
#
# Usage: acme.sh --issue --dns dns_cyon -d www.domain.com
#
# Dependencies:
# -------------
# - oathtool (When using 2 Factor Authentication)
#
# Issues:
# -------
# Any issues / questions / suggestions can be posted here:
# https://github.com/noplanman/cyon-api/issues
#
# Author: Armando Lüscher <armando@noplanman.ch>
########
dns_cyon_add() {
_cyon_load_credentials \
&& _cyon_load_parameters "$@" \
&& _cyon_print_header "add" \
&& _cyon_login \
&& _cyon_change_domain_env \
&& _cyon_add_txt \
&& _cyon_logout
}
dns_cyon_rm() {
_cyon_load_credentials \
&& _cyon_load_parameters "$@" \
&& _cyon_print_header "delete" \
&& _cyon_login \
&& _cyon_change_domain_env \
&& _cyon_delete_txt \
&& _cyon_logout
}
#########################
### PRIVATE FUNCTIONS ###
#########################
_cyon_load_credentials() {
# Convert loaded password to/from base64 as needed.
if [ "${CY_Password_B64}" ]; then
CY_Password="$(printf "%s" "${CY_Password_B64}" | _dbase64 "multiline")"
elif [ "${CY_Password}" ]; then
CY_Password_B64="$(printf "%s" "${CY_Password}" | _base64)"
fi
if [ -z "${CY_Username}" ] || [ -z "${CY_Password}" ]; then
# Dummy entries to satisfy script checker.
CY_Username=""
CY_Password=""
CY_OTP_Secret=""
_err ""
_err "You haven't set your cyon.ch login credentials yet."
_err "Please set the required cyon environment variables."
_err ""
return 1
fi
# Save the login credentials to the account.conf file.
_debug "Save credentials to account.conf"
_saveaccountconf CY_Username "${CY_Username}"
_saveaccountconf CY_Password_B64 "$CY_Password_B64"
if [ ! -z "${CY_OTP_Secret}" ]; then
_saveaccountconf CY_OTP_Secret "$CY_OTP_Secret"
else
_clearaccountconf CY_OTP_Secret
fi
}
_cyon_is_idn() {
_idn_temp="$(printf "%s" "${1}" | tr -d "0-9a-zA-Z.,-_")"
_idn_temp2="$(printf "%s" "${1}" | grep -o "xn--")"
[ "$_idn_temp" ] || [ "$_idn_temp2" ]
}
_cyon_load_parameters() {
# Read the required parameters to add the TXT entry.
# shellcheck disable=SC2018,SC2019
fulldomain="$(printf "%s" "${1}" | tr "A-Z" "a-z")"
fulldomain_idn="${fulldomain}"
# Special case for IDNs, as cyon needs a domain environment change,
# which uses the "pretty" instead of the punycode version.
if _cyon_is_idn "${fulldomain}"; then
if ! _exists idn; then
_err "Please install idn to process IDN names."
_err ""
return 1
fi
fulldomain="$(idn -u "${fulldomain}")"
fulldomain_idn="$(idn -a "${fulldomain}")"
fi
_debug fulldomain "${fulldomain}"
_debug fulldomain_idn "${fulldomain_idn}"
txtvalue="${2}"
_debug txtvalue "${txtvalue}"
# This header is required for curl calls.
_H1="X-Requested-With: XMLHttpRequest"
export _H1
}
_cyon_print_header() {
if [ "${1}" = "add" ]; then
_info ""
_info "+---------------------------------------------+"
_info "| Adding DNS TXT entry to your cyon.ch domain |"
_info "+---------------------------------------------+"
_info ""
_info " * Full Domain: ${fulldomain}"
_info " * TXT Value: ${txtvalue}"
_info ""
elif [ "${1}" = "delete" ]; then
_info ""
_info "+-------------------------------------------------+"
_info "| Deleting DNS TXT entry from your cyon.ch domain |"
_info "+-------------------------------------------------+"
_info ""
_info " * Full Domain: ${fulldomain}"
_info ""
fi
}
_cyon_get_cookie_header() {
printf "Cookie: %s" "$(grep "cyon=" "$HTTP_HEADER" | grep "^Set-Cookie:" | _tail_n 1 | _egrep_o 'cyon=[^;]*;' | tr -d ';')"
}
_cyon_login() {
_info " - Logging in..."
username_encoded="$(printf "%s" "${CY_Username}" | _url_encode)"
password_encoded="$(printf "%s" "${CY_Password}" | _url_encode)"
login_url="https://my.cyon.ch/auth/index/dologin-async"
login_data="$(printf "%s" "username=${username_encoded}&password=${password_encoded}&pathname=%2F")"
login_response="$(_post "$login_data" "$login_url")"
_debug login_response "${login_response}"
# Bail if login fails.
if [ "$(printf "%s" "${login_response}" | _cyon_get_response_success)" != "success" ]; then
_err " $(printf "%s" "${login_response}" | _cyon_get_response_message)"
_err ""
return 1
fi
_info " success"
# NECESSARY!! Load the main page after login, to get the new cookie.
_H2="$(_cyon_get_cookie_header)"
export _H2
_get "https://my.cyon.ch/" >/dev/null
# todo: instead of just checking if the env variable is defined, check if we actually need to do a 2FA auth request.
# 2FA authentication with OTP?
if [ ! -z "${CY_OTP_Secret}" ]; then
_info " - Authorising with OTP code..."
if ! _exists oathtool; then
_err "Please install oathtool to use 2 Factor Authentication."
_err ""
return 1
fi
# Get OTP code with the defined secret.
otp_code="$(oathtool --base32 --totp "${CY_OTP_Secret}" 2>/dev/null)"
login_otp_url="https://my.cyon.ch/auth/multi-factor/domultifactorauth-async"
login_otp_data="totpcode=${otp_code}&pathname=%2F&rememberme=0"
login_otp_response="$(_post "$login_otp_data" "$login_otp_url")"
_debug login_otp_response "${login_otp_response}"
# Bail if OTP authentication fails.
if [ "$(printf "%s" "${login_otp_response}" | _cyon_get_response_success)" != "success" ]; then
_err " $(printf "%s" "${login_otp_response}" | _cyon_get_response_message)"
_err ""
return 1
fi
_info " success"
fi
_info ""
}
_cyon_logout() {
_info " - Logging out..."
_get "https://my.cyon.ch/auth/index/dologout" >/dev/null
_info " success"
_info ""
}
_cyon_change_domain_env() {
_info " - Changing domain environment..."
# Get the "example.com" part of the full domain name.
domain_env="$(printf "%s" "${fulldomain}" | sed -E -e 's/.*\.(.*\..*)$/\1/')"
_debug "Changing domain environment to ${domain_env}"
gloo_item_key="$(_get "https://my.cyon.ch/domain/" | tr '\n' ' ' | sed -E -e "s/.*data-domain=\"${domain_env}\"[^<]*data-itemkey=\"([^\"]*).*/\1/")"
_debug gloo_item_key "${gloo_item_key}"
domain_env_url="https://my.cyon.ch/user/environment/setdomain/d/${domain_env}/gik/${gloo_item_key}"
domain_env_response="$(_get "${domain_env_url}")"
_debug domain_env_response "${domain_env_response}"
if ! _cyon_check_if_2fa_missed "${domain_env_response}"; then return 1; fi
domain_env_success="$(printf "%s" "${domain_env_response}" | _egrep_o '"authenticated":\w*' | cut -d : -f 2)"
# Bail if domain environment change fails.
if [ "${domain_env_success}" != "true" ]; then
_err " $(printf "%s" "${domain_env_response}" | _cyon_get_response_message)"
_err ""
return 1
fi
_info " success"
_info ""
}
_cyon_add_txt() {
_info " - Adding DNS TXT entry..."
add_txt_url="https://my.cyon.ch/domain/dnseditor/add-record-async"
add_txt_data="zone=${fulldomain_idn}.&ttl=900&type=TXT&value=${txtvalue}"
add_txt_response="$(_post "$add_txt_data" "$add_txt_url")"
_debug add_txt_response "${add_txt_response}"
if ! _cyon_check_if_2fa_missed "${add_txt_response}"; then return 1; fi
add_txt_message="$(printf "%s" "${add_txt_response}" | _cyon_get_response_message)"
add_txt_status="$(printf "%s" "${add_txt_response}" | _cyon_get_response_status)"
# Bail if adding TXT entry fails.
if [ "${add_txt_status}" != "true" ]; then
_err " ${add_txt_message}"
_err ""
return 1
fi
_info " success (TXT|${fulldomain_idn}.|${txtvalue})"
_info ""
}
_cyon_delete_txt() {
_info " - Deleting DNS TXT entry..."
list_txt_url="https://my.cyon.ch/domain/dnseditor/list-async"
list_txt_response="$(_get "${list_txt_url}" | sed -e 's/data-hash/\\ndata-hash/g')"
_debug list_txt_response "${list_txt_response}"
if ! _cyon_check_if_2fa_missed "${list_txt_response}"; then return 1; fi
# Find and delete all acme challenge entries for the $fulldomain.
_dns_entries="$(printf "%b\n" "${list_txt_response}" | sed -n 's/data-hash=\\"\([^"]*\)\\" data-identifier=\\"\([^"]*\)\\".*/\1 \2/p')"
printf "%s" "${_dns_entries}" | while read -r _hash _identifier; do
dns_type="$(printf "%s" "$_identifier" | cut -d'|' -f1)"
dns_domain="$(printf "%s" "$_identifier" | cut -d'|' -f2)"
if [ "${dns_type}" != "TXT" ] || [ "${dns_domain}" != "${fulldomain_idn}." ]; then
continue
fi
hash_encoded="$(printf "%s" "${_hash}" | _url_encode)"
identifier_encoded="$(printf "%s" "${_identifier}" | _url_encode)"
delete_txt_url="https://my.cyon.ch/domain/dnseditor/delete-record-async"
delete_txt_data="$(printf "%s" "hash=${hash_encoded}&identifier=${identifier_encoded}")"
delete_txt_response="$(_post "$delete_txt_data" "$delete_txt_url")"
_debug delete_txt_response "${delete_txt_response}"
if ! _cyon_check_if_2fa_missed "${delete_txt_response}"; then return 1; fi
delete_txt_message="$(printf "%s" "${delete_txt_response}" | _cyon_get_response_message)"
delete_txt_status="$(printf "%s" "${delete_txt_response}" | _cyon_get_response_status)"
# Skip if deleting TXT entry fails.
if [ "${delete_txt_status}" != "true" ]; then
_err " ${delete_txt_message} (${_identifier})"
else
_info " success (${_identifier})"
fi
done
_info " done"
_info ""
}
_cyon_get_response_message() {
_egrep_o '"message":"[^"]*"' | cut -d : -f 2 | tr -d '"'
}
_cyon_get_response_status() {
_egrep_o '"status":\w*' | cut -d : -f 2
}
_cyon_get_response_success() {
_egrep_o '"onSuccess":"[^"]*"' | cut -d : -f 2 | tr -d '"'
}
_cyon_check_if_2fa_missed() {
# Did we miss the 2FA?
if test "${1#*multi_factor_form}" != "${1}"; then
_err " Missed OTP authentication!"
_err ""
return 1
fi
}
+205
View File
@@ -0,0 +1,205 @@
#!/usr/bin/env sh
## Will be called by acme.sh to add the txt record to your api system.
## returns 0 means success, otherwise error.
## Author: thewer <github at thewer.com>
## GitHub: https://github.com/gitwer/acme.sh
##
## Environment Variables Required:
##
## DO_API_KEY="75310dc4ca779ac39a19f6355db573b49ce92ae126553ebd61ac3a3ae34834cc"
##
##################### Public functions #####################
## Create the text record for validation.
## Usage: fulldomain txtvalue
## EG: "_acme-challenge.www.other.domain.com" "XKrxpRBosdq0HG9i01zxXp5CPBs"
dns_dgon_add() {
fulldomain="$(echo "$1" | _lower_case)"
txtvalue=$2
_info "Using digitalocean dns validation - add record"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
## save the env vars (key and domain split location) for later automated use
_saveaccountconf DO_API_KEY "$DO_API_KEY"
## split the domain for DO API
if ! _get_base_domain "$fulldomain"; then
_err "domain not found in your account for addition"
return 1
fi
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
## Set the header with our post type and key auth key
export _H1="Content-Type: application/json"
export _H2="Authorization: Bearer $DO_API_KEY"
PURL='https://api.digitalocean.com/v2/domains/'$_domain'/records'
PBODY='{"type":"TXT","name":"'$_sub_domain'","data":"'$txtvalue'"}'
_debug PURL "$PURL"
_debug PBODY "$PBODY"
## the create request - post
## args: BODY, URL, [need64, httpmethod]
response="$(_post "$PBODY" "$PURL")"
## check response
if [ "$?" != "0" ]; then
_err "error in response: $response"
return 1
fi
_debug2 response "$response"
## finished correctly
return 0
}
## Remove the txt record after validation.
## Usage: fulldomain txtvalue
## EG: "_acme-challenge.www.other.domain.com" "XKrxpRBosdq0HG9i01zxXp5CPBs"
dns_dgon_rm() {
fulldomain="$(echo "$1" | _lower_case)"
txtvalue=$2
_info "Using digitalocean dns validation - remove record"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
## split the domain for DO API
if ! _get_base_domain "$fulldomain"; then
_err "domain not found in your account for removal"
return 1
fi
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
## Set the header with our post type and key auth key
export _H1="Content-Type: application/json"
export _H2="Authorization: Bearer $DO_API_KEY"
## get URL for the list of domains
## may get: "links":{"pages":{"last":".../v2/domains/DOM/records?page=2","next":".../v2/domains/DOM/records?page=2"}}
GURL="https://api.digitalocean.com/v2/domains/$_domain/records"
## while we dont have a record ID we keep going
while [ -z "$record" ]; do
## 1) get the URL
## the create request - get
## args: URL, [onlyheader, timeout]
domain_list="$(_get "$GURL")"
## 2) find record
## check for what we are looing for: "type":"A","name":"$_sub_domain"
record="$(echo "$domain_list" | _egrep_o "\"id\"\s*\:\s*\"*\d+\"*[^}]*\"name\"\s*\:\s*\"$_sub_domain\"[^}]*\"data\"\s*\:\s*\"$txtvalue\"")"
## 3) check record and get next page
if [ -z "$record" ]; then
## find the next page if we dont have a match
nextpage="$(echo "$domain_list" | _egrep_o "\"links\".*" | _egrep_o "\"next\".*" | _egrep_o "http.*page\=\d+")"
if [ -z "$nextpage" ]; then
_err "no record and no nextpage in digital ocean DNS removal"
return 1
fi
_debug2 nextpage "$nextpage"
GURL="$nextpage"
fi
## we break out of the loop when we have a record
done
## we found the record
rec_id="$(echo "$record" | _egrep_o "id\"\s*\:\s*\"*\d+" | _egrep_o "\d+")"
_debug rec_id "$rec_id"
## delete the record
## delete URL for removing the one we dont want
DURL="https://api.digitalocean.com/v2/domains/$_domain/records/$rec_id"
## the create request - delete
## args: BODY, URL, [need64, httpmethod]
response="$(_post "" "$DURL" "" "DELETE")"
## check response (sort of)
if [ "$?" != "0" ]; then
_err "error in remove response: $response"
return 1
fi
_debug2 response "$response"
## finished correctly
return 0
}
##################### Private functions below #####################
## Split the domain provided into the "bade domain" and the "start prefix".
## This function searches for the longest subdomain in your account
## for the full domain given and splits it into the base domain (zone)
## and the prefix/record to be added/removed
## USAGE: fulldomain
## EG: "_acme-challenge.two.three.four.domain.com"
## returns
## _sub_domain="_acme-challenge.two"
## _domain="three.four.domain.com" *IF* zone "three.four.domain.com" exists
## if only "domain.com" exists it will return
## _sub_domain="_acme-challenge.two.three.four"
## _domain="domain.com"
_get_base_domain() {
# args
fulldomain="$(echo "$1" | tr '[:upper:]' '[:lower:]')"
_debug fulldomain "$fulldomain"
# domain max legal length = 253
MAX_DOM=255
## get a list of domains for the account to check thru
## Set the headers
export _H1="Content-Type: application/json"
export _H2="Authorization: Bearer $DO_API_KEY"
_debug DO_API_KEY "$DO_API_KEY"
## get URL for the list of domains
## havent seen this request paginated, tested with 18 domains (more requires manual requests with DO)
DOMURL="https://api.digitalocean.com/v2/domains"
## get the domain list (DO gives basically a full XFER!)
domain_list="$(_get "$DOMURL")"
## check response
if [ "$?" != "0" ]; then
_err "error in domain_list response: $domain_list"
return 1
fi
_debug2 domain_list "$domain_list"
## for each shortening of our $fulldomain, check if it exists in the $domain_list
## can never start on 1 (aka whole $fulldomain) as $fulldomain starts with "_acme-challenge"
i=2
while [ $i -gt 0 ]; do
## get next longest domain
_domain=$(printf "%s" "$fulldomain" | cut -d . -f "$i"-"$MAX_DOM")
## check we got something back from our cut (or are we at the end)
if [ -z "$_domain" ]; then
## we got to the end of the domain - invalid domain
_err "domain not found in DigitalOcean account"
return 1
fi
## we got part of a domain back - grep it out
found="$(echo "$domain_list" | _egrep_o "\"name\"\s*\:\s*\"$_domain\"")"
## check if it exists
if [ ! -z "$found" ]; then
## exists - exit loop returning the parts
sub_point=$(_math $i - 1)
_sub_domain=$(printf "%s" "$fulldomain" | cut -d . -f 1-"$sub_point")
_debug _domain "$_domain"
_debug _sub_domain "$_sub_domain"
return 0
fi
## increment cut point $i
i=$(_math $i + 1)
done
## we went through the entire domain zone list and dint find one that matched
## doesnt look like we can add in the record
_err "domain not found in DigitalOcean account, but we should never get here"
return 1
}
+215
View File
@@ -0,0 +1,215 @@
#!/usr/bin/env sh
# DNSimple domain api
# https://github.com/pho3nixf1re/acme.sh/issues
#
# This is your oauth token which can be acquired on the account page. Please
# note that this must be an _account_ token and not a _user_ token.
# https://dnsimple.com/a/<your account id>/account/access_tokens
# DNSimple_OAUTH_TOKEN="sdfsdfsdfljlbjkljlkjsdfoiwje"
DNSimple_API="https://api.dnsimple.com/v2"
######## Public functions #####################
# Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_dnsimple_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$DNSimple_OAUTH_TOKEN" ]; then
DNSimple_OAUTH_TOKEN=""
_err "You have not set the dnsimple oauth token yet."
_err "Please visit https://dnsimple.com/user to generate it."
return 1
fi
# save the oauth token for later
_saveaccountconf DNSimple_OAUTH_TOKEN "$DNSimple_OAUTH_TOKEN"
if ! _get_account_id; then
_err "failed to retrive account id"
return 1
fi
if ! _get_root "$fulldomain"; then
_err "invalid domain"
return 1
fi
_get_records "$_account_id" "$_domain" "$_sub_domain"
if [ "$_records_count" = "0" ]; then
_info "Adding record"
if _dnsimple_rest POST "$_account_id/zones/$_domain/records" "{\"type\":\"TXT\",\"name\":\"$_sub_domain\",\"content\":\"$txtvalue\",\"ttl\":120}"; then
if printf -- "%s" "$response" | grep "\"name\":\"$_sub_domain\"" >/dev/null; then
_info "Added"
return 0
else
_err "Unexpected response while adding text record."
return 1
fi
fi
_err "Add txt record error."
else
_info "Updating record"
_extract_record_id "$_records" "$_sub_domain"
if _dnsimple_rest \
PATCH \
"$_account_id/zones/$_domain/records/$_record_id" \
"{\"type\":\"TXT\",\"name\":\"$_sub_domain\",\"content\":\"$txtvalue\",\"ttl\":120}"; then
_info "Updated!"
return 0
fi
_err "Update error"
return 1
fi
}
# fulldomain
dns_dnsimple_rm() {
fulldomain=$1
if ! _get_account_id; then
_err "failed to retrive account id"
return 1
fi
if ! _get_root "$fulldomain"; then
_err "invalid domain"
return 1
fi
_get_records "$_account_id" "$_domain" "$_sub_domain"
_extract_record_id "$_records" "$_sub_domain"
if [ "$_record_id" ]; then
if _dnsimple_rest DELETE "$_account_id/zones/$_domain/records/$_record_id"; then
_info "removed record" "$_record_id"
return 0
fi
fi
_err "failed to remove record" "$_record_id"
return 1
}
#################### Private functions bellow ##################################
# _acme-challenge.www.domain.com
# returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
_get_root() {
domain=$1
i=2
previous=1
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
if [ -z "$h" ]; then
# not valid
return 1
fi
if ! _dnsimple_rest GET "$_account_id/zones/$h"; then
return 1
fi
if _contains "$response" 'not found'; then
_debug "$h not found"
else
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$previous)
_domain="$h"
_debug _domain "$_domain"
_debug _sub_domain "$_sub_domain"
return 0
fi
previous="$i"
i=$(_math "$i" + 1)
done
return 1
}
# returns _account_id
_get_account_id() {
_debug "retrive account id"
if ! _dnsimple_rest GET "whoami"; then
return 1
fi
if _contains "$response" "\"account\":null"; then
_err "no account associated with this token"
return 1
fi
if _contains "$response" "timeout"; then
_err "timeout retrieving account id"
return 1
fi
_account_id=$(printf "%s" "$response" | _egrep_o "\"id\":[^,]*,\"email\":" | cut -d: -f2 | cut -d, -f1)
_debug _account_id "$_account_id"
return 0
}
# returns
# _records
# _records_count
_get_records() {
account_id=$1
domain=$2
sub_domain=$3
_debug "fetching txt records"
_dnsimple_rest GET "$account_id/zones/$domain/records?per_page=100"
if ! _contains "$response" "\"id\":"; then
_err "failed to retrieve records"
return 1
fi
_records_count=$(printf "%s" "$response" | _egrep_o "\"name\":\"$sub_domain\"" | wc -l | _egrep_o "[0-9]+")
_records=$response
_debug _records_count "$_records_count"
}
# returns _record_id
_extract_record_id() {
_record_id=$(printf "%s" "$_records" | _egrep_o "\"id\":[^,]*,\"zone_id\":\"[^,]*\",\"parent_id\":null,\"name\":\"$_sub_domain\"" | cut -d: -f2 | cut -d, -f1)
_debug "_record_id" "$_record_id"
}
# returns response
_dnsimple_rest() {
method=$1
path="$2"
data="$3"
request_url="$DNSimple_API/$path"
_debug "$path"
export _H1="Accept: application/json"
export _H2="Authorization: Bearer $DNSimple_OAUTH_TOKEN"
if [ "$data" ] || [ "$method" = "DELETE" ]; then
_H1="Content-Type: application/json"
_debug data "$data"
response="$(_post "$data" "$request_url" "" "$method")"
else
response="$(_get "$request_url" "" "" "$method")"
fi
if [ "$?" != "0" ]; then
_err "error $request_url"
return 1
fi
_debug2 response "$response"
return 0
}
+148
View File
@@ -0,0 +1,148 @@
#!/usr/bin/env sh
# DNS API for Domain-Offensive / Resellerinterface / Domainrobot
# Report bugs at https://github.com/seidler2547/acme.sh/issues
# set these environment variables to match your customer ID and password:
# DO_PID="KD-1234567"
# DO_PW="cdfkjl3n2"
DO_URL="https://soap.resellerinterface.de/"
######## Public functions #####################
#Usage: dns_myapi_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_do_add() {
fulldomain=$1
txtvalue=$2
if _dns_do_authenticate; then
_info "Adding TXT record to ${_domain} as ${fulldomain}"
_dns_do_soap createRR origin "${_domain}" name "${fulldomain}" type TXT data "${txtvalue}" ttl 300
if _contains "${response}" '>success<'; then
return 0
fi
_err "Could not create resource record, check logs"
fi
return 1
}
#fulldomain
dns_do_rm() {
fulldomain=$1
if _dns_do_authenticate; then
if _dns_do_list_rrs; then
_dns_do_had_error=0
for _rrid in ${_rr_list}; do
_info "Deleting resource record $_rrid for $_domain"
_dns_do_soap deleteRR origin "${_domain}" rrid "${_rrid}"
if ! _contains "${response}" '>success<'; then
_dns_do_had_error=1
_err "Could not delete resource record for ${_domain}, id ${_rrid}"
fi
done
return $_dns_do_had_error
fi
fi
return 1
}
#################### Private functions below ##################################
_dns_do_authenticate() {
_info "Authenticating as ${DO_PID}"
_dns_do_soap authPartner partner "${DO_PID}" password "${DO_PW}"
if _contains "${response}" '>success<'; then
_get_root "$fulldomain"
_debug "_domain $_domain"
return 0
else
_err "Authentication failed, are DO_PID and DO_PW set correctly?"
fi
return 1
}
_dns_do_list_rrs() {
_dns_do_soap getRRList origin "${_domain}"
if ! _contains "${response}" 'SOAP-ENC:Array'; then
_err "getRRList origin ${_domain} failed"
return 1
fi
_rr_list="$(echo "${response}" \
| tr -d "\n\r\t" \
| sed -e 's/<item xsi:type="ns2:Map">/\n/g' \
| grep ">$(_regexcape "$fulldomain")</value>" \
| sed -e 's/<\/item>/\n/g' \
| grep '>id</key><value' \
| _egrep_o '>[0-9]{1,16}<' \
| tr -d '><')"
[ "${_rr_list}" ]
}
_dns_do_soap() {
func="$1"
shift
# put the parameters to xml
body="<tns:${func} xmlns:tns=\"${DO_URL}\">"
while [ "$1" ]; do
_k="$1"
shift
_v="$1"
shift
body="$body<$_k>$_v</$_k>"
done
body="$body</tns:${func}>"
_debug2 "SOAP request ${body}"
# build SOAP XML
_xml='<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Body>'"$body"'</env:Body>
</env:Envelope>'
# set SOAP headers
export _H1="SOAPAction: ${DO_URL}#${func}"
if ! response="$(_post "${_xml}" "${DO_URL}")"; then
_err "Error <$1>"
return 1
fi
_debug2 "SOAP response $response"
# retrieve cookie header
_H2="$(_egrep_o 'Cookie: [^;]+' <"$HTTP_HEADER" | _head_n 1)"
export _H2
return 0
}
_get_root() {
domain=$1
i=1
_dns_do_soap getDomainList
_all_domains="$(echo "${response}" \
| tr -d "\n\r\t " \
| _egrep_o 'domain</key><value[^>]+>[^<]+' \
| sed -e 's/^domain<\/key><value[^>]*>//g')"
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
if [ -z "$h" ]; then
return 1
fi
if _contains "${_all_domains}" "^$(_regexcape "$h")\$"; then
_domain="$h"
return 0
fi
i=$(_math $i + 1)
done
_debug "$domain not found"
return 1
}
_regexcape() {
echo "$1" | sed -e 's/\([]\.$*^[]\)/\\\1/g'
}
+228
View File
@@ -0,0 +1,228 @@
#!/usr/bin/env sh
#Client ID
#Dynu_ClientId="0b71cae7-a099-4f6b-8ddf-94571cdb760d"
#
#Secret
#Dynu_Secret="aCUEY4BDCV45KI8CSIC3sp2LKQ9"
#
#Token
Dynu_Token=""
#
#Endpoint
Dynu_EndPoint="https://api.dynu.com/v1"
#
#Author: Dynu Systems, Inc.
#Report Bugs here: https://github.com/shar0119/acme.sh
#
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_dynu_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$Dynu_ClientId" ] || [ -z "$Dynu_Secret" ]; then
Dynu_ClientId=""
Dynu_Secret=""
_err "Dynu client id and secret is not specified."
_err "Please create you API client id and secret and try again."
return 1
fi
#save the client id and secret to the account conf file.
_saveaccountconf Dynu_ClientId "$Dynu_ClientId"
_saveaccountconf Dynu_Secret "$Dynu_Secret"
if [ -z "$Dynu_Token" ]; then
_info "Getting Dynu token."
if ! _dynu_authentication; then
_err "Can not get token."
fi
fi
_debug "Detect root zone"
if ! _get_root "$fulldomain"; then
_err "Invalid domain."
return 1
fi
_debug _node "$_node"
_debug _domain_name "$_domain_name"
_info "Creating TXT record."
if ! _dynu_rest POST "dns/record/add" "{\"domain_name\":\"$_domain_name\",\"node_name\":\"$_node\",\"record_type\":\"TXT\",\"text_data\":\"$txtvalue\",\"state\":true,\"ttl\":90}"; then
return 1
fi
if ! _contains "$response" "text_data"; then
_err "Could not add TXT record."
return 1
fi
return 0
}
#Usage: rm _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_dynu_rm() {
fulldomain=$1
txtvalue=$2
if [ -z "$Dynu_ClientId" ] || [ -z "$Dynu_Secret" ]; then
Dynu_ClientId=""
Dynu_Secret=""
_err "Dynu client id and secret is not specified."
_err "Please create you API client id and secret and try again."
return 1
fi
#save the client id and secret to the account conf file.
_saveaccountconf Dynu_ClientId "$Dynu_ClientId"
_saveaccountconf Dynu_Secret "$Dynu_Secret"
if [ -z "$Dynu_Token" ]; then
_info "Getting Dynu token."
if ! _dynu_authentication; then
_err "Can not get token."
fi
fi
_debug "Detect root zone."
if ! _get_root "$fulldomain"; then
_err "Invalid domain."
return 1
fi
_debug _node "$_node"
_debug _domain_name "$_domain_name"
_info "Checking for TXT record."
if ! _get_recordid "$fulldomain" "$txtvalue"; then
_err "Could not get TXT record id."
return 1
fi
if [ "$_dns_record_id" = "" ]; then
_err "TXT record not found."
return 1
fi
_info "Removing TXT record."
if ! _delete_txt_record "$_dns_record_id"; then
_err "Could not remove TXT record $_dns_record_id."
fi
return 0
}
######## Private functions below ##################################
#_acme-challenge.www.domain.com
#returns
# _node=_acme-challenge.www
# _domain_name=domain.com
_get_root() {
domain=$1
i=2
p=1
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
if ! _dynu_rest GET "dns/get/$h"; then
return 1
fi
if _contains "$response" "\"name\":\"$h\"" >/dev/null; then
_domain_name=$h
_node=$(printf "%s" "$domain" | cut -d . -f 1-$p)
return 0
fi
p=$i
i=$(_math "$i" + 1)
done
return 1
}
_get_recordid() {
fulldomain=$1
txtvalue=$2
if ! _dynu_rest GET "dns/record/get?hostname=$fulldomain&rrtype=TXT"; then
return 1
fi
if ! _contains "$response" "$txtvalue"; then
_dns_record_id=0
return 0
fi
_dns_record_id=$(printf "%s" "$response" | _egrep_o "{[^}]*}" | grep "\"text_data\":\"$txtvalue\"" | _egrep_o ",[^,]*," | grep ',"id":' | tr -d ",," | cut -d : -f 2)
return 0
}
_delete_txt_record() {
_dns_record_id=$1
if ! _dynu_rest GET "dns/record/delete/$_dns_record_id"; then
return 1
fi
if ! _contains "$response" "true"; then
return 1
fi
return 0
}
_dynu_rest() {
m=$1
ep="$2"
data="$3"
_debug "$ep"
export _H1="Authorization: Bearer $Dynu_Token"
export _H2="Content-Type: application/json"
if [ "$data" ]; then
_debug data "$data"
response="$(_post "$data" "$Dynu_EndPoint/$ep" "" "$m")"
else
_info "Getting $Dynu_EndPoint/$ep"
response="$(_get "$Dynu_EndPoint/$ep")"
fi
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}
_dynu_authentication() {
realm="$(printf "%s" "$Dynu_ClientId:$Dynu_Secret" | _base64)"
export _H1="Authorization: Basic $realm"
export _H2="Content-Type: application/json"
response="$(_get "$Dynu_EndPoint/oauth2/token")"
if [ "$?" != "0" ]; then
_err "Authentication failed."
return 1
fi
if _contains "$response" "accessToken"; then
Dynu_Token=$(printf "%s" "$response" | tr -d "[]" | cut -d , -f 2 | cut -d : -f 2 | cut -d '"' -f 2)
fi
if _contains "$Dynu_Token" "null"; then
Dynu_Token=""
fi
_debug2 response "$response"
return 0
}
+10 -10
View File
@@ -10,7 +10,7 @@
#
######## Public functions #####################
# Export FreeDNS userid and password in folowing variables...
# Export FreeDNS userid and password in following variables...
# FREEDNS_User=username
# FREEDNS_Password=password
# login cookie is saved in acme account config file so userid / pw
@@ -53,7 +53,7 @@ dns_freedns_add() {
i="$(_math "$i" - 1)"
sub_domain="$(echo "$fulldomain" | cut -d. -f -"$i")"
# Sometimes FreeDNS does not reurn the subdomain page but rather
# Sometimes FreeDNS does not return the subdomain page but rather
# returns a page regarding becoming a premium member. This usually
# happens after a period of inactivity. Immediately trying again
# returns the correct subdomain page. So, we will try twice to
@@ -65,14 +65,14 @@ dns_freedns_add() {
htmlpage="$(_freedns_retrieve_subdomain_page "$FREEDNS_COOKIE")"
if [ "$?" != "0" ]; then
if [ "$using_cached_cookies" = "true" ]; then
_err "Has your FreeDNS username and password channged? If so..."
_err "Has your FreeDNS username and password changed? If so..."
_err "Please export as FREEDNS_User / FREEDNS_Password and try again."
fi
return 1
fi
# Now convert the tables in the HTML to CSV. This litte gem from
# http://stackoverflow.com/questions/1403087/how-can-i-convert-an-html-table-to-csv
# http://stackoverflow.com/questions/1403087/how-can-i-convert-an-html-table-to-csv
subdomain_csv="$(echo "$htmlpage" \
| grep -i -e '</\?TABLE\|</\?TD\|</\?TR\|</\?TH' \
| sed 's/^[\ \t]*//g' \
@@ -112,7 +112,7 @@ dns_freedns_add() {
# not produce accurate results as the value field is truncated
# on this webpage. To get full value we would need to load
# another page. However we don't really need this so long as
# there is only one TXT record for the acme chalenge subdomain.
# there is only one TXT record for the acme challenge subdomain.
DNSvalue="$(echo "$line" | cut -d ',' -f 4 | sed 's/^[^&quot;]*&quot;//;s/&quot;.*//;s/<\/td>.*//')"
if [ $found != 0 ]; then
break
@@ -192,11 +192,11 @@ dns_freedns_rm() {
# Need to read cookie from conf file again in case new value set
# during login to FreeDNS when TXT record was created.
# acme.sh does not have a _readaccountconf() fuction
# acme.sh does not have a _readaccountconf() function
FREEDNS_COOKIE="$(_read_conf "$ACCOUNT_CONF_PATH" "FREEDNS_COOKIE")"
_debug "FreeDNS login cookies: $FREEDNS_COOKIE"
# Sometimes FreeDNS does not reurn the subdomain page but rather
# Sometimes FreeDNS does not return the subdomain page but rather
# returns a page regarding becoming a premium member. This usually
# happens after a period of inactivity. Immediately trying again
# returns the correct subdomain page. So, we will try twice to
@@ -302,12 +302,12 @@ _freedns_retrieve_subdomain_page() {
export _H2="Accept-Language:en-US"
url="https://freedns.afraid.org/subdomain/"
_debug "Retrieve subdmoain page from FreeDNS"
_debug "Retrieve subdomain page from FreeDNS"
htmlpage="$(_get "$url")"
if [ "$?" != "0" ]; then
_err "FreeDNS retrieve subdomins failed bad RC from _get"
_err "FreeDNS retrieve subdomains failed bad RC from _get"
return 1
elif [ -z "$htmlpage" ]; then
_err "FreeDNS returned empty subdomain page"
@@ -341,7 +341,7 @@ _freedns_add_txt_record() {
return 1
elif _contains "$htmlpage" "security code was incorrect"; then
_debug "$htmlpage"
_err "FreeDNS failed to add TXT record for $subdomain as FreeDNS requested seurity code"
_err "FreeDNS failed to add TXT record for $subdomain as FreeDNS requested security code"
_err "Note that you cannot use automatic DNS validation for FreeDNS public domains"
return 1
fi
+123
View File
@@ -0,0 +1,123 @@
#!/usr/bin/env sh
# Gandi LiveDNS v5 API
# http://doc.livedns.gandi.net/
# currently under beta
#
# Requires GANDI API KEY set in GANDI_LIVEDNS_KEY set as environment variable
#
#Author: Frédéric Crozat <fcrozat@suse.com>
#Report Bugs here: https://github.com/fcrozat/acme.sh
#
######## Public functions #####################
GANDI_LIVEDNS_API="https://dns.beta.gandi.net/api/v5"
#Usage: dns_gandi_livedns_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_gandi_livedns_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$GANDI_LIVEDNS_KEY" ]; then
_err "No API key specified for Gandi LiveDNS."
_err "Create your key and export it as GANDI_LIVEDNS_KEY"
return 1
fi
_saveaccountconf GANDI_LIVEDNS_KEY "$GANDI_LIVEDNS_KEY"
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "invalid domain"
return 1
fi
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
_debug domain "$_domain"
_debug sub_domain "$_sub_domain"
_gandi_livedns_rest PUT "domains/$_domain/records/$_sub_domain/TXT" "{\"rrset_ttl\": 300, \"rrset_values\":[\"$txtvalue\"]}" \
&& _contains "$response" '{"message": "DNS Record Created"}' \
&& _info "Add $(__green "success")"
}
#Usage: fulldomain txtvalue
#Remove the txt record after validation.
dns_gandi_livedns_rm() {
fulldomain=$1
txtvalue=$2
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "invalid domain"
return 1
fi
_debug fulldomain "$fulldomain"
_debug domain "$_domain"
_debug sub_domain "$_sub_domain"
_gandi_livedns_rest DELETE "domains/$_domain/records/$_sub_domain/TXT" ""
}
#################### Private functions below ##################################
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
_get_root() {
domain=$1
i=2
p=1
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
if ! _gandi_livedns_rest GET "domains/$h"; then
return 1
fi
if _contains "$response" '"code": 401'; then
_err "$response"
return 1
elif _contains "$response" '"code": 404'; then
_debug "$h not found"
else
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain="$h"
return 0
fi
p="$i"
i=$(_math "$i" + 1)
done
return 1
}
_gandi_livedns_rest() {
m=$1
ep="$2"
data="$3"
_debug "$ep"
export _H1="Content-Type: application/json"
export _H2="X-Api-Key: $GANDI_LIVEDNS_KEY"
if [ "$m" = "GET" ]; then
response="$(_get "$GANDI_LIVEDNS_API/$ep")"
else
_debug data "$data"
response="$(_post "$data" "$GANDI_LIVEDNS_API/$ep" "" "$m")"
fi
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}
+1 -1
View File
@@ -40,7 +40,7 @@ dns_gd_add() {
if _gd_rest PUT "domains/$_domain/records/TXT/$_sub_domain" "[{\"data\":\"$txtvalue\"}]"; then
if [ "$response" = "{}" ]; then
_info "Added, sleeping 10 seconds"
sleep 10
_sleep 10
#todo: check if the record takes effect
return 0
else
+102
View File
@@ -0,0 +1,102 @@
#!/usr/bin/env sh
## Infoblox API integration by Jason Keller and Elijah Tenai
##
## Report any bugs via https://github.com/jasonkeller/acme.sh
dns_infoblox_add() {
## Nothing to see here, just some housekeeping
fulldomain=$1
txtvalue=$2
baseurlnObject="https://$Infoblox_Server/wapi/v2.2.2/record:txt?name=$fulldomain&text=$txtvalue&view=$Infoblox_View"
_info "Using Infoblox API"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
## Check for the credentials
if [ -z "$Infoblox_Creds" ] || [ -z "$Infoblox_Server" ]; then
Infoblox_Creds=""
Infoblox_Server=""
_err "You didn't specify the credentials, server or infoblox view yet (Infoblox_Creds, Infoblox_Server and Infoblox_View)."
_err "Please set them via EXPORT ([username:password], [ip or hostname]) and try again."
return 1
fi
if [ -z "$Infoblox_View" ]; then
Infoblox_View="default"
fi
## Save the credentials to the account file
_saveaccountconf Infoblox_Creds "$Infoblox_Creds"
_saveaccountconf Infoblox_Server "$Infoblox_Server"
_saveaccountconf Infoblox_View "$Infoblox_View"
## Base64 encode the credentials
Infoblox_CredsEncoded=$(printf "%b" "$Infoblox_Creds" | _base64)
## Construct the HTTP Authorization header
export _H1="Accept-Language:en-US"
export _H2="Authorization: Basic $Infoblox_CredsEncoded"
## Add the challenge record to the Infoblox grid member
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
_info "Successfully created the txt record"
return 0
else
_err "Error encountered during record addition"
_err "$result"
return 1
fi
}
dns_infoblox_rm() {
## Nothing to see here, just some housekeeping
fulldomain=$1
txtvalue=$2
_info "Using Infoblox API"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
## Base64 encode the credentials
Infoblox_CredsEncoded=$(printf "%b" "$Infoblox_Creds" | _base64)
## Construct the HTTP Authorization header
export _H1="Accept-Language:en-US"
export _H2="Authorization: Basic $Infoblox_CredsEncoded"
## 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")
## Let's see if we get something intelligible back from the grid
if echo "$result" | egrep "record:txt/.*:.*/$Infoblox_View"; then
## Extract the object reference
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")
## Let's see if that worked
if echo "$rmResult" | egrep "record:txt/.*:.*/$Infoblox_View"; then
_info "Successfully deleted $objRef"
return 0
else
_err "Error occurred during txt record delete"
_err "$rmResult"
return 1
fi
else
_err "Record to delete didn't match an existing record"
_err "$result"
return 1
fi
}
#################### Private functions below ##################################
+95
View File
@@ -0,0 +1,95 @@
#!/usr/bin/env sh
######## Public functions #####################
#Usage: dns_knot_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_knot_add() {
fulldomain=$1
txtvalue=$2
_checkKey || return 1
[ -n "${KNOT_SERVER}" ] || KNOT_SERVER="localhost"
# save the dns server and key to the account.conf file.
_saveaccountconf KNOT_SERVER "${KNOT_SERVER}"
_saveaccountconf KNOT_KEY "${KNOT_KEY}"
if ! _get_root "$fulldomain"; then
_err "Domain does not exist."
return 1
fi
_info "Adding ${fulldomain}. 60 TXT \"${txtvalue}\""
knsupdate -y "${KNOT_KEY}" <<EOF
server ${KNOT_SERVER}
zone ${_domain}.
update add ${fulldomain}. 60 TXT "${txtvalue}"
send
quit
EOF
if [ $? -ne 0 ]; then
_err "Error updating domain."
return 1
fi
_info "Domain TXT record successfully added."
return 0
}
#Usage: dns_knot_rm _acme-challenge.www.domain.com
dns_knot_rm() {
fulldomain=$1
_checkKey || return 1
[ -n "${KNOT_SERVER}" ] || KNOT_SERVER="localhost"
if ! _get_root "$fulldomain"; then
_err "Domain does not exist."
return 1
fi
_info "Removing ${fulldomain}. TXT"
knsupdate -y "${KNOT_KEY}" <<EOF
server ${KNOT_SERVER}
zone ${_domain}.
update del ${fulldomain}. TXT
send
quit
EOF
if [ $? -ne 0 ]; then
_err "error updating domain"
return 1
fi
_info "Domain TXT record successfully deleted."
return 0
}
#################### Private functions below ##################################
# _acme-challenge.www.domain.com
# returns
# _domain=domain.com
_get_root() {
domain=$1
i="$(echo "$fulldomain" | tr '.' ' ' | wc -w)"
i=$(_math "$i" - 1)
while true; do
h=$(printf "%s" "$domain" | cut -d . -f "$i"-100)
if [ -z "$h" ]; then
return 1
fi
_domain="$h"
return 0
done
_debug "$domain not found"
return 1
}
_checkKey() {
if [ -z "${KNOT_KEY}" ]; then
_err "You must specify a TSIG key to authenticate the request."
return 1
fi
}
+4 -4
View File
@@ -34,7 +34,7 @@ dns_lexicon_add() {
# shellcheck disable=SC2018,SC2019
Lx_name=$(echo LEXICON_"${PROVIDER}"_USERNAME | tr 'a-z' 'A-Z')
Lx_name_v=$(eval echo \$"$Lx_name")
_debug "$Lx_name" "$Lx_name_v"
_secure_debug "$Lx_name" "$Lx_name_v"
if [ "$Lx_name_v" ]; then
_saveaccountconf "$Lx_name" "$Lx_name_v"
eval export "$Lx_name"
@@ -43,7 +43,7 @@ dns_lexicon_add() {
# shellcheck disable=SC2018,SC2019
Lx_token=$(echo LEXICON_"${PROVIDER}"_TOKEN | tr 'a-z' 'A-Z')
Lx_token_v=$(eval echo \$"$Lx_token")
_debug "$Lx_token" "$Lx_token_v"
_secure_debug "$Lx_token" "$Lx_token_v"
if [ "$Lx_token_v" ]; then
_saveaccountconf "$Lx_token" "$Lx_token_v"
eval export "$Lx_token"
@@ -52,7 +52,7 @@ dns_lexicon_add() {
# shellcheck disable=SC2018,SC2019
Lx_password=$(echo LEXICON_"${PROVIDER}"_PASSWORD | tr 'a-z' 'A-Z')
Lx_password_v=$(eval echo \$"$Lx_password")
_debug "$Lx_password" "$Lx_password_v"
_secure_debug "$Lx_password" "$Lx_password_v"
if [ "$Lx_password_v" ]; then
_saveaccountconf "$Lx_password" "$Lx_password_v"
eval export "$Lx_password"
@@ -61,7 +61,7 @@ dns_lexicon_add() {
# shellcheck disable=SC2018,SC2019
Lx_domaintoken=$(echo LEXICON_"${PROVIDER}"_DOMAINTOKEN | tr 'a-z' 'A-Z')
Lx_domaintoken_v=$(eval echo \$"$Lx_domaintoken")
_debug "$Lx_domaintoken" "$Lx_domaintoken_v"
_secure_debug "$Lx_domaintoken" "$Lx_domaintoken_v"
if [ "$Lx_domaintoken_v" ]; then
eval export "$Lx_domaintoken"
_saveaccountconf "$Lx_domaintoken" "$Lx_domaintoken_v"
+30 -1
View File
@@ -81,7 +81,36 @@ dns_lua_add() {
#fulldomain
dns_lua_rm() {
fulldomain=$1
txtvalue=$2
_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"
count=$(printf "%s\n" "$response" | _egrep_o "\"name\":\"$fulldomain.\",\"type\":\"TXT\"" | wc -l | tr -d " ")
_debug count "$count"
if [ "$count" = "0" ]; then
_info "Don't need to remove."
else
record_id=$(printf "%s\n" "$response" | _egrep_o "\"id\":[^,]*,\"name\":\"$fulldomain.\",\"type\":\"TXT\"" | _head_n 1 | cut -d: -f2 | cut -d, -f1)
_debug "record_id" "$record_id"
if [ -z "$record_id" ]; then
_err "Can not get record id to remove."
return 1
fi
if ! _LUA_rest DELETE "/zones/$_domain_id/records/$record_id"; then
_err "Delete record error."
return 1
fi
_contains "$response" "$record_id"
fi
}
#################### Private functions below ##################################
@@ -129,7 +158,7 @@ _LUA_rest() {
export _H1="Accept: application/json"
export _H2="Authorization: Basic $LUA_auth"
if [ "$data" ]; then
if [ "$m" != "GET" ]; then
_debug data "$data"
response="$(_post "$data" "$LUA_Api/$ep" "" "$m")"
else
Executable → Regular
+30 -1
View File
@@ -78,7 +78,36 @@ dns_me_add() {
#fulldomain
dns_me_rm() {
fulldomain=$1
txtvalue=$2
_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"
count=$(printf "%s\n" "$response" | _egrep_o "\"totalRecords\":[^,]*" | cut -d : -f 2)
_debug count "$count"
if [ "$count" = "0" ]; then
_info "Don't need to remove."
else
record_id=$(printf "%s\n" "$response" | _egrep_o "\"id\":[^,]*" | cut -d : -f 2 | head -n 1)
_debug "record_id" "$record_id"
if [ -z "$record_id" ]; then
_err "Can not get record id to remove."
return 1
fi
if ! _me_rest DELETE "$_domain_id/records/$record_id"; then
_err "Delete record error."
return 1
fi
_contains "$response" ''
fi
}
#################### Private functions below ##################################
@@ -130,7 +159,7 @@ _me_rest() {
export _H2="x-dnsme-requestDate: $cdate"
export _H3="x-dnsme-hmac: $hmac"
if [ "$data" ]; then
if [ "$m" != "GET" ]; then
_debug data "$data"
response="$(_post "$data" "$ME_Api/$ep" "" "$m")"
else
+158
View File
@@ -0,0 +1,158 @@
#!/usr/bin/env sh
# bug reports to dev@1e.ca
#
#NS1_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
#
NS1_Api="https://api.nsone.net/v1"
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_nsone_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$NS1_Key" ]; then
NS1_Key=""
_err "You didn't specify nsone dns api key yet."
_err "Please create you key and try again."
return 1
fi
#save the api key and email to the account conf file.
_saveaccountconf NS1_Key "$NS1_Key"
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "invalid domain"
return 1
fi
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_debug "Getting txt records"
_nsone_rest GET "zones/${_domain}"
if ! _contains "$response" "\"records\":"; then
_err "Error"
return 1
fi
count=$(printf "%s\n" "$response" | _egrep_o "\"domain\":\"$fulldomain\",[^{]*\"type\":\"TXT\"" | wc -l | tr -d " ")
_debug count "$count"
if [ "$count" = "0" ]; then
_info "Adding record"
if _nsone_rest PUT "zones/$_domain/$fulldomain/TXT" "{\"answers\":[{\"answer\":[\"$txtvalue\"]}],\"type\":\"TXT\",\"domain\":\"$fulldomain\",\"zone\":\"$_domain\"}"; then
if _contains "$response" "$fulldomain"; 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 "\"domain\":\"$fulldomain.\",[^{]*\"type\":\"TXT\",\"id\":\"[^,]*\"" | _head_n 1 | cut -d: -f7 | cut -d, -f1)
_debug "record_id" "$record_id"
_nsone_rest POST "zones/$_domain/$fulldomain/TXT" "{\"answers\": [{\"answer\": [\"$txtvalue\"]}],\"type\": \"TXT\",\"domain\":\"$fulldomain\",\"zone\": \"$_domain\"}"
if [ "$?" = "0" ] && _contains "$response" "$fulldomain"; then
_info "Updated!"
#todo: check if the record takes effect
return 0
fi
_err "Update error"
return 1
fi
}
#fulldomain
dns_nsone_rm() {
fulldomain=$1
txtvalue=$2
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "invalid domain"
return 1
fi
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_debug "Getting txt records"
_nsone_rest GET "zones/${_domain}/$fulldomain/TXT"
count=$(printf "%s\n" "$response" | _egrep_o "\"domain\":\"$fulldomain\",.*\"type\":\"TXT\"" | wc -l | tr -d " ")
_debug count "$count"
if [ "$count" = "0" ]; then
_info "Don't need to remove."
else
if ! _nsone_rest DELETE "zones/${_domain}/$fulldomain/TXT"; then
_err "Delete record error."
return 1
fi
_contains "$response" ""
fi
}
#################### Private functions below ##################################
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
_get_root() {
domain=$1
i=2
p=1
if ! _nsone_rest GET "zones"; then
return 1
fi
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
if _contains "$response" "\"zone\":\"$h\""; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain="$h"
return 0
fi
p=$i
i=$(_math "$i" + 1)
done
return 1
}
_nsone_rest() {
m=$1
ep="$2"
data="$3"
_debug "$ep"
export _H1="Accept: application/json"
export _H2="X-NSONE-Key: $NS1_Key"
if [ "$m" != "GET" ]; then
_debug data "$data"
response="$(_post "$data" "$NS1_Api/$ep" "" "$m")"
else
response="$(_get "$NS1_Api/$ep")"
fi
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}
+7 -7
View File
@@ -1,6 +1,6 @@
#!/usr/bin/env sh
#Applcation Key
#Application Key
#OVH_AK="sdfsdfsdfljlbjkljlkjsdfoiwje"
#
#Application Secret
@@ -14,7 +14,7 @@
#'ovh-eu'
OVH_EU='https://eu.api.ovh.com/1.0'
#'ovh-ca':
#'ovh-ca':
OVH_CA='https://ca.api.ovh.com/1.0'
#'kimsufi-eu'
@@ -119,7 +119,7 @@ dns_ovh_add() {
_info "Checking authentication"
response="$(_ovh_rest GET "domain/")"
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."
@@ -191,7 +191,7 @@ _ovh_authentication() {
_H3=""
_H4=""
_ovhdata='{"accessRules": [{"method": "GET","path": "/*"},{"method": "POST","path": "/*"},{"method": "PUT","path": "/*"},{"method": "DELETE","path": "/*"}],"redirection":"'$ovh_success'"}'
_ovhdata='{"accessRules": [{"method": "GET","path": "/auth/time"},{"method": "GET","path": "/domain"},{"method": "GET","path": "/domain/zone/*"},{"method": "GET","path": "/domain/zone/*/record"},{"method": "POST","path": "/domain/zone/*/record"},{"method": "POST","path": "/domain/zone/*/refresh"},{"method": "PUT","path": "/domain/zone/*/record/*"}],"redirection":"'$ovh_success'"}'
response="$(_post "$_ovhdata" "$OVH_API/auth/credential")"
_debug3 response "$response"
@@ -207,7 +207,7 @@ _ovh_authentication() {
_err "Unable to get consumerKey"
return 1
fi
_debug consumerKey "$consumerKey"
_secure_debug consumerKey "$consumerKey"
OVH_CK="$consumerKey"
_saveaccountconf OVH_CK "$OVH_CK"
@@ -238,7 +238,7 @@ _get_root() {
return 1
fi
if ! _contains "$response" "This service does not exist" >/dev/null; then
if ! _contains "$response" "This service does not exist" >/dev/null && ! _contains "$response" "NOT_GRANTED_CALL" >/dev/null; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain="$h"
return 0
@@ -269,7 +269,7 @@ _ovh_rest() {
_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"
_secure_debug _ovh_p "$_ovh_p"
_ovh_hex="$(printf "%s" "$_ovh_p" | _digest sha1 hex)"
_debug2 _ovh_hex "$_ovh_hex"
+1 -1
View File
@@ -1,6 +1,6 @@
#!/usr/bin/env sh
#PowerDNS Emdedded API
#PowerDNS Embedded API
#https://doc.powerdns.com/md/httpapi/api_spec/
#
#PDNS_Url="http://ns.example.com:8081"
+149
View File
@@ -0,0 +1,149 @@
#!/usr/bin/env sh
#This is the vscale.io api wrapper for acme.sh
#
#Author: Alex Loban
#Report Bugs here: https://github.com/LAV45/acme.sh
#VSCALE_API_KEY="sdfsdfsdfljlbjkljlkjsdfoiwje"
VSCALE_API_URL="https://api.vscale.io/v1"
######## Public functions #####################
#Usage: dns_myapi_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_vscale_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$VSCALE_API_KEY" ]; then
VSCALE_API_KEY=""
_err "You didn't specify the VSCALE api key yet."
_err "Please create you key and try again."
return 1
fi
_saveaccountconf VSCALE_API_KEY "$VSCALE_API_KEY"
_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"
_vscale_tmpl_json="{\"type\":\"TXT\",\"name\":\"$_sub_domain.$_domain\",\"content\":\"$txtvalue\"}"
if _vscale_rest POST "domains/$_domain_id/records/" "$_vscale_tmpl_json"; then
response=$(printf "%s\n" "$response" | _egrep_o "{\"error\": \".+\"" | cut -d : -f 2)
if [ -z "$response" ]; then
_info "txt record updated success."
return 0
fi
fi
return 1
}
#fulldomain txtvalue
dns_vscale_rm() {
fulldomain=$1
txtvalue=$2
_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"
_vscale_rest GET "domains/$_domain_id/records/"
if [ -n "$response" ]; then
record_id=$(printf "%s\n" "$response" | _egrep_o "\"TXT\", \"id\": [0-9]+, \"name\": \"$_sub_domain.$_domain\"" | cut -d : -f 2 | tr -d ", \"name\"")
_debug record_id "$record_id"
if [ -z "$record_id" ]; then
_err "Can not get record id to remove."
return 1
fi
if _vscale_rest DELETE "domains/$_domain_id/records/$record_id" && [ -z "$response" ]; then
_info "txt record deleted success."
return 0
fi
_debug response "$response"
return 1
fi
return 1
}
#################### Private functions below ##################################
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=12345
_get_root() {
domain=$1
i=2
p=1
if _vscale_rest GET "domains/"; then
response="$(echo "$response" | tr -d "\n" | sed 's/{/\n&/g')"
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
hostedzone="$(echo "$response" | _egrep_o "{.*\"name\":\s*\"$h\".*}")"
if [ "$hostedzone" ]; then
_domain_id=$(printf "%s\n" "$hostedzone" | _egrep_o "\"id\":\s*[0-9]+" | _head_n 1 | cut -d : -f 2 | tr -d \ )
if [ "$_domain_id" ]; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain=$h
return 0
fi
return 1
fi
p=$i
i=$(_math "$i" + 1)
done
fi
return 1
}
#method uri qstr data
_vscale_rest() {
mtd="$1"
ep="$2"
data="$3"
_debug mtd "$mtd"
_debug ep "$ep"
export _H1="Accept: application/json"
export _H2="Content-Type: application/json"
export _H3="X-Token: ${VSCALE_API_KEY}"
if [ "$mtd" != "GET" ]; then
# both POST and DELETE.
_debug data "$data"
response="$(_post "$data" "$VSCALE_API_URL/$ep" "" "$mtd")"
else
response="$(_get "$VSCALE_API_URL/$ep")"
fi
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.