#!/usr/bin/env bash # Need to add your API key below or set as env variable apikey="$HOSTWAY_API_KEY" # This script adds a token to dynu.com DNS for the ACME challenge # usage dns_add_dynu "domain name" "token" # return codes are; # 0 - success # 1 - error in input # 2 - error within internal processing # 3 - error in result ( domain not found in dynu.com etc) fulldomain="${1}" token="${2}" API='https://api.hostway.com/dns' # Check initial parameters if [[ -z "$fulldomain" ]]; then echo "DNS script requires full domain name as first parameter" exit 1 fi if [[ -z "$token" ]]; then echo "DNS script requires challenge token as second parameter" exit 1 fi curl_params=( -H "accept: application/json" -H "Authorization: Basic $apikey" -H 'Content-Type: application/json charset=utf-8') # Get domain id # curl -X GET "https://api.hostway.com/dns/domain/" resp=$(curl --silent "${curl_params[@]}" -X GET "$API/${fulldomain}") # Match domain id re="\"serial\":\s?([^}]*)" if [[ "$resp" =~ $re ]]; then domain_id="${BASH_REMATCH[1]}" fi if [[ -z "$domain_id" ]]; then echo 'Domain name not found on your Hostway account' exit 3 fi # Check for existing _acme-challenge TXT record # curl -X GET "https://api.hostway.com/dns/domain/records?filterType=TXT&page=1&pageSize=100" resp=$(curl --silent "${curl_params[@]}" -X GET "$API/${fulldomain}/records?filterType=TXT") re="\"id\":\s?([^}]*)" if [[ "$resp" =~ $re ]]; then record_id="${BASH_REMATCH[1]}" fi if [[ -z "$record_id" ]]; then # Add new TXT challenge record # curl -X POST https://api.hostway.com/dns/{domain}/records/{record_id} -d "{\"name\":\"_acme-challenge.{domain}\",\"type\":\"TXT\",\"ttl\":\"300\",\"data\":\"Test2\"}" # Response is empty when successful echo "Adding record for ${fulldomain}" resp=$(curl --silent \ "${curl_params[@]}" \ -X POST "${API}/${fulldomain}/records" \ --data "{\"name\":\"_acme-challenge.${fulldomain}\",\"type\":\"TXT\",\"ttl\":\"300\",\"data\":\"$token\"}") else # Update existing record # curl -X PUT https://api.hostway.com/dns/{domain}/records/{record_id} -d "{\"name\":\"_acme-challenge.{domain}\", \"data\":\"Test2\"}" echo "Updating record for ${fulldomain}" resp=$(curl --silent \ "${curl_params[@]}" \ -X PUT "${API}/${fulldomain}/records/${record_id}" \ --data "{\"name\":\"_acme-challenge.${fulldomain}\", \"data\":\"$token\"}") fi # Check if response data matches token re="\"data\":\s?\"([^,]*)\"" if [[ "$resp" =~ $re ]]; then if [[ ${BASH_REMATCH[1]} == "$token" ]]; then token_match="$token ${BASH_REMATCH[1]}" fi fi # If adding record failed (exception:) then print error message if [[ -z "$token_match" && "$resp" != "" ]]; then echo "Error: DNS challenge not added: unknown error - ${resp}" exit 3 else echo "Record added successfully for ${fulldomain}" fi