From e9042b6355f6502f30f5d4b8dbf61cf01a2fd3ee Mon Sep 17 00:00:00 2001 From: Adam Tkac Date: Thu, 14 Jun 2007 15:13:02 +0000 Subject: - major changes in initscript. Could be LSB compatible - removed caching-nameserver subpackage and move configfiles from there into main bind package as default configuration - major changes in default configuration --- named.init | 377 ++++++++++++++++++++++++++++--------------------------------- 1 file changed, 174 insertions(+), 203 deletions(-) (limited to 'named.init') diff --git a/named.init b/named.init index 06c0561..8c3176e 100755 --- a/named.init +++ b/named.init @@ -8,17 +8,22 @@ # that is used to resolve host names to IP addresses. # probe: true +# Return codes +# - script (all except status command) +# - 2 invalid or excess argument(s) +# - 3 unimplemented feature (for example, "reload") +# - 4 user had insufficient privilege +# - 5 program is not installed +# - 6 program is not configured +# - 7 program is not running + # Source function library. . /etc/rc.d/init.d/functions -# Source networking configuration. -[ -r /etc/sysconfig/network ] && . /etc/sysconfig/network - -# Check that networking is up. -[ "${NETWORKING}" = "no" ] && exit 1 - [ -r /etc/sysconfig/named ] && . /etc/sysconfig/named +RETVAL=0 + # Don't kill named during clean-up NAMED_SHUTDOWN_TIMEOUT=${NAMED_SHUTDOWN_TIMEOUT:-100} @@ -30,191 +35,180 @@ if [ -n "$ROOTDIR" ]; then fi; fi -RETVAL=0 +# Run SDB backend? named='named' -if [[ "$ENABLE_SDB" = [yY1]* ]] && [ -x /usr/sbin/named_sdb ]; then - named='named_sdb'; +if `echo "$ENABLE_SDB" | grep -q ^[yY1].*`; then + named='named_sdb'; fi; -prog=$named -[ -x /usr/sbin/$named ] || exit 1 +# Manage forwarders through D-BUS? +for a in $OPTIONS; do + if [ $a = "-D" ]; then + dbusEnabled=1; + fi; +done +if [ -z $dbusEnabled ] && [ -z "$DISABLE_NAMED_DBUS" ] ; then + for l in 0 1 2 3 4 5 6; do + if /sbin/chkconfig --level=$l NetworkManager >/dev/null 2>&1; then + dbusEnabled=1; + fi; + done + [ -z $NetworkManagerEnabled ] || OPTIONS="$OPTIONS -D"; +fi; -nmdcOption() -{ let i=0; - for a in $*; - do ((++i)); - if [ $a = -c ]; then - ((++i)); - eval 'echo $'$i; - elif [[ $a = -c* ]]; then - echo ${a#-c}; - fi; - done; -} +# Check if all what named needs running +start() +{ + # Source networking configuration. + [ -r /etc/sysconfig/network ] && . /etc/sysconfig/network -named_c_option=`nmdcOption $OPTIONS`; -named_conf=${named_c_option:-/etc/named.conf}; + # Check that networking is up + [ "${NETWORKING}" = "no" ] && exit 1 -if [ ! -r ${ROOTDIR}${named_conf} ] ; then - if [ -z "$named_c_option" ] && [ -r ${ROOTDIR}/etc/named.caching-nameserver.conf ]; then - named_conf='/etc/named.caching-nameserver.conf'; - OPTIONS="$OPTIONS -c ${named_conf}"; - else - echo Locating $ROOTDIR/${named_conf} failed. - echo $"I can't find any configuration file. You can create it by system-config-bind" - echo $"or install caching-nameserver." - failure - echo; - exit 1; - fi; -fi; -dbusEnabled=0; -for a in $OPTIONS; do - if [ $a = "-D" ]; then - dbusEnabled=1; + [ -x /usr/sbin/$named ] || exit 5 + + # Handle -c option + previous_option='unspecified'; + for a in $OPTIONS; do + if [ $previous_option = '-c' ]; then + named_conf=$a; fi; -done + previous_option=$a; + done; -if [ $dbusEnabled -eq 0 ] && [ -z "$DISABLE_NAMED_DBUS" ] ; then - NetworkManagerEnabled=0 - for l in 0 1 2 3 4 5 6; do - if /sbin/chkconfig --level=$l NetworkManager >/dev/null 2>&1; then - NetworkManagerEnabled=1; - fi; - done - if [ $NetworkManagerEnabled -eq 1 ]; then - OPTIONS="$OPTIONS -D"; + named_conf=${named_conf:-/etc/named.conf}; + + if [ ! -r $named_conf ]; then + echo 'Cannot find configuration file. You could create it by system-config-bind' + exit 6; + fi; + + # all pre-start is done, lets start named + echo -n $"Starting $named: " + if [ -n "`/sbin/pidof -o %PPID $named`" ]; then + echo -n $"$named: already running" + failure + echo + exit 1; + fi; + + ckcf_options='-z'; # enable named-checkzone for each zone (9.3.1+) ! + if [ -n "${ROOTDIR}" -a "x${ROOTDIR}" != "x/" ]; then + OPTIONS="${OPTIONS} -t ${ROOTDIR}" + ckcf_options="$ckcf_options -t ${ROOTDIR}"; + [ -s /etc/localtime ] && cp -fp /etc/localtime ${ROOTDIR}/etc/localtime; + [ -d ${ROOTDIR}/proc ] || mkdir -p ${ROOTDIR}/proc; + if ! egrep -q '^/proc[[:space:]]+'${ROOTDIR}'/proc' /proc/mounts; then + mount --bind -n /proc ${ROOTDIR}/proc >/dev/null 2>&1; + fi + if [ ! -z $dbusEnabled ]; then + if ! egrep -q '^/[^[:space:]]+[[:space:]]+'${ROOTDIR}'/var/run/dbus' /proc/mounts; then + mkdir -p ${ROOTDIR}/var/run/dbus + [ -d /var/run/dbus ] || mkdir -p /var/run/dbus; + mount --bind -n /var/run/dbus ${ROOTDIR}/var/run/dbus > /dev/null 2>&1; + fi; fi; - dbusEnabled=1; -fi + fi -start() { - # Start daemons. - echo -n $"Starting $named: " - if [ -n "`/sbin/pidof -o %PPID $named`" ]; then - echo -n $"$named: already running" - failure - echo - return 1 - fi - ckcf_options='-z'; # enable named-checkzone for each zone (9.3.1+) ! - if [ -n "${ROOTDIR}" -a "x${ROOTDIR}" != "x/" ]; then - OPTIONS="${OPTIONS} -t ${ROOTDIR}" - ckcf_options="$ckcf_options -t ${ROOTDIR}"; - if [ -s /etc/localtime ]; then - cp -fp /etc/localtime ${ROOTDIR}/etc/localtime - fi; - if [ ! -d ${ROOTDIR}/proc ]; then - mkdir -p ${ROOTDIR}/proc - fi - if ! egrep -q '^/proc[[:space:]]+'${ROOTDIR}'/proc' /proc/mounts; then - mount --bind -n /proc ${ROOTDIR}/proc >/dev/null 2>&1 - fi - if [ $dbusEnabled -eq 1 ]; then - if ! egrep -q '^/[^[:space:]]+[[:space:]]+'${ROOTDIR}'/var/run/dbus' /proc/mounts; then - mkdir -p ${ROOTDIR}/var/run/dbus - if [ ! -d /var/run/dbus ] ; then - mkdir -p /var/run/dbus ; - fi; - mount --bind -n /var/run/dbus ${ROOTDIR}/var/run/dbus > /dev/null 2>&1; - fi; - fi; - fi + RETVAL=0 + # check if configuration is correct + if [ -x /usr/sbin/named-checkconf ] && [ -x /usr/sbin/named-checkzone ] && /usr/sbin/named-checkconf $ckcf_options ${named_conf} >/dev/null 2>&1; then - conf_ok=0; - if [ -x /usr/sbin/named-checkconf ] && [ -x /usr/sbin/named-checkzone ] && /usr/sbin/named-checkconf $ckcf_options ${named_conf} >/dev/null 2>&1; then - conf_ok=1; - else - RETVAL=$?; - fi - if [ $conf_ok -eq 1 ]; then - daemon /usr/sbin/$named -u named ${OPTIONS}; - RETVAL=$?; - if [ $RETVAL -eq 0 ]; then - rm -f /var/run/named.pid - rm -f /var/run/named_sdb.pid 2>/dev/null - ln -s $ROOTDIR/var/run/named/named.pid /var/run/named.pid; - if [ "$named" = "named_sdb" ]; then - ln -s $ROOTDIR/var/run/named/named.pid /var/run/named_sdb.pid; - fi; - fi; - if [ -n "`/sbin/pidof -o %PPID $named`" ]; then - # Verify that named actually started (JM 2006-10-04) - if [ ! -e $ROOTDIR/var/run/named/named.pid ]; then - # If there is not a file containing the PID of the now running named daemon then create it (JM 2006-10-04) - echo `/sbin/pidof -o %PPID $named` > $ROOTDIR/var/run/named/named.pid; - if [ "$named" = "named_sdb" ]; then - echo `/sbin/pidof -o %PPID $named` > $ROOTDIR/var/run/named/named_sdb.pid; - fi; - fi; - fi; - else - named_err="`/usr/sbin/named-checkconf $ckcf_options $named_conf 2>&1`"; - echo - echo $"Error in named configuration"':'; - echo "$named_err"; - failure - echo - if [ -x /usr/bin/logger ]; then - echo "$named_err" | /usr/bin/logger -pdaemon.error -tnamed - fi; - return $RETVAL; - fi; - [ $RETVAL -eq 0 ] && touch /var/lock/subsys/named - echo - return $RETVAL + daemon /usr/sbin/$named -u named ${OPTIONS}; + RETVAL=$? + if [ $RETVAL -eq 0 ]; then + rm -f /var/run/named.pid; + rm -f /var/run/named_sdb.pid; + ln -s $ROOTDIR/var/run/named/named.pid /var/run/named.pid; + [ "$named" = "named_sdb" ] && ln -s $ROOTDIR/var/run/named/named.pid /var/run/named_sdb.pid; + fi; + + if [ -n "`/sbin/pidof -o %PPID $named`" ]; then + # Verify that named actually started (JM 2006-10-04) + if [ ! -e $ROOTDIR/var/run/named/named.pid ]; then + # If there is not a file containing the PID of the now running named daemon then create it (JM 2006-10-04) + echo `/sbin/pidof -o %PPID $named` > $ROOTDIR/var/run/named/named.pid; + [ "$named" = "named_sdb" ] && echo `/sbin/pidof -o %PPID $named` > $ROOTDIR/var/run/named/named_sdb.pid; + fi; + fi; + else + named_err="`/usr/sbin/named-checkconf $ckcf_options $named_conf 2>&1`"; + echo + echo "Error in named configuration:"; + echo "$named_err"; + failure + echo + [ -x /usr/bin/logger ] && echo "$named_err" | /usr/bin/logger -pdaemon.error -tnamed; + exit 2; + fi; + if [ $RETVAL -eq 0 ]; then + touch /var/lock/subsys/named; + else + exit 7; + fi + echo + return 0; } + stop() { - # Stop daemons. - echo -n $"Stopping $named: " - /usr/sbin/rndc stop >/dev/null 2>&1 - RETVAL=$? - # is it still here? - if /sbin/pidof -o %PPID $named >/dev/null; then - timeout=0 - while : ; do - if /sbin/pidof -o %PPID $named >/dev/null; then - if [ $timeout -ge $NAMED_SHUTDOWN_TIMEOUT ]; then - killproc $named -TERM >/dev/null 2>&1 - RETVAL=$? - echo $"no response, killing with -TERM " - break - else - sleep 2 && echo -n "." - timeout=$((timeout+2)) - fi; - else - break - fi; - done - fi; - if [ $RETVAL -eq 0 ]; then - rm -f /var/lock/subsys/named - rm -f /var/run/named.pid - rm -f /var/run/named_sdb.pid 2>/dev/null - fi; - if [ -n "${ROOTDIR}" -a "x${ROOTDIR}" != "x/" ]; then - if egrep -q '^/proc[[:space:]]+'${ROOTDIR}'/proc' /proc/mounts; then - umount ${ROOTDIR}/proc >/dev/null 2>&1 - fi - if [ $dbusEnabled -eq 1 ]; then - if egrep -q '^/[^[:space:]]+[[:space:]]+'${ROOTDIR}'/var/run/dbus' /proc/mounts; then - umount ${ROOTDIR}/var/run/dbus > /dev/null 2>&1 - fi; - fi; - fi; - if [ $RETVAL -eq 0 ]; then - success - else - failure + # Stop daemons. + echo -n $"Stopping $named: " + [ -x /usr/sbin/rndc ] && /usr/sbin/rndc stop >/dev/null 2>&1; + RETVAL=$? + # is it still here? + if /sbin/pidof -o %PPID $named >/dev/null; then + timeout=0 + while : ; do + if /sbin/pidof -o %PPID $named >/dev/null; then + if [ $timeout -ge $NAMED_SHUTDOWN_TIMEOUT ]; then + killproc $named -TERM >/dev/null 2>&1 + RETVAL=$? + echo $"no response, killing with -TERM " + break + else + sleep 2 && echo -n "." + timeout=$((timeout+2)) fi; - echo - return $RETVAL + else + break + fi; + done + fi; + + # remove pid files + if [ $RETVAL -eq 0 ]; then + rm -f /var/lock/subsys/named + rm -f /var/run/named.pid + rm -f /var/run/named_sdb.pid + fi; + + # unmount mounted filesystems/directories + if [ -n "${ROOTDIR}" -a "x${ROOTDIR}" != "x/" ]; then + if egrep -q '^/proc[[:space:]]+'${ROOTDIR}'/proc' /proc/mounts; then + umount ${ROOTDIR}/proc >/dev/null 2>&1 + fi + if [ ! -z $dbusEnabled ]; then + if egrep -q '^/[^[:space:]]+[[:space:]]+'${ROOTDIR}'/var/run/dbus' /proc/mounts; then + umount ${ROOTDIR}/var/run/dbus > /dev/null 2>&1 + fi; + fi; + fi; + if [ $RETVAL -eq 0 ]; then + success + else + failure + RETVAL=1 + fi; + echo + return $RETVAL } + + rhstatus() { - /usr/sbin/rndc status - return $? + [ -x /usr/sbin/rndc ] && /usr/sbin/rndc status; + status /usr/bin/$named; + return $? } restart() { stop @@ -231,25 +225,7 @@ reload() { fi [ "$RETVAL" -eq 0 ] && success $"$named reload" || failure $"$named reload" echo - return $? -} -probe() { - # named knows how to reload intelligently; we don't want linuxconf - # to offer to restart every time - /usr/sbin/rndc reload >/dev/null 2>&1 || echo start - return $? -} -checkconfig() { - ckcf_options='-z'; # enable named-checkzone for each zone (9.3.1+) ! - if [ -n "${ROOTDIR}" -a "x${ROOTDIR}" != "x/" ]; then - OPTIONS="${OPTIONS} -t ${ROOTDIR}" - ckcf_options="$ckcf_options -t ${ROOTDIR}"; - fi; - if [ -x /usr/sbin/named-checkconf ] && [ -x /usr/sbin/named-checkzone ] && /usr/sbin/named-checkconf $ckcf_options ${named_conf} | cat ; then - return 0; - else - return 1; - fi + return $RETVAL } # See how we were called. @@ -261,7 +237,8 @@ case "$1" in stop ;; status) - rhstatus + rhstatus; + RETVAL=$? ;; restart) restart @@ -272,16 +249,10 @@ case "$1" in reload) reload ;; - probe) - probe - ;; - checkconfig|configtest|check|test) - checkconfig - ;; *) - echo $"Usage: $0 {start|stop|status|restart|condrestart|reload|probe}" - exit 1 + echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}" + exit 3 esac -exit $? +exit $RETVAL -- cgit