From owner-freebsd-rc@FreeBSD.ORG Wed Jul 28 15:10:01 2004 Return-Path: Delivered-To: freebsd-rc@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 5C12A16A4CE for ; Wed, 28 Jul 2004 15:10:01 +0000 (GMT) Received: from fillmore.dyndns.org (port-212-202-50-15.dynamic.qsc.de [212.202.50.15]) by mx1.FreeBSD.org (Postfix) with ESMTP id D38DC43D5F for ; Wed, 28 Jul 2004 15:10:00 +0000 (GMT) (envelope-from eikemeier@fillmore-labs.com) Received: from dhcp-4.local ([172.16.0.4]) by fillmore.dyndns.org with esmtp (Exim 4.41 (FreeBSD)) id 1Bpq3J-0000zT-R1 for freebsd-rc@FreeBSD.org; Wed, 28 Jul 2004 17:10:00 +0200 Message-ID: <4107C362.6030101@fillmore-labs.com> Date: Wed, 28 Jul 2004 17:16:50 +0200 From: Oliver Eikemeier Organization: Fillmore Labs GmbH - http://www.fillmore-labs.com/ MIME-Version: 1.0 To: freebsd-rc@FreeBSD.org Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit User-Agent: KMail/1.5.9 Subject: RFC: Alternate patch to have true new-style rc.d scripts in ports X-BeenThere: freebsd-rc@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Discussion related to /etc/rc.d design and implementation. List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 28 Jul 2004 15:10:01 -0000 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)