RFC: Alternate patch to have true new-style rc.d ports scripts(without touching localpkg)

From: Oliver Eikemeier <eikemeier_at_fillmore-labs.com>
Date: Thu, 29 Jul 2004 10:39:33 +0200
I made an alternate patch to have true new-style rc.d scripts in 
ports.

I'm especially interested in feedback from people who use some form
of diskless booting or remote mounted filesystems whether they see
any potential for conflicts.


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.

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.

This patch could go into the tree independent of `fixing' any scripts,
since it does not break backwards compatibility. We can add  the necessary
infrastructure to bsd.port.mk and begin to 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. We could add stubs that are
only executed on older systems, but I'm not sure wheter this is worth
the effort.

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
_at__at_ -70,6 +70,44 _at__at_
 [ `/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
_at__at_ -82,7 +82,24 _at__at_
 # 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
_at__at_ -46,6 +46,7 _at__at_
 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
_at__at_ -1,7 +1,7 _at__at_
 # $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
_at__at_ -0,0 +1,12 _at__at_
+#!/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)
Received on Thu Jul 29 2004 - 06:31:55 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:03 UTC