]> git.ipfire.org Git - ipfire-2.x.git/blobdiff - src/initscripts/system/unbound
unbound: check if red/iface exists before read it
[ipfire-2.x.git] / src / initscripts / system / unbound
index 520525ea140c96971dfa72947cb6e7451cd287e2..5d3c5062ff5accbd8fa13f038d78595282023b1f 100644 (file)
@@ -48,7 +48,7 @@ config_header() {
 }
 
 update_forwarders() {
-       if [ "${USE_FORWARDERS}" = "1" -a -e "/var/ipfire/red/active" ]; then
+       if [ "${USE_FORWARDERS}" = "1" -a -e "/var/ipfire/red/iface" -a "$(</sys/class/net/$(</var/ipfire/red/iface)/carrier)" = "1" ]; then
                local forwarders
                local broken_forwarders
 
@@ -473,7 +473,7 @@ disable_dnssec() {
 fix_time_if_dns_fail() {
        # If DNS still not work try to init ntp with
        # hardcoded ntp.ipfire.org (81.3.27.46)
-       if [ -e /var/ipfire/red/active ]; then
+       if [ -e "/var/ipfire/red/iface" -a "$(</sys/class/net/$(</var/ipfire/red/iface)/carrier)" = "1" ]; then
                host 0.ipfire.pool.ntp.org > /dev/null 2>&1
                if [ "${?}" != "0" ]; then
                        boot_mesg "DNS still not functioning... Trying to sync time with ntp.ipfire.org (81.3.27.46)..."
@@ -482,6 +482,27 @@ fix_time_if_dns_fail() {
        fi
 }
 
+resolve() {
+       local hostname="${1}"
+
+       local found=0
+       local ns
+       for ns in $(read_name_servers); do
+               local answer
+               for answer in $(dig +short "@${ns}" A "${hostname}"); do
+                       found=1
+
+                       # Filter out non-IP addresses
+                       if [[ ! "${answer}" =~ \.$ ]]; then
+                               echo "${answer}"
+                       fi
+               done
+
+               # End loop when we have got something
+               [ ${found} -eq 1 ] && break
+       done
+}
+
 # Sets up Safe Search for various search engines
 write_safe_search_conf() {
        local google_tlds=(
@@ -691,26 +712,39 @@ write_safe_search_conf() {
 
                # Bing
                echo "  local-zone: bing.com transparent"
-               echo "  local-data: \"www.bing.com CNAME strict.bing.com.\""
+               for address in $(resolve "strict.bing.com"); do
+                       echo "  local-data: \"www.bing.com ${LOCAL_TTL} IN A ${address}\""
+               done
 
                # DuckDuckGo
-               echo "  local-zone: duckduckgo.com transparent"
-               echo "  local-data: \"duckduckgo.com CNAME safe.duckduckgo.com.\""
+               echo "  local-zone: duckduckgo.com typetransparent"
+               for address in $(resolve "safe.duckduckgo.com"); do
+                       echo "  local-data: \"duckduckgo.com ${LOCAL_TTL} IN A ${address}\""
+               done
 
                # Google
+               addresses="$(resolve "forcesafesearch.google.com")"
                local domain
                for domain in ${google_tlds[@]}; do
                        echo "  local-zone: ${domain} transparent"
-                       echo "  local-data: \"www.${domain} CNAME forcesafesearch.google.com.\""
+                       for address in ${addresses}; do
+                               echo "  local-data: \"www.${domain} ${LOCAL_TTL} IN A ${address}\""
+                       done
                done
 
                # Yandex
-               echo "  local-zone: yandex.ru transparent"
-               echo "  local-data: \"yandex.ru A 213.180.193.56\""
+               for domain in yandex.com yandex.ru; do
+                       echo "  local-zone: ${domain} typetransparent"
+                       for address in $(resolve "familysearch.${domain}"); do
+                               echo "  local-data: \"${domain} ${LOCAL_TTL} IN A ${address}\""
+                       done
+               done
 
                # YouTube
                echo "  local-zone: youtube.com transparent"
-               echo "  local-data: \"www.youtube.com CNAME restrictmoderate.youtube.com.\""
+               for address in $(resolve "restrictmoderate.youtube.com"); do
+                       echo "  local-data: \"www.youtube.com ${LOCAL_TTL} IN A ${address}\""
+               done
        ) > /etc/unbound/safe-search.conf
 }
 
@@ -809,8 +843,12 @@ case "$1" in
                exit ${ret}
                ;;
 
+       resolve)
+               resolve "${2}"
+               ;;
+
        *)
-               echo "Usage: $0 {start|stop|restart|status|update-forwarders|test-name-server}"
+               echo "Usage: $0 {start|stop|restart|status|update-forwarders|test-name-server|resolve}"
                exit 1
                ;;
 esac