]> git.ipfire.org Git - people/stevee/network.git/blame - functions.dns
DNS: Add static search domains.
[people/stevee/network.git] / functions.dns
CommitLineData
cccb3a4b
MT
1#!/bin/bash
2###############################################################################
3# #
b4b2fa50
MT
4# IPFire.org - A linux based firewall #
5# Copyright (C) 2012 IPFire Network Development Team #
cccb3a4b 6# #
b4b2fa50
MT
7# This program is free software: you can redistribute it and/or modify #
8# it under the terms of the GNU General Public License as published by #
9# the Free Software Foundation, either version 3 of the License, or #
10# (at your option) any later version. #
cccb3a4b 11# #
b4b2fa50
MT
12# This program is distributed in the hope that it will be useful, #
13# but WITHOUT ANY WARRANTY; without even the implied warranty of #
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
15# GNU General Public License for more details. #
cccb3a4b 16# #
b4b2fa50
MT
17# You should have received a copy of the GNU General Public License #
18# along with this program. If not, see <http://www.gnu.org/licenses/>. #
cccb3a4b
MT
19# #
20###############################################################################
21
acc9efd5 22# Set this to true if localhost should be added as the first DNS server.
b4b2fa50
MT
23DNS_USE_LOCAL_RESOLVER=true
24NETWORK_CONFIG_FILE_PARAMS="${NETWORK_CONFIG_FILE_PARAMS} DNS_USE_LOCAL_RESOLVER"
acc9efd5 25
b4b2fa50
MT
26# Set this option to true if the DNS servers should be queried in a random order.
27# This is useful to load balance between multiple servers.
28DNS_RANDOMIZE=false
acc9efd5
MT
29NETWORK_CONFIG_FILE_PARAMS="${NETWORK_CONFIG_FILE_PARAMS} DNS_RANDOMIZE"
30
805da540
MT
31DNS_SEARCH_DOMAINS=""
32NETWORK_CONFIG_FILE_PARAMS="${NETWORK_CONFIG_FILE_PARAMS} DNS_SEARCH_DOMAINS"
33
b4b2fa50 34# Set this option to true if the DNS servers should be advertised by
6f923dac
MT
35# radvd.
36DNS_ADVERTISE_SERVERS="true"
37
acc9efd5
MT
38DNS_SERVER_CONFIG_FILE="${NETWORK_CONFIG_DIR}/dns-servers"
39
40# Path to the configuration file of the DNS resolver.
41RESOLV_CONF="/etc/resolv.conf"
42
cccb3a4b
MT
43function dns_get_hostname() {
44 local address=${1}
45 assert isset address
46
acc9efd5
MT
47 (
48 unset HOSTNAME
49 eval $(ipcalc -h ${address} 2>/dev/null)
50 echo "${HOSTNAME}"
51 )
52}
53
54function __dns_server_println() {
55 local server=${1}
56 local priority=${2}
57
58 print "%-20s %s" "${server}" "${priority}"
59}
60
61function __dns_server_sort() {
6f923dac 62 sort -k2 -g | uniq
acc9efd5
MT
63}
64
65function dns_server_list() {
66 [ -r "${DNS_SERVER_CONFIG_FILE}" ] || return ${EXIT_OK}
67
68 local server priority
69 while read server priority; do
70 if [ -n "${server}" ] && [ -n "${priority}" ]; then
71 __dns_server_println "${server}" "${priority}"
72 fi
73 done < ${DNS_SERVER_CONFIG_FILE} | __dns_server_sort
74}
75
6f923dac
MT
76function dns_server_list_no_priority() {
77 local server priority
78 dns_server_list | while read server priority; do
79 echo "${server}"
80 done
81}
82
acc9efd5
MT
83function dns_server_add() {
84 local server=${1}
85 assert isset server
86
87 local priority=${2}
88 if ! isset priority; then
89 priority=20
90 fi
91 assert isinteger priority
92
93 (
94 dns_server_list
95 __dns_server_println "${server}" "${priority}"
96 ) | __dns_server_sort > ${DNS_SERVER_CONFIG_FILE}.new
97
98 mv ${DNS_SERVER_CONFIG_FILE}{.new,}
99}
100
101function dns_server_remove() {
102 local server=${1}
103 assert isset server
104
105 local entry priority
106 local entries=$(dns_server_list)
107
108 while read entry priority; do
b4b2fa50
MT
109 [ "${entry}" = "${server}" ] && continue
110 __dns_server_println "${server}" "${priority}"
acc9efd5
MT
111 done <<< ${entries} | __dns_server_sort > ${DNS_SERVER_CONFIG_FILE}
112}
113
114function dns_server_flush() {
115 : > ${DNS_SERVER_CONFIG_FILE}
116}
117
a469c542
MT
118# Update resolv.conf(5) when initializing the network.
119init_register dns_generate_resolvconf
120
acc9efd5
MT
121function dns_generate_resolvconf() {
122 local file=${RESOLV_CONF}
123
124 log INFO "Updating resolver configuration..."
125
126 config_header "resolver configutation file" > ${file}
127
128 if enabled DNS_RANDOMIZE; then
129 print "option rotate\n" >> ${file}
130 fi
131
805da540
MT
132 # Add search domains.
133 local search_domains="$(unquote ${DNS_SEARCH_DOMAINS})"
134
135 # Get search domains from DHCP clients, etc.
a9ebc53b
KB
136 local proto
137 local zone
138 local domainname
139 for zone in $(zones_get_all); do
140 for proto in ${IP_SUPPORTED_PROTOCOLS}; do
141 domainname=$(routing_db_get ${zone} ${proto} domain-name)
142 if [ -n "${domainname}" ]; then
805da540 143 list_append search_domains "${domainname}"
a9ebc53b
KB
144 fi
145 done
805da540
MT
146 done
147
148 # Sort out duplicate entries.
149 search_domains=$(list_unique ${search_domains})
150
151 # Write search domains to file.
152 for domainname in ${search_domains}; do
153 print "search ${domainname}"
a9ebc53b 154 done >> ${file}
acc9efd5
MT
155
156 # Add the local resolver as the first DNS server if enabled.
157 if enabled DNS_USE_LOCAL_RESOLVER; then
158 print "nameserver ::1" >> ${file}
159 fi
160
a9ebc53b
KB
161 # First pull in zone name servers.
162 local server
163 for server in $(dns_get_zone_name_servers); do
164 print "nameserver ${server}"
165 done >> ${file}
166
acc9efd5 167 # Dump all DNS servers (if any).
a9ebc53b 168 local priority
acc9efd5
MT
169 dns_server_list | while read server priority; do
170 print "nameserver ${server}"
171 done >> ${file}
cccb3a4b 172}
a9ebc53b
KB
173
174function dns_get_zone_name_servers() {
175 local servers
176 local zone
177 for zone in $(zones_get_all); do
178 local proto
179 for proto in ${IP_SUPPORTED_PROTOCOLS}; do
180 servers=$(routing_db_get ${zone} ${proto} domain-name-servers)
181
182 local server
183 for server in ${servers}; do
184 print "${server}"
185 done
186 done
187 done
188}