gitscope
← awesome-scripts / master / dnsleak-guard/ensure_dns.sh
https://dev.kronoz.win/r/awesome-scripts.git
dnsleak-guard/ensure_dns.sh · Bash
Blame Raw
 1#!/bin/bash
 2DNS_SERVER="127.0.0.1"
 3LOG_FILE="/tmp/dnsleak-guard.log"
 4
 5exec 2>>"$LOG_FILE"
 6
 7if [ "$EUID" -ne 0 ]; then
 8    echo "[$(date)] ERROR: must run as root" >> "$LOG_FILE"
 9    exit 1
10fi
11
12log() {
13    echo "[$(date)] $1" >> "$LOG_FILE"
14}
15
16log "dnsleak-guard started"
17
18while true; do
19    CHANGED=0
20
21    while IFS= read -r service; do
22        [[ "$service" == "An asterisk"* ]] && continue
23        [[ -z "$service" ]] && continue
24        [[ "$service" == "*"* ]] && continue
25
26        current=$(networksetup -getdnsservers "$service" 2>/dev/null)
27        [ -z "$current" ] && continue
28        [[ "$current" == *"aren't any"* ]] && continue
29
30        current_flat=$(echo "$current" | tr '\n' ' ' | sed 's/[[:space:]]*$//')
31
32        if [ "$current_flat" != "$DNS_SERVER" ]; then
33            if networksetup -setdnsservers "$service" "$DNS_SERVER" 2>/dev/null; then
34                CHANGED=1
35                log "[$service] DNS reset: '$current_flat' -> $DNS_SERVER"
36            fi
37        fi
38    done < <(networksetup -listallnetworkservices 2>/dev/null)
39
40    if [ "$CHANGED" -eq 1 ]; then
41        dscacheutil -flushcache 2>/dev/null
42        killall -HUP mDNSResponder 2>/dev/null
43        log "DNS cache flushed"
44    fi
45
46    sleep 10
47done