whitespace
[openresolv] / named.in
1 #!/bin/sh
2 # Copyright 2006 Gentoo Foundation
3 # Copyright 2007 Roy Marples <roy@marples.name>
4 # All rights reserved
5
6 # named updater for resolvconf
7
8 # Redistribution and use in source and binary forms, with or without
9 # modification, are permitted provided that the following conditions
10 # are met:
11 #     * Redistributions of source code must retain the above copyright
12 #       notice, this list of conditions and the following disclaimer.
13 #     * Redistributions in binary form must reproduce the above
14 #       copyright notice, this list of conditions and the following
15 #       disclaimer in the documentation and/or other materials provided
16 #       with the distribution.
17 #
18 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30 # This is very important!
31 # We assume that we are a local dns cache - after all, why would a server
32 # use resolvconf?
33 # Now that we have assumed this, we also assume that generic DHCP clients
34 # will enter their domains and search domains ONLY in the "search" field
35 # in their resolv.confs and VPN clients will put the domain they are for
36 # into the domain field only.
37 # This allows bind to forward domains for a specific VPN domain to the
38 # VPN nameserver and everything else to the standard name servers.
39
40 # The bind config needs to be setup to include our file
41 #options {
42 #   include "resolvconf-options.conf";
43 #};
44 #include "resolvconf-zones.conf";
45
46 # The last step is to configure dns configuration for /etc/resolv.conf
47 #echo "nameserver 127.0.0.1" > /etc/resolvconf/resolv.conf.d/base
48 # On some platforms, like FreeBSD, resolvconf is in /usr/local so it becomes
49 #echo "nameserver 127.0.0.1" > /usr/local/etc/resolvconf/resolv.conf.d/base
50
51 # Load our variables from resolvconf
52 VARS="$(resolvconf -v)"
53 eval "${VARS}"
54
55 # If our dir doesn't exist then don't do anything
56 NAMEDB=/etc/namedb
57 [ -d "${NAMEDB}" ] || NAMEDB="/etc/bind"
58 [ -d "${NAMEDB}" ] || exit 0
59
60 NAMEDOPTIONS="${NAMEDB}/resolvconf-options.conf"
61 NAMEDZONES="${NAMEDB}/resolvconf-zones.conf"
62
63 # If we only have domain information then put it in search too
64 [ -z "${NEWSEARCH}" -a -z "${NEWNS}" ] && NEWSEARCH="${NEWDOMAIN}"
65
66 NEWOPTIONS="# Generated by resolvconf\n"
67 NEWZONES="${NEWOPTIONS}"
68 FORWARD=
69 for N in ${NEWSEARCH}; do
70         case "${FORWARD}" in
71                 *"\n\t${N#*,};"*);;
72                 *) FORWARD="${FORWARD}\n\t${N#*,};";;
73         esac
74 done
75 for N in ${NEWNS}; do
76         case "${FORWARD}" in
77                 *"\n\t${N};"*);;
78                 *) FORWARD="${FORWARD}\n\t${N};";;
79         esac
80 done
81 if [ -n "${FORWARD}" ]; then
82         NEWOPTIONS="${NEWOPTIONS}\nforward first;\nforwarders {${FORWARD}\n};\n"
83 fi
84
85 LASTDN=
86 ZONES=
87 for DN in $(printf "%s\n" ${NEWDOMAIN} | sort -u); do
88         case "${LASTDN}" in
89                 "${DN%,*}");;
90                 *)
91                 [ -n "${ZONES}" ] && ZONES="${NEWZONES}\n\t};\n};\n"
92                 ZONES="${ZONES}\nzone \"${DN%,*}\" {\n"
93                 ZONES="${ZONES}\ttype forward;\n"
94                 ZONES="${ZONES}\tforward first;\n"
95                 ZONES="${ZONES}\tforwarders {"
96                 ;;
97         esac
98         ZONES="${ZONES}\n\t\t${DN#*,};"
99 done
100 [ -n "${ZONES}" ] && NEWZONES="${NEWZONES}${ZONES}\n\t};\n};\n"
101
102 # No point in changing files or reloading bind if the end result has not
103 # changed
104 RELOAD="no"
105 if [ -e "${NAMEDOPTIONS}" ]; then 
106         if [ "$(cat "${NAMEDOPTIONS}")" != "$(printf "${NEWOPTIONS}")" ]; then
107                 printf "${NEWOPTIONS}" > "${NAMEDOPTIONS}"
108                 RELOAD="yes"
109         fi
110 else
111         printf "${NEWOPTIONS}" > "${NAMEDOPTIONS}"
112         RELOAD="yes"
113 fi
114 if [ -e "${NAMEDZONES}" ]; then
115         if [ "$(cat "${NAMEDZONES}")" != "$(printf "${NEWZONES}")" ]; then
116                 printf "${NEWZONES}" > "${NAMEDZONES}"
117                 RELOAD="yes"
118         fi
119 else
120         printf "${NEWZONES}" > "${NAMEDZONES}"
121         RELOAD="yes"
122 fi
123
124 [ "${RELOAD}" = "yes" ] && resolvconf -s named restart
125
126 exit 0