mirror of
https://github.com/acmesh-official/acme.sh
synced 2025-11-30 14:11:13 +08:00
Compare commits
144 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c9febbdd87 | ||
|
|
caa2e45a8c | ||
|
|
d9130c9852 | ||
|
|
661f05837c | ||
|
|
b15cfc2c5a | ||
|
|
c575c9af3d | ||
|
|
81f27e9077 | ||
|
|
f78babfaa0 | ||
|
|
66990cf872 | ||
|
|
095fe2ed1b | ||
|
|
483ebc8141 | ||
|
|
b9311282eb | ||
|
|
d6f0c2b52b | ||
|
|
bb25febd70 | ||
|
|
19ab2a29ce | ||
|
|
24b4fe9867 | ||
|
|
aa7b82de04 | ||
|
|
3d826bed3a | ||
|
|
d2ae7e78ef | ||
|
|
656bd330f8 | ||
|
|
c2c8f32010 | ||
|
|
9f43c270e6 | ||
|
|
50827188ff | ||
|
|
6ae0f7f5c6 | ||
|
|
c583d6bb49 | ||
|
|
fdcb6b721c | ||
|
|
ef858ef062 | ||
|
|
fe04faf675 | ||
|
|
ad752b317d | ||
|
|
59649e9b1e | ||
|
|
6bf281f905 | ||
|
|
4dfc8b262c | ||
|
|
f08ffe9feb | ||
|
|
65de3110a9 | ||
|
|
f6dcd98995 | ||
|
|
950172dc01 | ||
|
|
5c48e139d4 | ||
|
|
150e9c8a48 | ||
|
|
b19ba13aff | ||
|
|
30bfc2cea7 | ||
|
|
30c2d84c6d | ||
|
|
fbd2038fa7 | ||
|
|
e4b8d9b9d6 | ||
|
|
6b50003697 | ||
|
|
a73c5b3355 | ||
|
|
eb59817e81 | ||
|
|
d404e92d16 | ||
|
|
86c017ec9d | ||
|
|
0407c4e0f7 | ||
|
|
0ba95a3dd4 | ||
|
|
0463b5d6cd | ||
|
|
3f4513b3a9 | ||
|
|
fb2029e717 | ||
|
|
48f02fb61b | ||
|
|
0c00e870c6 | ||
|
|
7da50703fb | ||
|
|
cfdaff5a46 | ||
|
|
18e46962c2 | ||
|
|
319e0ae3cf | ||
|
|
e69a7c38d9 | ||
|
|
ecd685755b | ||
|
|
276b51d927 | ||
|
|
251d1c5c9f | ||
|
|
028e17475f | ||
|
|
1ab630435d | ||
|
|
89002ed298 | ||
|
|
d0871bdae3 | ||
|
|
5ea6e9c9c0 | ||
|
|
267f283a31 | ||
|
|
3324c0ae79 | ||
|
|
811bff6db0 | ||
|
|
0c9546ccb0 | ||
|
|
7b16442656 | ||
|
|
b0070f03af | ||
|
|
08ee072f11 | ||
|
|
f3e4cea34f | ||
|
|
2d12b68952 | ||
|
|
1643b476eb | ||
|
|
5980ebc79a | ||
|
|
8371b030cf | ||
|
|
10afcaca2f | ||
|
|
2fb4b62330 | ||
|
|
cbcd7e0f86 | ||
|
|
df1c9d88a8 | ||
|
|
3aae1ae3d9 | ||
|
|
775bd1abd0 | ||
|
|
78009539d1 | ||
|
|
36246ad9ac | ||
|
|
e2053b22b4 | ||
|
|
dfdc402fbb | ||
|
|
73ba54a502 | ||
|
|
690a5e205d | ||
|
|
a6014bf04e | ||
|
|
d4d1f0f4a9 | ||
|
|
5fbc47eb3a | ||
|
|
6d4e903b08 | ||
|
|
66f08eb236 | ||
|
|
933c169da5 | ||
|
|
a8df88ab91 | ||
|
|
df9547ae39 | ||
|
|
d529eb6d00 | ||
|
|
fac1e367c9 | ||
|
|
31a5487cba | ||
|
|
43822d37a7 | ||
|
|
527dd31c70 | ||
|
|
e3c66532c5 | ||
|
|
22ea4004e1 | ||
|
|
d190a43e0a | ||
|
|
bd5e57d879 | ||
|
|
08928b486b | ||
|
|
75da0713d2 | ||
|
|
d35bf51780 | ||
|
|
ec603beeb0 | ||
|
|
7820467d59 | ||
|
|
fe09757cb3 | ||
|
|
1e6b68f5d1 | ||
|
|
f574e5813f | ||
|
|
30684246d2 | ||
|
|
8bdf5cf854 | ||
|
|
c93ec9331b | ||
|
|
0886e67df7 | ||
|
|
30de13b4df | ||
|
|
7a60c14b31 | ||
|
|
3ad08e9515 | ||
|
|
32fdc19697 | ||
|
|
c9c31c04c3 | ||
|
|
c3dd3ef0d7 | ||
|
|
fa989a554d | ||
|
|
4a4dacb52c | ||
|
|
dcf9cb581d | ||
|
|
1a6305c93f | ||
|
|
bdbf323fee | ||
|
|
7270f277a7 | ||
|
|
32dfc387c8 | ||
|
|
b3752e78b6 | ||
|
|
4c0d3f1b75 | ||
|
|
2e3cb75530 | ||
|
|
3e99ffe692 | ||
|
|
096d8992a1 | ||
|
|
0bbe6eef89 | ||
|
|
d0b748a4f2 | ||
|
|
58f41a194a | ||
|
|
d8d10bc478 | ||
|
|
61623d22d8 |
123
README.md
123
README.md
@@ -13,6 +13,8 @@ It's probably the `easiest&smallest&smartest` shell script to automatically issu
|
||||
|
||||
Wiki: https://github.com/Neilpang/acme.sh/wiki
|
||||
|
||||
# [中文说明](https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E)
|
||||
|
||||
#Tested OS
|
||||
| NO | Status| Platform|
|
||||
|----|-------|---------|
|
||||
@@ -32,6 +34,8 @@ Wiki: https://github.com/Neilpang/acme.sh/wiki
|
||||
|14|-----| Cloud Linux https://github.com/Neilpang/le/issues/111
|
||||
|15|[](https://github.com/Neilpang/letest#here-are-the-latest-status)|OpenBSD
|
||||
|16|[](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://github.com/Neilpang/letest#here-are-the-latest-status)|SunOS/Solaris
|
||||
|
||||
For all build statuses, check our [daily build project](https://github.com/Neilpang/acmetest):
|
||||
|
||||
@@ -44,17 +48,9 @@ https://github.com/Neilpang/acmetest
|
||||
3. Apache mode
|
||||
4. Dns mode
|
||||
|
||||
# Upgrade from 1.x to 2.x
|
||||
|
||||
You can simply uninstall 1.x and re-install 2.x.
|
||||
2.x is 100% compatible to 1.x. You will feel right at home as if nothing has changed.
|
||||
|
||||
# le.sh renamed to acme.sh NOW!
|
||||
|
||||
All configurations are 100% compatible between `le.sh` and `acme.sh`. You just need to uninstall `le.sh` and re-install `acme.sh` again.
|
||||
Nothing will be broken during the process.
|
||||
|
||||
# How to install
|
||||
# 1. How to install
|
||||
|
||||
### 1. Install online:
|
||||
|
||||
@@ -111,40 +107,40 @@ root@v1:~# acme.sh -h
|
||||
|
||||
```
|
||||
|
||||
# Just issue a cert:
|
||||
# 2. Just issue a cert:
|
||||
|
||||
**Example 1:** Single domain.
|
||||
|
||||
```bash
|
||||
acme.sh --issue -d aa.com -w /home/wwwroot/aa.com
|
||||
acme.sh --issue -d example.com -w /home/wwwroot/example.com
|
||||
```
|
||||
|
||||
**Example 2:** Multiple domains in the same cert.
|
||||
|
||||
```bash
|
||||
acme.sh --issue -d aa.com -d www.aa.com -d cp.aa.com -w /home/wwwroot/aa.com
|
||||
acme.sh --issue -d example.com -d www.example.com -d cp.example.com -w /home/wwwroot/example.com
|
||||
```
|
||||
|
||||
The parameter `/home/wwwroot/aa.com` is the web root folder. You **MUST** have `write access` to this folder.
|
||||
The parameter `/home/wwwroot/example.com` is the web root folder. You **MUST** have `write access` to this folder.
|
||||
|
||||
Second argument **"aa.com"** is the main domain you want to issue cert for.
|
||||
Second argument **"example.com"** is the main domain you want to issue cert for.
|
||||
You must have at least a domain there.
|
||||
|
||||
You must point and bind all the domains to the same webroot dir: `/home/wwwroot/aa.com`.
|
||||
You must point and bind all the domains to the same webroot dir: `/home/wwwroot/example.com`.
|
||||
|
||||
Generate/issued certs will be placed in `~/.acme.sh/aa.com/`
|
||||
Generate/issued certs will be placed in `~/.acme.sh/example.com/`
|
||||
|
||||
The issued cert will be renewed every 80 days automatically.
|
||||
The issued cert will be renewed every **60** days automatically.
|
||||
|
||||
More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
|
||||
|
||||
|
||||
# Install issued cert to apache/nginx etc.
|
||||
# 3. Install the issued cert to apache/nginx etc.
|
||||
|
||||
After you issue a cert, you probably want to install the cert with your nginx/apache or other servers you may be using.
|
||||
After you issue a cert, you probably want to install/copy the cert to your nginx/apache or other servers you may be using.
|
||||
|
||||
```bash
|
||||
acme.sh --installcert -d aa.com \
|
||||
acme.sh --installcert -d example.com \
|
||||
--certpath /path/to/certfile/in/apache/nginx \
|
||||
--keypath /path/to/keyfile/in/apache/nginx \
|
||||
--capath /path/to/ca/certfile/apache/nginx \
|
||||
@@ -154,23 +150,23 @@ acme.sh --installcert -d aa.com \
|
||||
|
||||
Only the domain is required, all the other parameters are optional.
|
||||
|
||||
Install the issued cert/key to the production apache or nginx path.
|
||||
Install/copy the issued cert/key to the production apache or nginx path.
|
||||
|
||||
The cert will be `renewed every 80 days by default` (which is configurable). Once the cert is renewed, the apache/nginx will be automatically reloaded by the command: `service apache2 reload` or `service nginx reload`.
|
||||
The cert will be `renewed every **60** days by default` (which is configurable). Once the cert is renewed, the apache/nginx will be automatically reloaded by the command: `service apache2 reload` or `service nginx reload`.
|
||||
|
||||
# Use Standalone server to issue cert
|
||||
# 4. Use Standalone server to issue cert
|
||||
|
||||
**(requires you be root/sudoer, or you have permission to listen tcp 80 port)**
|
||||
|
||||
The tcp `80` port **MUST** be free to listen, otherwise you will be prompted to free the `80` port and try again.
|
||||
|
||||
```bash
|
||||
acme.sh --issue --standalone -d aa.com -d www.aa.com -d cp.aa.com
|
||||
acme.sh --issue --standalone -d example.com -d www.example.com -d cp.example.com
|
||||
```
|
||||
|
||||
More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
|
||||
|
||||
# Use Standalone tls server to issue cert
|
||||
# 5. Use Standalone tls server to issue cert
|
||||
|
||||
**(requires you be root/sudoer, or you have permission to listen tcp 443 port)**
|
||||
|
||||
@@ -179,12 +175,12 @@ acme.sh supports `tls-sni-01` validation.
|
||||
The tcp `443` port **MUST** be free to listen, otherwise you will be prompted to free the `443` port and try again.
|
||||
|
||||
```bash
|
||||
acme.sh --issue --tls -d aa.com -d www.aa.com -d cp.aa.com
|
||||
acme.sh --issue --tls -d example.com -d www.example.com -d cp.example.com
|
||||
```
|
||||
|
||||
More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
|
||||
|
||||
# Use Apache mode
|
||||
# 6. Use Apache mode
|
||||
|
||||
**(requires you be root/sudoer, since it is required to interact with apache server)**
|
||||
|
||||
@@ -195,28 +191,28 @@ Particularly, if you are running an apache server, you should use apache mode in
|
||||
Just set string "apache" as the second argument, it will force use of apache plugin automatically.
|
||||
|
||||
```
|
||||
acme.sh --issue --apache -d aa.com -d www.aa.com -d user.aa.com
|
||||
acme.sh --issue --apache -d example.com -d www.example.com -d user.example.com
|
||||
```
|
||||
|
||||
More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
|
||||
|
||||
# Use DNS mode:
|
||||
# 7. Use DNS mode:
|
||||
|
||||
Support the `dns-01` challenge.
|
||||
|
||||
```bash
|
||||
acme.sh --issue --dns -d aa.com -d www.aa.com -d user.aa.com
|
||||
acme.sh --issue --dns -d example.com -d www.example.com -d user.example.com
|
||||
```
|
||||
|
||||
You should get the output like below:
|
||||
|
||||
```
|
||||
Add the following txt record:
|
||||
Domain:_acme-challenge.aa.com
|
||||
Domain:_acme-challenge.example.com
|
||||
Txt value:9ihDbjYfTExAYeDs4DBUeuTo18KBzwvTEjUnSwd32-c
|
||||
|
||||
Add the following txt record:
|
||||
Domain:_acme-challenge.www.aa.com
|
||||
Domain:_acme-challenge.www.example.com
|
||||
Txt value:9ihDbjxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
|
||||
Please add those txt records to the domains. Waiting for the dns to take effect.
|
||||
@@ -226,12 +222,12 @@ Please add those txt records to the domains. Waiting for the dns to take effect.
|
||||
Then just rerun with `renew` argument:
|
||||
|
||||
```bash
|
||||
acme.sh --renew -d aa.com
|
||||
acme.sh --renew -d example.com
|
||||
```
|
||||
|
||||
Ok, it's finished.
|
||||
|
||||
# Automatic DNS API integration
|
||||
# 8. Automatic DNS API integration
|
||||
|
||||
If your DNS provider supports API access, we can use API to automatically issue the certs.
|
||||
|
||||
@@ -242,8 +238,11 @@ You don't have do anything manually!
|
||||
1. Cloudflare.com API
|
||||
2. Dnspod.cn API
|
||||
3. Cloudxns.com API
|
||||
4. AWS Route 53, see: https://github.com/Neilpang/acme.sh/issues/65
|
||||
5. lexicon dns api: https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api
|
||||
4. Godaddy.com API
|
||||
5. OVH, kimsufi, soyoustart and runabove API
|
||||
6. AWS Route 53, see: https://github.com/Neilpang/acme.sh/issues/65
|
||||
7. PowerDNS API
|
||||
8. lexicon dns api: https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api
|
||||
(DigitalOcean, DNSimple, DnsMadeEasy, DNSPark, EasyDNS, Namesilo, NS1, PointHQ, Rage4 and Vultr etc.)
|
||||
|
||||
##### More APIs are coming soon...
|
||||
@@ -252,7 +251,7 @@ If your DNS provider is not on the supported list above, you can write your own
|
||||
|
||||
For more details: [How to use dns api](dnsapi)
|
||||
|
||||
# Issue ECC certificate:
|
||||
# 9. Issue ECC certificate:
|
||||
|
||||
`Let's Encrypt` now can issue **ECDSA** certificates.
|
||||
|
||||
@@ -265,13 +264,13 @@ For example:
|
||||
### Single domain ECC cerfiticate:
|
||||
|
||||
```bash
|
||||
acme.sh --issue -w /home/wwwroot/aa.com -d aa.com --keylength ec-256
|
||||
acme.sh --issue -w /home/wwwroot/example.com -d example.com --keylength ec-256
|
||||
```
|
||||
|
||||
SAN multi domain ECC certificate:
|
||||
|
||||
```bash
|
||||
acme.sh --issue -w /home/wwwroot/aa.com -d aa.com -d www.aa.com --keylength ec-256
|
||||
acme.sh --issue -w /home/wwwroot/example.com -d example.com -d www.example.com --keylength ec-256
|
||||
```
|
||||
|
||||
Please look at the last parameter above.
|
||||
@@ -282,6 +281,46 @@ Valid values are:
|
||||
2. **ec-384 (secp384r1, "ECDSA P-384")**
|
||||
3. **ec-521 (secp521r1, "ECDSA P-521", which is not supported by Let's Encrypt yet.)**
|
||||
|
||||
|
||||
# 10. How to renew the cert
|
||||
|
||||
No, you don't need to renew the certs manually. All the certs will be renewed automatically every **60** days.
|
||||
|
||||
However, you can also force to renew any cert:
|
||||
|
||||
```
|
||||
acme.sh --renew -d example.com --force
|
||||
```
|
||||
|
||||
or, for ECC cert:
|
||||
```
|
||||
acme.sh --renew -d example.com --force --ecc
|
||||
```
|
||||
|
||||
# 11. How to upgrade `acme.sh`
|
||||
acme.sh is in developing, it's strongly recommended to use the latest code.
|
||||
|
||||
You can update acme.sh to the latest code:
|
||||
```
|
||||
acme.sh --upgrade
|
||||
```
|
||||
|
||||
You can enable auto upgrade:
|
||||
```
|
||||
acme.sh --upgrade --auto-upgrade
|
||||
```
|
||||
Then **acme.sh** will keep up to date automatically.
|
||||
|
||||
Disable auto upgrade:
|
||||
```
|
||||
acme.sh --upgrade --auto-upgrade 0
|
||||
```
|
||||
|
||||
# 12. Issue a cert from an existing CSR
|
||||
|
||||
https://github.com/Neilpang/acme.sh/wiki/Issue-a-cert-from-existing-CSR
|
||||
|
||||
|
||||
# Under the Hood
|
||||
|
||||
Speak ACME language using shell, directly to "Let's Encrypt".
|
||||
@@ -293,7 +332,7 @@ TODO:
|
||||
2. ACME protocol: https://github.com/ietf-wg-acme/acme
|
||||
3. Certbot: https://github.com/certbot/certbot
|
||||
|
||||
# License & Other
|
||||
# License & Others
|
||||
|
||||
License is GPLv3
|
||||
|
||||
@@ -302,4 +341,8 @@ Please Star and Fork me.
|
||||
[Issues](https://github.com/Neilpang/acme.sh/issues) and [pull requests](https://github.com/Neilpang/acme.sh/pulls) are welcomed.
|
||||
|
||||
|
||||
# Donate
|
||||
1. PayPal: donate@acme.sh
|
||||
|
||||
[Donate List](https://github.com/Neilpang/acme.sh/wiki/Donate-list)
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ export CF_Email="xxxx@sss.com"
|
||||
|
||||
Ok, let's issue cert now:
|
||||
```
|
||||
acme.sh --issue --dns dns_cf -d aa.com -d www.aa.com
|
||||
acme.sh --issue --dns dns_cf -d example.com -d www.example.com
|
||||
```
|
||||
|
||||
The `CF_Key` and `CF_Email` will be saved in `~/.acme.sh/account.conf`, when next time you use cloudflare api, it will reuse this key.
|
||||
@@ -37,7 +37,7 @@ export DP_Key="sADDsdasdgdsf"
|
||||
|
||||
Ok, let's issue cert now:
|
||||
```
|
||||
acme.sh --issue --dns dns_dp -d aa.com -d www.aa.com
|
||||
acme.sh --issue --dns dns_dp -d example.com -d www.example.com
|
||||
```
|
||||
|
||||
The `DP_Id` and `DP_Key` will be saved in `~/.acme.sh/account.conf`, when next time you use dnspod.cn api, it will reuse this key.
|
||||
@@ -58,12 +58,63 @@ export CX_Secret="sADDsdasdgdsf"
|
||||
|
||||
Ok, let's issue cert now:
|
||||
```
|
||||
acme.sh --issue --dns dns_cx -d aa.com -d www.aa.com
|
||||
acme.sh --issue --dns dns_cx -d example.com -d www.example.com
|
||||
```
|
||||
|
||||
The `CX_Key` and `CX_Secret` will be saved in `~/.acme.sh/account.conf`, when next time you use Cloudxns.com api, it will reuse this key.
|
||||
|
||||
|
||||
## Use Godaddy.com domain api to automatically issue cert
|
||||
|
||||
We support Godaddy integration.
|
||||
|
||||
First you need to login to your Godaddy account to get your api key and api secret.
|
||||
|
||||
https://developer.godaddy.com/keys/
|
||||
|
||||
Please Create a Production key, instead of a Test key.
|
||||
|
||||
|
||||
```
|
||||
export GD_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
|
||||
|
||||
export GD_Secret="asdfsdafdsfdsfdsfdsfdsafd"
|
||||
|
||||
```
|
||||
|
||||
Ok, let's issue cert now:
|
||||
```
|
||||
acme.sh --issue --dns dns_gd -d example.com -d www.example.com
|
||||
```
|
||||
|
||||
The `GD_Key` and `GD_Secret` will be saved in `~/.acme.sh/account.conf`, when next time you use cloudflare api, it will reuse this key.
|
||||
|
||||
## Use PowerDNS embedded api to automatically issue cert
|
||||
|
||||
We support PowerDNS embedded API integration.
|
||||
|
||||
First you need to enable api and set your api-token in PowerDNS configuration.
|
||||
|
||||
https://doc.powerdns.com/md/httpapi/README/
|
||||
|
||||
```
|
||||
export PDNS_Url="http://ns.example.com:8081"
|
||||
export PDNS_ServerId="localhost"
|
||||
export PDNS_Token="0123456789ABCDEF"
|
||||
export PDNS_Ttl=60
|
||||
|
||||
```
|
||||
|
||||
Ok, let's issue cert now:
|
||||
```
|
||||
acme.sh --issue --dns dns_pdns -d example.com -d www.example.com
|
||||
```
|
||||
|
||||
The `PDNS_Url`, `PDNS_ServerId`, `PDNS_Token` and `PDNS_Ttl` will be saved in `~/.acme.sh/account.conf`.
|
||||
|
||||
## Use OVH/kimsufi/soyoustart/runabove API
|
||||
|
||||
https://github.com/Neilpang/acme.sh/wiki/How-to-use-OVH-domain-api
|
||||
|
||||
# Use custom api
|
||||
|
||||
@@ -72,17 +123,15 @@ If your api is not supported yet, you can write your own dns api.
|
||||
Let's assume you want to name it 'myapi',
|
||||
|
||||
1. Create a bash script named `~/.acme.sh/dns_myapi.sh`,
|
||||
2. In the scrypt, you must have a function named `dns_myapi_add()`. Which will be called by acme.sh to add dns records.
|
||||
2. In the script, you must have a function named `dns_myapi_add()`. Which will be called by acme.sh to add dns records.
|
||||
3. Then you can use your api to issue cert like:
|
||||
|
||||
```
|
||||
acme.sh --issue --dns dns_myapi -d aa.com -d www.aa.com
|
||||
acme.sh --issue --dns dns_myapi -d example.com -d www.example.com
|
||||
```
|
||||
|
||||
For more details, please check our sample script: [dns_myapi.sh](dns_myapi.sh)
|
||||
|
||||
|
||||
|
||||
# Use lexicon dns api
|
||||
|
||||
https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api
|
||||
|
||||
@@ -43,12 +43,12 @@ dns_cf_add(){
|
||||
return 1
|
||||
fi
|
||||
|
||||
count=$(printf "$response" | grep -o \"count\":[^,]* | cut -d : -f 2)
|
||||
count=$(printf "%s\n" "$response" | _egrep_o \"count\":[^,]* | cut -d : -f 2)
|
||||
_debug count "$count"
|
||||
if [ "$count" = "0" ] ; then
|
||||
_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 printf -- "%s" "$response" | grep $fulldomain > /dev/null ; then
|
||||
_info "Added, sleeping 10 seconds"
|
||||
sleep 10
|
||||
#todo: check if the record takes effect
|
||||
@@ -61,7 +61,7 @@ dns_cf_add(){
|
||||
_err "Add txt record error."
|
||||
else
|
||||
_info "Updating record"
|
||||
record_id=$(printf "$response" | grep -o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \"| head -1)
|
||||
record_id=$(printf "%s\n" "$response" | _egrep_o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \"| head -n 1)
|
||||
_debug "record_id" $record_id
|
||||
|
||||
_cf_rest PUT "zones/$_domain_id/dns_records/$record_id" "{\"id\":\"$record_id\",\"type\":\"TXT\",\"name\":\"$fulldomain\",\"content\":\"$txtvalue\",\"zone_id\":\"$_domain_id\",\"zone_name\":\"$_domain\"}"
|
||||
@@ -103,7 +103,7 @@ _get_root() {
|
||||
fi
|
||||
|
||||
if printf $response | grep \"name\":\"$h\" >/dev/null ; then
|
||||
_domain_id=$(printf "$response" | grep -o \"id\":\"[^\"]*\" | head -1 | cut -d : -f 2 | tr -d \")
|
||||
_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
|
||||
|
||||
@@ -69,7 +69,7 @@ existing_records() {
|
||||
return 1
|
||||
fi
|
||||
count=0
|
||||
seg=$(printf "$response" | grep -o "{[^{]*host\":\"$_sub_domain\"[^}]*}")
|
||||
seg=$(printf "%s\n" "$response" | _egrep_o "{[^\{]*host\":\"$_sub_domain\"[^\}]*\}")
|
||||
_debug seg "$seg"
|
||||
if [ -z "$seg" ] ; then
|
||||
return 0
|
||||
@@ -77,7 +77,7 @@ existing_records() {
|
||||
|
||||
if printf "$response" | grep '"type":"TXT"' > /dev/null ; then
|
||||
count=1
|
||||
record_id=$(printf "$seg" | grep -o \"record_id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \")
|
||||
record_id=$(printf "%s\n" "$seg" | _egrep_o \"record_id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \")
|
||||
_debug record_id "$record_id"
|
||||
return 0
|
||||
fi
|
||||
@@ -145,9 +145,9 @@ _get_root() {
|
||||
fi
|
||||
|
||||
if printf "$response" | grep "$h." >/dev/null ; then
|
||||
seg=$(printf "$response" | grep -o "{[^{]*$h\.[^}]*\}" )
|
||||
seg=$(printf "%s" "$response" | _egrep_o "\{[^\{]*\"$h\.\"[^\}]*\}" )
|
||||
_debug seg "$seg"
|
||||
_domain_id=$(printf "$seg" | grep -o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \")
|
||||
_domain_id=$(printf "%s" "$seg" | _egrep_o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \")
|
||||
_debug _domain_id "$_domain_id"
|
||||
if [ "$_domain_id" ] ; then
|
||||
_sub_domain=$(printf $domain | cut -d . -f 1-$p)
|
||||
|
||||
@@ -152,7 +152,7 @@ _get_root() {
|
||||
fi
|
||||
|
||||
if printf "$response" | grep "Action completed successful" >/dev/null ; then
|
||||
_domain_id=$(printf "$response" | grep -o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \")
|
||||
_domain_id=$(printf "%s\n" "$response" | _egrep_o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \")
|
||||
_debug _domain_id "$_domain_id"
|
||||
if [ "$_domain_id" ] ; then
|
||||
_sub_domain=$(printf $domain | cut -d . -f 1-$p)
|
||||
|
||||
118
dnsapi/dns_gd.sh
Executable file
118
dnsapi/dns_gd.sh
Executable file
@@ -0,0 +1,118 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
#Godaddy domain api
|
||||
#
|
||||
#GD_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
|
||||
#
|
||||
#GD_Secret="asdfsdfsfsdfsdfdfsdf"
|
||||
|
||||
|
||||
GD_Api="https://api.godaddy.com/v1"
|
||||
|
||||
######## Public functions #####################
|
||||
|
||||
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
|
||||
dns_gd_add(){
|
||||
fulldomain=$1
|
||||
txtvalue=$2
|
||||
|
||||
if [ -z "$GD_Key" ] || [ -z "$GD_Secret" ] ; then
|
||||
_err "You don't specify godaddy api key and secret yet."
|
||||
_err "Please create you key and try again."
|
||||
return 1
|
||||
fi
|
||||
|
||||
#save the api key and email to the account conf file.
|
||||
_saveaccountconf GD_Key "$GD_Key"
|
||||
_saveaccountconf GD_Secret "$GD_Secret"
|
||||
|
||||
_debug "First detect the root zone"
|
||||
if ! _get_root $fulldomain ; then
|
||||
_err "invalid domain"
|
||||
return 1
|
||||
fi
|
||||
_debug _domain_id "$_domain_id"
|
||||
_debug _sub_domain "$_sub_domain"
|
||||
_debug _domain "$_domain"
|
||||
|
||||
|
||||
_info "Adding record"
|
||||
if _gd_rest PUT "domains/$_domain/records/TXT/$_sub_domain" "[{\"data\":\"$txtvalue\"}]"; then
|
||||
if [ "$response" = "{}" ] ; then
|
||||
_info "Added, sleeping 10 seconds"
|
||||
sleep 10
|
||||
#todo: check if the record takes effect
|
||||
return 0
|
||||
else
|
||||
_err "Add txt record error."
|
||||
_err "$response"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
_err "Add txt record error."
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#################### Private functions bellow ##################################
|
||||
#_acme-challenge.www.domain.com
|
||||
#returns
|
||||
# _sub_domain=_acme-challenge.www
|
||||
# _domain=domain.com
|
||||
# _domain_id=sdjkglgdfewsdfg
|
||||
_get_root() {
|
||||
domain=$1
|
||||
i=2
|
||||
p=1
|
||||
while [ '1' ] ; do
|
||||
h=$(printf $domain | cut -d . -f $i-100)
|
||||
if [ -z "$h" ] ; then
|
||||
#not valid
|
||||
return 1;
|
||||
fi
|
||||
|
||||
if ! _gd_rest GET "domains/$h" ; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if printf "$response" | grep '"code":"NOT_FOUND"' >/dev/null ; then
|
||||
_debug "$h not found"
|
||||
else
|
||||
_sub_domain=$(printf $domain | cut -d . -f 1-$p)
|
||||
_domain=$h
|
||||
return 0
|
||||
fi
|
||||
p=$i
|
||||
i=$(expr $i + 1)
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
_gd_rest() {
|
||||
m=$1
|
||||
ep="$2"
|
||||
data="$3"
|
||||
_debug $ep
|
||||
|
||||
_H1="Authorization: sso-key $GD_Key:$GD_Secret"
|
||||
_H2="Content-Type: application/json"
|
||||
|
||||
if [ "$data" ] ; then
|
||||
_debug data "$data"
|
||||
response="$(_post "$data" "$GD_Api/$ep" "" $m)"
|
||||
else
|
||||
response="$(_get "$GD_Api/$ep")"
|
||||
fi
|
||||
|
||||
if [ "$?" != "0" ] ; then
|
||||
_err "error $ep"
|
||||
return 1
|
||||
fi
|
||||
_debug2 response "$response"
|
||||
return 0
|
||||
}
|
||||
|
||||
|
||||
302
dnsapi/dns_ovh.sh
Executable file
302
dnsapi/dns_ovh.sh
Executable file
@@ -0,0 +1,302 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
|
||||
#Applcation Key
|
||||
#OVH_AK="sdfsdfsdfljlbjkljlkjsdfoiwje"
|
||||
#
|
||||
#Application Secret
|
||||
#OVH_AS="sdfsafsdfsdfdsfsdfsa"
|
||||
#
|
||||
#Consumer Key
|
||||
#OVH_CK="sdfsdfsdfsdfsdfdsf"
|
||||
|
||||
|
||||
#OVH_END_POINT=ovh-eu
|
||||
|
||||
|
||||
#'ovh-eu'
|
||||
OVH_EU='https://eu.api.ovh.com/1.0'
|
||||
|
||||
#'ovh-ca':
|
||||
OVH_CA='https://ca.api.ovh.com/1.0'
|
||||
|
||||
#'kimsufi-eu'
|
||||
KSF_EU='https://eu.api.kimsufi.com/1.0'
|
||||
|
||||
#'kimsufi-ca'
|
||||
KSF_CA='https://ca.api.kimsufi.com/1.0'
|
||||
|
||||
#'soyoustart-eu'
|
||||
SYS_EU='https://eu.api.soyoustart.com/1.0'
|
||||
|
||||
#'soyoustart-ca'
|
||||
SYS_CA='https://ca.api.soyoustart.com/1.0'
|
||||
|
||||
#'runabove-ca'
|
||||
RAV_CA='https://api.runabove.com/1.0'
|
||||
|
||||
|
||||
wiki="https://github.com/Neilpang/acme.sh/wiki/How-to-use-OVH-domain-api"
|
||||
|
||||
ovh_success="https://github.com/Neilpang/acme.sh/wiki/OVH-Success"
|
||||
|
||||
|
||||
|
||||
_ovh_get_api() {
|
||||
_ogaep="$1"
|
||||
|
||||
case "${_ogaep}" in
|
||||
|
||||
ovh-eu|ovheu)
|
||||
printf "%s" $OVH_EU
|
||||
return
|
||||
;;
|
||||
ovh-ca|ovhca)
|
||||
printf "%s" $OVH_CA
|
||||
return
|
||||
;;
|
||||
kimsufi-eu|kimsufieu)
|
||||
printf "%s" $KSF_EU
|
||||
return
|
||||
;;
|
||||
kimsufi-ca|kimsufica)
|
||||
printf "%s" $KSF_CA
|
||||
return
|
||||
;;
|
||||
soyoustart-eu|soyoustarteu)
|
||||
printf "%s" $SYS_EU
|
||||
return
|
||||
;;
|
||||
soyoustart-ca|soyoustartca)
|
||||
printf "%s" $SYS_CA
|
||||
return
|
||||
;;
|
||||
runabove-ca|runaboveca)
|
||||
printf "%s" $RAV_CA
|
||||
return
|
||||
;;
|
||||
|
||||
|
||||
*)
|
||||
_err "Unknown parameter : $1"
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
######## Public functions #####################
|
||||
|
||||
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
|
||||
dns_ovh_add(){
|
||||
fulldomain=$1
|
||||
txtvalue=$2
|
||||
|
||||
if [ -z "$OVH_AK" ] || [ -z "$OVH_AS" ] ; then
|
||||
_err "You don't specify OVH application key and application secret yet."
|
||||
_err "Please create you key and try again."
|
||||
return 1
|
||||
fi
|
||||
|
||||
#save the api key and email to the account conf file.
|
||||
_saveaccountconf OVH_AK "$OVH_AK"
|
||||
_saveaccountconf OVH_AS "$OVH_AS"
|
||||
|
||||
|
||||
if [ -z "$OVH_END_POINT" ] ; then
|
||||
OVH_END_POINT="ovh-eu"
|
||||
fi
|
||||
_info "Using OVH endpoint: $OVH_END_POINT"
|
||||
if [ "$OVH_END_POINT" != "ovh-eu" ] ; then
|
||||
_saveaccountconf OVH_END_POINT "$OVH_END_POINT"
|
||||
fi
|
||||
|
||||
OVH_API="$(_ovh_get_api $OVH_END_POINT )"
|
||||
_debug OVH_API "$OVH_API"
|
||||
|
||||
if [ -z "$OVH_CK" ] ; then
|
||||
_info "OVH consumer key is empty, Let's get one:"
|
||||
if ! _ovh_authentication ; then
|
||||
_err "Can not get consumer key."
|
||||
fi
|
||||
#return and wait for retry.
|
||||
return 1;
|
||||
fi
|
||||
|
||||
|
||||
_info "Checking authentication"
|
||||
|
||||
response="$(_ovh_rest GET "domain/")"
|
||||
if _contains "$response" "INVALID_CREDENTIAL" ; then
|
||||
_err "The consumer key is invalid: $OVH_CK"
|
||||
_err "Please retry to create a new one."
|
||||
_clearaccountconf OVH_CK
|
||||
return 1
|
||||
fi
|
||||
_info "Consumer key is ok."
|
||||
|
||||
_debug "First detect the root zone"
|
||||
if ! _get_root $fulldomain ; then
|
||||
_err "invalid domain"
|
||||
return 1
|
||||
fi
|
||||
_debug _domain_id "$_domain_id"
|
||||
_debug _sub_domain "$_sub_domain"
|
||||
_debug _domain "$_domain"
|
||||
|
||||
_debug "Getting txt records"
|
||||
_ovh_rest GET "domain/zone/$_domain/record?fieldType=TXT&subDomain=$_sub_domain"
|
||||
|
||||
if _contains "$response" '\[\]' || _contains "$response" "This service does not exist" ; then
|
||||
_info "Adding record"
|
||||
if _ovh_rest POST "domain/zone/$_domain/record" "{\"fieldType\":\"TXT\",\"subDomain\":\"$_sub_domain\",\"target\":\"$txtvalue\",\"ttl\":60}"; then
|
||||
if _contains "$response" "$txtvalue" ; then
|
||||
_ovh_rest POST "domain/zone/$_domain/refresh"
|
||||
_debug "Refresh:$response"
|
||||
_info "Added, sleeping 10 seconds"
|
||||
sleep 10
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
_err "Add txt record error."
|
||||
else
|
||||
_info "Updating record"
|
||||
record_id=$(printf "%s" "$response" | tr -d "[]" | cut -d , -f 1)
|
||||
if [ -z "$record_id" ] ; then
|
||||
_err "Can not get record id."
|
||||
return 1
|
||||
fi
|
||||
_debug "record_id" $record_id
|
||||
|
||||
if _ovh_rest PUT "domain/zone/$_domain/record/$record_id" "{\"target\":\"$txtvalue\",\"subDomain\":\"$_sub_domain\",\"ttl\":60}" ; then
|
||||
if _contains "$response" "null" ; then
|
||||
_ovh_rest POST "domain/zone/$_domain/refresh"
|
||||
_debug "Refresh:$response"
|
||||
_info "Updated, sleeping 10 seconds"
|
||||
sleep 10
|
||||
return 0;
|
||||
fi
|
||||
fi
|
||||
_err "Update error"
|
||||
return 1
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
|
||||
#################### Private functions bellow ##################################
|
||||
|
||||
_ovh_authentication() {
|
||||
|
||||
_H1="X-Ovh-Application: $OVH_AK"
|
||||
_H2="Content-type: application/json"
|
||||
_H3=""
|
||||
_H4=""
|
||||
|
||||
_ovhdata='{"accessRules": [{"method": "GET","path": "/*"},{"method": "POST","path": "/*"},{"method": "PUT","path": "/*"},{"method": "DELETE","path": "/*"}],"redirection":"'$ovh_success'"}'
|
||||
|
||||
response="$(_post "$_ovhdata" "$OVH_API/auth/credential")"
|
||||
_debug3 response "$response"
|
||||
validationUrl="$(echo "$response" | _egrep_o "validationUrl\":\"[^\"]*\"" | _egrep_o "http.*\"" | tr -d '"')"
|
||||
if [ -z "$validationUrl" ] ; then
|
||||
_err "Unable to get validationUrl"
|
||||
return 1
|
||||
fi
|
||||
_debug validationUrl "$validationUrl"
|
||||
|
||||
consumerKey="$(echo "$response" | _egrep_o "consumerKey\":\"[^\"]*\"" | cut -d : -f 2 | tr -d '"')"
|
||||
if [ -z "$consumerKey" ] ; then
|
||||
_err "Unable to get consumerKey"
|
||||
return 1
|
||||
fi
|
||||
_debug consumerKey "$consumerKey"
|
||||
|
||||
OVH_CK="$consumerKey"
|
||||
_saveaccountconf OVH_CK "$OVH_CK"
|
||||
|
||||
_info "Please open this link to do authentication: $(__green "$validationUrl" )"
|
||||
|
||||
_info "Here is a guide for you: $(__green "$wiki" )"
|
||||
_info "Please retry after the authentication is done."
|
||||
|
||||
}
|
||||
|
||||
|
||||
#_acme-challenge.www.domain.com
|
||||
#returns
|
||||
# _sub_domain=_acme-challenge.www
|
||||
# _domain=domain.com
|
||||
# _domain_id=sdjkglgdfewsdfg
|
||||
_get_root() {
|
||||
domain=$1
|
||||
i=2
|
||||
p=1
|
||||
while [ '1' ] ; do
|
||||
h=$(printf $domain | cut -d . -f $i-100)
|
||||
if [ -z "$h" ] ; then
|
||||
#not valid
|
||||
return 1;
|
||||
fi
|
||||
|
||||
if ! _ovh_rest GET "domain/zone/$h" ; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if ! _contains "$response" "This service does not exist" >/dev/null ; then
|
||||
_sub_domain=$(printf $domain | cut -d . -f 1-$p)
|
||||
_domain=$h
|
||||
return 0
|
||||
fi
|
||||
p=$i
|
||||
i=$(expr $i + 1)
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
_ovh_timestamp() {
|
||||
_H1=""
|
||||
_H2=""
|
||||
_H3=""
|
||||
_H4=""
|
||||
_H5=""
|
||||
_get "$OVH_API/auth/time" "" 30
|
||||
}
|
||||
|
||||
_ovh_rest() {
|
||||
m=$1
|
||||
ep="$2"
|
||||
data="$3"
|
||||
_debug $ep
|
||||
|
||||
|
||||
_ovh_url="$OVH_API/$ep"
|
||||
_debug2 _ovh_url "$_ovh_url"
|
||||
_ovh_t="$(_ovh_timestamp)"
|
||||
_debug2 _ovh_t "$_ovh_t"
|
||||
_ovh_p="$OVH_AS+$OVH_CK+$m+$_ovh_url+$data+$_ovh_t"
|
||||
_debug _ovh_p "$_ovh_p"
|
||||
_ovh_hex="$(printf "%s" "$_ovh_p" | _digest sha1 hex)"
|
||||
_debug2 _ovh_hex "$_ovh_hex"
|
||||
|
||||
|
||||
_H1="X-Ovh-Application: $OVH_AK"
|
||||
_H2="X-Ovh-Signature: \$1\$$_ovh_hex"
|
||||
_debug2 _H2 "$_H2"
|
||||
_H3="X-Ovh-Timestamp: $_ovh_t"
|
||||
_H4="X-Ovh-Consumer: $OVH_CK"
|
||||
_H5="Content-Type: application/json;charset=utf-8"
|
||||
if [ "$data" ] || [ "$m" = "POST" ] || [ "$m" = "PUT" ] ; then
|
||||
_debug data "$data"
|
||||
response="$(_post "$data" "$_ovh_url" "" $m)"
|
||||
else
|
||||
response="$(_get "$_ovh_url")"
|
||||
fi
|
||||
|
||||
if [ "$?" != "0" ] ; then
|
||||
_err "error $ep"
|
||||
return 1
|
||||
fi
|
||||
_debug2 response "$response"
|
||||
return 0
|
||||
}
|
||||
|
||||
|
||||
133
dnsapi/dns_pdns.sh
Executable file
133
dnsapi/dns_pdns.sh
Executable file
@@ -0,0 +1,133 @@
|
||||
#!/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
|
||||
}
|
||||
|
||||
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