Subversion Repositories configs

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4 - 1
#!/bin/bash
2
#
3
# named           This shell script takes care of starting and stopping
4
#                 named (BIND DNS server).
5
#
6
# chkconfig: - 13 87
7
# description: named (BIND) is a Domain Name Server (DNS) \
8
# that is used to resolve host names to IP addresses.
9
# probe: true
10
 
11
### BEGIN INIT INFO
12
# Provides: $named
13
# Required-Start: $local_fs $network $syslog
14
# Required-Stop: $local_fs $network $syslog
15
# Default-Start:
16
# Default-Stop: 0 1 2 3 4 5 6
17
# Short-Description: start|stop|status|restart|try-restart|reload|force-reload DNS server
18
# Description: control ISC BIND implementation of DNS server
19
### END INIT INFO
20
 
21
# Source function library.
22
. /etc/rc.d/init.d/functions
23
 
24
[ -r /etc/sysconfig/named ] && . /etc/sysconfig/named
25
 
26
RETVAL=0
27
export KRB5_KTNAME=${KEYTAB_FILE:-/etc/named.keytab}
28
 
29
named='named'
30
if [ -x /usr/sbin/named-sdb ]; then
31
	named='named-sdb'
32
fi
33
 
34
# Don't kill named during clean-up
35
NAMED_SHUTDOWN_TIMEOUT=${NAMED_SHUTDOWN_TIMEOUT:-25}
36
 
37
if [ -n "$ROOTDIR" ]; then
38
   ROOTDIR=`echo $ROOTDIR | sed 's#//*#/#g;s#/$##'`;
39
   rdl=`/usr/bin/readlink $ROOTDIR`;
40
   if [ -n "$rdl" ]; then
41
      ROOTDIR="$rdl";
42
   fi;
43
fi
44
 
45
PIDFILE="/var/run/named/named.pid"
46
 
47
ROOTDIR_MOUNT='/etc/named /etc/pki/dnssec-keys /var/named /etc/named.conf
48
/etc/named.dnssec.keys /etc/named.rfc1912.zones /etc/rndc.conf /etc/rndc.key
49
/usr/lib64/bind /usr/lib/bind /etc/named.iscdlv.key /etc/named.root.key'
50
 
51
mount_chroot_conf()
52
{
53
  if [ -n "$ROOTDIR" ]; then
54
    for all in $ROOTDIR_MOUNT; do
55
      # Skip nonexistant files
56
      [ -e "$all" ] || continue
57
 
58
      # If mount source is a file
59
      if ! [ -d "$all" ]; then
60
        # mount it only if it is not present in chroot or it is empty
61
        if ! [ -e "$ROOTDIR$all" ] || [ `stat -c'%s' "$ROOTDIR$all"` -eq 0 ]; then
62
          touch "$ROOTDIR$all"
63
          mount --bind "$all" "$ROOTDIR$all"
64
        fi
65
      else
66
        # Mount source is a directory. Mount it only if directory in chroot is
67
        # empty.
68
	if [ -e "$all" ] && [ `ls -1A $ROOTDIR$all | wc -l` -eq 0 ]; then
69
          mount --bind "$all" "$ROOTDIR$all"
70
	fi
71
      fi
72
    done
73
  fi
74
}
75
 
76
umount_chroot_conf()
77
{
78
  if [ -n "$ROOTDIR" ]; then
79
    for all in $ROOTDIR_MOUNT; do
80
      # Check if file is mount target. Do not use /proc/mounts because detecting
81
      # of modified mounted files can fail.
82
      if mount | grep -q '.* on '"$ROOTDIR$all"' .*'; then
83
        umount "$ROOTDIR$all"
84
        # Remove temporary created files
85
        [ -f "$all" ] && rm -f "$ROOTDIR$all"
86
      fi
87
    done
88
  fi
89
}
90
 
9 - 91
check_pidfile() {
92
  PID="`pidofproc -p "$ROOTDIR$PIDFILE" "$named"`"
93
  if [ -n "$PID" ] && [ "`ps -p "$PID" --no-headers -o comm`" != "$named" ]; then
94
    rm -f $ROOTDIR$PIDFILE &> /dev/null
95
  fi
96
}
97
 
4 - 98
pidofnamed() {
9 - 99
	pidofproc -p "$ROOTDIR$PIDFILE" "$named";
4 - 100
}
101
 
102
# Check if all what named needs running
103
start()
104
{
105
  [ "$EUID" != "0" ] && exit 4
106
 
107
  # Source networking configuration.
108
  [ -r /etc/sysconfig/network ] && . /etc/sysconfig/network
109
 
110
  # Check that networking is up
111
  [ "${NETWORKING}" = "no" ] && exit 1
112
 
113
 
114
  [ -x /usr/sbin/"$named" ] || exit 5
115
 
9 - 116
  if [ ! -s /etc/rndc.key -a ! -s /etc/rndc.conf ]; then
117
    # Generate rndc.key if doesn't exist AND there is no rndc.conf
4 - 118
    echo -n $"Generating /etc/rndc.key:"
9 - 119
    if /usr/sbin/rndc-confgen -a -r /dev/urandom > /dev/null 2>&1; then
4 - 120
      chmod 640 /etc/rndc.key
121
      chown root.named /etc/rndc.key
122
      [ -x /sbin/restorecon ] && /sbin/restorecon /etc/rndc.key
123
      success $"/etc/rndc.key generation"
124
      echo
125
    else
126
      failure $"/etc/rndc.key generation"
127
      echo
128
    fi
129
  fi
130
 
131
  # Handle -c option
132
  previous_option='unspecified';
133
  for a in $OPTIONS; do
134
    if [ $previous_option = '-c' ]; then
135
      named_conf=$a;
136
    fi;
137
    previous_option=$a;
138
  done;
139
 
140
  named_conf=${named_conf:-/etc/named.conf};
141
 
9 - 142
  # check if named is running before mounting files/dirs
143
  echo -n $"Starting named: "
144
  check_pidfile
145
  if [ -n "`pidofnamed`" ]; then
146
    echo -n $"named: already running"
147
    success
148
    echo
149
    exit 0;
150
  fi;
151
 
4 - 152
  mount_chroot_conf
153
 
154
  if [ ! -r $ROOTDIR$named_conf ]; then
155
    echo 'Cannot find configuration file. You could create it by system-config-bind'
156
    exit 6;
157
  fi;
158
 
159
  [ -x /sbin/portrelease ] && /sbin/portrelease named &>/dev/null || :
160
 
161
  if ! [ "$DISABLE_ZONE_CHECKING" = yes ]; then
162
    ckcf_options='-z'; # enable named-checkzone for each zone (9.3.1+) !
163
  fi;
164
 
165
  if [ -n "${ROOTDIR}" -a "x${ROOTDIR}" != "x/" ]; then
166
    OPTIONS="${OPTIONS} -t ${ROOTDIR}"
167
    ckcf_options="$ckcf_options -t ${ROOTDIR}";
168
    [ -s /etc/localtime ] && cp -fp /etc/localtime ${ROOTDIR}/etc/localtime;
169
  fi
170
 
171
  RETVAL=0
172
  # check if configuration is correct
173
  if [ -x /usr/sbin/named-checkconf ] && [ -x /usr/sbin/named-checkzone ] && /usr/sbin/named-checkconf $ckcf_options ${named_conf} >/dev/null 2>&1; then
174
 
9 - 175
    daemon --pidfile "$ROOTDIR$PIDFILE" /usr/sbin/"$named" -u named ${OPTIONS};
4 - 176
    RETVAL=$?
177
    if [ $RETVAL -eq 0 ]; then
178
      rm -f /var/run/{named,named-sdb}.pid;
9 - 179
      ln -s "$ROOTDIR$PIDFILE" /var/run/"$named".pid;
4 - 180
    fi;
181
 
182
  else
183
    named_err="`/usr/sbin/named-checkconf $ckcf_options $named_conf 2>&1`";
184
    echo
185
    echo "Error in named configuration:";
186
    echo "$named_err";
187
    failure
188
    echo
189
    [ -x /usr/bin/logger ] && echo "$named_err" | /usr/bin/logger -pdaemon.error -tnamed;
190
    umount_chroot_conf
191
    exit 2;
192
  fi;
193
  echo
194
  if [ $RETVAL -eq 0 ]; then
195
    touch /var/lock/subsys/named;
196
  else
197
    umount_chroot_conf
198
    exit 7;
199
  fi
200
  return 0;
201
}
202
 
203
stop() {
204
  [ "$EUID" != "0" ] && exit 4
205
 
206
  # Stop daemons.
207
  echo -n $"Stopping named: "
9 - 208
  check_pidfile
4 - 209
  [ -x /usr/sbin/rndc ] && /usr/sbin/rndc stop >/dev/null 2>&1;
210
  RETVAL=$?
211
  # was rndc successful?
212
  [ "$RETVAL" -eq 0 ] || \
9 - 213
    killproc -p "$ROOTDIR$PIDFILE" "$named" -TERM >/dev/null 2>&1
4 - 214
 
215
  timeout=0
216
  RETVAL=0
217
  while pidofnamed &>/dev/null; do
218
    if [ $timeout -ge $NAMED_SHUTDOWN_TIMEOUT ]; then
219
      RETVAL=1
220
      break
221
    else
222
      sleep 2 && echo -n "."
223
      timeout=$((timeout+2))
224
    fi;
225
  done
226
 
227
  umount_chroot_conf
228
 
229
  # remove pid files
230
  if [ $RETVAL -eq 0 ]; then
231
    rm -f /var/lock/subsys/named
232
    rm -f /var/run/{named,named-sdb}.pid
233
  fi;
234
 
235
  if [ $RETVAL -eq 0 ]; then
236
    success
237
  else
238
    failure
239
    RETVAL=1
240
  fi;
241
  echo
242
  return $RETVAL
243
}
244
 
245
 
246
rhstatus() {
247
  [ -x /usr/sbin/rndc ] && /usr/sbin/rndc status;
9 - 248
  check_pidfile
249
  status -p "$ROOTDIR$PIDFILE" -l named /usr/sbin/"$named";
4 - 250
  return $?
251
}
9 - 252
 
4 - 253
restart() {
254
	stop
255
	start
9 - 256
}
257
 
4 - 258
reload() {
259
        [ "$EUID" != "0" ] && exit
260
 
261
        echo -n $"Reloading "$named": "
9 - 262
	check_pidfile
4 - 263
	p=`pidofnamed`
264
	RETVAL=$?
265
	if [ "$RETVAL" -eq 0 ]; then
266
	    /usr/sbin/rndc reload >/dev/null 2>&1 || /bin/kill -HUP $p;
267
	    RETVAL=$?
268
        fi
269
	[ "$RETVAL" -eq 0 ] && success $"$named reload" || failure $"$named reload"
270
        echo
271
	return $RETVAL
272
}
273
 
274
checkconfig() {
275
	ckcf_options='-z';
276
	if [ -n "${ROOTDIR}" -a "x${ROOTDIR}" != "x/" ]; then
277
		ckcf_options="$ckcf_options -t ${ROOTDIR}";
9 - 278
		if ! [ -e "$ROOTDIR/$PIDFILE" ]; then
279
			mount_chroot_conf
280
		fi
4 - 281
	fi;
282
	if [ -x /usr/sbin/named-checkconf ] && [ -x /usr/sbin/named-checkzone ] && /usr/sbin/named-checkconf $ckcf_options ${named_conf} ; then
9 - 283
		RETVAL=0
4 - 284
	else
9 - 285
		RETVAL=1
286
	fi
287
	if ! [ -e "$ROOTDIR/$PIDFILE" ]; then
4 - 288
		umount_chroot_conf
289
	fi
9 - 290
	return $RETVAL
4 - 291
}
292
 
293
# See how we were called.
294
case "$1" in
295
	start)
296
		start
297
		;;
298
	stop)
299
		stop
300
		;;
301
	status)
302
		rhstatus;
303
		RETVAL=$?
304
		;;
305
	restart)
306
		restart
307
		;;
308
	condrestart|try-restart)
309
		if [ -e /var/lock/subsys/named ]; then restart; fi
310
                ;;
311
	reload)
312
		reload
313
		;;
314
	force-reload)
315
		if ! reload; then restart; fi
316
		;;
317
	checkconfig|configtest|check|test)
318
		checkconfig
9 - 319
		RETVAL=$?
4 - 320
		;;
321
	*)
322
        	echo $"Usage: $0 {start|stop|status|restart|try-restart|reload|force-reload}"
323
		[ "x$1" = "x" ] && exit 0
324
		exit 2
325
esac
326
 
327
exit $RETVAL
328