RFC: Alternate patch to have true new-style rc.d scripts in ports

Oliver Eikemeier eikemeier at fillmore-labs.com
Wed Jul 28 08:09:30 PDT 2004


Appended is an alternate patch to have true new-style rc.d scripts in 
ports. Scripts in ${local_startup} are processed as follows:

- scripts ending in .sh are treated as old-style scripts, which means 
they need to have it's executable bit set to be considered by localpkg 
as before. Whether they partially use rc.subr features or not isn't 
relevant. They are executed in lexicographical order like specified in 
rc(8).

- scripts without any extension participate in a system wide rcorder(8). 
To enable diskless booting and remote mounting they are not executed 
before a configurable barrier script ${rclocal_barrier} is executed, 
which is PORTS is this patch. Whether or not the script is has it's 
executable bit set is not examined.

I'm not sure if we should filter out *all* scripts with extensions. 
There might be a startup.app port we like to add, perhaps just a list of 
values like `.old', `.sample' e.t.c. should be filtered out. OTOH this 
is easily changeable, should the need arise.

Also we could set the default of rclocal_barrier to be `LOGIN' in case 
we are not sure what the effects of starting ports early is. Users who 
know their files systems are all local could even set rclocal_barrier to 
be an earlier value. Perhaps the dummy `ports' target isn't needed at 
all and simply using `SERVERS' will do the trick.

I would prefer a testing period, but this patch could go into the tree 
every time since it does not break backwards compatibility. We can add 
the necessary infrastructure to bsd.port.mk, and slowly migrate the 
ports to extensionless startup scripts. New -CURRENTs can continue to 
use old or already installed packages, while older systems will ignore 
the startup scripts in packages build on newer systems. I guess a 
heads-up might be sufficient to deal with the later case, adding a 
pkg_req script to every package seems to be too much effort for too 
little gain.

The bsd.port.mk integration might be something like

RC_SCRIPTS=	apache

which will install `apache' or `apache.sh' depending on OSVERSION. A 
variable RC_SUFX is set that could be used in pkg-message or other 
places when necessary.

Sourcing port scripts is not possible with this patch, which is a good 
thing IMHO. Also some documentation needs to added to rc(8) before this 
patch can go in.

-Oliver


Index: etc/rc
===================================================================
RCS file: /home/ncvs/src/etc/rc,v
retrieving revision 1.333
diff -u -u -r1.333 rc
--- etc/rc	24 Jul 2004 16:30:31 -0000	1.333
+++ etc/rc	28 Jul 2004 14:13:27 -0000
@@ -70,6 +70,44 @@
 [ `/sbin/sysctl -n security.jail.jailed` -eq 1 ] && skip="$skip -s nojail"
 files=`rcorder -k ${os} ${skip} /etc/rc.d/* 2>/dev/null`
 
+# execute startup scripts up to rclocal_barrier (which is available after rcconf.sh)
+_rc_done=""
+for _rc_elem in ${files}; do
+	run_rc_script ${_rc_elem} ${_boot}
+	_rc_done="${_rc_done}${_rc_elem} "
+	if [ "/${_rc_elem##*/}" = "/${rclocal_barrier-}" ]; then
+		break
+	fi
+done
+
+# enough of the system is up to include local_startup in rcorder
+case ${local_startup} in
+[Nn][Oo] | '')
+	;;
+*)
+	_rc_startup="/etc/rc.d/*"
+	for dir in ${local_startup}; do
+		[ -d "${dir}" ] || continue
+		for script in "${dir}"/*; do
+			case "${script##*/}" in
+			*.*)	;;
+			*)	if [ -f "${script}" ]; then
+					_rc_startup="${_rc_startup} ${script}"
+				fi ;;
+			esac
+		done
+	done
+	files=`rcorder -k ${os} -s nostart ${_rc_startup} 2>/dev/null`
+esac
+
+# execute the remaining startup scripts, avoiding duplicates
+files=`echo "${_rc_done}<> ${files}" |
+	tr -s ' ' '\n' |
+	awk '
+		/^<>$/ {exec=1; next}
+		!exec {done[$0]=1; next}
+		!done[$0] {print}
+	'`
 for _rc_elem in ${files}; do
 	run_rc_script ${_rc_elem} ${_boot}
 done
Index: etc/rc.shutdown
===================================================================
RCS file: /home/ncvs/src/etc/rc.shutdown,v
retrieving revision 1.27
diff -u -u -r1.27 rc.shutdown
--- etc/rc.shutdown	26 Jun 2004 09:27:30 -0000	1.27
+++ etc/rc.shutdown	28 Jul 2004 11:51:47 -0000
@@ -82,7 +82,24 @@
 # XXX - rcorder(8) with multiple -k switches works as a logical OR,
 #       so, we can't do this: rcorder -k shutdown -k FreeBSD.
 #
-files=`eval grep -l \'^# KEYWORD:.*FreeBSD\' \`rcorder -k shutdown /etc/rc.d/* 2>/dev/null\``
+_rc_startup="/etc/rc.d/*"
+case ${local_startup} in
+[Nn][Oo] | '')
+	;;
+*)
+	for dir in ${local_startup}; do
+		[ -d "${dir}" ] || continue
+		for script in "${dir}"/*; do
+			case "${script##*/}" in
+			*.*)	;;
+			*)	if [ -f "${script}" ]; then
+					_rc_startup="${_rc_startup} ${script}"
+				fi ;;
+			esac
+		done
+	done
+esac
+files=`eval grep -El \'^# KEYWORDS?:.*FreeBSD\' \`rcorder -k shutdown ${_rc_startup} 2>/dev/null\``
 
 for _rc_elem in `reverse_list $files`; do
 	debug "run_rc_script $_rc_elem faststop"
Index: etc/defaults/rc.conf
===================================================================
RCS file: /home/ncvs/src/etc/defaults/rc.conf,v
retrieving revision 1.212
diff -u -u -r1.212 rc.conf
--- etc/defaults/rc.conf	27 Jul 2004 00:28:16 -0000	1.212
+++ etc/defaults/rc.conf	28 Jul 2004 11:58:52 -0000
@@ -46,6 +46,7 @@
 local_startup="/usr/local/etc/rc.d /usr/X11R6/etc/rc.d" # startup script dirs.
 script_name_sep=" "	# Change if your startup scripts' names contain spaces
 rc_conf_files="/etc/rc.conf /etc/rc.conf.local"
+rclocal_barrier="PORTS"	# Barrier for local_startup scripts to participate in rcorder(8)
 
 # Experimental - test before enabling
 gbde_autoattach_all="NO" # YES automatically mounts gbde devices from fstab
Index: etc/rc.d/Makefile
===================================================================
RCS file: /home/ncvs/src/etc/rc.d/Makefile,v
retrieving revision 1.41
diff -u -u -r1.41 Makefile
--- etc/rc.d/Makefile	24 May 2004 14:17:19 -0000	1.41
+++ etc/rc.d/Makefile	28 Jul 2004 13:39:43 -0000
@@ -1,7 +1,7 @@
 # $NetBSD: Makefile,v 1.16 2001/01/14 15:37:22 minoura Exp $
 # $FreeBSD: src/etc/rc.d/Makefile,v 1.41 2004/05/24 14:17:19 des Exp $
 
-FILES=	DAEMON LOGIN NETWORKING SERVERS \
+FILES=	DAEMON LOGIN NETWORKING PORTS SERVERS \
 	abi accounting addswap adjkerntz amd \
 	apm apmd archdep atm1 atm2 atm3 \
 	bgfsck bootparams \
Index: etc/rc.d/PORTS
===================================================================
RCS file: etc/rc.d/PORTS
diff -N etc/rc.d/PORTS
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ etc/rc.d/PORTS	28 Jul 2004 14:57:58 -0000
@@ -0,0 +1,12 @@
+#!/bin/sh
+#
+# $FreeBSD$
+#
+
+# PROVIDE: PORTS
+# REQUIRE: mountcritremote
+# BEFORE: SERVERS
+# KEYWORD: FreeBSD
+
+#	This is a dummy dependency, marking earliest
+#	moment ports can participate in rcorder(8)



More information about the freebsd-rc mailing list