Compare commits

..
329 Commits
Author SHA1 Message Date
neil ac0970abba Merge pull request #1131 from Neilpang/dev
Dev
2017-12-03 21:36:06 +08:00
neilpang 9eeebb147f fix osx build 2017-12-03 20:57:25 +08:00
neilpang dcf8457f4d fix format 2017-12-03 13:16:37 +08:00
neilpang 534a5ad688 Merge branch 'fixci' into dev 2017-12-03 13:11:53 +08:00
neilpang 529cbc0379 run ci in docker 2017-12-03 12:51:51 +08:00
neil b6aff65997 Merge pull request #1128 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/1127
2017-12-02 19:56:39 +08:00
neilpang b615cce92d fix https://github.com/Neilpang/acme.sh/issues/1127 2017-12-02 19:54:33 +08:00
neil aea631d9d2 Merge pull request #1126 from Neilpang/dev
Dev
2017-12-02 11:16:18 +08:00
neil bf942a4cb3 Merge pull request #1125 from Neilpang/freedns
fix https://github.com/Neilpang/acme.sh/issues/1109
2017-12-02 11:15:31 +08:00
neilpang ceafe389af fix https://github.com/Neilpang/acme.sh/issues/1109 2017-11-26 20:57:02 +08:00
neilpang f62457a24e fix 2017-11-13 20:54:29 +08:00
neil cc3660e259 Merge pull request #1107 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/1106
2017-11-10 23:06:05 +08:00
neilpang 6e93ff8bca fix https://github.com/Neilpang/acme.sh/issues/1106 2017-11-10 23:01:29 +08:00
neil 114003406d Merge pull request #1093 from Neilpang/dev
add dev guide
2017-11-01 10:15:36 +08:00
neilpang 4c99c0127b add dev guide 2017-11-01 10:14:44 +08:00
neil 3f1c7da15e Merge pull request #1079 from Neilpang/dev
Dev
2017-10-20 22:30:26 +08:00
neil a46695581e Merge pull request #1077 from max2711/master
small Docker output enhancement
2017-10-20 22:13:51 +08:00
max2711 7902d10a3a remove unused crontab jobs 2017-10-20 14:22:20 +02:00
neil 8aff2bd74c Merge pull request #1075 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/1074
2017-10-18 20:30:40 +08:00
neilpang 352dd907ac fix https://github.com/Neilpang/acme.sh/issues/1074 2017-10-18 20:27:09 +08:00
neil 43f195160e Merge pull request #1072 from Neilpang/dev
Dev
2017-10-12 21:54:13 +08:00
neilpang 872bfe4757 fix for PR https://github.com/Neilpang/acme.sh/pull/1069 2017-10-11 20:34:56 +08:00
neil 70bd493a25 Merge pull request #1061 from sahsanu/patch-1
Update ClouDNS.net API doc
2017-10-10 22:02:36 +08:00
neil bd065838fa Merge pull request #1063 from Neilpang/dev
fix https://github.com/Neilpang/acme.sh/issues/1062
2017-10-08 19:48:19 +08:00
neilpang 5f6e3da766 fix https://github.com/Neilpang/acme.sh/issues/1062
change back to use openssl for tls mode.
2017-10-08 19:45:50 +08:00
sahsanu ee56b9cd4e Update ClouDNS.net API doc
Update ClouDNS.net API doc to show that CLOUDNS_AUTH_ID and CLOUDNS_AUTH_PASSWORD will be saved in ~/.acme.sh/account.conf
2017-10-07 21:31:24 +02:00
neil 1a27172f20 Merge pull request #1059 from Neilpang/dev
Dev
2017-10-06 09:56:29 +08:00
neil 4ef1159666 Merge pull request #1055 from hiskang/deploy/strongswan
Deploy/strongswan
2017-10-04 08:59:05 +08:00
hiska c924e7c537 remove "return 0" 2017-10-04 06:44:02 +09:00
neil 814bd7cb0d Merge pull request #1056 from hebbet/patch-1
unify headlines
2017-10-03 22:11:05 +08:00
neil 5f2d8c0155 Merge pull request #1052 from sahsanu/patch-1
Update dns_cloudns.sh to be able to save ID and PASSWORD
2017-10-03 22:09:48 +08:00
hebbet 372f691fd6 unify headlines
unify headlines in deploy readme
2017-10-02 15:04:02 +02:00
hiska 5f05a452fc Merge branch 'dev' into deploy/strongswan 2017-10-02 08:39:55 +09:00
hiska afe3283c53 Update README.md 2017-10-02 08:34:32 +09:00
hiska 641a2895a6 Create strongswan.sh 2017-10-02 08:32:36 +09:00
sahsanu c73c33f94c Update dns_cloudns.sh 2017-10-01 10:31:38 +02:00
sahsanu 6c7da215e7 Update dns_cloudns.sh 2017-10-01 10:06:38 +02:00
sahsanu 754a4a7c8b Update dns_cloudns.sh
Added code to save CLOUDNS_AUTH_ID and CLOUDNS_AUTH_PASSWORD on account.conf file so the id and password for cloudns can be reused.
2017-09-30 20:12:53 +02:00
neil 0427e8bbb4 Merge pull request #993 from fritteli/deploy-fritzbox
Deploy fritzbox
2017-09-29 21:00:07 +08:00
neil c47f6ed30a Merge pull request #1048 from Neilpang/dev
Dev
2017-09-27 09:07:26 +08:00
neil 3bdc317fc8 Merge pull request #1046 from techdad/patch-1
Remove stray single-quote
2017-09-27 09:04:40 +08:00
neil 20cce349e4 Merge pull request #1044 from 2globalnomads/patch-5
#1042
2017-09-27 08:56:41 +08:00
Daniel 5261162fdf Remove stray single-quote
Get rid of a single stray erroneous single-quote that is breaking socat when using standalone mode.
2017-09-26 19:43:06 +04:00
Santeri Kannisto acf117584b #1042
Apparently UAPI does not return any error code, just JSON output that has a string "status: 0" whenever the command fails.
2017-09-26 07:04:30 +04:00
neil 7b4bbed553 Merge pull request #1038 from Neilpang/dev
add debug info
2017-09-23 22:13:14 +08:00
neilpang 270ce87582 add debug info 2017-09-23 22:12:17 +08:00
Manuel Friedli 2fc0225bc9 Make command line example consistent with env variable example. 2017-09-12 11:35:21 +02:00
Manuel Friedli 3536cd336d Merge branch 'dev' into deploy-fritzbox 2017-09-12 11:32:54 +02:00
neil 86dd290c1d Merge pull request #1020 from Neilpang/dev
minor
2017-09-11 21:43:57 +08:00
neilpang 95949b6519 minor 2017-09-11 21:40:56 +08:00
neil 6499a7298d Merge pull request #1019 from Neilpang/dev
Dev
2017-09-11 21:30:02 +08:00
neilpang 042e09d29f Merge branch 'dev' of https://github.com/Neilpang/acme.sh into dev 2017-09-11 21:28:57 +08:00
neilpang 36309e6dbc minor, fix debug info 2017-09-11 21:28:37 +08:00
neil e1ac201de1 Merge pull request #1014 from 2globalnomads/patch-4
1 cert per 1 domain for cpanel_uapi
2017-09-11 20:44:28 +08:00
neil f0c4e44d2f Merge pull request #1015 from baloo/patch-1
Use stable gandi API url
2017-09-11 20:43:23 +08:00
neil 1dc3036822 Merge pull request #1017 from Neilpang/dev
Dev
2017-09-10 16:47:42 +08:00
neilpang a6b399286e add socat 2017-09-09 14:15:11 +08:00
Arthur Gautier 856811bd2e Use stable gandi API url
The gandi api has changed its url for a more stable
one. Although https://dns.beta.gandi.net will continue to 
work for the foreseable future, this commits updates the
url to new official one.
2017-09-06 17:04:40 +00:00
neilpang 53273a15bf use socat for tls mode 2017-09-06 21:18:02 +08:00
neilpang 3eeb090578 fix tls mode back to use openssl 2017-09-06 20:50:31 +08:00
Santeri Kannisto a9726fde19 1 cert per domain
for cpanel_uapi
2017-09-05 17:42:17 +04:00
Santeri Kannisto f81d4033fa One cert per domain
Deploy works only for the first domain
2017-09-05 17:37:48 +04:00
neil 5e864ea3b5 Merge pull request #1013 from Neilpang/dev
Dev
2017-09-05 20:49:07 +08:00
neilpang 8148bfeacf fix https://github.com/Neilpang/acme.sh/issues/998 2017-09-05 20:32:14 +08:00
Manuel Friedli 1e30718df6 Try and work around shellcheck error SC2039: In POSIX sh, printf -%s-- is undefined. 2017-09-04 14:48:27 +02:00
Manuel Friedli 72e1eb88d9 Don't use individual redirects, but do it all in one block. 2017-09-04 14:40:28 +02:00
Manuel Friedli 8ee5ede834 Fix more formatting errors 2017-09-04 14:30:40 +02:00
Manuel Friedli bd8b1a2501 Don't use wget directly, but instead use _get and _post. 2017-09-04 14:27:22 +02:00
Manuel Friedli a098167bdb Fix more formatting errors 2017-09-04 14:07:10 +02:00
neil 7790208126 Merge pull request #1010 from 2globalnomads/patch-3
cpanel_uapi doc
2017-09-03 17:38:51 +08:00
Santeri e52304edb4 cpanel_uapi
tried to make it a bit less confusing
2017-09-03 13:35:20 +04:00
neil afdd02a80d Merge pull request #1006 from Neilpang/dev
Dev
2017-09-03 08:47:27 +08:00
neilpang c73fdd4022 minor 2017-09-03 08:45:58 +08:00
neilpang 4356eefbb1 fix https://github.com/Neilpang/acme.sh/issues/1005#event-1232471561 2017-09-03 08:42:44 +08:00
neilpang 6104680caa fix https://github.com/Neilpang/acme.sh/issues/999 2017-09-02 20:46:04 +08:00
neil 4373fdf48c Merge pull request #1003 from Neilpang/dev
fix for behind proxy
2017-09-02 19:10:08 +08:00
neilpang f9cdfd3e5b fix for behind proxy 2017-09-02 18:58:07 +08:00
neil b6c2fc5a69 Merge pull request #1001 from Neilpang/socat
Socat
2017-09-02 17:56:15 +08:00
neilpang cc6610edc2 add socat 2017-09-02 17:32:40 +08:00
neilpang 7b8ddfdd96 use socat 2017-09-02 08:59:30 +08:00
neilpang 443a5ca0c2 socat tls mode 2017-09-01 23:44:52 +08:00
neilpang 3794b5cb58 fix changes for :https://community.letsencrypt.org/t/acme-sh-standalone-fails-multiple-validation-requests-staging-multi-va/41249/8
use socat instead of nc.
2017-09-01 23:01:37 +08:00
Manuel Friedli 6cb5377d73 Fix bugs and more/new formatting errors. 2017-08-31 17:25:08 +02:00
Manuel Friedli a3a92ff1df Fix formatting errors. 2017-08-31 17:12:11 +02:00
neil 2068efdb38 Merge pull request #995 from Neilpang/dev
Dev
2017-08-30 22:22:50 +08:00
neil 258ca1b434 Merge pull request #991 from fritteli/fritteli-typos
Fritteli typos
2017-08-30 21:57:30 +08:00
Manuel Friedli 103fa959cb Typo 2017-08-30 00:47:31 +02:00
Manuel Friedli b6d48b7a14 Update README.md for the deploy hooks. 2017-08-30 00:45:03 +02:00
Manuel Friedli 412e4e6cf9 Add acknowledgement note 2017-08-30 00:24:31 +02:00
Manuel Friedli e6f81173a3 Delete auto-backup file 2017-08-29 23:58:20 +02:00
Manuel Friedli d50281453d Add --no-check-certificate option to wget, or else the initial deployment won't work because there isn't a valid certificate installed on the router yet. 2017-08-29 23:57:24 +02:00
Manuel Friedli 4bb488258d - Bugfixes
- Make sure the login actually worked
- Less output
2017-08-29 23:53:41 +02:00
Manuel Friedli f6da19ba83 add deploy script for the AVM FRITZ!Box 2017-08-29 23:14:21 +02:00
fritteli 88bb7b780d Typos 2017-08-29 22:35:11 +02:00
neil 3805e5d37e Merge pull request #988 from Neilpang/dev
Dev
2017-08-25 20:56:23 +08:00
neilpang a2d6daaef4 fix cpanel_uapi.sh 2017-08-25 20:54:10 +08:00
neilpang 48e9006cd1 fix cpanel uapi 2017-08-25 20:51:31 +08:00
neil a25a4b5d11 Merge pull request #986 from Neilpang/dev
Dev
2017-08-22 20:28:35 +08:00
neilpang 309bec474f add warning for dns manual mode 2017-08-22 20:27:13 +08:00
neil d36440a06d Merge pull request #940 from 2globalnomads/patch-1
cpanel_uapi.sh
2017-08-22 09:17:07 +08:00
neil 2a2f772412 Merge pull request #975 from Neilpang/dev
Dev
2017-08-17 22:06:10 +08:00
neil 6a524bff9d Merge pull request #973 from mvanini/master
Support for busybox in time2str()
2017-08-17 22:04:49 +08:00
neil 5def1169db Merge pull request #974 from Neilpang/dev
Dev
2017-08-17 21:52:33 +08:00
Michele a07395fb56 Added support for busybox in time2str()
awk fallback if none of preceding method works
2017-08-17 12:50:28 +02:00
neil e25a375f43 Merge pull request #969 from abelbeck/dns_duckdns
Update DuckDNS support, fix failure on first call, no longer save the…
2017-08-14 21:36:43 +08:00
Lonnie Abelbeck 96801e3478 Update DuckDNS support, fix failure on first call, no longer save the domain/username as a global, and other tweaks 2017-08-11 16:46:29 -05:00
neil 90100aa169 Merge pull request #967 from Neilpang/dev
support fcrontab, fix https://github.com/Neilpang/acme.sh/issues/966
2017-08-10 21:38:12 +08:00
neilpang 415f375ce6 support fcrontab, fix https://github.com/Neilpang/acme.sh/issues/966 2017-08-10 21:31:28 +08:00
neil 50d238b60f Merge pull request #963 from Neilpang/dev
format
2017-08-04 21:58:55 +08:00
neilpang 5c3b41bd93 format 2017-08-04 21:57:45 +08:00
neil 3e0971c159 Merge pull request #961 from Neilpang/dev
Dev
2017-08-03 23:40:05 +08:00
neil 57740fbd18 Merge pull request #960 from jfro/dev
Fix Linode DNS API to work on BSD
2017-08-03 22:38:17 +08:00
neil 16bc8f7040 Merge pull request #949 from candlerb/candlerb/unifi
Candlerb/unifi
2017-08-03 21:52:28 +08:00
Jeremy Knope c145f24621 Remove extra space 2017-08-03 09:47:45 -04:00
Jeremy Knope cd3a4573f2 Fix shell check errors 2017-07-31 08:37:30 -04:00
Brian Candler 8eab77f3c6 Add deployment script for unifi controller 2017-07-30 12:21:20 +01:00
neil 4af339424a Merge pull request #953 from angel333/master
Add DNS API script for Hurricane Electric DNS service
2017-07-30 10:45:40 +08:00
Ondrej Simek 4dd69a8b1a Exit codes, exit codes... Exit codes everywhere... 2017-07-29 14:40:56 +02:00
Ondrej Simek baa1160594 Make Shellcheck happier about exit codes 2017-07-29 14:31:27 +02:00
Ondrej Simek f438ff4bab Fix an improbable corner case. 2017-07-29 14:29:13 +02:00
Ondrej Simek a25b2af66c Get rid of _find_num 2017-07-29 14:25:07 +02:00
Ondrej Simek 31b67ab92e Few non-critical fixes. 2017-07-29 13:52:28 +02:00
neil 5303b36913 Merge pull request #958 from Neilpang/dev
Dev
2017-07-29 15:25:16 +08:00
neilpang a5c56c547d minor, fix dns param 2017-07-29 15:23:50 +08:00
Ondrej Simek ccf9a9976c Fix the previous rushed commit. 2017-07-28 18:33:25 +02:00
Jeremy Knope ab1efd923b back to sed 2017-07-28 10:26:56 -04:00
Ondrej Simek d6780f9e49 Retain an exit code 2017-07-28 15:29:35 +02:00
Ondrej Simek 8534e3b2f7 Make shellcheck happier 2017-07-28 13:58:47 +02:00
Jeremy Knope 8e6cf669ad Try awk instead for \n replacements 2017-07-27 14:15:19 -04:00
Ondrej Simek 577380e98e Few fixes for shellcheck 2017-07-27 18:44:55 +02:00
Ondrej Simek 235b5b0c15 Small cosmetic fixes. 2017-07-27 18:06:19 +02:00
Ondrej Simek aefed1d1b9 Get rid of shell arrays. 2017-07-27 18:04:53 +02:00
Jeremy Knope d39649f30d Revert non-linode scripts since they're untested 2017-07-27 08:52:46 -04:00
Ondrej Simek 1546b7e5a9 Missing quotes 2017-07-26 20:21:36 +02:00
Ondrej Simek ff74778dea Fix few issues from Travis 2017-07-26 20:15:34 +02:00
Jeremy Knope 29b21b828b Fix DNS API scripts on *BSD
\n isn't available in all regex/sed
2017-07-26 09:44:11 -04:00
neil a6a0495392 Merge pull request #952 from candlerb/candlerb/isecc
Clarify keylength parameter to _isEccKey() and _initpath()
2017-07-25 19:05:51 +08:00
Brian Candler 3281043e27 Clarify keylength parameter to _isEccKey() and _initpath()
Closes #950
2017-07-25 09:39:19 +01:00
Ondrej Simek f7299403f7 Incorporate Neilpang's comments 2017-07-23 07:31:55 +02:00
Ondrej Simek a0d251a336 Merge remote-tracking branch 'upstream/dev' 2017-07-23 05:15:27 +02:00
Ondrej Simek 8ca45d3d03 Add HE to README 2017-07-23 05:13:33 +02:00
Ondrej Simek d988542afc Sync with upstream 2017-07-23 05:09:48 +02:00
Ondrej Simek 4285d81ca9 Get rid of curl. 2017-07-23 05:00:02 +02:00
Santeri 4286b2917e renamed function 2017-07-19 12:22:00 +04:00
Santeri d09b5cb80e Rename cpanel_uapi.sh to cpanel_deploy.sh 2017-07-19 07:39:21 +04:00
Santeri 90fd18bf42 Renamed script to cpanel_uapi.sh
As per Neil's request.
2017-07-18 15:48:17 +04:00
neil cae6c8e5f5 Merge pull request #943 from Neilpang/dev
Dev
2017-07-14 20:38:11 +08:00
neil 473340c53b Merge pull request #936 from non7top/yandex
Add pdd.yandex.ru dns api support
2017-07-14 20:28:29 +08:00
Vladimir Berezhnoy ae302ee600 reformat docs 2017-07-14 03:51:08 +03:00
Vladimir Berezhnoy 27934ac4ca Merge branch 'yandex' of github.com:non7top/acme.sh into yandex 2017-07-14 03:27:11 +03:00
Vladimir Berezhnoy 283ef9adb7 minor fixes 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy 377fe5ecde add documentation 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy c848d3ee22 fix formatting 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy eb6be88fac rework root domain detection 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy fceb728501 fix egrep and exit 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy a0df46258d remove python 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy 57d1db58db shfmt fixes 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy d61b687853 remove awk 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy 42ab7a5d72 add newline and checks 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy 18cb11dcbf fix formatting 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy e9d5407792 fix syntax 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy a09b2c0074 fix syntax 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy a460ac021f add pdd.yandex.ru dns api 2017-07-14 03:26:36 +03:00
Vladimir Berezhnoy bdee66fe29 minor fixes 2017-07-13 18:37:13 +03:00
Vladimir Berezhnoy 84a251c8c7 add documentation 2017-07-13 17:05:57 +03:00
neil cea763bb11 Merge pull request #942 from Neilpang/dev
output log
2017-07-13 20:56:53 +08:00
neilpang accbda9d2f output log 2017-07-13 20:52:44 +08:00
Ondrej Simek 7d64e141e4 Add dns_he - DNS API script for Hurricane Electric DNS service
... Although not yet fully Posix compatible.
2017-07-12 20:24:54 +02:00
Vladimir Berezhnoy 6a9b4db448 fix formatting 2017-07-12 04:07:18 +03:00
Vladimir Berezhnoy e6a95ecd08 rework root domain detection 2017-07-12 03:51:48 +03:00
Vladimir Berezhnoy 10cb7585a7 fix egrep and exit 2017-07-11 02:19:39 +03:00
Santeri a577c7215f One more change to pass the check shellcheck test
Now it is tested and works also when run as a root.
2017-07-10 16:43:42 +04:00
neil e5244cf3c0 Merge pull request #941 from Neilpang/dev
do not retry for a invalid cert in cronjob.
2017-07-10 19:58:22 +08:00
neilpang c4d0aec536 do not retry for a invalid cert in cronjob.
fix https://github.com/Neilpang/acme.sh/issues/939
2017-07-10 19:51:55 +08:00
Santeri 796647158e Removed double quotes from _opt
Broke GoDaddy cpanel causing error (thanks Hedgehog)
2017-07-10 15:36:16 +04:00
Vladimir Berezhnoy 266e9d0619 remove python 2017-07-09 20:00:02 +03:00
Vladimir Berezhnoy 9ec54ef89b shfmt fixes 2017-07-09 13:21:55 +03:00
Vladimir Berezhnoy 256cb90f3c remove awk 2017-07-09 13:15:01 +03:00
Vladimir Berezhnoy 8f3a3b293d add newline and checks 2017-07-09 13:00:42 +03:00
neil 975a7359a2 Merge pull request #937 from Neilpang/dev
Dev
2017-07-09 09:48:37 +08:00
neil ac7361a55e Merge pull request #935 from abelbeck/dns_dyn
Add 'dns_dyn' DNS challenge validation script for Dyn Managed DNS API, Issue #594
2017-07-09 09:20:34 +08:00
Vladimir Berezhnoy bd41f50ba5 fix formatting 2017-07-08 22:02:34 +03:00
Vladimir Berezhnoy a2038ab07e fix syntax 2017-07-08 21:57:27 +03:00
Vladimir Berezhnoy 6445a7674b fix syntax 2017-07-08 21:52:47 +03:00
Vladimir Berezhnoy 3bf2e89a1a add pdd.yandex.ru dns api 2017-07-08 21:35:22 +03:00
Lonnie Abelbeck e6a13bf386 Merge branch 'dns_dyn' of github.com:abelbeck/acme.sh into dns_dyn 2017-07-08 07:10:09 -05:00
Lonnie Abelbeck 42b2adc03e Add 'dns_dyn' DNS challenge validation script for Dyn Managed DNS API
dns_dyn.sh, remove empty line at end

dns_dyn.sh, remove trailing spaces at end of line

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

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

No files matched your search

+9 -15
View File
@@ -1,10 +1,14 @@
language: shell
sudo: required
dist: trusty
os:
- linux
- osx
services:
- docker
env:
global:
- SHFMT_URL=https://github.com/mvdan/sh/releases/download/v0.4.0/shfmt_v0.4.0_linux_amd64
@@ -18,20 +22,10 @@ addons:
install:
- if [ "$TRAVIS_OS_NAME" = 'osx' ]; then
brew update && brew install openssl;
brew info openssl;
ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/;
ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/;
ln -s /usr/local/Cellar/openssl/1.0.2j/bin/openssl /usr/local/openssl;
_old_path="$PATH";
echo "PATH=$PATH";
export PATH="";
export ACME_OPENSSL_BIN="/usr/local/openssl";
openssl version 2>&1 || true;
$ACME_OPENSSL_BIN version 2>&1 || true;
export PATH="$_old_path";
brew update && brew install socat;
export PATH="/usr/local/opt/openssl@1.1/bin:$PATH" ;
fi
script:
- echo "NGROK_TOKEN=$(echo "$NGROK_TOKEN" | wc -c)"
- command -V openssl && openssl version
@@ -40,10 +34,10 @@ script:
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then ~/shfmt -l -w -i 2 . ; fi
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then git diff --exit-code && echo "shfmt OK" ; fi
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then shellcheck -V ; fi
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then shellcheck **/*.sh && echo "shellcheck OK" ; fi
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then shellcheck -e SC2181 **/*.sh && echo "shellcheck OK" ; fi
- cd ..
- git clone https://github.com/Neilpang/acmetest.git && cp -r acme.sh acmetest/ && cd acmetest
- if [ "$TRAVIS_OS_NAME" = "linux" -a "$NGROK_TOKEN" ]; then sudo TEST_LOCAL="$TEST_LOCAL" NGROK_TOKEN="$NGROK_TOKEN" ./letest.sh ; fi
- if [ "$TRAVIS_OS_NAME" = "linux" -a "$NGROK_TOKEN" ]; then sudo TEST_LOCAL="$TEST_LOCAL" NGROK_TOKEN="$NGROK_TOKEN" ./rundocker.sh testplat ubuntu:latest ; fi
- if [ "$TRAVIS_OS_NAME" = "osx" -a "$NGROK_TOKEN" ]; then sudo TEST_LOCAL="$TEST_LOCAL" NGROK_TOKEN="$NGROK_TOKEN" ACME_OPENSSL_BIN="$ACME_OPENSSL_BIN" ./letest.sh ; fi
+12 -8
View File
@@ -1,22 +1,22 @@
FROM alpine
FROM alpine:3.6
RUN apk update -f \
&& apk --no-cache add -f \
openssl \
curl \
netcat-openbsd
socat \
&& rm -rf /var/cache/apk/*
ENV LE_CONFIG_HOME /acme.sh
ENV AUTO_UPGRADE 1
#Install
RUN mkdir -p /install_acme.sh/
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)
RUN rm -rf /install_acme.sh/
RUN cd /install_acme.sh && ([ -f /install_acme.sh/acme.sh ] && /install_acme.sh/acme.sh --install || curl https://get.acme.sh | sh) && rm -rf /install_acme.sh/
RUN ln -s /root/.acme.sh/acme.sh /usr/local/bin/acme.sh
RUN ln -s /root/.acme.sh/acme.sh /usr/local/bin/acme.sh && crontab -l | grep acme.sh | sed 's#> /dev/null##' | crontab -
RUN for verb in help \
version \
@@ -44,16 +44,20 @@ RUN for verb in help \
create-domain-key \
createCSR \
deactivate \
deactivate-account \
; do \
printf -- "%b" "#!/usr/bin/env sh\n/root/.acme.sh/acme.sh --${verb} --config-home /acme.sh \"\$@\"" >/usr/local/bin/--${verb} && chmod +x /usr/local/bin/--${verb} \
; done
RUN printf "%b" '#!'"/usr/bin/env sh\n \
if [ \"\$1\" = \"daemon\" ]; then \n \
crond; tail -f /dev/null;\n \
trap \"echo stop && killall crond && exit 0\" SIGTERM SIGINT \n \
crond && while true; do sleep 1; done;\n \
else \n \
/root/.acme.sh/acme.sh --config-home /acme.sh \"\$@\"\n \
exec -- \"\$@\"\n \
fi" >/entry.sh && chmod +x /entry.sh
VOLUME /acme.sh
ENTRYPOINT ["/entry.sh"]
CMD ["--help"]
+12 -3
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.
@@ -60,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
@@ -197,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
@@ -294,6 +296,9 @@ acme.sh --renew -d example.com
Ok, it's finished.
**Take care, this is dns manual mode, it can not be renewed automatically. you will have to add a new txt record to your domain by your hand when you renew your cert.**
**Please use dns api mode instead.**
# 9. Automatic DNS API integration
@@ -329,7 +334,11 @@ You don't have to do anything manually!
1. Dynu API (https://www.dynu.com)
1. DNSimple API
1. NS1.com API
1. DuckDNS.org API
1. Name.com API
1. Dyn Managed DNS API
1. Yandex PDD API (https://pdd.yandex.ru)
1. Hurricane Electric DNS service (https://dns.he.net)
And:
+483 -220
View File
File diff suppressed because it is too large. Load diff
+41 -5
View File
@@ -4,7 +4,9 @@ Before you can deploy your cert, you must [issue the cert first](https://github.
Here are the scripts to deploy the certs/key to the server/services.
## 1. Deploy the certs to your cpanel host.
## 1. Deploy the certs to your cpanel host
If you want to deploy using cpanel UAPI see 7.
(cpanel deploy hook is not finished yet, this is just an example.)
@@ -18,7 +20,7 @@ export DEPLOY_CPANEL_PASSWORD=PASSWORD
acme.sh --deploy -d example.com --deploy-hook cpanel
```
## 2. Deploy ssl cert on kong proxy engine based on api.
## 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.
@@ -27,11 +29,11 @@ Currently supports Kong-v0.10.x.
acme.sh --deploy -d ftp.example.com --deploy-hook kong
```
## 3. Deploy the cert to remote server through SSH access.
## 3. Deploy the cert to remote server through SSH access
(TODO)
## 4. Deploy the cert to local vsftpd server.
## 4. Deploy the cert to local vsftpd server
```sh
acme.sh --deploy -d ftp.example.com --deploy-hook vsftpd
@@ -53,7 +55,7 @@ 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.
## 5. Deploy the cert to local exim4 server
```sh
acme.sh --deploy -d ftp.example.com --deploy-hook exim4
@@ -80,3 +82,37 @@ acme.sh --deploy -d ftp.example.com --deploy-hook exim4
```sh
acme.sh --deploy -d ftp.example.com --deploy-hook keychain
```
## 7. Deploy to cpanel host using UAPI
This hook is using UAPI and works in cPanel & WHM version 56 or newer.
```
acme.sh --deploy -d example.com --deploy-hook cpanel_uapi
```
DEPLOY_CPANEL_USER is required only if you run the script as root and it should contain cpanel username.
```sh
export DEPLOY_CPANEL_USER=username
acme.sh --deploy -d example.com --deploy-hook cpanel_uapi
```
Please note, that the cpanel_uapi hook will deploy only the first domain when your certificate will automatically renew. Therefore you should issue a separete certificate for each domain.
## 8. Deploy the cert to your FRITZ!Box router
You must specify the credentials that have administrative privileges on the FRITZ!Box in order to deploy the certificate, plus the URL of your FRITZ!Box, through the following environment variables:
```sh
$ export DEPLOY_FRITZBOX_USERNAME=my_username
$ export DEPLOY_FRITZBOX_PASSWORD=the_password
$ export DEPLOY_FRITZBOX_URL=https://fritzbox.example.com
```
After the first deployment, these values will be stored in your $HOME/.acme.sh/account.conf. You may now deploy the certificate like this:
```sh
acme.sh --deploy -d fritzbox.example.com --deploy-hook fritzbox
```
## 9. Deploy the cert to strongswan
```sh
acme.sh --deploy -d ftp.example.com --deploy-hook strongswan
```
-29
View File
@@ -1,29 +0,0 @@
#!/usr/bin/env sh
#Here is the script to deploy the cert to your cpanel account by the cpanel APIs.
#returns 0 means success, otherwise error.
#export DEPLOY_CPANEL_USER=myusername
#export DEPLOY_CPANEL_PASSWORD=PASSWORD
######## Public functions #####################
#domain keyfile certfile cafile fullchain
cpanel_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
_err "Not implemented yet"
return 1
}
+64
View File
@@ -0,0 +1,64 @@
#!/usr/bin/env sh
# Here is the script to deploy the cert to your cpanel using the cpanel API.
# Uses command line uapi. --user option is needed only if run as root.
# Returns 0 when success.
# Written by Santeri Kannisto <santeri.kannisto@2globalnomads.info>
# Public domain, 2017
#export DEPLOY_CPANEL_USER=myusername
######## Public functions #####################
#domain keyfile certfile cafile fullchain
cpanel_uapi_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
if ! _exists uapi; then
_err "The command uapi is not found."
return 1
fi
if ! _exists php; then
_err "The command php is not found."
return 1
fi
# read cert and key files and urlencode both
_certstr=$(cat "$_ccert")
_keystr=$(cat "$_ckey")
_cert=$(php -r "echo urlencode(\"$_certstr\");")
_key=$(php -r "echo urlencode(\"$_keystr\");")
_debug _cert "$_cert"
_debug _key "$_key"
if [ "$(id -u)" = 0 ]; then
if [ -z "$DEPLOY_CPANEL_USER" ]; then
_err "It seems that you are root, please define the target user name: export DEPLOY_CPANEL_USER=username"
return 1
fi
_savedomainconf DEPLOY_CPANEL_USER "$DEPLOY_CPANEL_USER"
_response=$(uapi --user="$DEPLOY_CPANEL_USER" SSL install_ssl domain="$_cdomain" cert="$_cert" key="$_key")
else
_response=$(uapi SSL install_ssl domain="$_cdomain" cert="$_cert" key="$_key")
fi
error_response="status: 0"
if test "${_response#*$error_response}" != "$_response"; then
_err "Error in deploying certificate:"
_err "$_response"
return 1
fi
_debug response "$_response"
_info "Certificate successfully deployed"
return 0
}
+108
View File
@@ -0,0 +1,108 @@
#!/usr/bin/env sh
#Here is a script to deploy cert to an AVM FRITZ!Box router.
#returns 0 means success, otherwise error.
#DEPLOY_FRITZBOX_USERNAME="username"
#DEPLOY_FRITZBOX_PASSWORD="password"
#DEPLOY_FRITZBOX_URL="https://fritz.box"
# Kudos to wikrie at Github for his FRITZ!Box update script:
# https://gist.github.com/wikrie/f1d5747a714e0a34d0582981f7cb4cfb
######## Public functions #####################
#domain keyfile certfile cafile fullchain
fritzbox_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
if ! _exists iconv; then
_err "iconv not found"
return 1
fi
_fritzbox_username="${DEPLOY_FRITZBOX_USERNAME}"
_fritzbox_password="${DEPLOY_FRITZBOX_PASSWORD}"
_fritzbox_url="${DEPLOY_FRITZBOX_URL}"
_debug _fritzbox_url "$_fritzbox_url"
_debug _fritzbox_username "$_fritzbox_username"
_secure_debug _fritzbox_password "$_fritzbox_password"
if [ -z "$_fritzbox_username" ]; then
_err "FRITZ!Box username is not found, please define DEPLOY_FRITZBOX_USERNAME."
return 1
fi
if [ -z "$_fritzbox_password" ]; then
_err "FRITZ!Box password is not found, please define DEPLOY_FRITZBOX_PASSWORD."
return 1
fi
if [ -z "$_fritzbox_url" ]; then
_err "FRITZ!Box url is not found, please define DEPLOY_FRITZBOX_URL."
return 1
fi
_saveaccountconf DEPLOY_FRITZBOX_USERNAME "${_fritzbox_username}"
_saveaccountconf DEPLOY_FRITZBOX_PASSWORD "${_fritzbox_password}"
_saveaccountconf DEPLOY_FRITZBOX_URL "${_fritzbox_url}"
# Do not check for a valid SSL certificate, because initially the cert is not valid, so it could not install the LE generated certificate
export HTTPS_INSECURE=1
_info "Log in to the FRITZ!Box"
_fritzbox_challenge="$(_get "${_fritzbox_url}/login_sid.lua" | sed -e 's/^.*<Challenge>//' -e 's/<\/Challenge>.*$//')"
_fritzbox_hash="$(printf "%s-%s" "${_fritzbox_challenge}" "${_fritzbox_password}" | iconv -f ASCII -t UTF16LE | md5sum | awk '{print $1}')"
_fritzbox_sid="$(_get "${_fritzbox_url}/login_sid.lua?sid=0000000000000000&username=${_fritzbox_username}&response=${_fritzbox_challenge}-${_fritzbox_hash}" | sed -e 's/^.*<SID>//' -e 's/<\/SID>.*$//')"
if [ -z "${_fritzbox_sid}" ] || [ "${_fritzbox_sid}" = "0000000000000000" ]; then
_err "Logging in to the FRITZ!Box failed. Please check username, password and URL."
return 1
fi
_info "Generate form POST request"
_post_request="$(_mktemp)"
_post_boundary="---------------------------$(date +%Y%m%d%H%M%S)"
# _CERTPASSWORD_ is unset because Let's Encrypt certificates don't have a password. But if they ever do, here's the place to use it!
_CERTPASSWORD_=
{
printf -- "--"
printf -- "%s\r\n" "${_post_boundary}"
printf "Content-Disposition: form-data; name=\"sid\"\r\n\r\n%s\r\n" "${_fritzbox_sid}"
printf -- "--"
printf -- "%s\r\n" "${_post_boundary}"
printf "Content-Disposition: form-data; name=\"BoxCertPassword\"\r\n\r\n%s\r\n" "${_CERTPASSWORD_}"
printf -- "--"
printf -- "%s\r\n" "${_post_boundary}"
printf "Content-Disposition: form-data; name=\"BoxCertImportFile\"; filename=\"BoxCert.pem\"\r\n"
printf "Content-Type: application/octet-stream\r\n\r\n"
cat "${_ckey}" "${_cfullchain}"
printf "\r\n"
printf -- "--"
printf -- "%s--" "${_post_boundary}"
} >>"${_post_request}"
_info "Upload certificate to the FRITZ!Box"
export _H1="Content-type: multipart/form-data boundary=${_post_boundary}"
_post "$(cat "${_post_request}")" "${_fritzbox_url}/cgi-bin/firmwarecfg" | grep SSL
retval=$?
if [ $retval = 0 ]; then
_info "Upload successful"
else
_err "Upload failed"
fi
rm "${_post_request}"
return $retval
}
+32
View File
@@ -0,0 +1,32 @@
#!/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
strongswan_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"
cat "$_ckey" >"/etc/ipsec.d/private/$(basename "$_ckey")"
cat "$_ccert" >"/etc/ipsec.d/certs/$(basename "$_ccert")"
cat "$_cca" >"/etc/ipsec.d/cacerts/$(basename "$_cca")"
cat "$_cfullchain" >"/etc/ipsec.d/cacerts/$(basename "$_cfullchain")"
ipsec reload
}
+100
View File
@@ -0,0 +1,100 @@
#!/usr/bin/env sh
#Here is a script to deploy cert to unifi server.
#returns 0 means success, otherwise error.
#DEPLOY_UNIFI_KEYSTORE="/usr/lib/unifi/data/keystore"
#DEPLOY_UNIFI_KEYPASS="aircontrolenterprise"
#DEPLOY_UNIFI_RELOAD="service unifi restart"
######## Public functions #####################
#domain keyfile certfile cafile fullchain
unifi_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
if ! _exists keytool; then
_err "keytool not found"
return 1
fi
DEFAULT_UNIFI_KEYSTORE="/usr/lib/unifi/data/keystore"
_unifi_keystore="${DEPLOY_UNIFI_KEYSTORE:-$DEFAULT_UNIFI_KEYSTORE}"
DEFAULT_UNIFI_KEYPASS="aircontrolenterprise"
_unifi_keypass="${DEPLOY_UNIFI_KEYPASS:-$DEFAULT_UNIFI_KEYPASS}"
DEFAULT_UNIFI_RELOAD="service unifi restart"
_reload="${DEPLOY_UNIFI_RELOAD:-$DEFAULT_UNIFI_RELOAD}"
_debug _unifi_keystore "$_unifi_keystore"
if [ ! -f "$_unifi_keystore" ]; then
if [ -z "$DEPLOY_UNIFI_KEYSTORE" ]; then
_err "unifi keystore is not found, please define DEPLOY_UNIFI_KEYSTORE"
return 1
else
_err "It seems that the specified unifi keystore is not valid, please check."
return 1
fi
fi
if [ ! -w "$_unifi_keystore" ]; then
_err "The file $_unifi_keystore is not writable, please change the permission."
return 1
fi
_info "Generate import pkcs12"
_import_pkcs12="$(_mktemp)"
_toPkcs "$_import_pkcs12" "$_ckey" "$_ccert" "$_cca" "$_unifi_keypass" unifi root
if [ "$?" != "0" ]; then
_err "Oops, error creating import pkcs12, please report bug to us."
return 1
fi
_info "Modify unifi keystore: $_unifi_keystore"
if keytool -importkeystore \
-deststorepass "$_unifi_keypass" -destkeypass "$_unifi_keypass" -destkeystore "$_unifi_keystore" \
-srckeystore "$_import_pkcs12" -srcstoretype PKCS12 -srcstorepass "$_unifi_keypass" \
-alias unifi -noprompt; then
_info "Import keystore success!"
rm "$_import_pkcs12"
else
_err "Import unifi keystore error, please report bug to us."
rm "$_import_pkcs12"
return 1
fi
_info "Run reload: $_reload"
if eval "$_reload"; then
_info "Reload success!"
if [ "$DEPLOY_UNIFI_KEYSTORE" ]; then
_savedomainconf DEPLOY_UNIFI_KEYSTORE "$DEPLOY_UNIFI_KEYSTORE"
else
_cleardomainconf DEPLOY_UNIFI_KEYSTORE
fi
if [ "$DEPLOY_UNIFI_KEYPASS" ]; then
_savedomainconf DEPLOY_UNIFI_KEYPASS "$DEPLOY_UNIFI_KEYPASS"
else
_cleardomainconf DEPLOY_UNIFI_KEYPASS
fi
if [ "$DEPLOY_UNIFI_RELOAD" ]; then
_savedomainconf DEPLOY_UNIFI_RELOAD "$DEPLOY_UNIFI_RELOAD"
else
_cleardomainconf DEPLOY_UNIFI_RELOAD
fi
return 0
else
_err "Reload error"
return 1
fi
return 0
}
+99 -1
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:
@@ -420,6 +420,7 @@ Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_cloudns -d example.com -d www.example.com
```
The `CLOUDNS_AUTH_ID` and `CLOUDNS_AUTH_PASSWORD` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 22. Use Infoblox API
@@ -505,6 +506,102 @@ Ok, let's issue a cert now:
acme.sh --issue --dns dns_nsone -d example.com -d www.example.com
```
## 27. Use DuckDNS.org API
```
export DuckDNS_Token="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
```
Please note that since DuckDNS uses StartSSL as their cert provider, thus
--insecure may need to be used when issuing certs:
```
acme.sh --insecure --issue --dns dns_duckdns -d mydomain.duckdns.org
```
For issues, please report to https://github.com/raidenii/acme.sh/issues.
## 28. Use Name.com API
You'll need to fill out the form at https://www.name.com/reseller/apply to apply
for API username and token.
```
export Namecom_Username="testuser"
export Namecom_Token="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
```
And now you can issue certs with:
```
acme.sh --issue --dns dns_namecom -d example.com -d www.example.com
```
For issues, please report to https://github.com/raidenii/acme.sh/issues.
## 29. Use Dyn Managed DNS API to automatically issue cert
First, login to your Dyn Managed DNS account: https://portal.dynect.net/login/
It is recommended to add a new user specific for API access.
The minimum "Zones & Records Permissions" required are:
```
RecordAdd
RecordUpdate
RecordDelete
RecordGet
ZoneGet
ZoneAddNode
ZoneRemoveNode
ZonePublish
```
Pass the API user credentials to the environment:
```
export DYN_Customer="customer"
export DYN_Username="apiuser"
export DYN_Password="secret"
```
Ok, let's issue a cert now:
```
acme.sh --issue --dns dns_dyn -d example.com -d www.example.com
```
The `DYN_Customer`, `DYN_Username` and `DYN_Password` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
## 30. Use pdd.yandex.ru API
```
export PDD_Token="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
```
Follow these instructions to get the token for your domain https://tech.yandex.com/domain/doc/concepts/access-docpage/
```
acme.sh --issue --dns dns_yandex -d mydomain.example.org
```
For issues, please report to https://github.com/non7top/acme.sh/issues.
## 31. Use Hurricane Electric
Hurricane Electric doesn't have an API so just set your login credentials like so:
```
export HE_Username="yourusername"
export HE_Password="password"
```
Then you can issue your certificate:
```
acme.sh --issue --dns dns_he -d example.com -d www.example.com
```
The `HE_Username` and `HE_Password` settings will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
Please report any issues to https://github.com/angel333/acme.sh or to <me@ondrejsimek.com>.
# Use custom API
If your API is not supported yet, you can write your own DNS API.
@@ -521,6 +618,7 @@ acme.sh --issue --dns dns_myapi -d example.com -d www.example.com
For more details, please check our sample script: [dns_myapi.sh](dns_myapi.sh)
See: https://github.com/Neilpang/acme.sh/wiki/DNS-API-Dev-Guide
# Use lexicon DNS API
+11 -10
View File
@@ -87,6 +87,7 @@ _get_root() {
_debug "response" "$response"
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug2 "Checking domain: $h"
if [ -z "$h" ]; then
if _contains "$response" "<IsTruncated>true</IsTruncated>" && _contains "$response" "<NextMarker>"; then
_debug "IsTruncated"
@@ -102,23 +103,23 @@ _get_root() {
fi
fi
#not valid
_err "Invalid domain"
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>.*<PrivateZone>false<.PrivateZone>.*<.HostedZone>")"
_debug hostedzone "$hostedzone"
if [ -z "$hostedzone" ]; then
_err "Error, can not get hostedzone."
if [ "$hostedzone" ]; then
_domain_id=$(printf "%s\n" "$hostedzone" | _egrep_o "<Id>.*<.Id>" | head -n 1 | _egrep_o ">.*<" | tr -d "<>")
if [ "$_domain_id" ]; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain=$h
return 0
fi
_err "Can not find domain id: $h"
return 1
fi
_domain_id=$(printf "%s\n" "$hostedzone" | _egrep_o "<Id>.*<.Id>" | head -n 1 | _egrep_o ">.*<" | 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)
@@ -208,7 +209,7 @@ aws_rest() {
kServiceH="$(printf "$Service%s" | _hmac "$Hash" "$kRegionH" hex)"
_debug2 kServiceH "$kServiceH"
kSigningH="$(printf "aws4_request%s" | _hmac "$Hash" "$kServiceH" hex)"
kSigningH="$(printf "%s" "aws4_request" | _hmac "$Hash" "$kServiceH" hex)"
_debug2 kSigningH "$kSigningH"
signature="$(printf "$StringToSign%s" | _hmac "$Hash" "$kSigningH" hex)"
+14
View File
@@ -96,6 +96,16 @@ _dns_cloudns_init_check() {
return 0
fi
CLOUDNS_AUTH_ID="${CLOUDNS_AUTH_ID:-$(_readaccountconf_mutable CLOUDNS_AUTH_ID)}"
CLOUDNS_AUTH_PASSWORD="${CLOUDNS_AUTH_PASSWORD:-$(_readaccountconf_mutable CLOUDNS_AUTH_PASSWORD)}"
if [ -z "$CLOUDNS_AUTH_ID" ] || [ -z "$CLOUDNS_AUTH_PASSWORD" ]; then
CLOUDNS_AUTH_ID=""
CLOUDNS_AUTH_PASSWORD=""
_err "You don't specify cloudns api id and password yet."
_err "Please create you id and password and try again."
return 1
fi
if [ -z "$CLOUDNS_AUTH_ID" ]; then
_err "CLOUDNS_AUTH_ID is not configured"
return 1
@@ -113,6 +123,10 @@ _dns_cloudns_init_check() {
return 1
fi
#save the api id and password to the account conf file.
_saveaccountconf_mutable CLOUDNS_AUTH_ID "$CLOUDNS_AUTH_ID"
_saveaccountconf_mutable CLOUDNS_AUTH_PASSWORD "$CLOUDNS_AUTH_PASSWORD"
CLOUDNS_INIT_CHECK_COMPLETED=1
return 0
+128
View File
@@ -0,0 +1,128 @@
#!/usr/bin/env sh
#Created by RaidenII, to use DuckDNS's API to add/remove text records
#06/27/2017
# Pass credentials before "acme.sh --issue --dns dns_duckdns ..."
# --
# export DuckDNS_Token="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
# --
#
# Due to the fact that DuckDNS uses StartSSL as cert provider, --insecure may need to be used with acme.sh
DuckDNS_API="https://www.duckdns.org/update"
######## Public functions #####################
#Usage: dns_duckdns_add _acme-challenge.domain.duckdns.org "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_duckdns_add() {
fulldomain=$1
txtvalue=$2
DuckDNS_Token="${DuckDNS_Token:-$(_readaccountconf_mutable DuckDNS_Token)}"
if [ -z "$DuckDNS_Token" ]; then
_err "You must export variable: DuckDNS_Token"
_err "The token for your DuckDNS account is necessary."
_err "You can look it up in your DuckDNS account."
return 1
fi
# Now save the credentials.
_saveaccountconf_mutable DuckDNS_Token "$DuckDNS_Token"
# Unfortunately, DuckDNS does not seems to support lookup domain through API
# So I assume your credentials (which are your domain and token) are correct
# If something goes wrong, we will get a KO response from DuckDNS
if ! _duckdns_get_domain; then
return 1
fi
# Now add the TXT record to DuckDNS
_info "Trying to add TXT record"
if _duckdns_rest GET "domains=$_duckdns_domain&token=$DuckDNS_Token&txt=$txtvalue"; then
if [ "$response" = "OK" ]; then
_info "TXT record has been successfully added to your DuckDNS domain."
_info "Note that all subdomains under this domain uses the same TXT record."
return 0
else
_err "Errors happened during adding the TXT record, response=$response"
return 1
fi
else
_err "Errors happened during adding the TXT record."
return 1
fi
}
#Usage: fulldomain txtvalue
#Remove the txt record after validation.
dns_duckdns_rm() {
fulldomain=$1
txtvalue=$2
DuckDNS_Token="${DuckDNS_Token:-$(_readaccountconf_mutable DuckDNS_Token)}"
if [ -z "$DuckDNS_Token" ]; then
_err "You must export variable: DuckDNS_Token"
_err "The token for your DuckDNS account is necessary."
_err "You can look it up in your DuckDNS account."
return 1
fi
if ! _duckdns_get_domain; then
return 1
fi
# Now remove the TXT record from DuckDNS
_info "Trying to remove TXT record"
if _duckdns_rest GET "domains=$_duckdns_domain&token=$DuckDNS_Token&txt=&clear=true"; then
if [ "$response" = "OK" ]; then
_info "TXT record has been successfully removed from your DuckDNS domain."
return 0
else
_err "Errors happened during removing the TXT record, response=$response"
return 1
fi
else
_err "Errors happened during removing the TXT record."
return 1
fi
}
#################### Private functions below ##################################
#fulldomain=_acme-challenge.domain.duckdns.org
#returns
# _duckdns_domain=domain
_duckdns_get_domain() {
# We'll extract the domain/username from full domain
_duckdns_domain="$(printf "%s" "$fulldomain" | _lower_case | _egrep_o '[.][^.][^.]*[.]duckdns.org' | cut -d . -f 2)"
if [ -z "$_duckdns_domain" ]; then
_err "Error extracting the domain."
return 1
fi
return 0
}
#Usage: method URI
_duckdns_rest() {
method=$1
param="$2"
_debug param "$param"
url="$DuckDNS_API?$param"
_debug url "$url"
# DuckDNS uses GET to update domain info
if [ "$method" = "GET" ]; then
response="$(_get "$url")"
else
_err "Unsupported method"
return 1
fi
_debug2 response "$response"
return 0
}
+339
View File
@@ -0,0 +1,339 @@
#!/usr/bin/env sh
#
# Dyn.com Domain API
#
# Author: Gerd Naschenweng
# https://github.com/magicdude4eva
#
# Dyn Managed DNS API
# https://help.dyn.com/dns-api-knowledge-base/
#
# It is recommended to add a "Dyn Managed DNS" user specific for API access.
# The "Zones & Records Permissions" required by this script are:
# --
# RecordAdd
# RecordUpdate
# RecordDelete
# RecordGet
# ZoneGet
# ZoneAddNode
# ZoneRemoveNode
# ZonePublish
# --
#
# Pass credentials before "acme.sh --issue --dns dns_dyn ..."
# --
# export DYN_Customer="customer"
# export DYN_Username="apiuser"
# export DYN_Password="secret"
# --
DYN_API="https://api.dynect.net/REST"
#REST_API
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "Challenge-code"
dns_dyn_add() {
fulldomain="$1"
txtvalue="$2"
DYN_Customer="${DYN_Customer:-$(_readaccountconf_mutable DYN_Customer)}"
DYN_Username="${DYN_Username:-$(_readaccountconf_mutable DYN_Username)}"
DYN_Password="${DYN_Password:-$(_readaccountconf_mutable DYN_Password)}"
if [ -z "$DYN_Customer" ] || [ -z "$DYN_Username" ] || [ -z "$DYN_Password" ]; then
DYN_Customer=""
DYN_Username=""
DYN_Password=""
_err "You must export variables: DYN_Customer, DYN_Username and DYN_Password"
return 1
fi
#save the config variables to the account conf file.
_saveaccountconf_mutable DYN_Customer "$DYN_Customer"
_saveaccountconf_mutable DYN_Username "$DYN_Username"
_saveaccountconf_mutable DYN_Password "$DYN_Password"
if ! _dyn_get_authtoken; then
return 1
fi
if [ -z "$_dyn_authtoken" ]; then
_dyn_end_session
return 1
fi
if ! _dyn_get_zone; then
_dyn_end_session
return 1
fi
if ! _dyn_add_record; then
_dyn_end_session
return 1
fi
if ! _dyn_publish_zone; then
_dyn_end_session
return 1
fi
_dyn_end_session
return 0
}
#Usage: fulldomain txtvalue
#Remove the txt record after validation.
dns_dyn_rm() {
fulldomain="$1"
txtvalue="$2"
DYN_Customer="${DYN_Customer:-$(_readaccountconf_mutable DYN_Customer)}"
DYN_Username="${DYN_Username:-$(_readaccountconf_mutable DYN_Username)}"
DYN_Password="${DYN_Password:-$(_readaccountconf_mutable DYN_Password)}"
if [ -z "$DYN_Customer" ] || [ -z "$DYN_Username" ] || [ -z "$DYN_Password" ]; then
DYN_Customer=""
DYN_Username=""
DYN_Password=""
_err "You must export variables: DYN_Customer, DYN_Username and DYN_Password"
return 1
fi
if ! _dyn_get_authtoken; then
return 1
fi
if [ -z "$_dyn_authtoken" ]; then
_dyn_end_session
return 1
fi
if ! _dyn_get_zone; then
_dyn_end_session
return 1
fi
if ! _dyn_get_record_id; then
_dyn_end_session
return 1
fi
if [ -z "$_dyn_record_id" ]; then
_dyn_end_session
return 1
fi
if ! _dyn_rm_record; then
_dyn_end_session
return 1
fi
if ! _dyn_publish_zone; then
_dyn_end_session
return 1
fi
_dyn_end_session
return 0
}
#################### Private functions below ##################################
#get Auth-Token
_dyn_get_authtoken() {
_info "Start Dyn API Session"
data="{\"customer_name\":\"$DYN_Customer\", \"user_name\":\"$DYN_Username\", \"password\":\"$DYN_Password\"}"
dyn_url="$DYN_API/Session/"
method="POST"
_debug data "$data"
_debug dyn_url "$dyn_url"
export _H1="Content-Type: application/json"
response="$(_post "$data" "$dyn_url" "" "$method")"
sessionstatus="$(printf "%s\n" "$response" | _egrep_o '"status" *: *"[^"]*' | _head_n 1 | sed 's#^"status" *: *"##')"
_debug response "$response"
_debug sessionstatus "$sessionstatus"
if [ "$sessionstatus" = "success" ]; then
_dyn_authtoken="$(printf "%s\n" "$response" | _egrep_o '"token" *: *"[^"]*' | _head_n 1 | sed 's#^"token" *: *"##')"
_info "Token received"
_debug _dyn_authtoken "$_dyn_authtoken"
return 0
fi
_dyn_authtoken=""
_err "get token failed"
return 1
}
#fulldomain=_acme-challenge.www.domain.com
#returns
# _dyn_zone=domain.com
_dyn_get_zone() {
i=2
while true; do
domain="$(printf "%s" "$fulldomain" | cut -d . -f "$i-100")"
if [ -z "$domain" ]; then
break
fi
dyn_url="$DYN_API/Zone/$domain/"
export _H1="Auth-Token: $_dyn_authtoken"
export _H2="Content-Type: application/json"
response="$(_get "$dyn_url" "" "")"
sessionstatus="$(printf "%s\n" "$response" | _egrep_o '"status" *: *"[^"]*' | _head_n 1 | sed 's#^"status" *: *"##')"
_debug dyn_url "$dyn_url"
_debug response "$response"
_debug sessionstatus "$sessionstatus"
if [ "$sessionstatus" = "success" ]; then
_dyn_zone="$domain"
return 0
fi
i=$(_math "$i" + 1)
done
_dyn_zone=""
_err "get zone failed"
return 1
}
#add TXT record
_dyn_add_record() {
_info "Adding TXT record"
data="{\"rdata\":{\"txtdata\":\"$txtvalue\"},\"ttl\":\"300\"}"
dyn_url="$DYN_API/TXTRecord/$_dyn_zone/$fulldomain/"
method="POST"
export _H1="Auth-Token: $_dyn_authtoken"
export _H2="Content-Type: application/json"
response="$(_post "$data" "$dyn_url" "" "$method")"
sessionstatus="$(printf "%s\n" "$response" | _egrep_o '"status" *: *"[^"]*' | _head_n 1 | sed 's#^"status" *: *"##')"
_debug response "$response"
_debug sessionstatus "$sessionstatus"
if [ "$sessionstatus" = "success" ]; then
_info "TXT Record successfully added"
return 0
fi
_err "add TXT record failed"
return 1
}
#publish the zone
_dyn_publish_zone() {
_info "Publishing zone"
data="{\"publish\":\"true\"}"
dyn_url="$DYN_API/Zone/$_dyn_zone/"
method="PUT"
export _H1="Auth-Token: $_dyn_authtoken"
export _H2="Content-Type: application/json"
response="$(_post "$data" "$dyn_url" "" "$method")"
sessionstatus="$(printf "%s\n" "$response" | _egrep_o '"status" *: *"[^"]*' | _head_n 1 | sed 's#^"status" *: *"##')"
_debug response "$response"
_debug sessionstatus "$sessionstatus"
if [ "$sessionstatus" = "success" ]; then
_info "Zone published"
return 0
fi
_err "publish zone failed"
return 1
}
#get record_id of TXT record so we can delete the record
_dyn_get_record_id() {
_info "Getting record_id of TXT record"
dyn_url="$DYN_API/TXTRecord/$_dyn_zone/$fulldomain/"
export _H1="Auth-Token: $_dyn_authtoken"
export _H2="Content-Type: application/json"
response="$(_get "$dyn_url" "" "")"
sessionstatus="$(printf "%s\n" "$response" | _egrep_o '"status" *: *"[^"]*' | _head_n 1 | sed 's#^"status" *: *"##')"
_debug response "$response"
_debug sessionstatus "$sessionstatus"
if [ "$sessionstatus" = "success" ]; then
_dyn_record_id="$(printf "%s\n" "$response" | _egrep_o "\"data\" *: *\[\"/REST/TXTRecord/$_dyn_zone/$fulldomain/[^\"]*" | _head_n 1 | sed "s#^\"data\" *: *\[\"/REST/TXTRecord/$_dyn_zone/$fulldomain/##")"
_debug _dyn_record_id "$_dyn_record_id"
return 0
fi
_dyn_record_id=""
_err "getting record_id failed"
return 1
}
#delete TXT record
_dyn_rm_record() {
_info "Deleting TXT record"
dyn_url="$DYN_API/TXTRecord/$_dyn_zone/$fulldomain/$_dyn_record_id/"
method="DELETE"
_debug dyn_url "$dyn_url"
export _H1="Auth-Token: $_dyn_authtoken"
export _H2="Content-Type: application/json"
response="$(_post "" "$dyn_url" "" "$method")"
sessionstatus="$(printf "%s\n" "$response" | _egrep_o '"status" *: *"[^"]*' | _head_n 1 | sed 's#^"status" *: *"##')"
_debug response "$response"
_debug sessionstatus "$sessionstatus"
if [ "$sessionstatus" = "success" ]; then
_info "TXT record successfully deleted"
return 0
fi
_err "delete TXT record failed"
return 1
}
#logout
_dyn_end_session() {
_info "End Dyn API Session"
dyn_url="$DYN_API/Session/"
method="DELETE"
_debug dyn_url "$dyn_url"
export _H1="Auth-Token: $_dyn_authtoken"
export _H2="Content-Type: application/json"
response="$(_post "" "$dyn_url" "" "$method")"
_debug response "$response"
_dyn_authtoken=""
return 0
}
+22 -10
View File
@@ -122,18 +122,30 @@ dns_dynu_rm() {
# _domain_name=domain.com
_get_root() {
domain=$1
if ! _dynu_rest GET "dns/getroot/$domain"; then
return 1
fi
i=2
p=1
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
if ! _contains "$response" "domain_name"; then
_debug "Domain name not found."
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
_domain_name=$(printf "%s" "$response" | tr -d "{}" | cut -d , -f 1 | cut -d : -f 2 | cut -d '"' -f 2)
_node=$(printf "%s" "$response" | tr -d "{}" | cut -d , -f 3 | cut -d : -f 2 | cut -d '"' -f 2)
return 0
}
_get_recordid() {
+32 -45
View File
@@ -53,6 +53,8 @@ dns_freedns_add() {
i="$(_math "$i" - 1)"
sub_domain="$(echo "$fulldomain" | cut -d. -f -"$i")"
_debug top_domain "$top_domain"
_debug sub_domain "$sub_domain"
# Sometimes FreeDNS does not return the subdomain page but rather
# returns a page regarding becoming a premium member. This usually
# happens after a period of inactivity. Immediately trying again
@@ -61,7 +63,6 @@ dns_freedns_add() {
attempts=2
while [ "$attempts" -gt "0" ]; do
attempts="$(_math "$attempts" - 1)"
htmlpage="$(_freedns_retrieve_subdomain_page "$FREEDNS_COOKIE")"
if [ "$?" != "0" ]; then
if [ "$using_cached_cookies" = "true" ]; then
@@ -70,19 +71,11 @@ dns_freedns_add() {
fi
return 1
fi
_debug2 htmlpage "$htmlpage"
subdomain_csv="$(echo "$htmlpage" | tr -d "\n\r" | _egrep_o '<form .*</form>' | sed 's/<tr>/@<tr>/g' | tr '@' '\n' | grep edit.php | grep "$top_domain")"
_debug2 subdomain_csv "$subdomain_csv"
# 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
subdomain_csv="$(echo "$htmlpage" \
| grep -i -e '</\?TABLE\|</\?TD\|</\?TR\|</\?TH' \
| sed 's/^[\ \t]*//g' \
| tr -d '\n' \
| sed 's/<\/TR[^>]*>/\n/Ig' \
| sed 's/<\/\?\(TABLE\|TR\)[^>]*>//Ig' \
| sed 's/^<T[DH][^>]*>\|<\/\?T[DH][^>]*>$//Ig' \
| sed 's/<\/T[DH][^>]*><T[DH][^>]*>/,/Ig' \
| grep 'edit.php?' \
| grep "$top_domain")"
# The above beauty ends with striping out rows that do not have an
# href to edit.php and do not have the top domain we are looking for.
# So all we should be left with is CSV of table of subdomains we are
@@ -90,30 +83,32 @@ dns_freedns_add() {
# Now we have to read through this table and extract the data we need
lines="$(echo "$subdomain_csv" | wc -l)"
nl='
'
i=0
found=0
while [ "$i" -lt "$lines" ]; do
i="$(_math "$i" + 1)"
line="$(echo "$subdomain_csv" | cut -d "$nl" -f "$i")"
tmp="$(echo "$line" | cut -d ',' -f 1)"
if [ $found = 0 ] && _startswith "$tmp" "<td>$top_domain"; then
line="$(echo "$subdomain_csv" | sed -n "${i}p")"
_debug2 line "$line"
if [ $found = 0 ] && _contains "$line" "<td>$top_domain</td>"; then
# this line will contain DNSdomainid for the top_domain
DNSdomainid="$(echo "$line" | cut -d ',' -f 2 | sed 's/^.*domain_id=//;s/>.*//')"
DNSdomainid="$(echo "$line" | _egrep_o "edit_domain_id *= *.*>" | cut -d = -f 2 | cut -d '>' -f 1)"
_debug2 DNSdomainid "$DNSdomainid"
found=1
else
# lines contain DNS records for all subdomains
DNSname="$(echo "$line" | cut -d ',' -f 2 | sed 's/^[^>]*>//;s/<\/a>.*//')"
DNStype="$(echo "$line" | cut -d ',' -f 3)"
DNSname="$(echo "$line" | _egrep_o 'edit.php.*</a>' | cut -d '>' -f 2 | cut -d '<' -f 1)"
_debug2 DNSname "$DNSname"
DNStype="$(echo "$line" | sed 's/<td/@<td/g' | tr '@' '\n' | sed -n '4p' | cut -d '>' -f 2 | cut -d '<' -f 1)"
_debug2 DNStype "$DNStype"
if [ "$DNSname" = "$fulldomain" ] && [ "$DNStype" = "TXT" ]; then
DNSdataid="$(echo "$line" | cut -d ',' -f 2 | sed 's/^.*data_id=//;s/>.*//')"
DNSdataid="$(echo "$line" | _egrep_o 'data_id=.*' | cut -d = -f 2 | cut -d '>' -f 1)"
# Now get current value for the TXT record. This method may
# not produce accurate results as the value field is truncated
# on this webpage. To get full value we would need to load
# another page. However we don't really need this so long as
# there is only one TXT record for the acme challenge subdomain.
DNSvalue="$(echo "$line" | cut -d ',' -f 4 | sed 's/^[^&quot;]*&quot;//;s/&quot;.*//;s/<\/td>.*//')"
DNSvalue="$(echo "$line" | sed 's/<td/@<td/g' | tr '@' '\n' | sed -n '5p' | cut -d '>' -f 2 | cut -d '<' -f 1)"
_debug2 DNSvalue "$DNSvalue"
if [ $found != 0 ]; then
break
# we are breaking out of the loop at the first match of DNS name
@@ -169,8 +164,7 @@ dns_freedns_add() {
return 0
else
# Delete the old TXT record (with the wrong value)
_freedns_delete_txt_record "$FREEDNS_COOKIE" "$DNSdataid"
if [ "$?" = "0" ]; then
if _freedns_delete_txt_record "$FREEDNS_COOKIE" "$DNSdataid"; then
# And add in new TXT record with the value provided
_freedns_add_txt_record "$FREEDNS_COOKIE" "$DNSdomainid" "$sub_domain" "$txtvalue"
fi
@@ -210,18 +204,9 @@ dns_freedns_rm() {
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
subdomain_csv="$(echo "$htmlpage" \
| grep -i -e '</\?TABLE\|</\?TD\|</\?TR\|</\?TH' \
| sed 's/^[\ \t]*//g' \
| tr -d '\n' \
| sed 's/<\/TR[^>]*>/\n/Ig' \
| sed 's/<\/\?\(TABLE\|TR\)[^>]*>//Ig' \
| sed 's/^<T[DH][^>]*>\|<\/\?T[DH][^>]*>$//Ig' \
| sed 's/<\/T[DH][^>]*><T[DH][^>]*>/,/Ig' \
| grep 'edit.php?' \
| grep "$fulldomain")"
subdomain_csv="$(echo "$htmlpage" | tr -d "\n\r" | _egrep_o '<form .*</form>' | sed 's/<tr>/@<tr>/g' | tr '@' '\n' | grep edit.php | grep "$fulldomain")"
_debug2 subdomain_csv "$subdomain_csv"
# The above beauty ends with striping out rows that do not have an
# href to edit.php and do not have the domain name we are looking for.
# So all we should be left with is CSV of table of subdomains we are
@@ -229,19 +214,21 @@ dns_freedns_rm() {
# Now we have to read through this table and extract the data we need
lines="$(echo "$subdomain_csv" | wc -l)"
nl='
'
i=0
found=0
while [ "$i" -lt "$lines" ]; do
i="$(_math "$i" + 1)"
line="$(echo "$subdomain_csv" | cut -d "$nl" -f "$i")"
DNSname="$(echo "$line" | cut -d ',' -f 2 | sed 's/^[^>]*>//;s/<\/a>.*//')"
DNStype="$(echo "$line" | cut -d ',' -f 3)"
line="$(echo "$subdomain_csv" | sed -n "${i}p")"
_debug2 line "$line"
DNSname="$(echo "$line" | _egrep_o 'edit.php.*</a>' | cut -d '>' -f 2 | cut -d '<' -f 1)"
_debug2 DNSname "$DNSname"
DNStype="$(echo "$line" | sed 's/<td/@<td/g' | tr '@' '\n' | sed -n '4p' | cut -d '>' -f 2 | cut -d '<' -f 1)"
_debug2 DNStype "$DNStype"
if [ "$DNSname" = "$fulldomain" ] && [ "$DNStype" = "TXT" ]; then
DNSdataid="$(echo "$line" | cut -d ',' -f 2 | sed 's/^.*data_id=//;s/>.*//')"
DNSvalue="$(echo "$line" | cut -d ',' -f 4 | sed 's/^[^&quot;]*&quot;//;s/&quot;.*//;s/<\/td>.*//')"
_debug "DNSvalue: $DNSvalue"
DNSdataid="$(echo "$line" | _egrep_o 'data_id=.*' | cut -d = -f 2 | cut -d '>' -f 1)"
_debug2 DNSdataid "$DNSdataid"
DNSvalue="$(echo "$line" | sed 's/<td/@<td/g' | tr '@' '\n' | sed -n '5p' | cut -d '>' -f 2 | cut -d '<' -f 1)"
_debug2 DNSvalue "$DNSvalue"
# if [ "$DNSvalue" = "$txtvalue" ]; then
# Testing value match fails. Website is truncating the value
# field. So for now we will assume that there is only one TXT
+2 -2
View File
@@ -11,7 +11,7 @@
#
######## Public functions #####################
GANDI_LIVEDNS_API="https://dns.beta.gandi.net/api/v5"
GANDI_LIVEDNS_API="https://dns.api.gandi.net/api/v5"
#Usage: dns_gandi_livedns_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_gandi_livedns_add() {
@@ -37,7 +37,7 @@ dns_gandi_livedns_add() {
_debug sub_domain "$_sub_domain"
_gandi_livedns_rest PUT "domains/$_domain/records/$_sub_domain/TXT" "{\"rrset_ttl\": 300, \"rrset_values\":[\"$txtvalue\"]}" \
&& _contains "$response" '{"message": "Zone Record Created"}' \
&& _contains "$response" '{"message": "DNS Record Created"}' \
&& _info "Add $(__green "success")"
}
+175
View File
@@ -0,0 +1,175 @@
#!/usr/bin/env sh
########################################################################
# Hurricane Electric hook script for acme.sh
#
# Environment variables:
#
# - $HE_Username (your dns.he.net username)
# - $HE_Password (your dns.he.net password)
#
# Author: Ondrej Simek <me@ondrejsimek.com>
# Git repo: https://github.com/angel333/acme.sh
#-- dns_he_add() - Add TXT record --------------------------------------
# Usage: dns_he_add _acme-challenge.subdomain.domain.com "XyZ123..."
dns_he_add() {
_full_domain=$1
_txt_value=$2
_info "Using DNS-01 Hurricane Electric hook"
if [ -z "$HE_Username" ] || [ -z "$HE_Password" ]; then
HE_Username=
HE_Password=
_err "No auth details provided. Please set user credentials using the \$HE_Username and \$HE_Password envoronment variables."
return 1
fi
_saveaccountconf HE_Username "$HE_Username"
_saveaccountconf HE_Password "$HE_Password"
# Fills in the $_zone_id
_find_zone "$_full_domain" || return 1
_debug "Zone id \"$_zone_id\" will be used."
body="email=${HE_Username}&pass=${HE_Password}"
body="$body&account="
body="$body&menu=edit_zone"
body="$body&Type=TXT"
body="$body&hosted_dns_zoneid=$_zone_id"
body="$body&hosted_dns_recordid="
body="$body&hosted_dns_editzone=1"
body="$body&Priority="
body="$body&Name=$_full_domain"
body="$body&Content=$_txt_value"
body="$body&TTL=300"
body="$body&hosted_dns_editrecord=Submit"
response="$(_post "$body" "https://dns.he.net/")"
exit_code="$?"
if [ "$exit_code" -eq 0 ]; then
_info "TXT record added successfully."
else
_err "Couldn't add the TXT record."
fi
_debug2 response "$response"
return "$exit_code"
}
#-- dns_he_rm() - Remove TXT record ------------------------------------
# Usage: dns_he_rm _acme-challenge.subdomain.domain.com "XyZ123..."
dns_he_rm() {
_full_domain=$1
_txt_value=$2
_info "Cleaning up after DNS-01 Hurricane Electric hook"
# fills in the $_zone_id
_find_zone "$_full_domain" || return 1
_debug "Zone id \"$_zone_id\" will be used."
# Find the record id to clean
body="email=${HE_Username}&pass=${HE_Password}"
body="$body&hosted_dns_zoneid=$_zone_id"
body="$body&menu=edit_zone"
body="$body&hosted_dns_editzone="
domain_regex="$(echo "$_full_domain" | sed 's/\./\\./g')" # escape dots
_record_id=$(_post "$body" "https://dns.he.net/" \
| tr -d '\n' \
| _egrep_o "data=\"&quot;${_txt_value}&quot;([^>]+>){6}[^<]+<[^;]+;deleteRecord\('[0-9]+','${domain_regex}','TXT'\)" \
| _egrep_o "[0-9]+','${domain_regex}','TXT'\)$" \
| _egrep_o "^[0-9]+"
)
# The series of egreps above could have been done a bit shorter but
# I wanted to double-check whether it's the correct record (in case
# HE changes their website somehow).
# Remove the record
body="email=${HE_Username}&pass=${HE_Password}"
body="$body&menu=edit_zone"
body="$body&hosted_dns_zoneid=$_zone_id"
body="$body&hosted_dns_recordid=$_record_id"
body="$body&hosted_dns_editzone=1"
body="$body&hosted_dns_delrecord=1"
body="$body&hosted_dns_delconfirm=delete"
_post "$body" "https://dns.he.net/" \
| grep '<div id="dns_status" onClick="hideThis(this);">Successfully removed record.</div>' \
>/dev/null
exit_code="$?"
if [ "$exit_code" -eq 0 ]; then
_info "Record removed successfully."
else
_err "Could not clean (remove) up the record. Please go to HE administration interface and clean it by hand."
return "$exit_code"
fi
}
########################## PRIVATE FUNCTIONS ###########################
#-- _find_zone() -------------------------------------------------------
# Returns the most specific zone found in administration interface.
#
# Example:
#
# _find_zone first.second.third.co.uk
#
# ... will return the first zone that exists in admin out of these:
# - "first.second.third.co.uk"
# - "second.third.co.uk"
# - "third.co.uk"
# - "co.uk" <-- unlikely
# - "uk" <-'
#
# (another approach would be something like this:
# https://github.com/hlandau/acme/blob/master/_doc/dns.hook
# - that's better if there are multiple pages. It's so much simpler.
# )
_find_zone() {
_domain="$1"
body="email=${HE_Username}&pass=${HE_Password}"
_matches=$(_post "$body" "https://dns.he.net/" \
| _egrep_o "delete_dom.*name=\"[^\"]+\" value=\"[0-9]+"
)
# Zone names and zone IDs are in same order
_zone_ids=$(echo "$_matches" | cut -d '"' -f 5)
_zone_names=$(echo "$_matches" | cut -d '"' -f 3)
_debug2 "These are the zones on this HE account:"
_debug2 "$_zone_names"
_debug2 "And these are their respective IDs:"
_debug2 "$_zone_ids"
# Walk through all possible zone names
_strip_counter=1
while true; do
_attempted_zone=$(echo "$_domain" | cut -d . -f ${_strip_counter}-)
# All possible zone names have been tried
if [ -z "$_attempted_zone" ]; then
_err "No zone for domain \"$_domain\" found."
return 1
fi
_debug "Looking for zone \"${_attempted_zone}\""
# Take care of "." and only match whole lines. Note that grep -F
# cannot be used because there's no way to make it match whole
# lines.
regex="^$(echo "$_attempted_zone" | sed 's/\./\\./g')$"
line_num=$(echo "$_zone_names" \
| grep -n "$regex" \
| cut -d : -f 1
)
if [ -n "$line_num" ]; then
_zone_id=$(echo "$_zone_ids" | sed "${line_num}q;d")
_debug "Found relevant zone \"$_attempted_zone\" with id \"$_zone_id\" - will be used for domain \"$_domain\"."
return 0
fi
_debug "Zone \"$_attempted_zone\" doesn't exist, let's try a less specific zone."
_strip_counter=$(_math "$_strip_counter" + 1)
done
}
# vim: et:ts=2:sw=2:
+17 -12
View File
@@ -9,7 +9,7 @@ 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"
baseurlnObject="https://$Infoblox_Server/wapi/v2.2.2/record:txt?name=$fulldomain&text=$txtvalue&view=$Infoblox_View"
_info "Using Infoblox API"
_debug fulldomain "$fulldomain"
@@ -19,14 +19,19 @@ dns_infoblox_add() {
if [ -z "$Infoblox_Creds" ] || [ -z "$Infoblox_Server" ]; then
Infoblox_Creds=""
Infoblox_Server=""
_err "You didn't specify the credentials or server yet (Infoblox_Creds and Infoblox_Server)."
_err "Please set them via EXPORT ([username:password] and [ip or hostname]) and try again."
_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)
@@ -36,10 +41,10 @@ dns_infoblox_add() {
export _H2="Authorization: Basic $Infoblox_CredsEncoded"
## Add the challenge record to the Infoblox grid member
result=$(_post "" "$baseurlnObject" "" "POST")
result="$(_post "" "$baseurlnObject" "" "POST")"
## Let's see if we get something intelligible back from the unit
if echo "$result" | egrep 'record:txt/.*:.*/default'; then
if [ "$(echo "$result" | _egrep_o "record:txt/.*:.*/$Infoblox_View")" ]; then
_info "Successfully created the txt record"
return 0
else
@@ -61,25 +66,25 @@ dns_infoblox_rm() {
_debug txtvalue "$txtvalue"
## Base64 encode the credentials
Infoblox_CredsEncoded=$(printf "%b" "$Infoblox_Creds" | _base64)
Infoblox_CredsEncoded="$(printf "%b" "$Infoblox_Creds" | _base64)"
## Construct the HTTP Authorization header
export _H1="Accept-Language:en-US"
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&_return_type=xml-pretty"
result=$(_get "$baseurlnObject")
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/.*:.*/default'; then
if [ "$(echo "$result" | _egrep_o "record:txt/.*:.*/$Infoblox_View")" ]; then
## Extract the object reference
objRef=$(printf "%b" "$result" | _egrep_o 'record:txt/.*:.*/default')
objRef="$(printf "%b" "$result" | _egrep_o "record:txt/.*:.*/$Infoblox_View")"
objRmUrl="https://$Infoblox_Server/wapi/v2.2.2/$objRef"
## Delete them! All the stale records!
rmResult=$(_post "" "$objRmUrl" "" "DELETE")
rmResult="$(_post "" "$objRmUrl" "" "DELETE")"
## Let's see if that worked
if echo "$rmResult" | egrep 'record:txt/.*:.*/default'; then
if [ "$(echo "$rmResult" | _egrep_o "record:txt/.*:.*/$Infoblox_View")" ]; then
_info "Successfully deleted $objRef"
return 0
else
+2 -2
View File
@@ -68,7 +68,7 @@ dns_linode_rm() {
_parameters="&DomainID=$_domain_id"
if _rest GET "domain.resource.list" "$_parameters" && [ -n "$response" ]; then
response="$(echo "$response" | tr -d "\n" | sed 's/{/\n&/g')"
response="$(echo "$response" | tr -d "\n" | tr '{' "|" | sed 's/|/&{/g' | tr "|" "\n")"
resource="$(echo "$response" | _egrep_o "{.*\"NAME\":\s*\"$_sub_domain\".*}")"
if [ "$resource" ]; then
@@ -128,7 +128,7 @@ _get_root() {
p=1
if _rest GET "domain.list"; then
response="$(echo "$response" | tr -d "\n" | sed 's/{/\n&/g')"
response="$(echo "$response" | tr -d "\n" | tr '{' "|" | sed 's/|/&{/g' | tr "|" "\n")"
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug h "$h"
+193
View File
@@ -0,0 +1,193 @@
#!/usr/bin/env sh
#Author: RaidneII
#Created 06/28/2017
#Utilize name.com API to finish dns-01 verifications.
######## Public functions #####################
Namecom_API="https://api.name.com/api"
#Usage: dns_namecom_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_namecom_add() {
fulldomain=$1
txtvalue=$2
# First we need name.com credentials.
if [ -z "$Namecom_Username" ]; then
Namecom_Username=""
_err "Username for name.com is missing."
_err "Please specify that in your environment variable."
return 1
fi
if [ -z "$Namecom_Token" ]; then
Namecom_Token=""
_err "API token for name.com is missing."
_err "Please specify that in your environment variable."
return 1
fi
# Save them in configuration.
_saveaccountconf Namecom_Username "$Namecom_Username"
_saveaccountconf Namecom_Token "$Namecom_Token"
# Login in using API
if ! _namecom_login; then
return 1
fi
# Find domain in domain list.
if ! _namecom_get_root "$fulldomain"; then
_err "Unable to find domain specified."
_namecom_logout
return 1
fi
# Add TXT record.
_namecom_addtxt_json="{\"hostname\":\"$_sub_domain\",\"type\":\"TXT\",\"content\":\"$txtvalue\",\"ttl\":\"300\",\"priority\":\"10\"}"
if _namecom_rest POST "dns/create/$_domain" "$_namecom_addtxt_json"; then
retcode=$(printf "%s\n" "$response" | _egrep_o "\"code\":100")
if [ "$retcode" ]; then
_info "Successfully added TXT record, ready for validation."
_namecom_logout
return 0
else
_err "Unable to add the DNS record."
_namecom_logout
return 1
fi
fi
}
#Usage: fulldomain txtvalue
#Remove the txt record after validation.
dns_namecom_rm() {
fulldomain=$1
txtvalue=$2
if ! _namecom_login; then
return 1
fi
# Find domain in domain list.
if ! _namecom_get_root "$fulldomain"; then
_err "Unable to find domain specified."
_namecom_logout
return 1
fi
# Get the record id.
if _namecom_rest GET "dns/list/$_domain"; then
retcode=$(printf "%s\n" "$response" | _egrep_o "\"code\":100")
if [ "$retcode" ]; then
_record_id=$(printf "%s\n" "$response" | _egrep_o "\"record_id\":\"[0-9]+\",\"name\":\"$fulldomain\",\"type\":\"TXT\"" | cut -d \" -f 4)
_debug record_id "$_record_id"
_info "Successfully retrieved the record id for ACME challenge."
else
_err "Unable to retrieve the record id."
_namecom_logout
return 1
fi
fi
# Remove the DNS record using record id.
_namecom_rmtxt_json="{\"record_id\":\"$_record_id\"}"
if _namecom_rest POST "dns/delete/$_domain" "$_namecom_rmtxt_json"; then
retcode=$(printf "%s\n" "$response" | _egrep_o "\"code\":100")
if [ "$retcode" ]; then
_info "Successfully removed the TXT record."
_namecom_logout
return 0
else
_err "Unable to remove the DNS record."
_namecom_logout
return 1
fi
fi
}
#################### Private functions below ##################################
_namecom_rest() {
method=$1
param=$2
data=$3
export _H1="Content-Type: application/json"
export _H2="Api-Session-Token: $sessionkey"
if [ "$method" != "GET" ]; then
response="$(_post "$data" "$Namecom_API/$param" "" "$method")"
else
response="$(_get "$Namecom_API/$param")"
fi
if [ "$?" != "0" ]; then
_err "error $param"
return 1
fi
_debug2 response "$response"
return 0
}
_namecom_login() {
namecom_login_json="{\"username\":\"$Namecom_Username\",\"api_token\":\"$Namecom_Token\"}"
if _namecom_rest POST "login" "$namecom_login_json"; then
retcode=$(printf "%s\n" "$response" | _egrep_o "\"code\":100")
if [ "$retcode" ]; then
_info "Successfully logged in. Fetching session token..."
sessionkey=$(printf "%s\n" "$response" | _egrep_o "\"session_token\":\".+" | cut -d \" -f 4)
if [ ! -z "$sessionkey" ]; then
_debug sessionkey "$sessionkey"
_info "Session key obtained."
else
_err "Unable to get session key."
return 1
fi
else
_err "Logging in failed."
return 1
fi
fi
}
_namecom_logout() {
if _namecom_rest GET "logout"; then
retcode=$(printf "%s\n" "$response" | _egrep_o "\"code\":100")
if [ "$retcode" ]; then
_info "Successfully logged out."
else
_err "Error logging out."
return 1
fi
fi
}
_namecom_get_root() {
domain=$1
i=2
p=1
if ! _namecom_rest GET "domain/list"; then
return 1
fi
# Need to exclude the last field (tld)
numfields=$(echo "$domain" | _egrep_o "\." | wc -l)
while [ $i -le "$numfields" ]; do
host=$(printf "%s" "$domain" | cut -d . -f $i-100)
_debug host "$host"
if [ -z "$host" ]; then
return 1
fi
if _contains "$response" "$host"; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain="$host"
return 0
fi
p=$i
i=$(_math "$i" + 1)
done
return 1
}
+1 -1
View File
@@ -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
+107
View File
@@ -0,0 +1,107 @@
#!/usr/bin/env sh
# Author: non7top@gmail.com
# 07 Jul 2017
# report bugs at https://github.com/non7top/acme.sh
# Values to export:
# export PDD_Token="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
######## Public functions #####################
#Usage: dns_myapi_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_yandex_add() {
fulldomain="${1}"
txtvalue="${2}"
_debug "Calling: dns_yandex_add() '${fulldomain}' '${txtvalue}'"
_PDD_credentials || return 1
export _H1="PddToken: $PDD_Token"
curDomain=$(_PDD_get_domain "$fulldomain")
_debug "Found suitable domain in pdd: $curDomain"
curSubdomain="$(echo "${fulldomain}" | sed -e "s@.${curDomain}\$@@")"
curData="domain=${curDomain}&type=TXT&subdomain=${curSubdomain}&ttl=360&content=${txtvalue}"
curUri="https://pddimp.yandex.ru/api2/admin/dns/add"
curResult="$(_post "${curData}" "${curUri}")"
_debug "Result: $curResult"
}
#Usage: dns_myapi_rm _acme-challenge.www.domain.com
dns_yandex_rm() {
fulldomain="${1}"
_debug "Calling: dns_yandex_rm() '${fulldomain}'"
_PDD_credentials || return 1
export _H1="PddToken: $PDD_Token"
record_id=$(pdd_get_record_id "${fulldomain}")
_debug "Result: $record_id"
curDomain=$(_PDD_get_domain "$fulldomain")
_debug "Found suitable domain in pdd: $curDomain"
curSubdomain="$(echo "${fulldomain}" | sed -e "s@.${curDomain}\$@@")"
curUri="https://pddimp.yandex.ru/api2/admin/dns/del"
curData="domain=${curDomain}&record_id=${record_id}"
curResult="$(_post "${curData}" "${curUri}")"
_debug "Result: $curResult"
}
#################### Private functions below ##################################
_PDD_get_domain() {
fulldomain="${1}"
__page=1
__last=0
while [ $__last -eq 0 ]; do
uri1="https://pddimp.yandex.ru/api2/admin/domain/domains?page=${__page}&on_page=20"
res1=$(_get "$uri1" | _normalizeJson)
#_debug "$res1"
__found=$(echo "$res1" | sed -n -e 's#.* "found": \([^,]*\),.*#\1#p')
_debug "found: $__found results on page"
if [ "$__found" -lt 20 ]; then
_debug "last page: $__page"
__last=1
fi
__all_domains="$__all_domains $(echo "$res1" | sed -e "s@,@\n@g" | grep '"name"' | cut -d: -f2 | sed -e 's@"@@g')"
__page=$(_math $__page + 1)
done
k=2
while [ $k -lt 10 ]; do
__t=$(echo "$fulldomain" | cut -d . -f $k-100)
_debug "finding zone for domain $__t"
for d in $__all_domains; do
if [ "$d" = "$__t" ]; then
echo "$__t"
return
fi
done
k=$(_math $k + 1)
done
_err "No suitable domain found in your account"
return 1
}
_PDD_credentials() {
if [ -z "${PDD_Token}" ]; then
PDD_Token=""
_err "You need to export PDD_Token=xxxxxxxxxxxxxxxxx"
_err "You can get it at https://pddimp.yandex.ru/api2/admin/get_token"
return 1
else
_saveaccountconf PDD_Token "${PDD_Token}"
fi
}
pdd_get_record_id() {
fulldomain="${1}"
curDomain=$(_PDD_get_domain "$fulldomain")
_debug "Found suitable domain in pdd: $curDomain"
curSubdomain="$(echo "${fulldomain}" | sed -e "s@.${curDomain}\$@@")"
curUri="https://pddimp.yandex.ru/api2/admin/dns/list?domain=${curDomain}"
curResult="$(_get "${curUri}" | _normalizeJson)"
_debug "Result: $curResult"
echo "$curResult" | _egrep_o "{[^{]*\"content\":[^{]*\"subdomain\":\"${curSubdomain}\"" | sed -n -e 's#.* "record_id": \(.*\),[^,]*#\1#p'
}
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.