Browse Source

add versio API (dns_versio.sh)

fixed issues shellcheck.net

fix style

add Versio to README.md and ./dnsapi/README.md

fix dns remove
pull/1800/head
lebaned 7 years ago
parent
commit
2fd1297830
  1. 1
      README.md
  2. 13
      dnsapi/README.md
  3. 211
      dnsapi/dns_versio.sh

1
README.md

@ -321,6 +321,7 @@ You don't have to do anything manually!
1. acme-dns (https://github.com/joohoi/acme-dns) 1. acme-dns (https://github.com/joohoi/acme-dns)
1. TELE3 (https://www.tele3.cz) 1. TELE3 (https://www.tele3.cz)
1. EUSERV.EU (https://www.euserv.eu) 1. EUSERV.EU (https://www.euserv.eu)
1. Versio (https://versio.nl)
And: And:

13
dnsapi/README.md

@ -897,6 +897,19 @@ acme.sh --issue --dns dns_euserv -d example.com -d *.example.com --insecure
The `EUSERV_Username` and `EUSERV_Password` will be saved in `~/.acme.sh/account.conf` and will be reused when needed. The `EUSERV_Username` and `EUSERV_Password` will be saved in `~/.acme.sh/account.conf` and will be reused when needed.
Please report any issues to https://github.com/initit/acme.sh or to <github@initit.de> Please report any issues to https://github.com/initit/acme.sh or to <github@initit.de>
## 48. Use Versio.nl API
First you've to add your ip address to the whitelist in your Versio portal. (Account > Versio API)
Then set your credentials:
```
export Versio_Username=[email address]
export Versio_Password=[password]
```
Now you can issue your cert:
```
acme.sh --issue --dns versio -d example.com -d *.example.com
```
# Use custom API # Use custom API
If your API is not supported yet, you can write your own DNS API. If your API is not supported yet, you can write your own DNS API.

211
dnsapi/dns_versio.sh

@ -0,0 +1,211 @@
#!/usr/bin/env sh
#
# DNS API for Versio.nl
# Author: lebaned <github@bakker.cloud>
# Report Bugs here: https://github.com/lebaned/acme.sh
#
######## Public functions #####################
#Usage: dns_versio_add _acme-challenge.www.domain.com "[txtvalue]"
dns_versio_add() {
fulldomain=$1
txtvalue=$2
_info "Using Versio"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
if ! _get_credentials; then
return 1
fi
#save the credentials to the account conf file.
_saveaccountconf_mutable Versio_Username "$Versio_Username"
_saveaccountconf_mutable Versio_Password "$Versio_Password"
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "invalid domain"
return 1
fi
_info fulldomain "$fulldomain"
_info _domain "$_domain"
_info _sub_domain "$_sub_domain"
if ! _get_dns_records "$_domain"; then
_err "invalid domain"
return 1
fi
_debug "orginal dnsrecords" "$_dns_records"
_delete_dns_record "TXT" "$fulldomain."
_debug "dnsrecords after deleted old record" "$_dns_records"
_add_dns_record "TXT" "$fulldomain" "\\\"$txtvalue\\\"" 0 300
_debug "dnsrecords after add record" "{\"dns_records\":[$_dns_records]}"
if _versio_rest POST "domains/$_domain/update" "{\"dns_records\":[$_dns_records]}"; then
_debug "rest update response" "$response"
return 0
fi
_err "Error!"
return 1
}
#Usage: fulldomain txtvalue
#Remove the txt record after validation.
dns_versio_rm() {
fulldomain=$1
txtvalue=$2
_info "Using Versio"
_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"
if ! _get_credentials; then
return 1
fi
_debug "First detect the root zone"
if ! _get_root "$fulldomain"; then
_err "invalid domain"
return 1
fi
_debug fulldomain "$fulldomain"
_debug _domain "$_domain"
_debug _sub_domain "$_sub_domain"
if ! _get_dns_records "$_domain"; then
_err "invalid domain"
return 1
fi
_debug "orginal dnsrecords" "$_dns_records"
_delete_dns_record "TXT" "$fulldomain."
_debug "dnsrecords after deleted old record" "$_dns_records"
if _versio_rest POST "domains/$_domain/update" "{\"dns_records\":[$_dns_records]}"; then
_debug "rest update response" "$response"
return 0
fi
_err "Error!"
return 1
}
#################### Private functions below ##################################
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
_get_root() {
domain=$1
i=2
p=1
if _versio_rest GET "domains?status=OK"; then
response="$(echo "$response" | tr -d "\n" | sed 's/{/\n&/g')"
while true; do
h=$(printf "%s" "$domain" | cut -d . -f $i-100)
_info h "$h"
_debug h "$h"
if [ -z "$h" ]; then
#not valid
return 1
fi
hostedzone="$(echo "$response" | _egrep_o "{.*\"domain\":\s*\"$h\".*}")"
if [ "$hostedzone" ]; then
_sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
_domain=$h
return 0
fi
p=$i
i=$(_math "$i" + 1)
done
fi
return 1
}
#parameters: [record type] [record name]
_delete_dns_record() {
_dns_records=$(echo "$_dns_records" | sed 's/{"type":"'"$1"'","name":"'"$2"'"[^}]*}[,]\?//' | sed 's/,$//')
}
#parameters: [type] [name] [value] [prio] [ttl]
_add_dns_record() {
_dns_records="$_dns_records,{\"type\":\"$1\",\"name\":\"$2\",\"value\":\"$3\",\"prio\":$4,\"ttl\":$5}"
}
#parameters: [root domain]
#returns
# _dns_records
_get_dns_records() {
if _versio_rest GET "domains/$1?show_dns_records=true"; then
_dns_records=$(echo "$response" | grep -oP '(?<="dns_records":\[)[^\]]*')
return 0
fi
return 1
}
#method uri qstr data
_versio_rest() {
mtd="$1"
ep="$2"
data="$3"
_debug mtd "$mtd"
_debug ep "$ep"
VERSIO_API_URL="https://www.versio.nl/api/v1"
VERSIO_CREDENTIALS_BASE64=$(printf "%s:%s" "$Versio_Username" "$Versio_Password" | openssl enc -base64)
export _H1="Accept: application/json"
export _H2="Content-Type: application/json"
export _H3="Authorization: Basic $VERSIO_CREDENTIALS_BASE64"
if [ "$mtd" != "GET" ]; then
# both POST and DELETE.
_debug data "$data"
response="$(_post "$data" "$VERSIO_API_URL/$ep" "" "$mtd")"
else
response="$(_get "$VERSIO_API_URL/$ep")"
fi
case $? in
0)
_debug response "$response"
return 0
;;
6)
_err "Authentication failure. Check your Versio email address and password"
return 1
;;
*)
_err "Unknown error"
return 1
;;
esac
}
#parameters: []
#returns:
# Versio_Username
# Versio_Password
_get_credentials() {
Versio_Username="${Versio_Username:-$(_readaccountconf_mutable Versio_Username)}"
Versio_Password="${Versio_Password:-$(_readaccountconf_mutable Versio_Password)}"
if [ -z "$Versio_Username" ] || [ -z "$Versio_Password" ]; then
Versio_Username=""
Versio_Password=""
_err "You don't specify Versio email address and/or password yet."
_err "Example:"
_err "export Versio_Username=[email address]"
_err "export Versio_Password=[password]"
return 1
fi
return 0
}
Loading…
Cancel
Save