#!/bin/sh # Start/stop/restart the BIND name server daemon (named). # Start BIND. In the past it was more secure to run BIND as a non-root # user (for example, with '-u daemon'), but the modern version of BIND # knows how to use the kernel's capability mechanism to drop all root # privileges except the ability to bind() to a privileged port and set # process resource limits, so running as a non-root user is not needed. # But if you want to run as a non-root user anyway, the command options # can be set like this in /etc/default/named: # NAMED_OPTIONS="-u daemon" # So you will not have to edit this script. # # Please note that if you run BIND as a non-root user, your files in # /var/named may need to be chowned to this user or else named will # refuse to start. # You might also consider running BIND in a "chroot jail", # a discussion of which may be found in # /usr/doc/Linux-HOWTOs/Chroot-BIND-HOWTO. # One last note: rndc has a lot of other nice features that it is not # within the scope of this start/stop/restart script to support. # For more details, see "man rndc" or just type "rndc" to see the options. # Load command defaults: if [ -f /etc/default/named ] ; then . /etc/default/named ; fi if [ -f /etc/default/rndc ] ; then . /etc/default/rndc ; fi # Sanity check. If /usr/sbin/named is missing then it # doesn't make much sense to try to run this script: if [ ! -x /usr/sbin/named ]; then echo "/etc/rc.d/rc.bind: no /usr/sbin/named found (or not executable); cannot start." exit 1 fi # Function to find the user BIND is running as in $NAMED_OPTIONS: find_bind_user() { if echo $NAMED_OPTIONS | grep -wq "\-u" ; then unset BIND_USER USER_FOUND echo $NAMED_OPTIONS | tr ' ' '\n' | while read element ; do if [ "$USER_FOUND" = "true" ]; then BIND_USER="$element" echo $BIND_USER break elif [ "$element" = "-u" ]; then USER_FOUND="true" fi done else echo "root" fi } # Start BIND. As many times as you like. ;-) # Seriously, don't run "rc.bind start" if BIND is already # running or you'll get more than one copy running. bind_start() { # If we are running as a non-root user, we'll need to be sure that # /var/run/named exists, and /var/run/named is chowned properly to # that user. Your files in /var/named may need to be chowned as # well, but that will be up to the sysadmin to do. BIND_USER="$(find_bind_user)" if [ ! "$BIND_USER" = "root" ]; then mkdir -p /var/run/named chown -R $BIND_USER /var/run/named else # prevent error if switching back to running as root: chown -R root /var/run/named fi if [ -x /usr/sbin/named ]; then echo "Starting BIND: /usr/sbin/named $NAMED_OPTIONS" /usr/sbin/named $NAMED_OPTIONS sleep 1 fi if ! ps axc | grep -q named ; then echo "WARNING: named did not start." echo "Attempting to start named again: /usr/sbin/named $NAMED_OPTIONS" /usr/sbin/named $NAMED_OPTIONS sleep 1 if ps axc | grep -q named ; then echo "SUCCESS: named started." else echo "FAILED: Sorry, a second attempt to start named has also failed." echo "There may be a configuration error that needs fixing. Good luck!" fi fi } # Stop all running copies of BIND (/usr/sbin/named): bind_stop() { echo "Stopping BIND: /usr/sbin/rndc $RDNC_OPTIONS stop" /usr/sbin/rndc $RDNC_OPTIONS stop # A problem with using "/usr/sbin/rndc stop" is that if you # managed to get multiple copies of named running it will # only stop one of them and then can't stop the others even # if you run it again. So, after doing things the nice way # we'll do them the old-fashioned way. If you don't like # it you can comment it out, but unless you have a lot of # other programs you run called "named" this is unlikely # to have any ill effects: sleep 1 if ps axc | grep -q named ; then echo "Using "killall named" on additional BIND processes..." /bin/killall named 2> /dev/null fi } # Reload BIND: bind_reload() { /usr/sbin/rndc $RDNC_OPTIONS reload } # Restart BIND: bind_restart() { bind_stop bind_start } # Get BIND status: bind_status() { /usr/sbin/rndc $RDNC_OPTIONS status } case "$1" in 'start') bind_start ;; 'stop') bind_stop ;; 'reload') bind_reload ;; 'restart') bind_restart ;; 'status') bind_status ;; *) echo "usage $0 start|stop|reload|restart|status" esac