Reviewed-on: #17 Reviewed-by: sundapeng <sundp@mail.zgclab.edu.cn> Reviewed-by: xuxt <xuxt@zgclab.edu.cn>
260 lines
8.2 KiB
Bash
Executable File
260 lines
8.2 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Test DNS auto-sync functionality using argus_dns_sync.sh
|
|
# This test validates the automatic DNS record updates from IP files
|
|
# Usage: ./03.5_dns_sync_test.sh
|
|
|
|
set -e
|
|
|
|
HOST_DNS_PORT="${HOST_DNS_PORT:-1053}"
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
TEST_DIR="$(dirname "$SCRIPT_DIR")"
|
|
|
|
echo "=== DNS Auto-Sync Functionality Test ==="
|
|
echo "Using DNS server localhost:${HOST_DNS_PORT}"
|
|
|
|
# Check if container is running
|
|
if ! docker compose ps | grep -q "Up"; then
|
|
echo "Error: BIND9 container is not running"
|
|
echo "Please start the container first with: ./01_start_container.sh"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if dig is available
|
|
if ! command -v dig &> /dev/null; then
|
|
echo "Installing dig (dnsutils)..."
|
|
apt-get update && apt-get install -y dnsutils
|
|
fi
|
|
|
|
# Function to test DNS query
|
|
test_dns_query() {
|
|
local hostname="$1"
|
|
local expected_ip="$2"
|
|
local description="$3"
|
|
|
|
echo "Testing: $description"
|
|
echo "Query: $hostname.argus.com -> Expected: $expected_ip"
|
|
|
|
# Wait a moment for DNS cache
|
|
sleep 2
|
|
|
|
result=$(dig @localhost -p "$HOST_DNS_PORT" "$hostname".argus.com A +short 2>/dev/null || echo "QUERY_FAILED")
|
|
|
|
if [ "$result" = "$expected_ip" ]; then
|
|
echo "✓ $result"
|
|
return 0
|
|
else
|
|
echo "✗ Got: $result, Expected: $expected_ip"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Function to wait for sync to complete
|
|
wait_for_sync() {
|
|
local timeout=15
|
|
local elapsed=0
|
|
echo "Waiting for DNS sync to complete (max ${timeout}s)..."
|
|
|
|
while [ $elapsed -lt $timeout ]; do
|
|
if docker compose exec bind9 test -f /var/lock/argus_dns_sync.lock; then
|
|
echo "Sync process is running..."
|
|
else
|
|
echo "Sync completed"
|
|
sleep 2 # Extra wait for DNS propagation
|
|
return 0
|
|
fi
|
|
sleep 2
|
|
elapsed=$((elapsed + 2))
|
|
done
|
|
|
|
echo "Warning: Sync may still be running after ${timeout}s"
|
|
return 0
|
|
}
|
|
|
|
echo ""
|
|
echo "Step 1: Preparing test environment..."
|
|
|
|
# Ensure required directories exist
|
|
docker compose exec bind9 mkdir -p /private/argus/etc
|
|
docker compose exec bind9 mkdir -p /private/argus/bind/.backup
|
|
|
|
# Backup original configuration if it exists
|
|
docker compose exec bind9 test -f /private/argus/bind/db.argus.com && \
|
|
docker compose exec bind9 cp /private/argus/bind/db.argus.com /private/argus/bind/db.argus.com.backup.test || true
|
|
|
|
# Ensure initial configuration is available (may already be symlinked)
|
|
docker compose exec bind9 test -f /private/argus/bind/db.argus.com || \
|
|
docker compose exec bind9 cp /etc/bind/db.argus.com /private/argus/bind/db.argus.com
|
|
|
|
echo "✓ Test environment prepared"
|
|
|
|
echo ""
|
|
echo "Step 2: Testing initial DNS configuration..."
|
|
|
|
# Get current IP for web.argus.com (may have been changed by previous tests)
|
|
current_web_ip=$(dig @localhost -p "$HOST_DNS_PORT" web.argus.com A +short 2>/dev/null || echo "UNKNOWN")
|
|
echo "Current web.argus.com IP: $current_web_ip"
|
|
|
|
# Test that DNS is working (regardless of specific IP)
|
|
if [ "$current_web_ip" = "UNKNOWN" ] || [ -z "$current_web_ip" ]; then
|
|
echo "DNS resolution not working for web.argus.com"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✓ DNS resolution is working"
|
|
|
|
echo ""
|
|
echo "Step 3: Creating IP files for auto-sync..."
|
|
|
|
# Create test IP files in the watch directory
|
|
echo "Creating test1.argus.com with IP 10.0.0.100"
|
|
docker compose exec bind9 bash -c 'echo "10.0.0.100" > /private/argus/etc/test1.argus.com'
|
|
|
|
echo "Creating test2.argus.com with IP 10.0.0.200"
|
|
docker compose exec bind9 bash -c 'echo "test2 service running on 10.0.0.200" > /private/argus/etc/test2.argus.com'
|
|
|
|
echo "Creating api.argus.com with IP 192.168.1.50"
|
|
docker compose exec bind9 bash -c 'echo "API server: 192.168.1.50 port 8080" > /private/argus/etc/api.argus.com'
|
|
|
|
echo "✓ IP files created"
|
|
|
|
echo ""
|
|
echo "Step 4: Checking DNS sync process..."
|
|
|
|
# Check if DNS sync process is already running (via supervisord)
|
|
if docker compose exec bind9 pgrep -f argus_dns_sync.sh > /dev/null; then
|
|
echo "✓ DNS sync process already running (via supervisord)"
|
|
else
|
|
echo "Starting DNS sync process manually..."
|
|
# Start the DNS sync process in background if not running
|
|
docker compose exec -d bind9 /usr/local/bin/argus_dns_sync.sh
|
|
echo "✓ DNS sync process started manually"
|
|
fi
|
|
|
|
# Wait for first sync cycle
|
|
wait_for_sync
|
|
|
|
echo ""
|
|
echo "Step 5: Testing auto-synced DNS records..."
|
|
|
|
failed_tests=0
|
|
|
|
# Test new DNS records created by auto-sync
|
|
if ! test_dns_query "test1" "10.0.0.100" "Auto-synced test1.argus.com"; then
|
|
((failed_tests++))
|
|
fi
|
|
|
|
if ! test_dns_query "test2" "10.0.0.200" "Auto-synced test2.argus.com"; then
|
|
((failed_tests++))
|
|
fi
|
|
|
|
if ! test_dns_query "api" "192.168.1.50" "Auto-synced api.argus.com"; then
|
|
((failed_tests++))
|
|
fi
|
|
|
|
# Verify original records still work (use current IP from earlier)
|
|
if ! test_dns_query "web" "$current_web_ip" "Original web.argus.com still working"; then
|
|
((failed_tests++))
|
|
fi
|
|
|
|
if ! test_dns_query "ns1" "127.0.0.1" "Original ns1.argus.com still working"; then
|
|
((failed_tests++))
|
|
fi
|
|
|
|
echo ""
|
|
echo "Step 6: Testing IP update functionality..."
|
|
|
|
# Update an existing IP file
|
|
echo "Updating test1.argus.com IP from 10.0.0.100 to 10.0.0.150"
|
|
docker compose exec bind9 bash -c 'echo "10.0.0.150" > /private/argus/etc/test1.argus.com'
|
|
|
|
# Wait for sync
|
|
wait_for_sync
|
|
|
|
# Test updated record
|
|
if ! test_dns_query "test1" "10.0.0.150" "Updated test1.argus.com IP"; then
|
|
((failed_tests++))
|
|
fi
|
|
|
|
echo ""
|
|
echo "Step 7: Testing invalid IP handling..."
|
|
|
|
# Create file with invalid IP
|
|
echo "Creating invalid.argus.com with invalid IP"
|
|
docker compose exec bind9 bash -c 'echo "this is not an IP address" > /private/argus/etc/invalid.argus.com'
|
|
|
|
# Wait for sync (should skip invalid IP)
|
|
wait_for_sync
|
|
|
|
# Verify invalid record was not added (should fail to resolve)
|
|
result=$(dig @localhost -p "$HOST_DNS_PORT" invalid.argus.com A +short 2>/dev/null || echo "NO_RESULT")
|
|
if [ "$result" = "NO_RESULT" ] || [ -z "$result" ]; then
|
|
echo "✓ Invalid IP correctly ignored"
|
|
else
|
|
echo "✗ Invalid IP was processed: $result"
|
|
((failed_tests++))
|
|
fi
|
|
|
|
echo ""
|
|
echo "Step 8: Verifying backup functionality..."
|
|
|
|
# Check if backups were created
|
|
backup_count=$(docker compose exec bind9 ls -1 /private/argus/bind/.backup/ | wc -l || echo "0")
|
|
if [ "$backup_count" -gt 0 ]; then
|
|
echo "✓ Configuration backups created ($backup_count files)"
|
|
# Show latest backup
|
|
docker compose exec bind9 ls -la /private/argus/bind/.backup/ | tail -1
|
|
else
|
|
echo "✗ No backup files found"
|
|
((failed_tests++))
|
|
fi
|
|
|
|
echo ""
|
|
echo "Step 9: Cleanup..."
|
|
|
|
# Note: We don't stop the DNS sync process since it's managed by supervisord
|
|
echo "Note: DNS sync process will continue running (managed by supervisord)"
|
|
|
|
# Clean up test files
|
|
docker compose exec bind9 rm -f /private/argus/etc/test1.argus.com
|
|
docker compose exec bind9 rm -f /private/argus/etc/test2.argus.com
|
|
docker compose exec bind9 rm -f /private/argus/etc/api.argus.com
|
|
docker compose exec bind9 rm -f /private/argus/etc/invalid.argus.com
|
|
|
|
# Restore original configuration if backup exists
|
|
docker compose exec bind9 test -f /private/argus/bind/db.argus.com.backup.test && \
|
|
docker compose exec bind9 cp /private/argus/bind/db.argus.com.backup.test /private/argus/bind/db.argus.com && \
|
|
docker compose exec bind9 rm /private/argus/bind/db.argus.com.backup.test || true
|
|
|
|
# Reload original configuration
|
|
docker compose exec bind9 /usr/local/bin/reload-bind9.sh
|
|
|
|
echo "✓ Cleanup completed"
|
|
|
|
echo ""
|
|
echo "=== DNS Auto-Sync Test Summary ==="
|
|
if [ $failed_tests -eq 0 ]; then
|
|
echo "✅ All DNS auto-sync tests passed!"
|
|
echo ""
|
|
echo "Validated functionality:"
|
|
echo " ✓ Automatic DNS record creation from IP files"
|
|
echo " ✓ IP address extraction from various file formats"
|
|
echo " ✓ Dynamic DNS record updates"
|
|
echo " ✓ Invalid IP address handling"
|
|
echo " ✓ Configuration backup mechanism"
|
|
echo " ✓ Preservation of existing DNS records"
|
|
echo ""
|
|
echo "The DNS auto-sync functionality is working correctly!"
|
|
exit 0
|
|
else
|
|
echo "❌ $failed_tests DNS auto-sync test(s) failed!"
|
|
echo ""
|
|
echo "Please check:"
|
|
echo " - argus_dns_sync.sh script configuration"
|
|
echo " - File permissions in /private/argus/etc/"
|
|
echo " - BIND9 reload functionality"
|
|
echo " - Network connectivity and DNS resolution"
|
|
exit 1
|
|
fi
|