Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for MyDevil.net #2076

Merged
merged 20 commits into from
Feb 20, 2019
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
f62a4a0
Merge pull request #2056 from Neilpang/dev
Jan 25, 2019
9dac02b
Merge pull request #2063 from Neilpang/dev
Jan 27, 2019
7c41dd5
Merge pull request #2064 from Neilpang/dev
Jan 28, 2019
55e862a
Merge pull request #2068 from Neilpang/dev
Jan 30, 2019
b07ef22
feat: add support for MyDevil.net
ahwayakchih Feb 3, 2019
eea3a3c
docs: update MyDEvil.net interlinks
ahwayakchih Feb 3, 2019
1983913
docs: some more info about handling changing IP (just in case) on MyD…
ahwayakchih Feb 3, 2019
3bb7022
style: restyle MyDevil.net scripts to pass ShellCheck.net validation
ahwayakchih Feb 3, 2019
84a1e18
style: fix style errors reported by shfmt
ahwayakchih Feb 3, 2019
b2cb73c
style: fix 2 more errors reported by shfmt
ahwayakchih Feb 3, 2019
3fa6fb5
fix: do not use `local` keyword as requested by @Neilpang
ahwayakchih Feb 11, 2019
e5475b7
fix: check if `devil` command exists, as requested by @Neilpang
ahwayakchih Feb 11, 2019
b616a0d
Merge upstream dev
ahwayakchih Feb 16, 2019
6c9bbc7
style: fix
ahwayakchih Feb 16, 2019
f1b6782
fix: use `cut` and `tail` instead of `awk`
ahwayakchih Feb 17, 2019
19042f6
fix: do not depend on `_acme-challenge` prefix
ahwayakchih Feb 17, 2019
db536fe
docs: rewrite info about installation/setup of acme.sh on MyDevil.net
ahwayakchih Feb 17, 2019
f106bef
fix: change shebang as requested by @Neilpang
ahwayakchih Feb 18, 2019
00f1b57
Merge branch 'dev' of https://github.com/Neilpang/acme.sh into feat/m…
ahwayakchih Feb 18, 2019
78750a3
docs: update comment in MyDevil.net deploy and dns scripts
ahwayakchih Feb 18, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,7 @@ You don't have to do anything manually!
1. PointDNS API (https://pointhq.com/)
1. Active24.cz API (https://www.active24.cz/)
1. do.de API (https://www.do.de/)
1. MyDevil.net (https://www.mydevil.net/)

And:

Expand Down
10 changes: 10 additions & 0 deletions deploy/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -381,3 +381,13 @@ you want to update:
$ export QINIU_CDN_DOMAIN="cdn.example.com"
$ acme.sh --deploy -d example.com --deploy-hook qiniu
```

## 14. Deploy your cert on MyDevil.net

Once you have acme.sh installed and certificate issued (see info in [DNS API](../dnsapi/README.md#61-use-mydevilnet)), you can install it by following command:

```sh
acme.sh --deploy --deploy-hook mydevil -d example.com
```

That will remove old certificate and install new one.
56 changes: 56 additions & 0 deletions deploy/mydevil.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
#!/bin/bash
ahwayakchih marked this conversation as resolved.
Show resolved Hide resolved

# MyDevil.net API (2019-02-03)
#
# MyDevil.net already supports automatic Let's Encrypt certificates,
# except for wildcard domains.
#
# This script depends on `devil dns` that MyDevil.net provides,
# which means that it works only on server side.
#
# Author: Marcin Konicki <https://ahwayakchih.neoni.net>
#
######## Public functions #####################

# Usage: mydevil_deploy domain keyfile certfile cafile fullchain
mydevil_deploy() {
local _cdomain="$1"
local _ckey="$2"
local _ccert="$3"
local _cca="$4"
local _cfullchain="$5"
local ip=""

_debug _cdomain "$_cdomain"
_debug _ckey "$_ckey"
_debug _ccert "$_ccert"
_debug _cca "$_cca"
_debug _cfullchain "$_cfullchain"

ip=$(mydevil_get_ip "$_cdomain")
if [ -z "$ip" ]; then
_err "Could not find IP for domain $_cdomain."
return 1
fi

# Delete old certificate first
_info "Removing old certificate for $_cdomain at $ip"
devil ssl www del "$ip" "$_cdomain"

# Add new certificate
_info "Adding new certificate for $_cdomain at $ip"
devil ssl www add "$ip" "$_cfullchain" "$_ckey" "$_cdomain" || return 1

return 0
}

#################### Private functions below ##################################

# Usage: ip=$(mydevil_get_ip domain.com)
# echo $ip
mydevil_get_ip() {
local domain=$1

devil dns list "$domain" | awk '{print $3"\t"$7}' | grep "^A$(printf '\t')" | awk '{print $2}' || return 1
return 0
}
26 changes: 26 additions & 0 deletions dnsapi/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1172,6 +1172,32 @@ acme.sh --issue --dns dns_doapi -d example.com -d *.example.com

The API token will be saved in `~/.acme.sh/account.conf` and will be reused when needed.

## 61. Use MyDevil.net

Make sure that you can execute own binaries:

```sh
devil binexec on
```

Install acme.sh somewhere on your mydevil host account, probably in your home directory.
Once it is installed, add it to your `~/bin` directory (and make sure it exists first):

```sh
mkdir ~/bin
ln -s /path/to/installed/directory/of/.acme.sh/acme.sh ~/bin/acme.sh
ahwayakchih marked this conversation as resolved.
Show resolved Hide resolved
```

If you're not using private IP and depend on default IP provided by host, you may want to edit `crontab` too, and make sure that `acme.sh --cron` is run also after reboot (you can find out how to do that on their wiki pages).

To issue a new certificate, run:

```sh
acme.sh --issue --dns dns_mydevil -d example.com -d *.example.com
```

After certificate is ready, you can install it with [deploy command](../deploy/README.md#14-deploy-your-cert-on-mydevilnet).

# Use custom API

If your API is not supported yet, you can write your own DNS API.
Expand Down
100 changes: 100 additions & 0 deletions dnsapi/dns_mydevil.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
#!/bin/bash
ahwayakchih marked this conversation as resolved.
Show resolved Hide resolved

# MyDevil.net API (2019-02-03)
#
# MyDevil.net already supports automatic Let's Encrypt certificates,
# except for wildcard domains.
#
# This script depends on `devil dns` that MyDevil.net provides,
# which means that it works only on server side.
#
# Author: Marcin Konicki <https://ahwayakchih.neoni.net>
#
######## Public functions #####################

#Usage: dns_mydevil_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_mydevil_add() {
ahwayakchih marked this conversation as resolved.
Show resolved Hide resolved
local fulldomain=$1
ahwayakchih marked this conversation as resolved.
Show resolved Hide resolved
local txtvalue=$2
local domain=""

_info "Using mydevil"
ahwayakchih marked this conversation as resolved.
Show resolved Hide resolved

domain=$(mydevil_get_domain "$fulldomain")
if ! mydevil_check_record "$fulldomain"; then
_err "Invalid record name: does not start with '_acme-challenge'."
return 1
fi

if [ -z "$domain" ]; then
_err "Invalid domain name: could not find root domain of $fulldomain."
return 1
fi

_info "Adding $fulldomain record for domain $domain"
if devil dns add "$domain" "$fulldomain" TXT "$txtvalue"; then
_info "Successfully added TXT record, ready for validation."
return 0
else
_err "Unable to add DNS record."
return 1
fi
}

#Usage: fulldomain txtvalue
#Remove the txt record after validation.
dns_mydevil_rm() {
local fulldomain=$1
local txtvalue=$2
local domain=""

_info "Using mydevil"

domain=$(mydevil_get_domain "$fulldomain")
if ! mydevil_check_record "$fulldomain"; then
_err "Invalid record name: does not start with '_acme-challenge'."
return 1
fi

if [ -z "$domain" ]; then
_err "Invalid domain name: could not find root domain of $fulldomain."
return 1
fi

for id in $(devil dns list "$domain" | grep "$fulldomain" | awk '{print $1}'); do
_info "Removing record $id from domain $domain"
devil dns del "$domain" "$id" || _err "Could not remove DNS record."
done
}

#################### Private functions below ##################################

# Usage: mydevil_check_record "_acme-challenge.www.domain.com" || _err "Invalid record name"
mydevil_check_record() {
local record=$1
ahwayakchih marked this conversation as resolved.
Show resolved Hide resolved

case "$record" in
"_acme-challenge."*)
return 0
;;
*)
return 1
;;
esac
}

# Usage: domain=$(mydevil_get_domain "_acme-challenge.www.domain.com" || _err "Invalid domain name")
# echo $domain
mydevil_get_domain() {
local fulldomain=$1
local domain=""

for domain in $(devil dns list | grep . | awk '{if(NR>1)print $1}'); do
ahwayakchih marked this conversation as resolved.
Show resolved Hide resolved
if _endswith "$fulldomain" "$domain"; then
printf -- "%s" "$domain"
return 0
fi
done

return 1
}