diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2013-11-04 10:15:17 +0000 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2013-11-04 13:00:30 +0000 |
commit | ef1b26f67837bc9402b673760238b2fda33acd4e (patch) | |
tree | 6f53cec4287ab485e953ab71d82c5d87790a00ce /main/nsd/nsd.initd | |
parent | 5e0dc63587df78566d95f57ff404639774e86dae (diff) | |
download | aports-ef1b26f67837bc9402b673760238b2fda33acd4e.tar.bz2 aports-ef1b26f67837bc9402b673760238b2fda33acd4e.tar.xz |
main/nsd: upgrade to 4.0.0
Diffstat (limited to 'main/nsd/nsd.initd')
-rw-r--r-- | main/nsd/nsd.initd | 433 |
1 files changed, 32 insertions, 401 deletions
diff --git a/main/nsd/nsd.initd b/main/nsd/nsd.initd index f400080494..5115599c6b 100644 --- a/main/nsd/nsd.initd +++ b/main/nsd/nsd.initd @@ -1,420 +1,51 @@ #!/sbin/runscript -# -# nsdc.sh -- a shell script to manage the beast -# -# Copyright (c) 2001-2006, NLnet Labs. All rights reserved. -# -# See LICENSE for the license. -# -# OpenRC conversion by Matt Smith <msmith@alpinelinux.org> -# -# +# Copyright 1999-2013 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/net-dns/nsd/files/nsd.initd,v 1.2 2013/04/03 19:10:39 wschlich Exp $ -name=nsd -daemon=/usr/sbin/${name} -initd=/etc/init.d/${name} +name="NSD" +description="NSD is an authoritative-only, high performance, open source name server" +extra_commands="configtest" -description="NSD, authoritative only high performance name server." +# these can be overridden in /etc/conf.d/nsd if necessary +NSD_CONFIG="${NSD_CONFIG:-/etc/nsd/nsd.conf}" +command="${NSD_BINARY:-/usr/sbin/nsd}" +NSD_CHECKCONF="${NSD_CHECKCONF:-/usr/sbin/nsd-checkconf}" -extra_commands="stats reload running patch rebuild update notify do_start do_stop" -description_reload="Reloads the nsd database file." -description_running="Prints message and exits nonzero if server is not running." -description_patch="Merge zone transfer changes back to zone files." -description_rebuild="Compile database file from zone files." -description_update="Try to update all slave zones hosted on this server." -description_notify="Send notify messages to all secondary servers." -description_do_start="Internal command; use 'start' instead." -description_do_stop="Internal command; use 'stop' instead." +command_args="-c ${NSD_CONFIG}" depend() { - need net - after firewall + need net + use logger } -# -# You sure heard this many times before: NO USER SERVICEABLE PARTS BELOW -# - -# see if user selects a different config file, with -c <filename> -if test "x$1" = "x-c"; then - shift - if [ -e $1 ]; then - configfile=$1 - shift - else - echo "`basename $0`: Config file "$1" does not exist." - exit 1 - fi -fi - -# locate nsd-checkconf : in sbindir, PATH, nsdc_dir or . -nsd_checkconf="" -if [ -e ${sbindir}/nsd-checkconf ]; then - nsd_checkconf=${sbindir}/nsd-checkconf -else - if which nsd-checkconf >/dev/null 2>&1 ; then - if which nsd-checkconf 2>&1 | grep "^[Nn]o " >/dev/null; then - nsd_checkconf="" - else - nsd_checkconf=`which nsd-checkconf` - fi - fi - if [ -z "${nsd_checkconf}" -a -e `dirname $0`/nsd-checkconf ]; then - nsd_checkconf=`dirname $0`/nsd-checkconf - fi - if [ -z "${nsd_checkconf}" -a -e ./nsd-checkconf ]; then - nsd_checkconf=./nsd-checkconf - fi - if [ -z "${nsd_checkconf}" ]; then - echo "`basename $0`: Could not find nsd programs" \ - "in $sbindir, in PATH=$PATH, in cwd=`pwd`," \ - "or in dir of nsdc=`dirname $0`" - exit 1 - fi -fi - -# check the config syntax before using it -${nsd_checkconf} ${configfile} -if test $? -ne 0 ; then - ${initd} describe - exit 1 -fi - -# Read some settings from the config file. -dbfile=`${nsd_checkconf} -o database ${configfile}` -pidfile=`${nsd_checkconf} -o pidfile ${configfile}` -difffile=`${nsd_checkconf} -o difffile ${configfile}` -zonesdir=`${nsd_checkconf} -o zonesdir ${configfile}` -lockfile="${dbfile}.lock" # still needed -sbindir=`dirname ${nsd_checkconf}` - -# move to zonesdir (if specified), and make absolute pathnames. -if test -n "${zonesdir}"; then - zonesdir=`dirname ${zonesdir}/.` - if echo "${zonesdir}" | grep "^[^/]" >/dev/null; then - zonesdir=`pwd`/${zonesdir} - fi - if echo "${dbfile}" | grep "^[^/]" >/dev/null; then - dbfile=${zonesdir}/${dbfile} - fi - if echo "${pidfile}" | grep "^[^/]" >/dev/null; then - pidfile=${zonesdir}/${pidfile} - fi - if echo "${lockfile}" | grep "^[^/]" >/dev/null; then - lockfile=${zonesdir}/${lockfile} - fi - if echo "${difffile}" | grep "^[^/]" >/dev/null; then - difffile=${zonesdir}/${difffile} - fi -fi - -# for bash: -C or noclobber. For tcsh: noclobber. For bourne: -C. -noclobber_set="set -C" -# ugly check for tcsh -if echo /bin/sh | grep tcsh >/dev/null; then - noclobber_set="set noclobber" -fi - -# -# useful routines -# -signal() { - if [ -s ${pidfile} ] - then - kill -"$1" `cat ${pidfile}` && return 0 - else - echo "nsd is not running" - fi - return 1 -} - -lock_file() { - (umask 222; ${noclobber_set}; echo "$$" >${lockfile}) -} - -lock() { - lock_file - if [ $? = 1 ] - then - # check if the lockfile has not gone stale - LPID=`cat ${lockfile}` - echo database locked by PID: $LPID - if kill -0 $LPID 2>/dev/null; then - exit 1 - fi - - # locking process does not exist, consider lockfile stale - echo stale lockfile, removing... && rm -f ${lockfile} && lock_file - fi - - if [ $? = 1 ] - then - echo lock failed - exit 1 - fi - return 0 -} - -unlock() { - rm -f ${lockfile} -} - -do_start() { - if test -x ${sbindir}/nsd; then - ${sbindir}/nsd -c ${configfile} - test $? = 0 || (echo "nsd startup failed."; exit 1) - else - echo "${sbindir}/nsd not an executable file, nsd startup failed."; exit 1 - fi -} - -controlled_sleep() { - if [ $1 -ge 25 ]; then - sleep 1 - fi -} - -controlled_stop() { - pid=$1 - try=1 - - while [ $try -ne 0 ]; do - if [ ${try} -gt 50 ]; then - echo "nsdc stop failed" - return 1 - else - if [ $try -eq 1 ]; then - kill -TERM ${pid} - else - kill -TERM ${pid} >/dev/null 2>&1 - fi - - # really stopped? - kill -0 ${pid} >/dev/null 2>&1 - if [ $? -eq 0 ]; then - controlled_sleep ${try} - try=`expr ${try} + 1` - else - try=0 - fi - fi - done - - return 0 -} - -do_controlled_stop() { - if [ -s ${pidfile} ]; then - pid=`cat ${pidfile}` - controlled_stop ${pid} && return 0 - else - echo "nsd is not running, starting anyway" && return 0 - fi - return 1 -} - -do_stop() { - signal "TERM" -} - -do_reload() { - signal "HUP" -} - -# send_updates zone_name {ip_spec key_spec} -send_updates() { - local zonename=$1 - shift 1 - # extract port number (if any) - port=`${nsd_checkconf} -o port ${configfile}` - if test -n "${port}"; then - port="-p ${port}" - fi - update_sent="no" - - while test $# -gt 0; do - ip_spec=$1 - key_spec=$2 - shift 2 - # only localhost is allowed. - # see if zone has 127.0.0.1 or ::1 as allowed. - if test Z${ip_spec} = "Z127.0.0.1" -o Z${ip_spec} = "Z::1"; then - secret="" - if test K${key_spec} != KNOKEY -a K${key_spec} != KBLOCKED; then - secret=`${nsd_checkconf} -s ${key_spec} ${configfile}` - algo=`${nsd_checkconf} -a ${key_spec} ${configfile}` - secret="-y ${key_spec}:${secret}:${algo}" - fi - if test K${key_spec} != KBLOCKED; then - #echo "${sbindir}/nsd-notify -a ${ip_spec} ${port} ${secret} -z ${zonename} ${ip_spec}" - ${sbindir}/nsd-notify -a ${ip_spec} ${port} ${secret} -z ${zonename} ${ip_spec} && update_sent="yes" - fi - fi - done - if test ${update_sent} = no; then - req_xfr=`${nsd_checkconf} -z "${zonename}" -o request-xfr ${configfile}` - if test -n "${req_xfr}"; then - # must be a slave zone (has request-xfr). - echo "`basename $0`: Could not send notify for slave zone ${zonename}: not configured (with allow-notify: 127.0.0.1 or ::1)" - fi - fi -} - -# send_notify zone_name ifc_spec {ip_spec key_spec} -send_notify() { - local zonename=$1 - # set local interface - ifc_spec="" - if test I$2 != INOIFC; then - ifc_spec="-a $2" - fi - shift 2 - - while test $# -gt 0; do - ip_spec=$1 - key_spec=$2 - shift 2 - secret="" - - if test K${key_spec} != KNOKEY -a K${key_spec} != KBLOCKED; then - secret=`${nsd_checkconf} -s ${key_spec} ${configfile}` - algo=`${nsd_checkconf} -a ${key_spec} ${configfile}` - secret="-y ${key_spec}:${secret}:${algo}" - fi - if test K${key_spec} != KBLOCKED; then - port="" - ipaddr=${ip_spec} - if echo ${ip_spec} | grep @ >/dev/null; then - port="-p "`echo ${ip_spec} | sed -e 's/[^@]*@\([0-9]*\)/\1/'` - ipaddr=`echo ${ip_spec} | sed -e 's/\([^@]*\)@[0-9]*/\1/'` - fi - #echo "${sbindir}/nsd-notify ${ifc_spec} ${port} ${secret} -z ${zonename} ${ipaddr}" - ${sbindir}/nsd-notify ${ifc_spec} ${port} ${secret} -z ${zonename} ${ipaddr} - fi - done -} - -# do_patch {with-textfile} -do_patch() { - if test I$1 = I1; then - lock && mv ${difffile} ${difffile}.$$ && \ - ${sbindir}/nsd-patch -c ${configfile} -x ${difffile}.$$ && \ - rm -f ${difffile}.$$ && unlock && do_rebuild - result=$? - else # without textfile - lock && mv ${difffile} ${difffile}.$$ && \ - ${sbindir}/nsd-patch -c ${configfile} -x ${difffile}.$$ -s -o ${dbfile}.$$ \ - && rm -f ${difffile}.$$ && unlock && \ - mv ${dbfile}.$$ ${dbfile} - result=$? - fi - - return ${result} -} - -do_rebuild() { - lock && \ - ${sbindir}/zonec ${ZONEC_VERBOSE} -c ${configfile} -f ${dbfile}.$$ && \ - mv ${dbfile}.$$ ${dbfile} - result=$? - unlock - [ $result != 0 ] && echo "${dbfile} is unmodified" - rm -f ${dbfile}.$$ - return ${result} -} - -start() { - ebegin "Starting ${name}" - if test -s ${pidfile} && kill -"0" `cat ${pidfile}` - then - (echo "process `cat ${pidfile}` exists, please use restart"; exit 1) - else - start-stop-daemon --start --quiet \ - --pidfile ${pidfile} \ - --exec ${initd} -- do_start - fi - eend $? -} - -stop() { - ebegin "Stopping ${name}" - start-stop-daemon --stop --quiet \ - --pidfile ${pidfile} \ - --exec ${initd} -- do_stop +configtest() { + ebegin "Checking ${SVCNAME} configuration" + checkconfig eend $? } -stats() { - signal "USR1" -} - -reload() { - do_reload -} - -running() { - signal "0" -} - -patch() { - # patch queue clearen - if test -s ${difffile}; then - #${sbindir}/nsd-patch -c ${configfile} -x ${difffile} -l #debug - #echo ${sbindir}/nsd-patch -c ${configfile} -x ${difffile} - if do_patch ${PATCH_STYLE}; then - do_reload - else - unlock - # try to move back the transfer data - if [ -e ${difffile}.$$ -a ! -e ${difffile} ]; then - mv ${difffile}.$$ ${difffile} - fi - echo "`basename $0`: patch failed." - exit 1 - fi - else - echo "`basename $0`: no patch necessary." +checkconfig() { + if ! test -e "${NSD_CONFIG}"; then + eerror "You need to create an appropriate config file." + eerror "An example can be found in /etc/nsd/nsd.conf.sample" + return 1 + elif ! "${NSD_CHECKCONF}" "${NSD_CONFIG}"; then + eerror "You have errors in your configfile (${NSD_CONFIG})" + return $? fi + return 0 } -rebuild() { - do_rebuild +start_pre() { + checkconfig || return $? + pidfile=$("${NSD_CHECKCONF}" -o pidfile "${NSD_CONFIG}") + checkpath --directory --owner nsd:nsd "${pidfile%/*}" } -update() { - # send notifies to localhost for all zones that allow it - echo "Sending notify to localhost to update secondary zones..." - if [ -s ${pidfile} ]; then - zoneslist=`${nsd_checkconf} -o zones ${configfile}` - for zonename in ${zoneslist}; do - notify_allow=`${nsd_checkconf} -z "${zonename}" -o allow-notify ${configfile}` - if test "" != "${notify_allow}"; then - send_updates ${zonename} ${notify_allow} - fi - done - else - echo "nsd is not running" - fi -} -notify() { - # send notifies to all slaves - echo "Sending notify to slave servers..." - zoneslist=`${nsd_checkconf} -o zones ${configfile}` - for zonename in ${zoneslist}; do - notify=`${nsd_checkconf} -z "${zonename}" -o notify ${configfile}` - local_ifc=`${nsd_checkconf} -z "${zonename}" -o outgoing-interface ${configfile}` - if test "" = "${local_ifc}"; then - local_ifc="NOIFC" - fi - if test "" != "${notify}"; then - for ifc in ${local_ifc}; do - send_notify ${zonename} ${ifc} ${notify} - done - fi - done +stop_pre() { + checkconfig || return $? + pidfile=$("${NSD_CHECKCONF}" -o pidfile "${NSD_CONFIG}") } -restart() { - do_controlled_stop && do_start -} |