97 Commits
2.6.0 ... 2.6.4

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

* fix performance

* fix performance, use cached nonce

* do not register account if already registered

* fix thumbprint

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

* fix performance

* fix performance, use cached nonce

* do not register account if already registered

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

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

* fix deactivate idn name

* 2.6.1 support IDN
2016-10-23 14:56:52 +08:00
neil
ecf0a710e1 fix typo 2016-10-21 18:26:35 +08:00
neilpang
a61fe418b2 support deploy api 2016-10-11 20:56:59 +08:00
16 changed files with 2468 additions and 1654 deletions

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

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

11
.travis.yml Normal file
View File

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

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. - An ACME protocol client written purely in Shell (Unix shell) language.
- Fully ACME protocol implementation. - Fully ACME protocol implementation.
- Simple, powerful and very easy to use. You only need 3 minutes to learn. - Simple, powerful and very easy to use. You only need 3 minutes to learn.
@@ -36,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 |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) |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 |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): For all build statuses, check our [daily build project](https://github.com/Neilpang/acmetest):
@@ -137,15 +138,24 @@ More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
# 3. Install the 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/copy the cert to 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 ```bash
acme.sh --installcert -d example.com \ acme.sh --installcert -d example.com \
--certpath /path/to/certfile/in/apache/nginx \ --keypath /path/to/keyfile/in/nginx/key.pem \
--keypath /path/to/keyfile/in/apache/nginx \ --fullchainpath path/to/fullchain/nginx/cert.pem \
--capath /path/to/ca/certfile/apache/nginx \ --reloadcmd "service nginx restart"
--fullchainpath path/to/fullchain/certfile/apache/nginx \ ```
--reloadcmd "service apache2|nginx reload"
**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. Only the domain is required, all the other parameters are optional.
@@ -244,6 +254,8 @@ You don't have do anything manually!
7. PowerDNS API 7. PowerDNS API
8. lexicon dns api: https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-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.) (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... ##### More APIs are coming soon...

2541
acme.sh

File diff suppressed because it is too large Load Diff

28
deploy/myapi.sh Normal file
View File

@@ -0,0 +1,28 @@
#!/usr/bin/env sh
#Here is a sample custom api script.
#This file name is "myapi.sh"
#So, here must be a method myapi_deploy()
#Which will be called by acme.sh to deploy the cert
#returns 0 means success, otherwise error.
######## Public functions #####################
#domain keyfile certfile cafile fullchain
myapi_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"
_err "Not implemented yet"
return 1
}

View File

@@ -136,4 +136,41 @@ For more details, please check our sample script: [dns_myapi.sh](dns_myapi.sh)
https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api
## Use LuaDNS domain API
Get your API token at https://api.luadns.com/settings
```
export LUA_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export LUA_Email="xxxx@sss.com"
```
To issue a cert:
```
acme.sh --issue --dns dns_lua --dnssleep 3 -d example.com -d www.example.com
```
The `LUA_Key` and `LUA_Email` will be saved in `~/.acme.sh/account.conf`, and will be reused when needed.
## Use DNSMadeEasy domain API
Get your API credentials at https://cp.dnsmadeeasy.com/account/info
```
export ME_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export ME_Secret="qdfqsdfkjdskfj"
```
To issue a cert:
```
acme.sh --issue --dns dns_me --dnssleep 3 -d example.com -d www.example.com
```
The `ME_Key` and `ME_Secret` will be saved in `~/.acme.sh/account.conf`, and will be reused when needed.

View File

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

View File

@@ -6,10 +6,8 @@
# #
#CX_Secret="sADDsdasdgdsf" #CX_Secret="sADDsdasdgdsf"
CX_Api="https://www.cloudxns.net/api2" CX_Api="https://www.cloudxns.net/api2"
#REST_API #REST_API
######## Public functions ##################### ######## Public functions #####################
@@ -18,7 +16,7 @@ dns_cx_add() {
fulldomain=$1 fulldomain=$1
txtvalue=$2 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 "You don't specify cloudxns.com api key or secret yet."
_err "Please create you key and try again." _err "Please create you key and try again."
return 1 return 1
@@ -30,32 +28,37 @@ dns_cx_add() {
_saveaccountconf CX_Key "$CX_Key" _saveaccountconf CX_Key "$CX_Key"
_saveaccountconf CX_Secret "$CX_Secret" _saveaccountconf CX_Secret "$CX_Secret"
_debug "First detect the root zone" _debug "First detect the root zone"
if ! _get_root $fulldomain ; then if ! _get_root $fulldomain; then
_err "invalid domain" _err "invalid domain"
return 1 return 1
fi fi
existing_records $_domain $_sub_domain existing_records $_domain $_sub_domain
_debug count "$count" _debug count "$count"
if [ "$?" != "0" ] ; then if [ "$?" != "0" ]; then
_err "Error get existing records." _err "Error get existing records."
return 1 return 1
fi fi
if [ "$count" = "0" ] ; then if [ "$count" = "0" ]; then
add_record $_domain $_sub_domain $txtvalue add_record $_domain $_sub_domain $txtvalue
else else
update_record $_domain $_sub_domain $txtvalue update_record $_domain $_sub_domain $txtvalue
fi fi
if [ "$?" = "0" ] ; then if [ "$?" = "0" ]; then
return 0 return 0
fi fi
return 1 return 1
} }
#fulldomain
dns_cx_rm() {
fulldomain=$1
}
#usage: root sub #usage: root sub
#return if the sub record already exists. #return if the sub record already exists.
#echos the existing records count. #echos the existing records count.
@@ -65,17 +68,17 @@ existing_records() {
root=$1 root=$1
sub=$2 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 return 1
fi fi
count=0 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" _debug seg "$seg"
if [ -z "$seg" ] ; then if [ -z "$seg" ]; then
return 0 return 0
fi fi
if printf "$response" | grep '"type":"TXT"' > /dev/null ; then if printf "$response" | grep '"type":"TXT"' >/dev/null; then
count=1 count=1
record_id=$(printf "%s\n" "$seg" | _egrep_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" _debug record_id "$record_id"
@@ -111,16 +114,13 @@ update_record() {
_info "Updating record" _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 return 0
fi fi
return 1 return 1
} }
#################### Private functions bellow ################################## #################### Private functions bellow ##################################
#_acme-challenge.www.domain.com #_acme-challenge.www.domain.com
#returns #returns
@@ -132,24 +132,24 @@ _get_root() {
i=2 i=2
p=1 p=1
if ! _rest GET "domain" ; then if ! _rest GET "domain"; then
return 1 return 1
fi fi
while [ '1' ] ; do while [ '1' ]; do
h=$(printf $domain | cut -d . -f $i-100) h=$(printf $domain | cut -d . -f $i-100)
_debug h "$h" _debug h "$h"
if [ -z "$h" ] ; then if [ -z "$h" ]; then
#not valid #not valid
return 1; return 1
fi fi
if printf "$response" | grep "$h." >/dev/null ; then if printf "$response" | grep "$h." >/dev/null; then
seg=$(printf "%s" "$response" | _egrep_o "\{[^\{]*\"$h\.\"[^\}]*\}" ) seg=$(printf "%s" "$response" | _egrep_o "\{[^\{]*\"$h\.\"[^\}]*\}")
_debug seg "$seg" _debug seg "$seg"
_domain_id=$(printf "%s" "$seg" | _egrep_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" _debug _domain_id "$_domain_id"
if [ "$_domain_id" ] ; then if [ "$_domain_id" ]; then
_sub_domain=$(printf $domain | cut -d . -f 1-$p) _sub_domain=$(printf $domain | cut -d . -f 1-$p)
_debug _sub_domain $_sub_domain _debug _sub_domain $_sub_domain
_domain=$h _domain=$h
@@ -164,7 +164,6 @@ _get_root() {
return 1 return 1
} }
#Usage: method URI data #Usage: method URI data
_rest() { _rest() {
m=$1 m=$1
@@ -173,7 +172,7 @@ _rest() {
url="$REST_API/$ep" url="$REST_API/$ep"
_debug url "$url" _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" _debug cdate "$cdate"
data="$3" data="$3"
@@ -181,7 +180,7 @@ _rest() {
sec="$CX_Key$url$data$cdate$CX_Secret" sec="$CX_Key$url$data$cdate$CX_Secret"
_debug sec "$sec" _debug sec "$sec"
hmac=$(printf "$sec"| openssl md5 |cut -d " " -f 2) hmac=$(printf "$sec" | openssl md5 | cut -d " " -f 2)
_debug hmac "$hmac" _debug hmac "$hmac"
_H1="API-KEY: $CX_Key" _H1="API-KEY: $CX_Key"
@@ -189,21 +188,19 @@ _rest() {
_H3="API-HMAC: $hmac" _H3="API-HMAC: $hmac"
_H4="Content-Type: application/json" _H4="Content-Type: application/json"
if [ "$data" ] ; then if [ "$data" ]; then
response="$(_post "$data" "$url" "" $m)" response="$(_post "$data" "$url" "" $m)"
else else
response="$(_get "$url")" response="$(_get "$url")"
fi fi
if [ "$?" != "0" ] ; then if [ "$?" != "0" ]; then
_err "error $ep" _err "error $ep"
return 1 return 1
fi fi
_debug2 response "$response" _debug2 response "$response"
if ! printf "$response" | grep '"message":"success"' > /dev/null ; then if ! printf "$response" | grep '"message":"success"' >/dev/null; then
return 1 return 1
fi fi
return 0 return 0
} }

View File

@@ -6,10 +6,8 @@
# #
#DP_Key="sADDsdasdgdsf" #DP_Key="sADDsdasdgdsf"
DP_Api="https://dnsapi.cn" DP_Api="https://dnsapi.cn"
#REST_API #REST_API
######## Public functions ##################### ######## Public functions #####################
@@ -18,7 +16,7 @@ dns_dp_add() {
fulldomain=$1 fulldomain=$1
txtvalue=$2 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 "You don't specify dnspod api key and key id yet."
_err "Please create you key and try again." _err "Please create you key and try again."
return 1 return 1
@@ -30,27 +28,32 @@ dns_dp_add() {
_saveaccountconf DP_Id "$DP_Id" _saveaccountconf DP_Id "$DP_Id"
_saveaccountconf DP_Key "$DP_Key" _saveaccountconf DP_Key "$DP_Key"
_debug "First detect the root zone" _debug "First detect the root zone"
if ! _get_root $fulldomain ; then if ! _get_root $fulldomain; then
_err "invalid domain" _err "invalid domain"
return 1 return 1
fi fi
existing_records $_domain $_sub_domain existing_records $_domain $_sub_domain
_debug count "$count" _debug count "$count"
if [ "$?" != "0" ] ; then if [ "$?" != "0" ]; then
_err "Error get existing records." _err "Error get existing records."
return 1 return 1
fi fi
if [ "$count" = "0" ] ; then if [ "$count" = "0" ]; then
add_record $_domain $_sub_domain $txtvalue add_record $_domain $_sub_domain $txtvalue
else else
update_record $_domain $_sub_domain $txtvalue update_record $_domain $_sub_domain $txtvalue
fi fi
} }
#fulldomain
dns_dp_rm() {
fulldomain=$1
}
#usage: root sub #usage: root sub
#return if the sub record already exists. #return if the sub record already exists.
#echos the existing records count. #echos the existing records count.
@@ -61,15 +64,15 @@ existing_records() {
sub=$2 sub=$2
if ! _rest POST "Record.List" "login_token=$DP_Id,$DP_Key&domain_id=$_domain_id&sub_domain=$_sub_domain"; then 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 fi
if printf "$response" | grep 'No records' ; then if printf "$response" | grep 'No records'; then
count=0; count=0
return 0 return 0
fi 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) 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) record_id=$(printf "$response" | grep '^<id>' | tail -1 | cut -d '>' -f 2 | cut -d '<' -f 1)
return 0 return 0
@@ -78,7 +81,6 @@ existing_records() {
return 1 return 1
fi fi
count=0 count=0
} }
@@ -96,12 +98,11 @@ add_record() {
return 1 return 1
fi fi
if printf "$response" | grep "Action completed successful" ; then if printf "$response" | grep "Action completed successful"; then
return 0 return 0
fi fi
return 1 #error return 1 #error
} }
@@ -119,7 +120,7 @@ update_record() {
return 1 return 1
fi fi
if printf "$response" | grep "Action completed successful" ; then if printf "$response" | grep "Action completed successful"; then
return 0 return 0
fi fi
@@ -127,9 +128,6 @@ update_record() {
return 1 #error return 1 #error
} }
#################### Private functions bellow ################################## #################### Private functions bellow ##################################
#_acme-challenge.www.domain.com #_acme-challenge.www.domain.com
#returns #returns
@@ -140,21 +138,21 @@ _get_root() {
domain=$1 domain=$1
i=2 i=2
p=1 p=1
while [ '1' ] ; do while [ '1' ]; do
h=$(printf $domain | cut -d . -f $i-100) h=$(printf $domain | cut -d . -f $i-100)
if [ -z "$h" ] ; then if [ -z "$h" ]; then
#not valid #not valid
return 1; return 1
fi fi
if ! _rest POST "Domain.Info" "login_token=$DP_Id,$DP_Key&format=json&domain=$h"; then if ! _rest POST "Domain.Info" "login_token=$DP_Id,$DP_Key&format=json&domain=$h"; then
return 1 return 1
fi 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 \") _domain_id=$(printf "%s\n" "$response" | _egrep_o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \")
_debug _domain_id "$_domain_id" _debug _domain_id "$_domain_id"
if [ "$_domain_id" ] ; then if [ "$_domain_id" ]; then
_sub_domain=$(printf $domain | cut -d . -f 1-$p) _sub_domain=$(printf $domain | cut -d . -f 1-$p)
_debug _sub_domain $_sub_domain _debug _sub_domain $_sub_domain
_domain=$h _domain=$h
@@ -169,7 +167,6 @@ _get_root() {
return 1 return 1
} }
#Usage: method URI data #Usage: method URI data
_rest() { _rest() {
m=$1 m=$1
@@ -180,19 +177,17 @@ _rest() {
_debug url "$url" _debug url "$url"
if [ "$data" ] ; then if [ "$data" ]; then
_debug2 data "$data" _debug2 data "$data"
response="$(_post $data "$url")" response="$(_post $data "$url")"
else else
response="$(_get "$url")" response="$(_get "$url")"
fi fi
if [ "$?" != "0" ] ; then if [ "$?" != "0" ]; then
_err "error $ep" _err "error $ep"
return 1 return 1
fi fi
_debug2 response "$response" _debug2 response "$response"
return 0 return 0
} }

View File

@@ -6,17 +6,16 @@
# #
#GD_Secret="asdfsdfsfsdfsdfdfsdf" #GD_Secret="asdfsdfsfsdfsdfdfsdf"
GD_Api="https://api.godaddy.com/v1" GD_Api="https://api.godaddy.com/v1"
######## Public functions ##################### ######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs" #Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_gd_add(){ dns_gd_add() {
fulldomain=$1 fulldomain=$1
txtvalue=$2 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 "You don't specify godaddy api key and secret yet."
_err "Please create you key and try again." _err "Please create you key and try again."
return 1 return 1
@@ -27,7 +26,7 @@ dns_gd_add(){
_saveaccountconf GD_Secret "$GD_Secret" _saveaccountconf GD_Secret "$GD_Secret"
_debug "First detect the root zone" _debug "First detect the root zone"
if ! _get_root $fulldomain ; then if ! _get_root $fulldomain; then
_err "invalid domain" _err "invalid domain"
return 1 return 1
fi fi
@@ -35,10 +34,9 @@ dns_gd_add(){
_debug _sub_domain "$_sub_domain" _debug _sub_domain "$_sub_domain"
_debug _domain "$_domain" _debug _domain "$_domain"
_info "Adding record" _info "Adding record"
if _gd_rest PUT "domains/$_domain/records/TXT/$_sub_domain" "[{\"data\":\"$txtvalue\"}]"; then if _gd_rest PUT "domains/$_domain/records/TXT/$_sub_domain" "[{\"data\":\"$txtvalue\"}]"; then
if [ "$response" = "{}" ] ; then if [ "$response" = "{}" ]; then
_info "Added, sleeping 10 seconds" _info "Added, sleeping 10 seconds"
sleep 10 sleep 10
#todo: check if the record takes effect #todo: check if the record takes effect
@@ -53,9 +51,11 @@ dns_gd_add(){
} }
#fulldomain
dns_gd_rm() {
fulldomain=$1
}
#################### Private functions bellow ################################## #################### Private functions bellow ##################################
#_acme-challenge.www.domain.com #_acme-challenge.www.domain.com
@@ -67,18 +67,18 @@ _get_root() {
domain=$1 domain=$1
i=2 i=2
p=1 p=1
while [ '1' ] ; do while [ '1' ]; do
h=$(printf $domain | cut -d . -f $i-100) h=$(printf $domain | cut -d . -f $i-100)
if [ -z "$h" ] ; then if [ -z "$h" ]; then
#not valid #not valid
return 1;
fi
if ! _gd_rest GET "domains/$h" ; then
return 1 return 1
fi 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" _debug "$h not found"
else else
_sub_domain=$(printf $domain | cut -d . -f 1-$p) _sub_domain=$(printf $domain | cut -d . -f 1-$p)
@@ -100,19 +100,17 @@ _gd_rest() {
_H1="Authorization: sso-key $GD_Key:$GD_Secret" _H1="Authorization: sso-key $GD_Key:$GD_Secret"
_H2="Content-Type: application/json" _H2="Content-Type: application/json"
if [ "$data" ] ; then if [ "$data" ]; then
_debug data "$data" _debug data "$data"
response="$(_post "$data" "$GD_Api/$ep" "" $m)" response="$(_post "$data" "$GD_Api/$ep" "" $m)"
else else
response="$(_get "$GD_Api/$ep")" response="$(_get "$GD_Api/$ep")"
fi fi
if [ "$?" != "0" ] ; then if [ "$?" != "0" ]; then
_err "error $ep" _err "error $ep"
return 1 return 1
fi fi
_debug2 response "$response" _debug2 response "$response"
return 0 return 0
} }

View File

@@ -16,12 +16,12 @@ dns_lexicon_add() {
domain=$(printf "$fulldomain" | cut -d . -f 2-999) 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" _err "Please install $lexicon_cmd first: $wiki"
return 1 return 1
fi fi
if [ -z "$PROVIDER" ] ; then if [ -z "$PROVIDER" ]; then
_err "Please define env PROVIDER first: $wiki" _err "Please define env PROVIDER first: $wiki"
return 1 return 1
fi fi
@@ -29,34 +29,34 @@ dns_lexicon_add() {
_savedomainconf PROVIDER "$PROVIDER" _savedomainconf PROVIDER "$PROVIDER"
export 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" eval Lx_name_v="\$$Lx_name"
_debug "$Lx_name" "$Lx_name_v" _debug "$Lx_name" "$Lx_name_v"
if [ "$Lx_name_v" ] ; then if [ "$Lx_name_v" ]; then
_saveaccountconf $Lx_name "$Lx_name_v" _saveaccountconf $Lx_name "$Lx_name_v"
export "$Lx_name" export "$Lx_name"
fi 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" eval Lx_token_v="\$$Lx_token"
_debug "$Lx_token" "$Lx_token_v" _debug "$Lx_token" "$Lx_token_v"
if [ "$Lx_token_v" ] ; then if [ "$Lx_token_v" ]; then
_saveaccountconf $Lx_token "$Lx_token_v" _saveaccountconf $Lx_token "$Lx_token_v"
export "$Lx_token" export "$Lx_token"
fi 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" eval Lx_password_v="\$$Lx_password"
_debug "$Lx_password" "$Lx_password_v" _debug "$Lx_password" "$Lx_password_v"
if [ "$Lx_password_v" ] ; then if [ "$Lx_password_v" ]; then
_saveaccountconf $Lx_password "$Lx_password_v" _saveaccountconf $Lx_password "$Lx_password_v"
export "$Lx_password" export "$Lx_password"
fi 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" eval Lx_domaintoken_v="\$$Lx_domaintoken"
_debug "$Lx_domaintoken" "$Lx_domaintoken_v" _debug "$Lx_domaintoken" "$Lx_domaintoken_v"
if [ "$Lx_domaintoken_v" ] ; then if [ "$Lx_domaintoken_v" ]; then
export "$Lx_domaintoken" export "$Lx_domaintoken"
_saveaccountconf $Lx_domaintoken "$Lx_domaintoken_v" _saveaccountconf $Lx_domaintoken "$Lx_domaintoken_v"
fi fi
@@ -65,5 +65,8 @@ dns_lexicon_add() {
} }
#fulldomain
dns_lexicon_rm() {
fulldomain=$1
}

141
dnsapi/dns_lua.sh Executable file
View File

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

144
dnsapi/dns_me.sh Executable file
View File

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

View File

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

View File

@@ -1,6 +1,5 @@
#!/usr/bin/env sh #!/usr/bin/env sh
#Applcation Key #Applcation Key
#OVH_AK="sdfsdfsdfljlbjkljlkjsdfoiwje" #OVH_AK="sdfsdfsdfljlbjkljlkjsdfoiwje"
# #
@@ -10,10 +9,8 @@
#Consumer Key #Consumer Key
#OVH_CK="sdfsdfsdfsdfsdfdsf" #OVH_CK="sdfsdfsdfsdfsdfdsf"
#OVH_END_POINT=ovh-eu #OVH_END_POINT=ovh-eu
#'ovh-eu' #'ovh-eu'
OVH_EU='https://eu.api.ovh.com/1.0' OVH_EU='https://eu.api.ovh.com/1.0'
@@ -35,63 +32,60 @@ SYS_CA='https://ca.api.soyoustart.com/1.0'
#'runabove-ca' #'runabove-ca'
RAV_CA='https://api.runabove.com/1.0' RAV_CA='https://api.runabove.com/1.0'
wiki="https://github.com/Neilpang/acme.sh/wiki/How-to-use-OVH-domain-api" 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_success="https://github.com/Neilpang/acme.sh/wiki/OVH-Success"
_ovh_get_api() { _ovh_get_api() {
_ogaep="$1" _ogaep="$1"
case "${_ogaep}" in case "${_ogaep}" in
ovh-eu|ovheu) ovh-eu | ovheu)
printf "%s" $OVH_EU printf "%s" $OVH_EU
return return
;; ;;
ovh-ca|ovhca) ovh-ca | ovhca)
printf "%s" $OVH_CA printf "%s" $OVH_CA
return return
;; ;;
kimsufi-eu|kimsufieu) kimsufi-eu | kimsufieu)
printf "%s" $KSF_EU printf "%s" $KSF_EU
return return
;; ;;
kimsufi-ca|kimsufica) kimsufi-ca | kimsufica)
printf "%s" $KSF_CA printf "%s" $KSF_CA
return return
;; ;;
soyoustart-eu|soyoustarteu) soyoustart-eu | soyoustarteu)
printf "%s" $SYS_EU printf "%s" $SYS_EU
return return
;; ;;
soyoustart-ca|soyoustartca) soyoustart-ca | soyoustartca)
printf "%s" $SYS_CA printf "%s" $SYS_CA
return return
;; ;;
runabove-ca|runaboveca) runabove-ca | runaboveca)
printf "%s" $RAV_CA printf "%s" $RAV_CA
return return
;; ;;
*) *)
_err "Unknown parameter : $1"
return 1 _err "Unknown parameter : $1"
;; return 1
esac ;;
esac
} }
######## Public functions ##################### ######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs" #Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_ovh_add(){ dns_ovh_add() {
fulldomain=$1 fulldomain=$1
txtvalue=$2 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 "You don't specify OVH application key and application secret yet."
_err "Please create you key and try again." _err "Please create you key and try again."
return 1 return 1
@@ -101,41 +95,39 @@ dns_ovh_add(){
_saveaccountconf OVH_AK "$OVH_AK" _saveaccountconf OVH_AK "$OVH_AK"
_saveaccountconf OVH_AS "$OVH_AS" _saveaccountconf OVH_AS "$OVH_AS"
if [ -z "$OVH_END_POINT" ]; then
if [ -z "$OVH_END_POINT" ] ; then
OVH_END_POINT="ovh-eu" OVH_END_POINT="ovh-eu"
fi fi
_info "Using OVH endpoint: $OVH_END_POINT" _info "Using OVH endpoint: $OVH_END_POINT"
if [ "$OVH_END_POINT" != "ovh-eu" ] ; then if [ "$OVH_END_POINT" != "ovh-eu" ]; then
_saveaccountconf OVH_END_POINT "$OVH_END_POINT" _saveaccountconf OVH_END_POINT "$OVH_END_POINT"
fi fi
OVH_API="$(_ovh_get_api $OVH_END_POINT )" OVH_API="$(_ovh_get_api $OVH_END_POINT)"
_debug OVH_API "$OVH_API" _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:" _info "OVH consumer key is empty, Let's get one:"
if ! _ovh_authentication ; then if ! _ovh_authentication; then
_err "Can not get consumer key." _err "Can not get consumer key."
fi fi
#return and wait for retry. #return and wait for retry.
return 1; return 1
fi fi
_info "Checking authentication" _info "Checking authentication"
response="$(_ovh_rest GET "domain/")" 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 "The consumer key is invalid: $OVH_CK"
_err "Please retry to create a new one." _err "Please retry to create a new one."
_clearaccountconf OVH_CK _clearaccountconf OVH_CK
return 1 return 1
fi fi
_info "Consumer key is ok." _info "Consumer key is ok."
_debug "First detect the root zone" _debug "First detect the root zone"
if ! _get_root $fulldomain ; then if ! _get_root $fulldomain; then
_err "invalid domain" _err "invalid domain"
return 1 return 1
fi fi
@@ -146,10 +138,10 @@ dns_ovh_add(){
_debug "Getting txt records" _debug "Getting txt records"
_ovh_rest GET "domain/zone/$_domain/record?fieldType=TXT&subDomain=$_sub_domain" _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" _info "Adding record"
if _ovh_rest POST "domain/zone/$_domain/record" "{\"fieldType\":\"TXT\",\"subDomain\":\"$_sub_domain\",\"target\":\"$txtvalue\",\"ttl\":60}"; then if _ovh_rest POST "domain/zone/$_domain/record" "{\"fieldType\":\"TXT\",\"subDomain\":\"$_sub_domain\",\"target\":\"$txtvalue\",\"ttl\":60}"; then
if _contains "$response" "$txtvalue" ; then if _contains "$response" "$txtvalue"; then
_ovh_rest POST "domain/zone/$_domain/refresh" _ovh_rest POST "domain/zone/$_domain/refresh"
_debug "Refresh:$response" _debug "Refresh:$response"
_info "Added, sleeping 10 seconds" _info "Added, sleeping 10 seconds"
@@ -161,19 +153,19 @@ dns_ovh_add(){
else else
_info "Updating record" _info "Updating record"
record_id=$(printf "%s" "$response" | tr -d "[]" | cut -d , -f 1) 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." _err "Can not get record id."
return 1 return 1
fi fi
_debug "record_id" $record_id _debug "record_id" $record_id
if _ovh_rest PUT "domain/zone/$_domain/record/$record_id" "{\"target\":\"$txtvalue\",\"subDomain\":\"$_sub_domain\",\"ttl\":60}" ; then if _ovh_rest PUT "domain/zone/$_domain/record/$record_id" "{\"target\":\"$txtvalue\",\"subDomain\":\"$_sub_domain\",\"ttl\":60}"; then
if _contains "$response" "null" ; then if _contains "$response" "null"; then
_ovh_rest POST "domain/zone/$_domain/refresh" _ovh_rest POST "domain/zone/$_domain/refresh"
_debug "Refresh:$response" _debug "Refresh:$response"
_info "Updated, sleeping 10 seconds" _info "Updated, sleeping 10 seconds"
sleep 10 sleep 10
return 0; return 0
fi fi
fi fi
_err "Update error" _err "Update error"
@@ -182,6 +174,11 @@ dns_ovh_add(){
} }
#fulldomain
dns_ovh_rm() {
fulldomain=$1
}
#################### Private functions bellow ################################## #################### Private functions bellow ##################################
@@ -197,14 +194,14 @@ _ovh_authentication() {
response="$(_post "$_ovhdata" "$OVH_API/auth/credential")" response="$(_post "$_ovhdata" "$OVH_API/auth/credential")"
_debug3 response "$response" _debug3 response "$response"
validationUrl="$(echo "$response" | _egrep_o "validationUrl\":\"[^\"]*\"" | _egrep_o "http.*\"" | tr -d '"')" validationUrl="$(echo "$response" | _egrep_o "validationUrl\":\"[^\"]*\"" | _egrep_o "http.*\"" | tr -d '"')"
if [ -z "$validationUrl" ] ; then if [ -z "$validationUrl" ]; then
_err "Unable to get validationUrl" _err "Unable to get validationUrl"
return 1 return 1
fi fi
_debug validationUrl "$validationUrl" _debug validationUrl "$validationUrl"
consumerKey="$(echo "$response" | _egrep_o "consumerKey\":\"[^\"]*\"" | cut -d : -f 2 | tr -d '"')" 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" _err "Unable to get consumerKey"
return 1 return 1
fi fi
@@ -213,14 +210,13 @@ _ovh_authentication() {
OVH_CK="$consumerKey" OVH_CK="$consumerKey"
_saveaccountconf OVH_CK "$OVH_CK" _saveaccountconf OVH_CK "$OVH_CK"
_info "Please open this link to do authentication: $(__green "$validationUrl" )" _info "Please open this link to do authentication: $(__green "$validationUrl")"
_info "Here is a guide for you: $(__green "$wiki" )" _info "Here is a guide for you: $(__green "$wiki")"
_info "Please retry after the authentication is done." _info "Please retry after the authentication is done."
} }
#_acme-challenge.www.domain.com #_acme-challenge.www.domain.com
#returns #returns
# _sub_domain=_acme-challenge.www # _sub_domain=_acme-challenge.www
@@ -230,18 +226,18 @@ _get_root() {
domain=$1 domain=$1
i=2 i=2
p=1 p=1
while [ '1' ] ; do while [ '1' ]; do
h=$(printf $domain | cut -d . -f $i-100) h=$(printf $domain | cut -d . -f $i-100)
if [ -z "$h" ] ; then if [ -z "$h" ]; then
#not valid #not valid
return 1;
fi
if ! _ovh_rest GET "domain/zone/$h" ; then
return 1 return 1
fi 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) _sub_domain=$(printf $domain | cut -d . -f 1-$p)
_domain=$h _domain=$h
return 0 return 0
@@ -267,7 +263,6 @@ _ovh_rest() {
data="$3" data="$3"
_debug $ep _debug $ep
_ovh_url="$OVH_API/$ep" _ovh_url="$OVH_API/$ep"
_debug2 _ovh_url "$_ovh_url" _debug2 _ovh_url "$_ovh_url"
_ovh_t="$(_ovh_timestamp)" _ovh_t="$(_ovh_timestamp)"
@@ -277,26 +272,23 @@ _ovh_rest() {
_ovh_hex="$(printf "%s" "$_ovh_p" | _digest sha1 hex)" _ovh_hex="$(printf "%s" "$_ovh_p" | _digest sha1 hex)"
_debug2 _ovh_hex "$_ovh_hex" _debug2 _ovh_hex "$_ovh_hex"
_H1="X-Ovh-Application: $OVH_AK" _H1="X-Ovh-Application: $OVH_AK"
_H2="X-Ovh-Signature: \$1\$$_ovh_hex" _H2="X-Ovh-Signature: \$1\$$_ovh_hex"
_debug2 _H2 "$_H2" _debug2 _H2 "$_H2"
_H3="X-Ovh-Timestamp: $_ovh_t" _H3="X-Ovh-Timestamp: $_ovh_t"
_H4="X-Ovh-Consumer: $OVH_CK" _H4="X-Ovh-Consumer: $OVH_CK"
_H5="Content-Type: application/json;charset=utf-8" _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" _debug data "$data"
response="$(_post "$data" "$_ovh_url" "" $m)" response="$(_post "$data" "$_ovh_url" "" $m)"
else else
response="$(_get "$_ovh_url")" response="$(_get "$_ovh_url")"
fi fi
if [ "$?" != "0" ] ; then if [ "$?" != "0" ]; then
_err "error $ep" _err "error $ep"
return 1 return 1
fi fi
_debug2 response "$response" _debug2 response "$response"
return 0 return 0
} }

View File

@@ -16,25 +16,25 @@ dns_pdns_add() {
fulldomain=$1 fulldomain=$1
txtvalue=$2 txtvalue=$2
if [ -z "$PDNS_Url" ] ; then if [ -z "$PDNS_Url" ]; then
_err "You don't specify PowerDNS address." _err "You don't specify PowerDNS address."
_err "Please set PDNS_Url and try again." _err "Please set PDNS_Url and try again."
return 1 return 1
fi fi
if [ -z "$PDNS_ServerId" ] ; then if [ -z "$PDNS_ServerId" ]; then
_err "You don't specify PowerDNS server id." _err "You don't specify PowerDNS server id."
_err "Please set you PDNS_ServerId and try again." _err "Please set you PDNS_ServerId and try again."
return 1 return 1
fi fi
if [ -z "$PDNS_Token" ] ; then if [ -z "$PDNS_Token" ]; then
_err "You don't specify PowerDNS token." _err "You don't specify PowerDNS token."
_err "Please create you PDNS_Token and try again." _err "Please create you PDNS_Token and try again."
return 1 return 1
fi fi
if [ -z "$PDNS_Ttl" ] ; then if [ -z "$PDNS_Ttl" ]; then
PDNS_Ttl=$DEFAULT_PDNS_TTL PDNS_Ttl=$DEFAULT_PDNS_TTL
fi fi
@@ -43,35 +43,41 @@ dns_pdns_add() {
_saveaccountconf PDNS_ServerId "$PDNS_ServerId" _saveaccountconf PDNS_ServerId "$PDNS_ServerId"
_saveaccountconf PDNS_Token "$PDNS_Token" _saveaccountconf PDNS_Token "$PDNS_Token"
if [ "$PDNS_Ttl" != "$DEFAULT_PDNS_TTL" ] ; then if [ "$PDNS_Ttl" != "$DEFAULT_PDNS_TTL" ]; then
_saveaccountconf PDNS_Ttl "$PDNS_Ttl" _saveaccountconf PDNS_Ttl "$PDNS_Ttl"
fi fi
_debug "First detect the root zone" _debug "First detect the root zone"
if ! _get_root $fulldomain ; then if ! _get_root $fulldomain; then
_err "invalid domain" _err "invalid domain"
return 1 return 1
fi fi
_debug _domain "$_domain" _debug _domain "$_domain"
if ! set_record "$_domain" "$fulldomain" "$txtvalue" ; then if ! set_record "$_domain" "$fulldomain" "$txtvalue"; then
return 1 return 1
fi fi
return 0 return 0
} }
#fulldomain
dns_pdns_rm() {
fulldomain=$1
}
set_record() { set_record() {
_info "Adding record" _info "Adding record"
root=$1 root=$1
full=$2 full=$2
txtvalue=$3 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 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." _err "Set txt record error."
return 1 return 1
fi fi
if ! _pdns_rest "PUT" "/api/v1/servers/$PDNS_ServerId/zones/$root./notify" ; then if ! _pdns_rest "PUT" "/api/v1/servers/$PDNS_ServerId/zones/$root./notify"; then
_err "Notify servers error." _err "Notify servers error."
return 1 return 1
fi fi
@@ -87,17 +93,17 @@ _get_root() {
i=1 i=1
p=1 p=1
if _pdns_rest "GET" "/api/v1/servers/$PDNS_ServerId/zones" ; then if _pdns_rest "GET" "/api/v1/servers/$PDNS_ServerId/zones"; then
_zones_response=$response _zones_response=$response
fi fi
while [ '1' ] ; do while [ '1' ]; do
h=$(printf $domain | cut -d . -f $i-100) h=$(printf $domain | cut -d . -f $i-100)
if [ -z "$h" ] ; then if [ -z "$h" ]; then
return 1 return 1
fi fi
if printf "$_zones_response" | grep "\"name\": \"$h.\"" >/dev/null ; then if printf "$_zones_response" | grep "\"name\": \"$h.\"" >/dev/null; then
_domain=$h _domain=$h
return 0 return 0
fi fi
@@ -116,14 +122,14 @@ _pdns_rest() {
_H1="X-API-Key: $PDNS_Token" _H1="X-API-Key: $PDNS_Token"
if [ ! "$method" = "GET" ] ; then if [ ! "$method" = "GET" ]; then
_debug data "$data" _debug data "$data"
response="$(_post "$data" "$PDNS_Url$ep" "" "$method")" response="$(_post "$data" "$PDNS_Url$ep" "" "$method")"
else else
response="$(_get "$PDNS_Url$ep")" response="$(_get "$PDNS_Url$ep")"
fi fi
if [ "$?" != "0" ] ; then if [ "$?" != "0" ]; then
_err "error $ep" _err "error $ep"
return 1 return 1
fi fi