#!/usr/bin/env sh # shellcheck disable=SC2034 # Credits to the authors of dnsapi/dns_pdns.sh as this reuses much of that code. dns_poweradmin_info='Poweradmin API Site: https://www.poweradmin.org/ Docs: https://github.com/acmesh-official/acme.sh/wiki/dnsapi2#dns_poweradmin Options: POWERADMIN_URL API URL (with scheme). E.g. "https://poweradmin.example.com" or "http://192.168.0.10:8080" POWERADMIN_API_KEY API Token "pwa_xxxx" POWERADMIN_API_VERSION Optionally override Poweradmin API version. Issues: https://github.com/acmesh-official/acme.sh/issues/6912 Author: Jakob Næss ' ######## Public functions #################### # Usage: dns_poweradmin_add _acme-challenge.www.domain.com "123456789ABCDEF" # fulldomain # txtvalue dns_poweradmin_add() { fulldomain=$1 txtvalue=$2 POWERADMIN_URL="${POWERADMIN_URL:-$(_readaccountconf_mutable POWERADMIN_URL)}" POWERADMIN_API_KEY="${POWERADMIN_API_KEY:-$(_readaccountconf_mutable POWERADMIN_API_KEY)}" POWERADMIN_API_VERSION="${POWERADMIN_API_VERSION:-$(_readaccountconf_mutable POWERADMIN_API_VERSION)}" POWERADMIN_API_VERSION="${POWERADMIN_API_VERSION:-2}" if [ -z "$POWERADMIN_URL" ]; then POWERADMIN_URL="" _err "You didn't specify Poweradmin URL." _err "Please set POWERADMIN_URL and try again." return 1 fi if [ -z "$POWERADMIN_API_KEY" ]; then POWERADMIN_API_KEY="" _err "You didn't specify Poweradmin token." _err "Please set POWERADMIN_API_KEY and try again." return 1 fi # Save the api addr, key, and version to the account conf file. _saveaccountconf_mutable POWERADMIN_URL "$POWERADMIN_URL" _saveaccountconf_mutable POWERADMIN_API_KEY "$POWERADMIN_API_KEY" _saveaccountconf_mutable POWERADMIN_API_VERSION "$POWERADMIN_API_VERSION" _debug "Detect root zone" if ! _get_root "$fulldomain"; then _err "invalid domain" return 1 fi _debug _domain "$_domain" _debug _zone_id "$_zone_id" if ! _set_record "$fulldomain" "$txtvalue"; then return 1 fi return 0 } # Usage: dns_poweradmin_rm _acme-challenge.www.domain.com "123456789ABCDEF" # fulldomain # txtvalue dns_poweradmin_rm() { fulldomain=$1 txtvalue=$2 POWERADMIN_URL="${POWERADMIN_URL:-$(_readaccountconf_mutable POWERADMIN_URL)}" POWERADMIN_API_KEY="${POWERADMIN_API_KEY:-$(_readaccountconf_mutable POWERADMIN_API_KEY)}" POWERADMIN_API_VERSION="${POWERADMIN_API_VERSION:-$(_readaccountconf_mutable POWERADMIN_API_VERSION)}" POWERADMIN_API_VERSION="${POWERADMIN_API_VERSION:-2}" _debug "Detect root zone" if ! _get_root "$fulldomain"; then _err "invalid domain" return 1 fi _debug _domain "$_domain" _debug _zone_id "$_zone_id" if ! _rm_record "$fulldomain" "$txtvalue"; then return 1 fi return 0 } ######## Private functions below ##################### _set_record() { _info "Adding TXT record" full=$1 new_challenge=$2 data='{"name":"'$full'","type":"TXT","content":"'$new_challenge'","ttl":60}' if ! _poweradmin_rest "POST" "/api/v${POWERADMIN_API_VERSION}/zones/$_zone_id/records" "$data" "application/json"; then _err "Failed to add TXT record" return 1 fi return 0 } _rm_record() { _info "Remove TXT record" full=$1 txtvalue=$2 if ! _poweradmin_rest "GET" "/api/v${POWERADMIN_API_VERSION}/zones/$_zone_id/records?type=TXT"; then _err "Failed to retrieve records" return 1 fi # The API returns: {"success":true,"data":{"records":[{"id":..., "name":"...", "type":"TXT", "content":"...", ...}]},"message":"..."} _records="$(printf '%s\n' "$response" | tr -d '\r\n' | _egrep_o '\{[^{}]*\}')" _txt_record_obj="" while IFS= read -r _rec || [ -n "$_rec" ]; do case "$_rec" in *"\"name\":\"$full\""*) ;; *) continue ;; esac case "$_rec" in *"\"type\":\"TXT\""*) ;; *) continue ;; esac case "$_rec" in *"\"content\":\"$txtvalue\""*) _txt_record_obj="$_rec" break ;; esac done <