Loading...
Loading...
Performs low-level Cloudflare DNS operations including adding, updating, deleting DNS records, managing zone settings, and dynamic DNS updates via Cloudflare API. Use when need manual DNS record management, dynamic DNS updates, zone settings configuration, or operations outside domain management system. Triggers on "add DNS record", "update DNS", "delete DNS record", "dynamic DNS", "Cloudflare API", or "manual DNS management". Works with Cloudflare API v4, cf-dns.sh and cf-settings.sh helper scripts, and direct curl API calls.
npx skill4agent add dawiddutoit/custom-claude cloudflare-dns-operations# Load environment variables
source /home/dawiddutoit/projects/network/.env
# List all DNS records
/home/dawiddutoit/projects/network/scripts/cf-dns.sh list
# Add A record
/home/dawiddutoit/projects/network/scripts/cf-dns.sh add A api.temet.ai 192.168.68.100
# Add CNAME record
/home/dawiddutoit/projects/network/scripts/cf-dns.sh add CNAME www temet.ai
# Update existing record
/home/dawiddutoit/projects/network/scripts/cf-dns.sh update api.temet.ai 192.168.68.200
# Delete record
/home/dawiddutoit/projects/network/scripts/cf-dns.sh delete api.temet.ai1234567890abcdef1234567890abcdef# Edit .env
nano /home/dawiddutoit/projects/network/.env
# Add (using API Token - recommended):
CLOUDFLARE_EMAIL="your-email@example.com"
CLOUDFLARE_ZONE_ID="your-zone-id-here"
CLOUDFLARE_API_KEY="your-api-token-here"
# Or using Global API Key:
CLOUDFLARE_EMAIL="your-email@example.com"
CLOUDFLARE_ZONE_ID="your-zone-id-here"
CLOUDFLARE_GLOBAL_API_KEY="your-global-api-key-here"source /home/dawiddutoit/projects/network/.env
curl -s -X GET "https://api.cloudflare.com/client/v4/user" \
-H "X-Auth-Email: ${CLOUDFLARE_EMAIL}" \
-H "X-Auth-Key: ${CLOUDFLARE_API_KEY}" \
| jq '.success'true/home/dawiddutoit/projects/network/scripts/cf-dns.sh listDNS Records for temet.ai:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Type Name Value
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
CNAME pihole tunnel-id.cfargotunnel.com
CNAME jaeger tunnel-id.cfargotunnel.com
A home 1.2.3.4
...source /home/dawiddutoit/projects/network/.env
curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/dns_records" \
-H "X-Auth-Email: ${CLOUDFLARE_EMAIL}" \
-H "X-Auth-Key: ${CLOUDFLARE_API_KEY}" \
| jq -r '.result[] | "\(.type)\t\(.name)\t\(.content)"'# List only A records
/home/dawiddutoit/projects/network/scripts/cf-dns.sh list | grep "^A"
# List only CNAME records
/home/dawiddutoit/projects/network/scripts/cf-dns.sh list | grep "^CNAME"/home/dawiddutoit/projects/network/scripts/cf-dns.sh add A api.temet.ai 192.168.68.100/home/dawiddutoit/projects/network/scripts/cf-dns.sh add AAAA ipv6.temet.ai 2001:db8::1/home/dawiddutoit/projects/network/scripts/cf-dns.sh add CNAME www temet.ai/home/dawiddutoit/projects/network/scripts/cf-dns.sh add TXT _verification "verification-code"# Using direct API call
source /home/dawiddutoit/projects/network/.env
curl -X POST "https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/dns_records" \
-H "X-Auth-Email: ${CLOUDFLARE_EMAIL}" \
-H "X-Auth-Key: ${CLOUDFLARE_API_KEY}" \
-H "Content-Type: application/json" \
--data '{
"type": "A",
"name": "proxied.temet.ai",
"content": "192.168.68.100",
"ttl": 1,
"proxied": true
}' | jq '.'| Type | Example | Purpose |
|---|---|---|
| A | | IPv4 address |
| AAAA | | IPv6 address |
| CNAME | | Alias to another domain |
| TXT | | Text records (verification, SPF) |
| MX | | Mail exchange |
/home/dawiddutoit/projects/network/scripts/cf-dns.sh update api.temet.ai 192.168.68.200source /home/dawiddutoit/projects/network/.env
# Step 1: Get record ID
record_id=$(curl -s -X GET \
"https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/dns_records?name=api.temet.ai" \
-H "X-Auth-Email: ${CLOUDFLARE_EMAIL}" \
-H "X-Auth-Key: ${CLOUDFLARE_API_KEY}" \
| jq -r '.result[0].id')
# Step 2: Update record
curl -X PUT \
"https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/dns_records/${record_id}" \
-H "X-Auth-Email: ${CLOUDFLARE_EMAIL}" \
-H "X-Auth-Key: ${CLOUDFLARE_API_KEY}" \
-H "Content-Type: application/json" \
--data '{
"type": "A",
"name": "api.temet.ai",
"content": "192.168.68.200",
"ttl": 1,
"proxied": false
}' | jq '.'/home/dawiddutoit/projects/network/scripts/cf-dns.sh delete api.temet.aiFound record: A api.temet.ai → 192.168.68.100
Delete this record? (y/N):source /home/dawiddutoit/projects/network/.env
# Step 1: Get record ID
record_id=$(curl -s -X GET \
"https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/dns_records?name=api.temet.ai" \
-H "X-Auth-Email: ${CLOUDFLARE_EMAIL}" \
-H "X-Auth-Key: ${CLOUDFLARE_API_KEY}" \
| jq -r '.result[0].id')
# Step 2: Delete record
curl -X DELETE \
"https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/dns_records/${record_id}" \
-H "X-Auth-Email: ${CLOUDFLARE_EMAIL}" \
-H "X-Auth-Key: ${CLOUDFLARE_API_KEY}" \
| jq '.'/home/dawiddutoit/projects/network/scripts/cf-settings.sh all# SSL/TLS mode
/home/dawiddutoit/projects/network/scripts/cf-settings.sh get ssl
# Security level
/home/dawiddutoit/projects/network/scripts/cf-settings.sh get security_level
# Caching level
/home/dawiddutoit/projects/network/scripts/cf-settings.sh get cache_level# Set SSL to Full
/home/dawiddutoit/projects/network/scripts/cf-settings.sh set ssl full
# Enable always HTTPS
/home/dawiddutoit/projects/network/scripts/cf-settings.sh set always_use_https on
# Enable HTTP/3
/home/dawiddutoit/projects/network/scripts/cf-settings.sh set http3 on# Enables: SSL Full, Always HTTPS, WAF
/home/dawiddutoit/projects/network/scripts/cf-settings.sh enable-security# Enables: Brotli, HTTP/2, HTTP/3
/home/dawiddutoit/projects/network/scripts/cf-settings.sh enable-performance# Purge all cached files
/home/dawiddutoit/projects/network/scripts/cf-settings.sh purge-cache# Bypass cache for 3 hours
/home/dawiddutoit/projects/network/scripts/cf-settings.sh dev-mode on
# Disable development mode
/home/dawiddutoit/projects/network/scripts/cf-settings.sh dev-mode off# Get current public IP
current_ip=$(curl -s https://api.ipify.org)
# Update DNS record
/home/dawiddutoit/projects/network/scripts/cf-dns.sh update home.temet.ai $current_ip#!/bin/bash
# /home/dawiddutoit/scripts/dynamic-dns-update.sh
source /home/dawiddutoit/projects/network/.env
# Get current public IP
current_ip=$(curl -s https://api.ipify.org)
# Get DNS record IP
dns_ip=$(dig +short home.temet.ai @1.1.1.1)
# Update if different
if [ "$current_ip" != "$dns_ip" ]; then
echo "IP changed: $dns_ip → $current_ip"
/home/dawiddutoit/projects/network/scripts/cf-dns.sh update home.temet.ai $current_ip
else
echo "IP unchanged: $current_ip"
fi# Edit crontab
crontab -e
# Check every 5 minutes
*/5 * * * * /home/dawiddutoit/scripts/dynamic-dns-update.sh >> /var/log/dynamic-dns.log 2>&1#!/bin/bash
# With notification
current_ip=$(curl -s https://api.ipify.org)
dns_ip=$(dig +short home.temet.ai @1.1.1.1)
if [ "$current_ip" != "$dns_ip" ]; then
/home/dawiddutoit/projects/network/scripts/cf-dns.sh update home.temet.ai $current_ip
# Send notification (if ntfy configured)
if [ -n "$NTFY_TOPIC" ]; then
curl -d "Home IP updated: $current_ip" https://ntfy.sh/$NTFY_TOPIC
fi
fi| File | Purpose |
|---|---|
| Cloudflare API reference, authentication methods, record types |
| DNS record management helper script |
| Zone settings management helper script |
| Example API calls, automation scripts, common patterns |
scripts/manage-domains.sh