Compare commits

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

* fix performance

* fix performance, use cached nonce

* do not register account if already registered

* fix thumbprint

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

* fix performance

* fix performance, use cached nonce

* do not register account if already registered

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

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

* fix deactivate idn name

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

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

* fix output info
2016-10-05 22:09:15 +08:00
neil 19ab2a29ce fix tail for solaris 2016-10-05 13:03:45 +08:00
neil 24b4fe9867 Merge branch 'master' of https://github.com/Neilpang/acme.sh 2016-10-05 12:16:14 +08:00
neil aa7b82de04 minor 2016-10-05 12:15:06 +08:00
neil 3d826bed3a fix for ncat on centos, try without '-p' first (#315) 2016-10-04 23:35:56 +08:00
neil d2ae7e78ef 60 days 2016-10-04 21:17:19 +08:00
neil 656bd330f8 change default renew days o 60.
fix https://github.com/Neilpang/acme.sh/issues/314
https://github.com/Neilpang/acme.sh/issues/281
2016-10-04 20:55:31 +08:00
neil c2c8f32010 fix for wget 2016-10-03 22:29:48 +08:00
neil 9f43c270e6 fix wget 2016-10-03 22:08:40 +08:00
neil 50827188ff minor: save on success 2016-10-02 23:54:21 +08:00
neil 6ae0f7f5c6 support "--listen-v4" and "--listen-v6" (#311)
https://github.com/Neilpang/acme.sh/issues/310
2016-10-02 23:37:37 +08:00
neil c583d6bb49 fix sleep display 2016-09-30 22:43:24 +08:00
neil fdcb6b721c fix for busybox 2016-09-30 22:13:27 +08:00
neil ef858ef062 use head -n 2016-09-30 21:37:39 +08:00
neil fe04faf675 Add Chinese link 2016-09-30 21:27:23 +08:00
neil ad752b317d support csr that contains empty CN field. fix https://github.com/Neilpang/acme.sh/issues/306 2016-09-29 22:19:03 +08:00
neil 59649e9b1e support --auto-upgrade 2016-09-28 22:11:00 +08:00
neil 6bf281f905 support '--auto-upgrade' 2016-09-28 22:05:43 +08:00
neil 4dfc8b262c support individual ca path 2016-09-28 13:27:32 +08:00
neil f08ffe9feb v2.6.0 2016-09-28 13:26:02 +08:00
neil 65de3110a9 minor, fix error message 2016-09-28 13:13:08 +08:00
neil f6dcd98995 save api first 2016-09-28 13:07:51 +08:00
neil 950172dc01 debug info 2016-09-27 23:52:52 +08:00
neil 5c48e139d4 support individual ca accounts 2016-09-27 23:43:18 +08:00
neil 150e9c8a48 Update README.md 2016-09-27 22:03:42 +08:00
neil b19ba13aff fix for Mac osx 2016-09-27 21:27:43 +08:00
neil 30bfc2cea7 fix https://github.com/Neilpang/acme.sh/issues/304 2016-09-27 13:11:08 +08:00
neil 30c2d84c6d minor: remove useless hook. 2016-09-26 13:33:09 +08:00
neil fbd2038fa7 minor 2016-09-26 13:08:19 +08:00
neil e4b8d9b9d6 minor, No need to save ACCOUNT_URL 2016-09-25 22:54:58 +08:00
neil 6b50003697 minor 2016-09-25 22:26:41 +08:00
neil a73c5b3355 support log level 2016-09-25 21:58:59 +08:00
neil eb59817e81 Support updateaccount and registeraccount. fix https://github.com/Neilpang/acme.sh/issues/70 2016-09-25 10:56:06 +08:00
neil d404e92d16 Fetch agreement tos dynamically, fix https://github.com/Neilpang/acme.sh/issues/253 2016-09-24 23:53:53 +08:00
neil 86c017ec9d fix deactivate return code 2016-09-24 14:17:04 +08:00
neil 0407c4e0f7 minor 2016-09-24 14:01:28 +08:00
neil 0ba95a3dd4 fix auto upgrade 2016-09-24 13:43:08 +08:00
neil 0463b5d6cd support "--local-address" to specify a listening ip address in standalone mode if the server have multiple ips. By default, the standalone server listens to 0.0.0.0 2016-09-23 23:14:03 +08:00
neil 3f4513b3a9 Support deactivate in bulk 2016-09-23 22:35:13 +08:00
neil fb2029e717 add more info 2016-09-22 23:25:32 +08:00
neil 48f02fb61b minor 2016-09-22 23:23:27 +08:00
neil 0c00e870c6 Support Authorization deactivation
https://github.com/Neilpang/acme.sh/issues/291
2016-09-22 23:17:50 +08:00
neil 7da50703fb minor 2016-09-22 21:38:11 +08:00
neil cfdaff5a46 fix cf 2016-09-22 20:36:33 +08:00
neil 18e46962c2 fix https://github.com/Neilpang/acme.sh/issues/297 2016-09-22 13:15:25 +08:00
neil 319e0ae3cf fix auto upgrade 2016-09-21 13:39:39 +08:00
neil e69a7c38d9 fix auto upgrade 2016-09-21 13:27:05 +08:00
neil ecd685755b fix auto upgrade 2016-09-21 13:18:46 +08:00
neil 276b51d927 minor 2016-09-21 13:09:22 +08:00
neil 251d1c5c9f minor 2016-09-20 22:23:49 +08:00
neil 028e17475f minor, renew time minus 1 day 2016-09-20 21:03:43 +08:00
neil 1ab630435d fix color when upgrade in cronjob 2016-09-20 20:34:33 +08:00
neil 89002ed298 support AUTO_UPGRADE. In the cron job, try to upgrade acme.sh if "AUTO_UPGRADE" is set. 2016-09-20 20:22:25 +08:00
neil d0871bdae3 rename "--logfile" to "--log", and give a default log file 2016-09-20 19:08:02 +08:00
neil 5ea6e9c9c0 support "--logfile" 2016-09-19 23:07:43 +08:00
16 changed files with 3159 additions and 1615 deletions

No files matched your search

+25
View File
@@ -0,0 +1,25 @@
<!--
If it is a bug report:
- make sure you are able to repro it on the latest released version.
You can install the latest version by: `acme.sh --upgrade`
- Search the existing issues.
- Refer to the [WIKI](https://wiki.acme.sh).
- Debug info [Debug](https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh).
-->
Steps to reproduce
------------------
Debug log
-----------------
```
acme.sh --issue ..... --debug 2
```
+11
View File
@@ -0,0 +1,11 @@
language: bash
env:
global:
- SHFMT_URL=https://github.com/mvdan/sh/releases/download/v0.4.0/shfmt_v0.4.0_linux_amd64
script:
- curl -sSL $SHFMT_URL -o ~/shfmt
- chmod +x ~/shfmt
- ~/shfmt -l -w -i 2 .
- git diff --exit-code || (echo "Run shfmt to fix the formatting issues" && false)
+59 -33
View File
@@ -1,4 +1,4 @@
# An ACME Shell script: acme.sh
# An ACME Shell script: acme.sh [![Build Status](https://travis-ci.org/Neilpang/acme.sh.svg?branch=master)](https://travis-ci.org/Neilpang/acme.sh)
- An ACME protocol client written purely in Shell (Unix shell) language.
- Fully ACME protocol implementation.
- Simple, powerful and very easy to use. You only need 3 minutes to learn.
@@ -13,6 +13,8 @@ It's probably the `easiest&smallest&smartest` shell script to automatically issu
Wiki: https://github.com/Neilpang/acme.sh/wiki
# [中文说明](https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E)
#Tested OS
| NO | Status| Platform|
|----|-------|---------|
@@ -34,6 +36,7 @@ Wiki: https://github.com/Neilpang/acme.sh/wiki
|16|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/mageia.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Mageia
|17|-----| OpenWRT: Tested and working. See [wiki page](https://github.com/Neilpang/acme.sh/wiki/How-to-run-on-OpenWRT)
|18|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/solaris.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|SunOS/Solaris
|19|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/gentoo-stage3-amd64.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Gentoo Linux
For all build statuses, check our [daily build project](https://github.com/Neilpang/acmetest):
@@ -110,47 +113,56 @@ root@v1:~# acme.sh -h
**Example 1:** Single domain.
```bash
acme.sh --issue -d aa.com -w /home/wwwroot/aa.com
acme.sh --issue -d example.com -w /home/wwwroot/example.com
```
**Example 2:** Multiple domains in the same cert.
```bash
acme.sh --issue -d aa.com -d www.aa.com -d cp.aa.com -w /home/wwwroot/aa.com
acme.sh --issue -d example.com -d www.example.com -d cp.example.com -w /home/wwwroot/example.com
```
The parameter `/home/wwwroot/aa.com` is the web root folder. You **MUST** have `write access` to this folder.
The parameter `/home/wwwroot/example.com` is the web root folder. You **MUST** have `write access` to this folder.
Second argument **"aa.com"** is the main domain you want to issue cert for.
Second argument **"example.com"** is the main domain you want to issue cert for.
You must have at least a domain there.
You must point and bind all the domains to the same webroot dir: `/home/wwwroot/aa.com`.
You must point and bind all the domains to the same webroot dir: `/home/wwwroot/example.com`.
Generate/issued certs will be placed in `~/.acme.sh/aa.com/`
Generate/issued certs will be placed in `~/.acme.sh/example.com/`
The issued cert will be renewed every 80 days automatically.
The issued cert will be renewed every **60** days automatically.
More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
# 3. Install issued cert to apache/nginx etc.
# 3. Install the issued cert to apache/nginx etc.
After you issue a cert, you probably want to install the cert with your nginx/apache or other servers you may be using.
After you issue a cert, you probably want to install/copy the cert to your nginx/apache or other servers.
You **MUST** use this command to copy the certs to the target files, **Do NOT** use the certs files in **.acme.sh/** folder, they are for internal use only, the folder structure may change in future.
**nginx** example
```bash
acme.sh --installcert -d aa.com \
--certpath /path/to/certfile/in/apache/nginx \
--keypath /path/to/keyfile/in/apache/nginx \
--capath /path/to/ca/certfile/apache/nginx \
--fullchainpath path/to/fullchain/certfile/apache/nginx \
--reloadcmd "service apache2|nginx reload"
acme.sh --installcert -d example.com \
--keypath /path/to/keyfile/in/nginx/key.pem \
--fullchainpath path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx restart"
```
**apache** example
```bash
acme.sh --installcert -d example.com \
--certpath /path/to/certfile/in/apache/cert.pem \
--keypath /path/to/keyfile/in/apache/key.pem \
--fullchainpath path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd "service apache2 restart"
```
Only the domain is required, all the other parameters are optional.
Install the issued cert/key to the production apache or nginx path.
Install/copy the issued cert/key to the production apache or nginx path.
The cert will be `renewed every 80 days by default` (which is configurable). Once the cert is renewed, the apache/nginx will be automatically reloaded by the command: `service apache2 reload` or `service nginx reload`.
The cert will be `renewed every **60** days by default` (which is configurable). Once the cert is renewed, the apache/nginx will be automatically reloaded by the command: `service apache2 reload` or `service nginx reload`.
# 4. Use Standalone server to issue cert
@@ -159,7 +171,7 @@ The cert will be `renewed every 80 days by default` (which is configurable). Onc
The tcp `80` port **MUST** be free to listen, otherwise you will be prompted to free the `80` port and try again.
```bash
acme.sh --issue --standalone -d aa.com -d www.aa.com -d cp.aa.com
acme.sh --issue --standalone -d example.com -d www.example.com -d cp.example.com
```
More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
@@ -173,7 +185,7 @@ acme.sh supports `tls-sni-01` validation.
The tcp `443` port **MUST** be free to listen, otherwise you will be prompted to free the `443` port and try again.
```bash
acme.sh --issue --tls -d aa.com -d www.aa.com -d cp.aa.com
acme.sh --issue --tls -d example.com -d www.example.com -d cp.example.com
```
More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
@@ -189,7 +201,7 @@ Particularly, if you are running an apache server, you should use apache mode in
Just set string "apache" as the second argument, it will force use of apache plugin automatically.
```
acme.sh --issue --apache -d aa.com -d www.aa.com -d user.aa.com
acme.sh --issue --apache -d example.com -d www.example.com -d user.example.com
```
More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
@@ -199,18 +211,18 @@ More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
Support the `dns-01` challenge.
```bash
acme.sh --issue --dns -d aa.com -d www.aa.com -d user.aa.com
acme.sh --issue --dns -d example.com -d www.example.com -d user.example.com
```
You should get the output like below:
```
Add the following txt record:
Domain:_acme-challenge.aa.com
Domain:_acme-challenge.example.com
Txt value:9ihDbjYfTExAYeDs4DBUeuTo18KBzwvTEjUnSwd32-c
Add the following txt record:
Domain:_acme-challenge.www.aa.com
Domain:_acme-challenge.www.example.com
Txt value:9ihDbjxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Please add those txt records to the domains. Waiting for the dns to take effect.
@@ -220,7 +232,7 @@ Please add those txt records to the domains. Waiting for the dns to take effect.
Then just rerun with `renew` argument:
```bash
acme.sh --renew -d aa.com
acme.sh --renew -d example.com
```
Ok, it's finished.
@@ -239,8 +251,11 @@ You don't have do anything manually!
4. Godaddy.com API
5. OVH, kimsufi, soyoustart and runabove API
6. AWS Route 53, see: https://github.com/Neilpang/acme.sh/issues/65
7. lexicon dns api: https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api
7. PowerDNS API
8. lexicon dns api: https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api
(DigitalOcean, DNSimple, DnsMadeEasy, DNSPark, EasyDNS, Namesilo, NS1, PointHQ, Rage4 and Vultr etc.)
9. LuaDNS.com API
10. DNSMadeEasy.com API
##### More APIs are coming soon...
@@ -261,13 +276,13 @@ For example:
### Single domain ECC cerfiticate:
```bash
acme.sh --issue -w /home/wwwroot/aa.com -d aa.com --keylength ec-256
acme.sh --issue -w /home/wwwroot/example.com -d example.com --keylength ec-256
```
SAN multi domain ECC certificate:
```bash
acme.sh --issue -w /home/wwwroot/aa.com -d aa.com -d www.aa.com --keylength ec-256
acme.sh --issue -w /home/wwwroot/example.com -d example.com -d www.example.com --keylength ec-256
```
Please look at the last parameter above.
@@ -281,17 +296,17 @@ Valid values are:
# 10. How to renew the cert
No, you don't need to renew the certs manually. All the certs will be renewed automatically every 80 days.
No, you don't need to renew the certs manually. All the certs will be renewed automatically every **60** days.
However, you can also force to renew any cert:
```
acme.sh --renew -d aa.com --force
acme.sh --renew -d example.com --force
```
or, for ECC cert:
```
acme.sh --renew -d aa.com --force --ecc
acme.sh --renew -d example.com --force --ecc
```
# 11. How to upgrade `acme.sh`
@@ -302,7 +317,18 @@ You can update acme.sh to the latest code:
acme.sh --upgrade
```
# 12. Issue a cert from existing CSR
You can enable auto upgrade:
```
acme.sh --upgrade --auto-upgrade
```
Then **acme.sh** will keep up to date automatically.
Disable auto upgrade:
```
acme.sh --upgrade --auto-upgrade 0
```
# 12. Issue a cert from an existing CSR
https://github.com/Neilpang/acme.sh/wiki/Issue-a-cert-from-existing-CSR
@@ -318,7 +344,7 @@ TODO:
2. ACME protocol: https://github.com/ietf-wg-acme/acme
3. Certbot: https://github.com/certbot/certbot
# License & Other
# License & Others
License is GPLv3
+2262 -1273
View File
File diff suppressed because it is too large. Load diff
+28
View File
@@ -0,0 +1,28 @@
#!/usr/bin/env sh
#Here is a sample custom api script.
#This file name is "myapi.sh"
#So, here must be a method myapi_deploy()
#Which will be called by acme.sh to deploy the cert
#returns 0 means success, otherwise error.
######## Public functions #####################
#domain keyfile certfile cafile fullchain
myapi_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
_err "Not implemented yet"
return 1
}
+66 -8
View File
@@ -15,7 +15,7 @@ export CF_Email="xxxx@sss.com"
Ok, let's issue cert now:
```
acme.sh --issue --dns dns_cf -d aa.com -d www.aa.com
acme.sh --issue --dns dns_cf -d example.com -d www.example.com
```
The `CF_Key` and `CF_Email` will be saved in `~/.acme.sh/account.conf`, when next time you use cloudflare api, it will reuse this key.
@@ -37,7 +37,7 @@ export DP_Key="sADDsdasdgdsf"
Ok, let's issue cert now:
```
acme.sh --issue --dns dns_dp -d aa.com -d www.aa.com
acme.sh --issue --dns dns_dp -d example.com -d www.example.com
```
The `DP_Id` and `DP_Key` will be saved in `~/.acme.sh/account.conf`, when next time you use dnspod.cn api, it will reuse this key.
@@ -58,7 +58,7 @@ export CX_Secret="sADDsdasdgdsf"
Ok, let's issue cert now:
```
acme.sh --issue --dns dns_cx -d aa.com -d www.aa.com
acme.sh --issue --dns dns_cx -d example.com -d www.example.com
```
The `CX_Key` and `CX_Secret` will be saved in `~/.acme.sh/account.conf`, when next time you use Cloudxns.com api, it will reuse this key.
@@ -66,7 +66,7 @@ The `CX_Key` and `CX_Secret` will be saved in `~/.acme.sh/account.conf`, when n
## Use Godaddy.com domain api to automatically issue cert
We support Godaddy integeration.
We support Godaddy integration.
First you need to login to your Godaddy account to get your api key and api secret.
@@ -84,11 +84,34 @@ export GD_Secret="asdfsdafdsfdsfdsfdsfdsafd"
Ok, let's issue cert now:
```
acme.sh --issue --dns dns_gd -d aa.com -d www.aa.com
acme.sh --issue --dns dns_gd -d example.com -d www.example.com
```
The `GD_Key` and `GD_Secret` will be saved in `~/.acme.sh/account.conf`, when next time you use cloudflare api, it will reuse this key.
## Use PowerDNS embedded api to automatically issue cert
We support PowerDNS embedded API integration.
First you need to enable api and set your api-token in PowerDNS configuration.
https://doc.powerdns.com/md/httpapi/README/
```
export PDNS_Url="http://ns.example.com:8081"
export PDNS_ServerId="localhost"
export PDNS_Token="0123456789ABCDEF"
export PDNS_Ttl=60
```
Ok, let's issue cert now:
```
acme.sh --issue --dns dns_pdns -d example.com -d www.example.com
```
The `PDNS_Url`, `PDNS_ServerId`, `PDNS_Token` and `PDNS_Ttl` will be saved in `~/.acme.sh/account.conf`.
## Use OVH/kimsufi/soyoustart/runabove API
https://github.com/Neilpang/acme.sh/wiki/How-to-use-OVH-domain-api
@@ -104,15 +127,50 @@ Let's assume you want to name it 'myapi',
3. Then you can use your api to issue cert like:
```
acme.sh --issue --dns dns_myapi -d aa.com -d www.aa.com
acme.sh --issue --dns dns_myapi -d example.com -d www.example.com
```
For more details, please check our sample script: [dns_myapi.sh](dns_myapi.sh)
# Use lexicon dns api
https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api
## Use LuaDNS domain API
Get your API token at https://api.luadns.com/settings
```
export LUA_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export LUA_Email="xxxx@sss.com"
```
To issue a cert:
```
acme.sh --issue --dns dns_lua --dnssleep 3 -d example.com -d www.example.com
```
The `LUA_Key` and `LUA_Email` will be saved in `~/.acme.sh/account.conf`, and will be reused when needed.
## Use DNSMadeEasy domain API
Get your API credentials at https://cp.dnsmadeeasy.com/account/info
```
export ME_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export ME_Secret="qdfqsdfkjdskfj"
```
To issue a cert:
```
acme.sh --issue --dns dns_me --dnssleep 3 -d example.com -d www.example.com
```
The `ME_Key` and `ME_Secret` will be saved in `~/.acme.sh/account.conf`, and will be reused when needed.
+37 -39
View File
@@ -1,54 +1,52 @@
#!/usr/bin/env sh
#
#CF_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
#
#CF_Email="xxxx@sss.com"
CF_Api="https://api.cloudflare.com/client/v4"
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_cf_add(){
dns_cf_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$CF_Key" ] || [ -z "$CF_Email" ] ; then
if [ -z "$CF_Key" ] || [ -z "$CF_Email" ]; then
_err "You don't specify cloudflare api key and email yet."
_err "Please create you key and try again."
return 1
fi
#save the api key and email to the account conf file.
_saveaccountconf CF_Key "$CF_Key"
_saveaccountconf CF_Email "$CF_Email"
_debug "First detect the root zone"
if ! _get_root $fulldomain ; then
if ! _get_root $fulldomain; then
_err "invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_debug "Getting txt records"
_cf_rest GET "zones/${_domain_id}/dns_records?type=TXT&name=$fulldomain"
if ! printf "$response" | grep \"success\":true > /dev/null ; then
if ! printf "$response" | grep \"success\":true >/dev/null; then
_err "Error"
return 1
fi
count=$(printf "%s\n" "$response" | _egrep_o \"count\":[^,]* | cut -d : -f 2)
_debug count "$count"
if [ "$count" = "0" ] ; then
if [ "$count" = "0" ]; then
_info "Adding record"
if _cf_rest POST "zones/$_domain_id/dns_records" "{\"type\":\"TXT\",\"name\":\"$fulldomain\",\"content\":\"$txtvalue\",\"ttl\":120}"; then
if printf $response | grep $fulldomain > /dev/null ; then
if _cf_rest POST "zones/$_domain_id/dns_records" "{\"type\":\"TXT\",\"name\":\"$fulldomain\",\"content\":\"$txtvalue\",\"ttl\":120}"; then
if printf -- "%s" "$response" | grep $fulldomain >/dev/null; then
_info "Added, sleeping 10 seconds"
sleep 10
#todo: check if the record takes effect
@@ -61,25 +59,27 @@ dns_cf_add(){
_err "Add txt record error."
else
_info "Updating record"
record_id=$(printf "%s\n" "$response" | _egrep_o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \"| head -1)
record_id=$(printf "%s\n" "$response" | _egrep_o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \" | head -n 1)
_debug "record_id" $record_id
_cf_rest PUT "zones/$_domain_id/dns_records/$record_id" "{\"id\":\"$record_id\",\"type\":\"TXT\",\"name\":\"$fulldomain\",\"content\":\"$txtvalue\",\"zone_id\":\"$_domain_id\",\"zone_name\":\"$_domain\"}"
_cf_rest PUT "zones/$_domain_id/dns_records/$record_id" "{\"id\":\"$record_id\",\"type\":\"TXT\",\"name\":\"$fulldomain\",\"content\":\"$txtvalue\",\"zone_id\":\"$_domain_id\",\"zone_name\":\"$_domain\"}"
if [ "$?" = "0" ]; then
_info "Updated, sleeping 10 seconds"
sleep 10
#todo: check if the record takes effect
return 0;
return 0
fi
_err "Update error"
return 1
fi
}
#fulldomain
dns_cf_rm() {
fulldomain=$1
}
#################### Private functions bellow ##################################
#_acme-challenge.www.domain.com
@@ -91,20 +91,20 @@ _get_root() {
domain=$1
i=2
p=1
while [ '1' ] ; do
while [ '1' ]; do
h=$(printf $domain | cut -d . -f $i-100)
if [ -z "$h" ] ; then
if [ -z "$h" ]; then
#not valid
return 1;
fi
if ! _cf_rest GET "zones?name=$h" ; then
return 1
fi
if printf $response | grep \"name\":\"$h\" >/dev/null ; then
_domain_id=$(printf "%s\n" "$response" | _egrep_o \"id\":\"[^\"]*\" | head -1 | cut -d : -f 2 | tr -d \")
if [ "$_domain_id" ] ; then
if ! _cf_rest GET "zones?name=$h"; then
return 1
fi
if printf $response | grep \"name\":\"$h\" >/dev/null; then
_domain_id=$(printf "%s\n" "$response" | _egrep_o \"id\":\"[^\"]*\" | head -n 1 | cut -d : -f 2 | tr -d \")
if [ "$_domain_id" ]; then
_sub_domain=$(printf $domain | cut -d . -f 1-$p)
_domain=$h
return 0
@@ -122,24 +122,22 @@ _cf_rest() {
ep="$2"
data="$3"
_debug $ep
_H1="X-Auth-Email: $CF_Email"
_H2="X-Auth-Key: $CF_Key"
_H3="Content-Type: application/json"
if [ "$data" ] ; then
if [ "$data" ]; then
_debug data "$data"
response="$(_post "$data" "$CF_Api/$ep" "" $m)"
else
response="$(_get "$CF_Api/$ep")"
fi
if [ "$?" != "0" ] ; then
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}
+51 -54
View File
@@ -6,10 +6,8 @@
#
#CX_Secret="sADDsdasdgdsf"
CX_Api="https://www.cloudxns.net/api2"
#REST_API
######## Public functions #####################
@@ -17,45 +15,50 @@ CX_Api="https://www.cloudxns.net/api2"
dns_cx_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$CX_Key" ] || [ -z "$CX_Secret" ] ; then
if [ -z "$CX_Key" ] || [ -z "$CX_Secret" ]; then
_err "You don't specify cloudxns.com api key or secret yet."
_err "Please create you key and try again."
return 1
fi
REST_API=$CX_Api
#save the api key and email to the account conf file.
_saveaccountconf CX_Key "$CX_Key"
_saveaccountconf CX_Secret "$CX_Secret"
_debug "First detect the root zone"
if ! _get_root $fulldomain ; then
if ! _get_root $fulldomain; then
_err "invalid domain"
return 1
fi
existing_records $_domain $_sub_domain
existing_records $_domain $_sub_domain
_debug count "$count"
if [ "$?" != "0" ] ; then
if [ "$?" != "0" ]; then
_err "Error get existing records."
return 1
fi
if [ "$count" = "0" ] ; then
if [ "$count" = "0" ]; then
add_record $_domain $_sub_domain $txtvalue
else
update_record $_domain $_sub_domain $txtvalue
fi
if [ "$?" = "0" ] ; then
if [ "$?" = "0" ]; then
return 0
fi
return 1
}
#fulldomain
dns_cx_rm() {
fulldomain=$1
}
#usage: root sub
#return if the sub record already exists.
#echos the existing records count.
@@ -64,24 +67,24 @@ existing_records() {
_debug "Getting txt records"
root=$1
sub=$2
if ! _rest GET "record/$_domain_id?:domain_id?host_id=0&offset=0&row_num=100" ; then
if ! _rest GET "record/$_domain_id?:domain_id?host_id=0&offset=0&row_num=100"; then
return 1
fi
count=0
seg=$(printf "%s\n" "$response" | _egrep_o "{[^{]*host\":\"$_sub_domain\"[^}]*}")
seg=$(printf "%s\n" "$response" | _egrep_o "{[^\{]*host\":\"$_sub_domain\"[^\}]*\}")
_debug seg "$seg"
if [ -z "$seg" ] ; then
if [ -z "$seg" ]; then
return 0
fi
if printf "$response" | grep '"type":"TXT"' > /dev/null ; then
if printf "$response" | grep '"type":"TXT"' >/dev/null; then
count=1
record_id=$(printf "%s\n" "$seg" | _egrep_o \"record_id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \")
_debug record_id "$record_id"
return 0
return 0
fi
}
#add the txt record.
@@ -91,13 +94,13 @@ add_record() {
sub=$2
txtvalue=$3
fulldomain=$sub.$root
_info "Adding record"
if ! _rest POST "record" "{\"domain_id\": $_domain_id, \"host\":\"$_sub_domain\", \"value\":\"$txtvalue\", \"type\":\"TXT\",\"ttl\":600, \"line_id\":1}"; then
return 1
fi
return 0
}
@@ -108,19 +111,16 @@ update_record() {
sub=$2
txtvalue=$3
fulldomain=$sub.$root
_info "Updating record"
if _rest PUT "record/$record_id" "{\"domain_id\": $_domain_id, \"host\":\"$_sub_domain\", \"value\":\"$txtvalue\", \"type\":\"TXT\",\"ttl\":600, \"line_id\":1}" ; then
if _rest PUT "record/$record_id" "{\"domain_id\": $_domain_id, \"host\":\"$_sub_domain\", \"value\":\"$txtvalue\", \"type\":\"TXT\",\"ttl\":600, \"line_id\":1}"; then
return 0
fi
return 1
}
#################### Private functions bellow ##################################
#_acme-challenge.www.domain.com
#returns
@@ -131,25 +131,25 @@ _get_root() {
domain=$1
i=2
p=1
if ! _rest GET "domain" ; then
if ! _rest GET "domain"; then
return 1
fi
while [ '1' ] ; do
while [ '1' ]; do
h=$(printf $domain | cut -d . -f $i-100)
_debug h "$h"
if [ -z "$h" ] ; then
if [ -z "$h" ]; then
#not valid
return 1;
return 1
fi
if printf "$response" | grep "$h." >/dev/null ; then
seg=$(printf "%s" "$response" | _egrep_o "{[^{]*\"$h\.\"[^}]*\}" )
if printf "$response" | grep "$h." >/dev/null; then
seg=$(printf "%s" "$response" | _egrep_o "\{[^\{]*\"$h\.\"[^\}]*\}")
_debug seg "$seg"
_domain_id=$(printf "%s" "$seg" | _egrep_o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \")
_debug _domain_id "$_domain_id"
if [ "$_domain_id" ] ; then
if [ "$_domain_id" ]; then
_sub_domain=$(printf $domain | cut -d . -f 1-$p)
_debug _sub_domain $_sub_domain
_domain=$h
@@ -164,7 +164,6 @@ _get_root() {
return 1
}
#Usage: method URI data
_rest() {
m=$1
@@ -172,38 +171,36 @@ _rest() {
_debug $ep
url="$REST_API/$ep"
_debug url "$url"
cdate=$(date -u "+%Y-%m-%d %H:%M:%S UTC")
cdate=$(date -u "+%Y-%m-%d %H:%M:%S UTC")
_debug cdate "$cdate"
data="$3"
_debug data "$data"
sec="$CX_Key$url$data$cdate$CX_Secret"
_debug sec "$sec"
hmac=$(printf "$sec"| openssl md5 |cut -d " " -f 2)
hmac=$(printf "$sec" | openssl md5 | cut -d " " -f 2)
_debug hmac "$hmac"
_H1="API-KEY: $CX_Key"
_H2="API-REQUEST-DATE: $cdate"
_H3="API-HMAC: $hmac"
_H4="Content-Type: application/json"
if [ "$data" ] ; then
if [ "$data" ]; then
response="$(_post "$data" "$url" "" $m)"
else
response="$(_get "$url")"
fi
if [ "$?" != "0" ] ; then
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
if ! printf "$response" | grep '"message":"success"' > /dev/null ; then
if ! printf "$response" | grep '"message":"success"' >/dev/null; then
return 1
fi
return 0
}
+50 -55
View File
@@ -6,10 +6,8 @@
#
#DP_Key="sADDsdasdgdsf"
DP_Api="https://dnsapi.cn"
#REST_API
######## Public functions #####################
@@ -17,40 +15,45 @@ DP_Api="https://dnsapi.cn"
dns_dp_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$DP_Id" ] || [ -z "$DP_Key" ] ; then
if [ -z "$DP_Id" ] || [ -z "$DP_Key" ]; then
_err "You don't specify dnspod api key and key id yet."
_err "Please create you key and try again."
return 1
fi
REST_API=$DP_Api
#save the api key and email to the account conf file.
_saveaccountconf DP_Id "$DP_Id"
_saveaccountconf DP_Key "$DP_Key"
_debug "First detect the root zone"
if ! _get_root $fulldomain ; then
if ! _get_root $fulldomain; then
_err "invalid domain"
return 1
fi
existing_records $_domain $_sub_domain
existing_records $_domain $_sub_domain
_debug count "$count"
if [ "$?" != "0" ] ; then
if [ "$?" != "0" ]; then
_err "Error get existing records."
return 1
fi
if [ "$count" = "0" ] ; then
if [ "$count" = "0" ]; then
add_record $_domain $_sub_domain $txtvalue
else
update_record $_domain $_sub_domain $txtvalue
fi
}
#fulldomain
dns_dp_rm() {
fulldomain=$1
}
#usage: root sub
#return if the sub record already exists.
#echos the existing records count.
@@ -59,26 +62,25 @@ existing_records() {
_debug "Getting txt records"
root=$1
sub=$2
if ! _rest POST "Record.List" "login_token=$DP_Id,$DP_Key&domain_id=$_domain_id&sub_domain=$_sub_domain"; then
return 1
return 1
fi
if printf "$response" | grep 'No records' ; then
count=0;
return 0
if printf "$response" | grep 'No records'; then
count=0
return 0
fi
if printf "$response" | grep "Action completed successful" >/dev/null ; then
if printf "$response" | grep "Action completed successful" >/dev/null; then
count=$(printf "$response" | grep '<type>TXT</type>' | wc -l)
record_id=$(printf "$response" | grep '^<id>' | tail -1 | cut -d '>' -f 2 | cut -d '<' -f 1)
return 0
return 0
else
_err "get existing records error."
return 1
fi
count=0
}
@@ -89,19 +91,18 @@ add_record() {
sub=$2
txtvalue=$3
fulldomain=$sub.$root
_info "Adding record"
if ! _rest POST "Record.Create" "login_token=$DP_Id,$DP_Key&format=json&domain_id=$_domain_id&sub_domain=$_sub_domain&record_type=TXT&value=$txtvalue&record_line=默认"; then
return 1
fi
if printf "$response" | grep "Action completed successful" ; then
if printf "$response" | grep "Action completed successful"; then
return 0
fi
return 1 #error
}
@@ -112,24 +113,21 @@ update_record() {
sub=$2
txtvalue=$3
fulldomain=$sub.$root
_info "Updating record"
if ! _rest POST "Record.Modify" "login_token=$DP_Id,$DP_Key&format=json&domain_id=$_domain_id&sub_domain=$_sub_domain&record_type=TXT&value=$txtvalue&record_line=默认&record_id=$record_id"; then
return 1
fi
if printf "$response" | grep "Action completed successful" ; then
if printf "$response" | grep "Action completed successful"; then
return 0
fi
return 1 #error
}
#################### Private functions bellow ##################################
#_acme-challenge.www.domain.com
#returns
@@ -140,21 +138,21 @@ _get_root() {
domain=$1
i=2
p=1
while [ '1' ] ; do
while [ '1' ]; do
h=$(printf $domain | cut -d . -f $i-100)
if [ -z "$h" ] ; then
if [ -z "$h" ]; then
#not valid
return 1;
return 1
fi
if ! _rest POST "Domain.Info" "login_token=$DP_Id,$DP_Key&format=json&domain=$h"; then
return 1
fi
if printf "$response" | grep "Action completed successful" >/dev/null ; then
if printf "$response" | grep "Action completed successful" >/dev/null; then
_domain_id=$(printf "%s\n" "$response" | _egrep_o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \")
_debug _domain_id "$_domain_id"
if [ "$_domain_id" ] ; then
if [ "$_domain_id" ]; then
_sub_domain=$(printf $domain | cut -d . -f 1-$p)
_debug _sub_domain $_sub_domain
_domain=$h
@@ -169,7 +167,6 @@ _get_root() {
return 1
}
#Usage: method URI data
_rest() {
m=$1
@@ -177,22 +174,20 @@ _rest() {
data="$3"
_debug $ep
url="$REST_API/$ep"
_debug url "$url"
if [ "$data" ] ; then
if [ "$data" ]; then
_debug2 data "$data"
response="$(_post $data "$url")"
else
response="$(_get "$url")"
fi
if [ "$?" != "0" ] ; then
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}
+26 -28
View File
@@ -6,39 +6,37 @@
#
#GD_Secret="asdfsdfsfsdfsdfdfsdf"
GD_Api="https://api.godaddy.com/v1"
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_gd_add(){
dns_gd_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$GD_Key" ] || [ -z "$GD_Secret" ] ; then
if [ -z "$GD_Key" ] || [ -z "$GD_Secret" ]; then
_err "You don't specify godaddy api key and secret yet."
_err "Please create you key and try again."
return 1
fi
#save the api key and email to the account conf file.
_saveaccountconf GD_Key "$GD_Key"
_saveaccountconf GD_Secret "$GD_Secret"
_debug "First detect the root zone"
if ! _get_root $fulldomain ; then
if ! _get_root $fulldomain; then
_err "invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_info "Adding record"
if _gd_rest PUT "domains/$_domain/records/TXT/$_sub_domain" "[{\"data\":\"$txtvalue\"}]"; then
if [ "$response" = "{}" ] ; then
if _gd_rest PUT "domains/$_domain/records/TXT/$_sub_domain" "[{\"data\":\"$txtvalue\"}]"; then
if [ "$response" = "{}" ]; then
_info "Added, sleeping 10 seconds"
sleep 10
#todo: check if the record takes effect
@@ -50,12 +48,14 @@ dns_gd_add(){
fi
fi
_err "Add txt record error."
}
#fulldomain
dns_gd_rm() {
fulldomain=$1
}
#################### Private functions bellow ##################################
#_acme-challenge.www.domain.com
@@ -67,18 +67,18 @@ _get_root() {
domain=$1
i=2
p=1
while [ '1' ] ; do
while [ '1' ]; do
h=$(printf $domain | cut -d . -f $i-100)
if [ -z "$h" ] ; then
if [ -z "$h" ]; then
#not valid
return 1;
fi
if ! _gd_rest GET "domains/$h" ; then
return 1
fi
if printf "$response" | grep '"code":"NOT_FOUND"' >/dev/null ; then
if ! _gd_rest GET "domains/$h"; then
return 1
fi
if printf "$response" | grep '"code":"NOT_FOUND"' >/dev/null; then
_debug "$h not found"
else
_sub_domain=$(printf $domain | cut -d . -f 1-$p)
@@ -96,23 +96,21 @@ _gd_rest() {
ep="$2"
data="$3"
_debug $ep
_H1="Authorization: sso-key $GD_Key:$GD_Secret"
_H2="Content-Type: application/json"
if [ "$data" ] ; then
if [ "$data" ]; then
_debug data "$data"
response="$(_post "$data" "$GD_Api/$ep" "" $m)"
else
response="$(_get "$GD_Api/$ep")"
fi
if [ "$?" != "0" ] ; then
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}
+20 -17
View File
@@ -13,15 +13,15 @@ wiki="https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api"
dns_lexicon_add() {
fulldomain=$1
txtvalue=$2
domain=$(printf "$fulldomain" | cut -d . -f 2-999)
if ! _exists $lexicon_cmd ; then
if ! _exists $lexicon_cmd; then
_err "Please install $lexicon_cmd first: $wiki"
return 1
fi
if [ -z "$PROVIDER" ] ; then
if [ -z "$PROVIDER" ]; then
_err "Please define env PROVIDER first: $wiki"
return 1
fi
@@ -29,34 +29,34 @@ dns_lexicon_add() {
_savedomainconf PROVIDER "$PROVIDER"
export PROVIDER
Lx_name=$(echo LEXICON_${PROVIDER}_USERNAME | tr [a-z] [A-Z])
Lx_name=$(echo LEXICON_${PROVIDER}_USERNAME | tr [a-z] [A-Z])
eval Lx_name_v="\$$Lx_name"
_debug "$Lx_name" "$Lx_name_v"
if [ "$Lx_name_v" ] ; then
if [ "$Lx_name_v" ]; then
_saveaccountconf $Lx_name "$Lx_name_v"
export "$Lx_name"
fi
Lx_token=$(echo LEXICON_${PROVIDER}_TOKEN | tr [a-z] [A-Z])
Lx_token=$(echo LEXICON_${PROVIDER}_TOKEN | tr [a-z] [A-Z])
eval Lx_token_v="\$$Lx_token"
_debug "$Lx_token" "$Lx_token_v"
if [ "$Lx_token_v" ] ; then
if [ "$Lx_token_v" ]; then
_saveaccountconf $Lx_token "$Lx_token_v"
export "$Lx_token"
fi
Lx_password=$(echo LEXICON_${PROVIDER}_PASSWORD | tr [a-z] [A-Z])
Lx_password=$(echo LEXICON_${PROVIDER}_PASSWORD | tr [a-z] [A-Z])
eval Lx_password_v="\$$Lx_password"
_debug "$Lx_password" "$Lx_password_v"
if [ "$Lx_password_v" ] ; then
if [ "$Lx_password_v" ]; then
_saveaccountconf $Lx_password "$Lx_password_v"
export "$Lx_password"
fi
Lx_domaintoken=$(echo LEXICON_${PROVIDER}_DOMAINTOKEN | tr [a-z] [A-Z])
Lx_domaintoken=$(echo LEXICON_${PROVIDER}_DOMAINTOKEN | tr [a-z] [A-Z])
eval Lx_domaintoken_v="\$$Lx_domaintoken"
_debug "$Lx_domaintoken" "$Lx_domaintoken_v"
if [ "$Lx_domaintoken_v" ] ; then
if [ "$Lx_domaintoken_v" ]; then
export "$Lx_domaintoken"
_saveaccountconf $Lx_domaintoken "$Lx_domaintoken_v"
fi
@@ -65,5 +65,8 @@ dns_lexicon_add() {
}
#fulldomain
dns_lexicon_rm() {
fulldomain=$1
}
+141
View File
@@ -0,0 +1,141 @@
#!/usr/bin/env sh
# bug reports to dev@1e.ca
#
#LUA_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
#
#LUA_Email="user@luadns.net"
LUA_Api="https://api.luadns.com/v1"
LUA_auth=$(printf $LUA_Email:$LUA_Key | _base64)
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_lua_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$LUA_Key" ] || [ -z "$LUA_Email" ]; then
_err "You don't specify luadns api key and email yet."
_err "Please create you key and try again."
return 1
fi
#save the api key and email to the account conf file.
_saveaccountconf LUA_Key "$LUA_Key"
_saveaccountconf LUA_Email "$LUA_Email"
_debug "First detect the root zone"
if ! _get_root $fulldomain; then
_err "invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_debug "Getting txt records"
_LUA_rest GET "zones/${_domain_id}/records"
if ! printf "$response" | grep \"id\": >/dev/null; then
_err "Error"
return 1
fi
count=$(printf "%s\n" "$response" | _egrep_o \"name\":\"$fulldomain\" | wc -l)
_debug count "$count"
if [ "$count" = "0" ]; then
_info "Adding record"
if _LUA_rest POST "zones/$_domain_id/records" "{\"type\":\"TXT\",\"name\":\"$fulldomain.\",\"content\":\"$txtvalue\",\"ttl\":120}"; then
if printf -- "%s" "$response" | grep $fulldomain >/dev/null; then
_info "Added"
#todo: check if the record takes effect
return 0
else
_err "Add txt record error."
return 1
fi
fi
_err "Add txt record error."
else
_info "Updating record"
record_id=$(printf "%s\n" "$response" | _egrep_o \"id\":[^,]*,\"name\":\"$fulldomain.\",\"type\":\"TXT\" | cut -d: -f2 | cut -d, -f1)
_debug "record_id" $record_id
_LUA_rest PUT "zones/$_domain_id/records/$record_id" "{\"id\":\"$record_id\",\"type\":\"TXT\",\"name\":\"$fulldomain.\",\"content\":\"$txtvalue\",\"zone_id\":\"$_domain_id\",\"ttl\":120}"
if [ "$?" = "0" ]; then
_info "Updated!"
#todo: check if the record takes effect
return 0
fi
_err "Update error"
return 1
fi
}
#fulldomain
dns_lua_rm() {
fulldomain=$1
}
#################### Private functions bellow ##################################
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
_get_root() {
domain=$1
i=2
p=1
if ! _LUA_rest GET "zones"; then
return 1
fi
while [ '1' ]; do
h=$(printf $domain | cut -d . -f $i-100)
if [ -z "$h" ]; then
#not valid
return 1
fi
if printf $response | grep \"name\":\"$h\" >/dev/null; then
_domain_id=$(printf "%s\n" "$response" | _egrep_o \"id\":[^,]*,\"name\":\"$h\" | cut -d : -f 2 | cut -d , -f 1)
if [ "$_domain_id" ]; then
_sub_domain=$(printf $domain | cut -d . -f 1-$p)
_domain=$h
return 0
fi
return 1
fi
p=$i
i=$(expr $i + 1)
done
return 1
}
_LUA_rest() {
m=$1
ep="$2"
data="$3"
_debug $ep
_H1="Accept: application/json"
_H2="Authorization: Basic $LUA_auth"
if [ "$data" ]; then
_debug data "$data"
response="$(_post "$data" "$LUA_Api/$ep" "" $m)"
else
response="$(_get "$LUA_Api/$ep")"
fi
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}
+144
View File
@@ -0,0 +1,144 @@
#!/usr/bin/env sh
# bug reports to dev@1e.ca
# ME_Key=qmlkdjflmkqdjf
# ME_Secret=qmsdlkqmlksdvnnpae
ME_Api=https://api.dnsmadeeasy.com/V2.0/dns/managed
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_me_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$ME_Key" ] || [ -z "$ME_Secret" ]; then
_err "You didn't specify DNSMadeEasy api key and secret yet."
_err "Please create you key and try again."
return 1
fi
#save the api key and email to the account conf file.
_saveaccountconf ME_Key "$ME_Key"
_saveaccountconf ME_Secret "$ME_Secret"
_debug "First detect the root zone"
if ! _get_root $fulldomain; then
_err "invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_debug "Getting txt records"
_me_rest GET "${_domain_id}/records?recordName=$_sub_domain&type=TXT"
if ! printf "$response" | grep \"totalRecords\": >/dev/null; then
_err "Error"
return 1
fi
count=$(printf "%s\n" "$response" | _egrep_o \"totalRecords\":[^,]* | cut -d : -f 2)
_debug count "$count"
if [ "$count" = "0" ]; then
_info "Adding record"
if _me_rest POST "$_domain_id/records/" "{\"type\":\"TXT\",\"name\":\"$_sub_domain\",\"value\":\"$txtvalue\",\"gtdLocation\":\"DEFAULT\",\"ttl\":120}"; then
if printf -- "%s" "$response" | grep \"id\": >/dev/null; then
_info "Added"
#todo: check if the record takes effect
return 0
else
_err "Add txt record error."
return 1
fi
fi
_err "Add txt record error."
else
_info "Updating record"
record_id=$(printf "%s\n" "$response" | _egrep_o \"id\":[^,]* | cut -d : -f 2 | head -n 1)
_debug "record_id" $record_id
_me_rest PUT "$_domain_id/records/$record_id/" "{\"id\":\"$record_id\",\"type\":\"TXT\",\"name\":\"$_sub_domain\",\"value\":\"$txtvalue\",\"gtdLocation\":\"DEFAULT\",\"ttl\":120}"
if [ "$?" = "0" ]; then
_info "Updated"
#todo: check if the record takes effect
return 0
fi
_err "Update error"
return 1
fi
}
#fulldomain
dns_me_rm() {
fulldomain=$1
}
#################### Private functions bellow ##################################
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
_get_root() {
domain=$1
i=2
p=1
while [ '1' ]; do
h=$(printf $domain | cut -d . -f $i-100)
if [ -z "$h" ]; then
#not valid
return 1
fi
if ! _me_rest GET "name?domainname=$h"; then
return 1
fi
if printf $response | grep \"name\":\"$h\" >/dev/null; then
_domain_id=$(printf "%s\n" "$response" | _egrep_o \"id\":[^,]* | head -n 1 | cut -d : -f 2)
if [ "$_domain_id" ]; then
_sub_domain=$(printf $domain | cut -d . -f 1-$p)
_domain=$h
return 0
fi
return 1
fi
p=$i
i=$(expr $i + 1)
done
return 1
}
_me_rest() {
m=$1
ep="$2"
data="$3"
_debug $ep
cdate=$(date -u +"%a, %d %b %Y %T %Z")
hmac=$(printf "$cdate" | _hmac sha1 "$ME_Secret" 1)
_H1="x-dnsme-apiKey: $ME_Key"
_H2="x-dnsme-requestDate: $cdate"
_H3="x-dnsme-hmac: $hmac"
if [ "$data" ]; then
_debug data "$data"
response="$(_post "$data" "$ME_Api/$ep" "" $m)"
else
response="$(_get "$ME_Api/$ep")"
fi
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}
+9 -9
View File
@@ -6,8 +6,6 @@
#Which will be called by acme.sh to add the txt record to your api system.
#returns 0 means success, otherwise error.
######## Public functions #####################
#Usage: dns_myapi_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
@@ -15,16 +13,18 @@ dns_myapi_add() {
fulldomain=$1
txtvalue=$2
_err "Not implemented!"
return 1;
return 1
}
#fulldomain
dns_myapi_rm() {
fulldomain=$1
}
#################### Private functions bellow ##################################
_info() {
if [ -z "$2" ] ; then
if [ -z "$2" ]; then
echo "[$(date)] $1"
else
echo "[$(date)] $1='$2'"
@@ -37,7 +37,7 @@ _err() {
}
_debug() {
if [ -z "$DEBUG" ] ; then
if [ -z "$DEBUG" ]; then
return
fi
_err "$@"
@@ -45,8 +45,8 @@ _debug() {
}
_debug2() {
if [ "$DEBUG" ] && [ "$DEBUG" -ge "2" ] ; then
if [ "$DEBUG" ] && [ "$DEBUG" -ge "2" ]; then
_debug "$@"
fi
return
}
}
Regular → Executable
+91 -99
View File
@@ -1,6 +1,5 @@
#!/usr/bin/env sh
#Applcation Key
#OVH_AK="sdfsdfsdfljlbjkljlkjsdfoiwje"
#
@@ -10,10 +9,8 @@
#Consumer Key
#OVH_CK="sdfsdfsdfsdfsdfdsf"
#OVH_END_POINT=ovh-eu
#'ovh-eu'
OVH_EU='https://eu.api.ovh.com/1.0'
@@ -35,121 +32,116 @@ SYS_CA='https://ca.api.soyoustart.com/1.0'
#'runabove-ca'
RAV_CA='https://api.runabove.com/1.0'
wiki="https://github.com/Neilpang/acme.sh/wiki/How-to-use-OVH-domain-api"
ovh_success="https://github.com/Neilpang/acme.sh/wiki/OVH-Success"
_ovh_get_api() {
_ogaep="$1"
case "${_ogaep}" in
ovh-eu|ovheu)
printf "%s" $OVH_EU
return
;;
ovh-ca|ovhca)
printf "%s" $OVH_CA
return
;;
kimsufi-eu|kimsufieu)
printf "%s" $KSF_EU
return
;;
kimsufi-ca|kimsufica)
printf "%s" $KSF_CA
return
;;
soyoustart-eu|soyoustarteu)
printf "%s" $SYS_EU
return
;;
soyoustart-ca|soyoustartca)
printf "%s" $SYS_CA
return
;;
runabove-ca|runaboveca)
printf "%s" $RAV_CA
return
;;
ovh-eu | ovheu)
printf "%s" $OVH_EU
return
;;
ovh-ca | ovhca)
printf "%s" $OVH_CA
return
;;
kimsufi-eu | kimsufieu)
printf "%s" $KSF_EU
return
;;
kimsufi-ca | kimsufica)
printf "%s" $KSF_CA
return
;;
soyoustart-eu | soyoustarteu)
printf "%s" $SYS_EU
return
;;
soyoustart-ca | soyoustartca)
printf "%s" $SYS_CA
return
;;
runabove-ca | runaboveca)
printf "%s" $RAV_CA
return
;;
*)
_err "Unknown parameter : $1"
return 1
;;
esac
_err "Unknown parameter : $1"
return 1
;;
esac
}
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_ovh_add(){
dns_ovh_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$OVH_AK" ] || [ -z "$OVH_AS" ] ; then
if [ -z "$OVH_AK" ] || [ -z "$OVH_AS" ]; then
_err "You don't specify OVH application key and application secret yet."
_err "Please create you key and try again."
return 1
fi
#save the api key and email to the account conf file.
_saveaccountconf OVH_AK "$OVH_AK"
_saveaccountconf OVH_AS "$OVH_AS"
if [ -z "$OVH_END_POINT" ] ; then
if [ -z "$OVH_END_POINT" ]; then
OVH_END_POINT="ovh-eu"
fi
_info "Using OVH endpoint: $OVH_END_POINT"
if [ "$OVH_END_POINT" != "ovh-eu" ] ; then
_saveaccountconf OVH_END_POINT "$OVH_END_POINT"
if [ "$OVH_END_POINT" != "ovh-eu" ]; then
_saveaccountconf OVH_END_POINT "$OVH_END_POINT"
fi
OVH_API="$(_ovh_get_api $OVH_END_POINT )"
OVH_API="$(_ovh_get_api $OVH_END_POINT)"
_debug OVH_API "$OVH_API"
if [ -z "$OVH_CK" ] ; then
if [ -z "$OVH_CK" ]; then
_info "OVH consumer key is empty, Let's get one:"
if ! _ovh_authentication ; then
if ! _ovh_authentication; then
_err "Can not get consumer key."
fi
#return and wait for retry.
return 1;
return 1
fi
_info "Checking authentication"
response="$(_ovh_rest GET "domain/")"
if _contains "$response" "INVALID_CREDENTIAL" ; then
if _contains "$response" "INVALID_CREDENTIAL"; then
_err "The consumer key is invalid: $OVH_CK"
_err "Please retry to create a new one."
_clearaccountconf OVH_CK
_clearaccountconf OVH_CK
return 1
fi
_info "Consumer key is ok."
_debug "First detect the root zone"
if ! _get_root $fulldomain ; then
if ! _get_root $fulldomain; then
_err "invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_debug "Getting txt records"
_ovh_rest GET "domain/zone/$_domain/record?fieldType=TXT&subDomain=$_sub_domain"
if _contains "$response" '\[\]' || _contains "$response" "This service does not exist" ; then
if _contains "$response" '\[\]' || _contains "$response" "This service does not exist"; then
_info "Adding record"
if _ovh_rest POST "domain/zone/$_domain/record" "{\"fieldType\":\"TXT\",\"subDomain\":\"$_sub_domain\",\"target\":\"$txtvalue\",\"ttl\":60}"; then
if _contains "$response" "$txtvalue" ; then
if _ovh_rest POST "domain/zone/$_domain/record" "{\"fieldType\":\"TXT\",\"subDomain\":\"$_sub_domain\",\"target\":\"$txtvalue\",\"ttl\":60}"; then
if _contains "$response" "$txtvalue"; then
_ovh_rest POST "domain/zone/$_domain/refresh"
_debug "Refresh:$response"
_info "Added, sleeping 10 seconds"
@@ -161,66 +153,70 @@ dns_ovh_add(){
else
_info "Updating record"
record_id=$(printf "%s" "$response" | tr -d "[]" | cut -d , -f 1)
if [ -z "$record_id" ] ; then
if [ -z "$record_id" ]; then
_err "Can not get record id."
return 1
fi
_debug "record_id" $record_id
if _ovh_rest PUT "domain/zone/$_domain/record/$record_id" "{\"target\":\"$txtvalue\",\"subDomain\":\"$_sub_domain\",\"ttl\":60}" ; then
if _contains "$response" "null" ; then
if _ovh_rest PUT "domain/zone/$_domain/record/$record_id" "{\"target\":\"$txtvalue\",\"subDomain\":\"$_sub_domain\",\"ttl\":60}"; then
if _contains "$response" "null"; then
_ovh_rest POST "domain/zone/$_domain/refresh"
_debug "Refresh:$response"
_info "Updated, sleeping 10 seconds"
sleep 10
return 0;
return 0
fi
fi
_err "Update error"
return 1
fi
}
#fulldomain
dns_ovh_rm() {
fulldomain=$1
}
#################### Private functions bellow ##################################
_ovh_authentication() {
_H1="X-Ovh-Application: $OVH_AK"
_H2="Content-type: application/json"
_H3=""
_H4=""
_ovhdata='{"accessRules": [{"method": "GET","path": "/*"},{"method": "POST","path": "/*"},{"method": "PUT","path": "/*"},{"method": "DELETE","path": "/*"}],"redirection":"'$ovh_success'"}'
response="$(_post "$_ovhdata" "$OVH_API/auth/credential")"
_debug3 response "$response"
validationUrl="$(echo "$response" | _egrep_o "validationUrl\":\"[^\"]*\"" | _egrep_o "http.*\"" | tr -d '"')"
if [ -z "$validationUrl" ] ; then
if [ -z "$validationUrl" ]; then
_err "Unable to get validationUrl"
return 1
fi
_debug validationUrl "$validationUrl"
consumerKey="$(echo "$response" | _egrep_o "consumerKey\":\"[^\"]*\"" | cut -d : -f 2 | tr -d '"')"
if [ -z "$consumerKey" ] ; then
if [ -z "$consumerKey" ]; then
_err "Unable to get consumerKey"
return 1
fi
_debug consumerKey "$consumerKey"
OVH_CK="$consumerKey"
_saveaccountconf OVH_CK "$OVH_CK"
_info "Please open this link to do authentication: $(__green "$validationUrl" )"
_info "Here is a guide for you: $(__green "$wiki" )"
_info "Please open this link to do authentication: $(__green "$validationUrl")"
_info "Here is a guide for you: $(__green "$wiki")"
_info "Please retry after the authentication is done."
}
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
@@ -230,18 +226,18 @@ _get_root() {
domain=$1
i=2
p=1
while [ '1' ] ; do
while [ '1' ]; do
h=$(printf $domain | cut -d . -f $i-100)
if [ -z "$h" ] ; then
if [ -z "$h" ]; then
#not valid
return 1;
fi
if ! _ovh_rest GET "domain/zone/$h" ; then
return 1
fi
if ! _contains "$response" "This service does not exist" >/dev/null ; then
if ! _ovh_rest GET "domain/zone/$h"; then
return 1
fi
if ! _contains "$response" "This service does not exist" >/dev/null; then
_sub_domain=$(printf $domain | cut -d . -f 1-$p)
_domain=$h
return 0
@@ -266,8 +262,7 @@ _ovh_rest() {
ep="$2"
data="$3"
_debug $ep
_ovh_url="$OVH_API/$ep"
_debug2 _ovh_url "$_ovh_url"
_ovh_t="$(_ovh_timestamp)"
@@ -276,7 +271,6 @@ _ovh_rest() {
_debug _ovh_p "$_ovh_p"
_ovh_hex="$(printf "%s" "$_ovh_p" | _digest sha1 hex)"
_debug2 _ovh_hex "$_ovh_hex"
_H1="X-Ovh-Application: $OVH_AK"
_H2="X-Ovh-Signature: \$1\$$_ovh_hex"
@@ -284,19 +278,17 @@ _ovh_rest() {
_H3="X-Ovh-Timestamp: $_ovh_t"
_H4="X-Ovh-Consumer: $OVH_CK"
_H5="Content-Type: application/json;charset=utf-8"
if [ "$data" ] || [ "$m" = "POST" ] || [ "$m" = "PUT" ] ; then
if [ "$data" ] || [ "$m" = "POST" ] || [ "$m" = "PUT" ]; then
_debug data "$data"
response="$(_post "$data" "$_ovh_url" "" $m)"
else
response="$(_get "$_ovh_url")"
fi
if [ "$?" != "0" ] ; then
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}
+139
View File
@@ -0,0 +1,139 @@
#!/usr/bin/env sh
#PowerDNS Emdedded API
#https://doc.powerdns.com/md/httpapi/api_spec/
#
#PDNS_Url="http://ns.example.com:8081"
#PDNS_ServerId="localhost"
#PDNS_Token="0123456789ABCDEF"
#PDNS_Ttl=60
DEFAULT_PDNS_TTL=60
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "123456789ABCDEF0000000000000000000000000000000000000"
dns_pdns_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$PDNS_Url" ]; then
_err "You don't specify PowerDNS address."
_err "Please set PDNS_Url and try again."
return 1
fi
if [ -z "$PDNS_ServerId" ]; then
_err "You don't specify PowerDNS server id."
_err "Please set you PDNS_ServerId and try again."
return 1
fi
if [ -z "$PDNS_Token" ]; then
_err "You don't specify PowerDNS token."
_err "Please create you PDNS_Token and try again."
return 1
fi
if [ -z "$PDNS_Ttl" ]; then
PDNS_Ttl=$DEFAULT_PDNS_TTL
fi
#save the api addr and key to the account conf file.
_saveaccountconf PDNS_Url "$PDNS_Url"
_saveaccountconf PDNS_ServerId "$PDNS_ServerId"
_saveaccountconf PDNS_Token "$PDNS_Token"
if [ "$PDNS_Ttl" != "$DEFAULT_PDNS_TTL" ]; then
_saveaccountconf PDNS_Ttl "$PDNS_Ttl"
fi
_debug "First detect the root zone"
if ! _get_root $fulldomain; then
_err "invalid domain"
return 1
fi
_debug _domain "$_domain"
if ! set_record "$_domain" "$fulldomain" "$txtvalue"; then
return 1
fi
return 0
}
#fulldomain
dns_pdns_rm() {
fulldomain=$1
}
set_record() {
_info "Adding record"
root=$1
full=$2
txtvalue=$3
if ! _pdns_rest "PATCH" "/api/v1/servers/$PDNS_ServerId/zones/$root." "{\"rrsets\": [{\"name\": \"$full.\", \"changetype\": \"REPLACE\", \"type\": \"TXT\", \"ttl\": $PDNS_Ttl, \"records\": [{\"name\": \"$full.\", \"type\": \"TXT\", \"content\": \"\\\"$txtvalue\\\"\", \"disabled\": false, \"ttl\": $PDNS_Ttl}]}]}"; then
_err "Set txt record error."
return 1
fi
if ! _pdns_rest "PUT" "/api/v1/servers/$PDNS_ServerId/zones/$root./notify"; then
_err "Notify servers error."
return 1
fi
return 0
}
#################### Private functions bellow ##################################
#_acme-challenge.www.domain.com
#returns
# _domain=domain.com
_get_root() {
domain=$1
i=1
p=1
if _pdns_rest "GET" "/api/v1/servers/$PDNS_ServerId/zones"; then
_zones_response=$response
fi
while [ '1' ]; do
h=$(printf $domain | cut -d . -f $i-100)
if [ -z "$h" ]; then
return 1
fi
if printf "$_zones_response" | grep "\"name\": \"$h.\"" >/dev/null; then
_domain=$h
return 0
fi
p=$i
i=$(expr $i + 1)
done
_debug "$domain not found"
return 1
}
_pdns_rest() {
method=$1
ep=$2
data=$3
_H1="X-API-Key: $PDNS_Token"
if [ ! "$method" = "GET" ]; then
_debug data "$data"
response="$(_post "$data" "$PDNS_Url$ep" "" "$method")"
else
response="$(_get "$PDNS_Url$ep")"
fi
if [ "$?" != "0" ]; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}
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.