96 lines
No EOL
2.7 KiB
Bash
96 lines
No EOL
2.7 KiB
Bash
#!/bin/bash
|
|
|
|
# Script to find DNS zones not linked to a user
|
|
# and optionally delete them.
|
|
|
|
echo "Checking for DNS zones without a linked user..."
|
|
echo "======================================================"
|
|
|
|
# --- Preparation ---
|
|
|
|
# Check if required files/directories exist
|
|
if [[ ! -d "/var/named" ]]; then
|
|
echo "Error: Directory /var/named not found"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -f "/etc/userdomains" ]]; then
|
|
echo "Error: File /etc/userdomains not found"
|
|
exit 1
|
|
fi
|
|
|
|
# Create temporary files for comparison
|
|
ZONES_FILE=$(mktemp)
|
|
DOMAINS_FILE=$(mktemp)
|
|
ORPHANED_ZONES_FILE=$(mktemp)
|
|
|
|
# Clean up temporary files on exit (even on error)
|
|
trap 'rm -f "$ZONES_FILE" "$DOMAINS_FILE" "$ORPHANED_ZONES_FILE"' EXIT
|
|
|
|
# --- Analysis ---
|
|
|
|
# 1. Create a list of all DNS zones
|
|
for db_file in /var/named/*.db; do
|
|
if [[ -f "$db_file" ]]; then
|
|
basename "$db_file" .db
|
|
fi
|
|
done | sort > "$ZONES_FILE"
|
|
|
|
# 2. Create a list of all domains linked to users
|
|
cut -d: -f1 /etc/userdomains | sort > "$DOMAINS_FILE"
|
|
|
|
# 3. Compare the lists and save the "orphaned" zones
|
|
comm -23 "$ZONES_FILE" "$DOMAINS_FILE" > "$ORPHANED_ZONES_FILE"
|
|
|
|
# --- Action & Confirmation ---
|
|
|
|
# Check if the file with orphaned zones is empty or not
|
|
if [[ ! -s "$ORPHANED_ZONES_FILE" ]]; then
|
|
echo
|
|
echo "Good news! No orphaned DNS zones found."
|
|
else
|
|
ZONE_COUNT=$(wc -l < "$ORPHANED_ZONES_FILE")
|
|
echo
|
|
echo "Found $ZONE_COUNT zone(s) that are NOT linked to a user:"
|
|
echo "---------------------------------------------------------"
|
|
# Display the list of zones that can be deleted
|
|
cat "$ORPHANED_ZONES_FILE"
|
|
echo "---------------------------------------------------------"
|
|
echo
|
|
|
|
# --- FIRST CONFIRMATION ---
|
|
read -p "Do you want to proceed with deleting these $ZONE_COUNT zone(s)? (yes/no): " confirm1
|
|
|
|
if [[ "$confirm1" == "yes" ]]; then
|
|
echo
|
|
echo "WARNING: This action is permanent and cannot be undone."
|
|
|
|
# --- SECOND CONFIRMATION ---
|
|
read -p "Are you ABSOLUTELY sure you want to delete the zones shown? (yes/no): " confirm2
|
|
|
|
if [[ "$confirm2" == "yes" ]]; then
|
|
echo
|
|
echo "Confirmation received. The following zones will now be deleted:"
|
|
|
|
# Loop through the file and delete each zone
|
|
while read -r domain; do
|
|
# Make sure the line is not empty
|
|
if [[ -n "$domain" ]]; then
|
|
echo " -> Deleting DNS zone for: $domain"
|
|
# Execute the WHM API command
|
|
whmapi1 killdns domain="$domain"
|
|
fi
|
|
done < "$ORPHANED_ZONES_FILE"
|
|
|
|
echo
|
|
echo "All selected zones have been processed."
|
|
else
|
|
echo "Second confirmation not received. Action canceled."
|
|
fi
|
|
else
|
|
echo "First confirmation not received. Action canceled."
|
|
fi
|
|
fi
|
|
|
|
echo
|
|
echo "Script finished." |