From be4ef7c80358d72efb4b55bcc7344cde33454d81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Bud=C3=ADn?= Date: Sat, 23 Jun 2018 18:25:15 +0200 Subject: [PATCH] Added DNS plugin for WEDOS.com --- README.md | 1 + dnsapi/README.md | 15 ++++ dnsapi/dns_wedos.sh | 198 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 214 insertions(+) create mode 100644 dnsapi/dns_wedos.sh diff --git a/README.md b/README.md index f395e49a..3c76a44b 100644 --- a/README.md +++ b/README.md @@ -320,6 +320,7 @@ You don't have to do anything manually! 1. Loopia.se API 1. acme-dns (https://github.com/joohoi/acme-dns) 1. TELE3 (https://www.tele3.cz) +1. WEDOS WAPI (https://hosting.wedos.com/en/) And: diff --git a/dnsapi/README.md b/dnsapi/README.md index ef6c9d09..09ef7c2d 100644 --- a/dnsapi/README.md +++ b/dnsapi/README.md @@ -876,6 +876,21 @@ acme.sh --issue --dns dns_tele3 -d example.com -d *.example.com ``` The TELE3_Key and TELE3_Secret will be saved in ~/.acme.sh/account.conf and will be reused when needed. +## 47. Use WEDOS WAPI + +First you need login to WEDOS customer administration to set your WAPI password and allowed IP addresses. +https://client.wedos.com/client/wapi.html + +``` +export WEDOS_Email="customer@example.com" +export WEDOS_ApiPassword="1l+C+}mcFT0c38" + +acme.sh --issue --dns dns_wedos --dnssleep 1800 -d example.com -d *.example.com +``` + +The `WEDOS_Email` and `WEDOS_ApiPassword` will be saved in `~/.acme.sh/account.conf` and will be reused when needed. + +**Notice:** Verifying a single domain (creating and deleting a record) generates 7 requests to WAPI. The limit is 1000 requests per hour. # Use custom API If your API is not supported yet, you can write your own DNS API. diff --git a/dnsapi/dns_wedos.sh b/dnsapi/dns_wedos.sh new file mode 100644 index 00000000..c003d672 --- /dev/null +++ b/dnsapi/dns_wedos.sh @@ -0,0 +1,198 @@ +#!/usr/bin/env sh +# +# WEDOS DNS WAPI +# https://hosting.wedos.com/en/ +# +# Author: Ondřej Budín +# Report Bugs here: https://github.com/obud/acme.sh +# +# -- +# export WEDOS_Email="customer@example.com" +# export WEDOS_ApiPassword="1l+C+}mcFT0c38" +# -- + +WEDOS_URL="https://api.wedos.com/wapi/json" +WEDOS_PREFIX="WEDOS WAPI:" + + +################################## +# Private functions # +################################## + +_wedos_init() { + WEDOS_Email="${WEDOS_Email:-$(_readaccountconf_mutable WEDOS_Email)}" + WEDOS_ApiPassword="${WEDOS_ApiPassword:-$(_readaccountconf_mutable WEDOS_ApiPassword)}" + if [ -z "$WEDOS_Email" ] || [ -z "$WEDOS_ApiPassword" ]; then + WEDOS_Email="" + WEDOS_ApiPassword="" + _err "You must export variables: WEDOS_Email and WEDOS_ApiPassword" + return 1 + fi + _saveaccountconf_mutable WEDOS_Email "$WEDOS_Email" + _saveaccountconf_mutable WEDOS_ApiPassword "$WEDOS_ApiPassword" +} + +_wedos_call() { + WEDOS_Auth="$(printf "%s" "$WEDOS_ApiPassword" | _digest sha1 hex)" + WEDOS_Auth="$(printf "%s" "$WEDOS_Email$WEDOS_Auth$(date --date="TZ=\"Europe/Prague\" today" "+%H")" | _digest sha1 hex)" + data="request={\"request\":{\"user\":\"$WEDOS_Email\",\"auth\":\"$WEDOS_Auth\",\"command\":\"$1\",\"clTRID\":\"acme.sh - WEDOS WAPI\",\"data\":$data}}" + _debug data "$data" + response="$(_post "$data" "$WEDOS_URL" "" "POST")" + _debug response "$response" + code=$(printf "%s" "$response" | cut -c 21-24) + if [ "$code" = "2006" ]; then + _err "$WEDOS_PREFIX API ERROR. Requests limit exceeded." + return 1 + fi + if [ "$code" = "2050" ]; then + _err "$WEDOS_PREFIX API ERROR. Authentication failure." + return 1 + fi + if [ "$code" = "2051" ]; then + _err "$WEDOS_PREFIX API ERROR. Access not allowed from this IP address." + return 1 + fi + if [ "$code" = "2052" ]; then + _err "$WEDOS_PREFIX API ERROR. IP address temporarily blocked due to too many failed requests." + return 1 + fi + if [ "$code" = "2310" ]; then + _err "$WEDOS_PREFIX API ERROR. DNS domain - rows count limit reached. Please contact WEDOS customer support to increase limit." + return 1 + fi + if [ "$code" != "1000" ]; then + _err "$WEDOS_PREFIX API ERROR." + _info "" + _err "RESPONSE: $response" + return 1 + fi +} + +_wedos_get_root() { + _info "$WEDOS_PREFIX Searching root zone..." + data="[]" + if ! _wedos_call "dns-domains-list"; then + return 1 + fi + + domain=$1 + i=2 + p=1 + while true; do + candidate=$(printf "%s" "$domain" | cut -d . -f "$i-100") + _debug candidate "$candidate" + + if [ -z "$candidate" ]; then + _err "$WEDOS_PREFIX ERROR. Root zone not found." + return 1 + fi + + if _contains "$response" "\"name\":\"$candidate\"" >/dev/null && _contains "$response" "\"status\":\"active\"" >/dev/null; then + _domain="$candidate" + _sub_domain=$(printf "%s" "$domain" | cut -d . -f "1-$p") + _info "$WEDOS_PREFIX OK." + _debug _domain "$_domain" + _debug _sub_domain "$_sub_domain" + return 0 + fi + p="$i" + i=$(_math "$i" + 1) + done + return 1 +} + +_wedos_get_record_id() { + _info "$WEDOS_PREFIX Searching DNS record..." + domain=$1 + sub_domain=$2 + r_data=$3 + + data="{\"domain\":\"$domain\"}" + if ! _wedos_call "dns-rows-list"; then + return 1 + fi + + if _contains "$response" "\"name\":\"$sub_domain\"" >/dev/null; then + i=1 + while true; do + row=$(printf "%s" "$response" | cut -d "}" -f "$i") + _debug row "$row" + + if [ -z "$row" ]; then + _err "$WEDOS_PREFIX ERROR." + return 1 + fi + + if _contains "$row" "\"name\":\"$sub_domain\"" >/dev/null && _contains "$row" "\"rdata\":\"$r_data\"" >/dev/null; then + _record_id=$(printf "%s" "$row" | _egrep_o "\[*\"ID\":\"[^\"]*\"" | head -n 1 | cut -d : -f 2 | tr -d \") + if [ "$_record_id" ]; then + _info "$WEDOS_PREFIX OK." + return 0 + fi + _err "$WEDOS_PREFIX ERROR." + return 1 + fi + i=$(_math "$i" + 1) + done + fi + _err "$WEDOS_PREFIX ERROR. Record not found." + return 1 +} + +_wedos_commit() { + _info "$WEDOS_PREFIX Committing changes..." + data="{\"name\":\"$1\"}" + if ! _wedos_call "dns-domain-commit"; then + return 1 + fi + _info "$WEDOS_PREFIX OK." +} + + + +################################## +# Public functions # +################################## + +dns_wedos_add() { + if ! _wedos_init; then + return 1 + fi + _info "$WEDOS_PREFIX $1" + if ! _wedos_get_root "$1"; then + return 1 + fi + _info "$WEDOS_PREFIX Adding record..." + data="{\"domain\":\"$_domain\",\"name\":\"$_sub_domain\",\"ttl\":300,\"type\":\"TXT\",\"rdata\":\"$2\"}" + if ! _wedos_call "dns-row-add"; then + return 1 + fi + _info "$WEDOS_PREFIX OK." + if ! _wedos_commit "$_domain"; then + return 1 + fi +} + +dns_wedos_rm() { + if ! _wedos_init; then + return 1 + fi + _info "$WEDOS_PREFIX $1" + if ! _wedos_get_root "$1"; then + return 1 + fi + if ! _wedos_get_record_id "$_domain" "$_sub_domain" "$2"; then + return 1 + fi + + _info "$WEDOS_PREFIX Removing record..." + data="{\"domain\":\"$_domain\",\"row_id\":\"$_record_id\"}" + if ! _wedos_call "dns-row-delete"; then + return 1 + fi + _info "$WEDOS_PREFIX OK." + + if ! _wedos_commit "$_domain"; then + return 1 + fi +} \ No newline at end of file