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
}
chmod +x ~/.acme.sh/dns_tinydns.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"
chmod +x /usr/local/bin/update_tinydns_txt.sh
[…] Example for TinyDNS on CentOS […]