#!/usr/bin/env bash set -euo pipefail # Toggle DNS between Pi-hole and Cloudflare on all active network services. # Usage: ./toggle_dns.sh # Requires sudo for networksetup. PIHOLE="192.168.1.4" CLOUDFLARE="1.1.1.1" # Get all hardware network services (Wi-Fi, Ethernet, Thunderbolt, USB, etc.) services=() while IFS= read -r line; do [[ "$line" == *"*"* ]] && continue # skip disabled services services+=("$line") done < <(networksetup -listallnetworkservices 2>/dev/null | tail -n +2) if [[ ${#services[@]} -eq 0 ]]; then echo "No network services found" exit 1 fi # Detect current mode from the first service that has a DNS set current_dns="" for svc in "${services[@]}"; do dns=$(networksetup -getdnsservers "$svc" 2>/dev/null | head -1) if [[ "$dns" != *"aren't any"* ]] && [[ -n "$dns" ]]; then current_dns="$dns" break fi done if [[ "$current_dns" == "$CLOUDFLARE" ]]; then target="$PIHOLE" label="Pi-hole" else target="$CLOUDFLARE" label="Cloudflare" fi echo "Switching all services to ${label} (${target})..." for svc in "${services[@]}"; do sudo networksetup -setdnsservers "$svc" "$target" echo " ${svc} → ${target}" done sudo dscacheutil -flushcache sudo killall -HUP mDNSResponder 2>/dev/null || true echo "DNS set to ${label} (${target})"