#!/sbin/runscript # Copyright 1999-2010 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: /var/cvsroot/gentoo-x86/net-dns/bind/files/named.init-r8,v 1.3 2010/10/24 20:47:17 idl0r Exp $ opts="start stop reload restart" depend() { need net use logger provide dns } NAMED_CONF=${CHROOT}/etc/bind/named.conf _mount() { local from local to local opts if [ "${#}" -lt 3 ]; then eerror "_mount(): to few arguments" return 1 fi from=$1 to=$2 shift 2 opts="${*}" shift $# if [ -z "$(grep ${to} /proc/mounts)" ]; then einfo "mounting ${from} to ${to}" mount ${from} ${to} ${opts} || return 1 fi } _umount() { local dir=$1 if [ -n "$(grep ${dir} /proc/mounts)" ]; then einfo "umount ${dir}" umount ${dir} fi } check_chroot() { if [ -n "${CHROOT}" ]; then [ ! -d "${CHROOT}" ] && return 1 [ ! -d "${CHROOT}/dev" ] || [ ! -d "${CHROOT}/etc" ] || [ ! -d "${CHROOT}/var" ] && return 1 [ ! -d "${CHROOT}/var/run" ] || [ ! -d "${CHROOT}/var/log" ] && return 1 [ ! -d "${CHROOT}/etc/bind" ] || [ ! -d "${CHROOT}/var/bind" ] && return 1 [ ! -d "${CHROOT}/var/log/named" ] && return 1 [ ! -e "${CHROOT}/etc/localtime" ] && return 1 [ ! -c "${CHROOT}/dev/null" ] || [ ! -c "${CHROOT}/dev/zero" ] && return 1 [ ! -c "${CHROOT}/dev/random" ] && [ ! -c "${CHROOT}/dev/urandom" ] && return 1 fi return 0 } checkconfig() { if [ ! -f "${NAMED_CONF}" ] ; then eerror "No ${NAMED_CONF} file exists!" fi named-checkconf -z -j ${CHROOT:+-t} ${CHROOT} ${NAMED_CONF/${CHROOT}} 1>/dev/null || { eerror "named-checkconf failed! Please fix your config first." return 1 } # as suggested in bug #107724 [ -n "${PIDFILE}" ] || PIDFILE=${CHROOT}$(\ egrep -v \ "^([[:cntrl:] ]+(#|//|/\*)|(#|//|/\*))" \ ${CHROOT}/etc/bind/named.conf \ | egrep -o -m1 "pid\-file +\".+\" *;" \ | cut -d\" -f2 ) [ -z "${PIDFILE}" ] && PIDFILE=${CHROOT}/var/run/named/named.pid return 0 } start() { local piddir ebegin "Starting ${CHROOT:+chrooted }named" if [ -n "${CHROOT}" ]; then check_chroot || { eend 1 eerror "Your chroot dir ${CHROOT} is inconsistent, please run 'emerge --config net-dns/bind' first" return 1 } if [ "${CHROOT_NOMOUNT:-0}" -eq 0 ]; then einfo "Mounting chroot dirs" _mount /etc/bind ${CHROOT}/etc/bind -o bind _mount /var/bind ${CHROOT}/var/bind -o bind _mount /var/log/named ${CHROOT}/var/log/named -o bind fi fi checkconfig || { eend 1 return 1 } # create piddir (usually /var/run/named) if necessary piddir="${PIDFILE%/*}" if [ ! -d "${piddir}" ]; then checkpath -q -d -o root:named -m 0770 "${piddir}" || { eend 1 return 1 } fi # In case someone have $CPU set in /etc/conf.d/named if [ -n "${CPU}" ] && [ "${CPU}" -gt 0 ]; then CPU="-n ${CPU}" fi start-stop-daemon --start --pidfile ${PIDFILE} \ --nicelevel ${NAMED_NICELEVEL:-0} \ --exec /usr/sbin/named \ -- -u named ${CPU} ${OPTIONS} ${CHROOT:+-t} ${CHROOT} eend $? } stop() { local reported=0 ebegin "Stopping ${CHROOT:+chrooted }named" checkconfig || return 2 if [ -n "${RNDC_KEY}" ] && [ -f "${RNDC_KEY}" ]; then rndc $SERVER -k $RNDC_KEY stop 1>/dev/null else # -R 10, bug 335398 start-stop-daemon --stop --retry 10 --pidfile $PIDFILE \ --exec /usr/sbin/named fi if [ -n "${CHROOT}" ] && [ "${CHROOT_NOMOUNT:-0}" -eq 0 ]; then einfo "Umounting chroot dirs" # just to be sure everything gets clean while [ -n "$(fuser ${CHROOT} 2>/dev/null)" ]; do if [ "${reported}" -eq 0 ]; then einfo "Waiting until all named processes are stopped" reported=1 fi sleep 1 done _umount ${CHROOT}/etc/bind _umount ${CHROOT}/var/log/named _umount ${CHROOT}/var/bind fi eend $? } reload() { local ret # checkconf also gives us the pidfile. checkconfig || return 3 ebegin "Reloading named.conf and zone files" if [ -n "${RNDC_KEY}" ] && [ -f "${RNDC_KEY}" ] ; then rndc $SERVER -k $RNDC_KEY reload 1>/dev/null ret=$? elif [ -n "${PIDFILE}" ]; then # FIXME: Remove --stop and --oknodo as soon as baselayout-1 has been removed... finally... start-stop-daemon --stop --oknodo --pidfile $PIDFILE --signal HUP --exec /usr/sbin/named ret=$? else ewarn "Neither an rndc key has been specified nor a pidfile... this is" ewarn "a fallback mode. Please check your installation!" $RC_SERVICE restart ret=$? fi eend $ret }