Create TinyDNS “hook” script for use with acme.sh

Add “hook” processing file for acme.sh

Create the file ~/.acme.sh/dns_tinydns.sh

Add the following to this file:

#!/bin/bash
# acme.sh custom DNS API hook for TinyDNS

# Path to your update script
TINYSCRIPT="/usr/local/bin/update_tinydns_txt.sh"

dns_tinydns_add() {
    fulldomain="$1" # e.g. _acme-challenge.example.com
    txtvalue="$2" # e.g. the ACME challenge token

    _debug "dns_tinydns_add: $fulldomain = $txtvalue"

    "$TINYSCRIPT" "$txtvalue" "$fulldomain" || return 1

    return 0
}

dns_tinydns_rm() {
    fulldomain="$1"
    txtvalue="$2"

    _debug "dns_tinydns_rm: $fulldomain (value $txtvalue)"

    # Optional: implement record removal here
    return 0
}

Set file as executable

chmod +x ~/.acme.sh/dns_tinydns.sh

Create tinydns update script ‘/usr/local/bin/update_tinydns_txt.sh’

Add the following to this file:

#!/bin/bash
# Must be run as root
if [[ $EUID -ne 0 ]]; then
    echo "This script must be run as root."
    exit 1
fi

# Check arguments
if [[ -z "$1" || -z "$2" ]]; then
    echo "Usage: $0 \"txt-value\" \"record-name\""
    exit 1
fi

# Input parameters
TXT_VALUE="$1"
RECORD_NAME="$2"

# Paths and settings
TINYDNS_ROOT="/var/tinydns/root"
DATA_FILE="$TINYDNS_ROOT/data"
BACKUP_DIR="$TINYDNS_ROOT/backups"
DNSCACHE_SERVICE_NAME="dnscached"

# Ensure backup directory exists
mkdir -p "$BACKUP_DIR"
echo "Updating TXT record for $RECORD_NAME"

# Backup current data file
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
cp "$DATA_FILE" "$BACKUP_DIR/data_$TIMESTAMP.bak" || {
    echo "Failed to back up data file."
    exit 1
}

# Backup in-place
cp "$DATA_FILE" "$DATA_FILE.bak"

# Check if record exists
if grep -q "^'${RECORD_NAME}:" "$DATA_FILE"; then
    # Update existing TXT record
    sed -i -E "s|^('${RECORD_NAME}):.*|\1:${TXT_VALUE}:30|" "$DATA_FILE"
else
    # Append new TXT record
    echo "'${RECORD_NAME}:${TXT_VALUE}" >> "$DATA_FILE"
fi

# Rebuild data.cdb
cd "$TINYDNS_ROOT" && make || {
    echo "make failed. Restoring original data file."
    mv "$DATA_FILE.bak" "$DATA_FILE"
    make
    exit 1
}

# Restart dnscached service
service "$DNSCACHE_SERVICE_NAME" restart || {
    echo "Failed to restart $DNSCACHE_SERVICE_NAME service."
    exit 1
}

echo "Successfully updated TXT record for $RECORD_NAME"

Set file as executable

chmod +x /usr/local/bin/update_tinydns_txt.sh

About the Author

Jim Lucas

Owner and proprietor of this establishment

1 thought on “Create TinyDNS “hook” script for use with acme.sh

Leave a Reply

Your email address will not be published. Required fields are marked *