ports/176156: Add multi-instance support to NSD rc script

Darren Pilgrim darren.pilgrim at gmail.com
Fri Feb 15 05:20:00 UTC 2013


>Number:         176156
>Category:       ports
>Synopsis:       Add multi-instance support to NSD rc script
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Fri Feb 15 05:20:00 UTC 2013
>Closed-Date:
>Last-Modified:
>Originator:     Darren Pilgrim
>Release:        
>Organization:
>Environment:
>Description:
NSD 3.x can run multiple instances by specifying alternate config files via the -c command-line parameter.  The attached patch alters the RC script such that the config file chosen depends on the name of the RC script invoked.  This lets you add instances by creating symlinks to the RC script.  The same approach is used with ISC DHCPD to run the separate v4 and v6 instances.  The pattern is ${LOCAL_BASE}/etc/rc.d/foo tells NSD to use /usr/local/etc/nsd/foo.conf.  This does not change the default behaviour.

>How-To-Repeat:

>Fix:


Patch attached with submission follows:

--- files/nsd.in.orig	2012-02-21 15:26:18.452254011 -0800
+++ files/nsd.in	2012-09-09 06:11:14.075501163 -0700
@@ -14,45 +14,71 @@
 
 . /etc/rc.subr
 
-name=nsd
-rcvar=nsd_enable
+case $0 in
+/etc/rc*)
+	# during boot (shutdown) $0 is /etc/rc (/etc/rc.shutdown),
+	# so get the name of the script from $_file
+	name=$_file
+	;;
+*)
+	name=$0
+	;;
+esac
 
-required_files=%%PREFIX%%/etc/nsd/nsd.conf
+name=${name##*/}
 
-command=%%PREFIX%%/sbin/nsdc
-command_args="start"
-pidfile=`%%PREFIX%%/sbin/nsd-checkconf -o pidfile %%PREFIX%%/etc/nsd/nsd.conf`
-procname=%%PREFIX%%/sbin/${name}
+rcvar=${name}_enable
 
 load_rc_config ${name}
 
-nsd_enable=${nsd_enable-"NO"}
+eval ": \${${name}_conf:=\"%%PREFIX%%/etc/nsd/${name}.conf\"}"
+eval "_conf=\${${name}_conf}"
+
+command=%%PREFIX%%/sbin/nsdc
+procname=%%PREFIX%%/sbin/nsd
+
+required_files=${_conf}
+pidfile=`%%PREFIX%%/sbin/nsd-checkconf -o pidfile ${_conf}`
+
+extra_commands="notify patch rebuild reload update"
 
-extra_commands="reload"
-start_precmd="nsd_precmd"
-reload_cmd="nsd_reload"
-stop_cmd="nsd_stop"
+notify_cmd="nsd_nsdc_cmd notify"
+patch_cmd="nsd_nsdc_cmd patch"
+rebuild_cmd="nsd_nsdc_cmd rebuild"
+reload_cmd="nsd_reload_cmd"
+start_cmd="nsd_start_cmd"
+stop_cmd="nsd_stop_cmd"
+update_cmd="nsd_nsdc_cmd update"
 
-nsd_precmd()
+nsd_nsdc_cmd()
 {
-	db=`%%PREFIX%%/sbin/nsd-checkconf -o database %%PREFIX%%/etc/nsd/nsd.conf`
-	if [ ! -f "$db" ]; then
-		${command} rebuild
-	fi
+	${command} -c ${_conf} "$1"
 }
 
-nsd_reload()
+nsd_reload_cmd()
 {
-	${command} rebuild && ${command} reload
+	nsd_nsdc_cmd rebuild && nsd_nsdc_cmd reload
+}
+
+nsd_start_cmd()
+{
+	local _db
+	_db=`%%PREFIX%%/sbin/nsd-checkconf -o database ${_conf}`
+	if [ ! -f "${_db}" ]; then
+		nsd_nsdc_cmd rebuild
+	fi
+
+	echo "Starting ${name}."
+	nsd_nsdc_cmd start
 }
 
-nsd_stop()
+nsd_stop_cmd()
 {
 	echo "Merging nsd zone transfer changes to zone files."
-	${command} patch
+	nsd_nsdc_cmd patch
 
 	echo "Stopping ${name}."
-	${command} stop
+	nsd_nsdc_cmd stop	
 }
 
 run_rc_command "$1"


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-ports-bugs mailing list