From 0f3ce2b32c1dd5e82c838030e87f1f868cf58af9 Mon Sep 17 00:00:00 2001 From: Doug Barton Date: Fri, 2 Dec 2005 20:06:07 +0000 Subject: [PATCH] Introduce startup scripts from the local_startup directories to the base rcorder. This is accomplished by running rcorder twice, first to get all the disks mounted (through mountcritremote), then again to include the local_startup directories. This dramatically changes the behavior of rc.d/localpkg, as all "local" scripts that have the new rc.d semantics are now run in the base rcorder, so only scripts that have not been converted yet will run in rc.d/localpkg. Make a similar change in rc.shutdown, and add some functions in rc.subr to support these changes. Bump __FreeBSD_version to reflect this change. --- etc/rc | 34 +++++++++++++++++++++++++++++++++- etc/rc.d/localpkg | 37 +++++-------------------------------- etc/rc.shutdown | 8 +++++++- etc/rc.subr | 38 ++++++++++++++++++++++++++++++++++++++ sys/sys/param.h | 2 +- 5 files changed, 84 insertions(+), 35 deletions(-) diff --git a/etc/rc b/etc/rc index bc2e6f906cff..a94d923cf24d 100644 --- a/etc/rc +++ b/etc/rc @@ -53,7 +53,7 @@ export HOME PATH . /etc/rc.subr # Note: the system configuration files are loaded as part of -# the RCNG system (rc.d/rcconf.sh). Do not load them here as it may +# the rc.d system (rc.d/rcconf.sh). Do not load them here as it may # interfere with diskless booting. # if [ "$1" = autoboot ]; then @@ -72,10 +72,42 @@ fi skip="-s nostart" [ `/sbin/sysctl -n security.jail.jailed` -eq 1 ] && skip="$skip -s nojail" + +# Do a first pass to get everything up to mountcritremote so that +# we can do a second pass that includes $local_startup directories +# files=`rcorder ${skip} /etc/rc.d/* 2>/dev/null` for _rc_elem in ${files}; do run_rc_script ${_rc_elem} ${_boot} + + case "$_rc_elem" in + */mountcritremote) break ;; + esac +done + +unset files local_rc + +# Now that disks are mounted, for each dir in $local_startup +# search for init scripts that use the new rc.d semantics. +# +case ${local_startup} in +[Nn][Oo] | '') ;; +*) find_local_scripts_new ;; +esac + +files=`rcorder ${skip} /etc/rc.d/* ${local_rc} 2>/dev/null` +_skip_early=1 +for _rc_elem in ${files}; do + case "$_skip_early" in + 1) case "$_rc_elem" in + */mountcritremote) _skip_early=0 ;; + esac + continue + ;; + esac + + run_rc_script ${_rc_elem} ${_boot} done echo '' diff --git a/etc/rc.d/localpkg b/etc/rc.d/localpkg index c4ade879024b..0eba5239fa1c 100644 --- a/etc/rc.d/localpkg +++ b/etc/rc.d/localpkg @@ -23,29 +23,16 @@ pkg_start() ;; *) echo -n 'Local package initialization:' - slist="" - if [ -z "${script_name_sep}" ]; then - script_name_sep=" " - fi - for dir in ${local_startup}; do - if [ -d "${dir}" ]; then - for script in ${dir}/*.sh; do - slist="${slist}${script_name_sep}${script}" - done - fi - done - script_save_sep="$IFS" - IFS="${script_name_sep}" - for script in ${slist}; do + find_local_scripts_old + for script in ${zlist} ${slist}; do if [ -x "${script}" ]; then (set -T trap 'exit 1' 2 ${script} start) elif [ -f "${script}" -o -L "${script}" ]; then - echo -n " (skipping ${script##*/}, not executable)" + echo -n " (skipping ${script}, not executable)" fi done - IFS="${script_save_sep}" echo '.' ;; esac @@ -53,33 +40,19 @@ pkg_start() pkg_stop() { - # For each dir in $local_startup, search for init scripts matching *.sh case ${local_startup} in [Nn][Oo] | '') ;; *) echo -n 'Shutting down daemon processes:' - slist="" - if [ -z "${script_name_sep}" ]; then - script_name_sep=" " - fi - for dir in ${local_startup}; do - if [ -d "${dir}" ]; then - for script in ${dir}/*.sh; do - slist="${slist}${script_name_sep}${script}" - done - fi - done - script_save_sep="$IFS" - IFS="${script_name_sep}" - for script in `reverse_list ${slist}`; do + find_local_scripts_old + for script in `reverse_list ${slist} ${zlist}`; do if [ -x "${script}" ]; then (set -T trap 'exit 1' 2 ${script} stop) fi done - IFS="${script_save_sep}" echo '.' ;; esac diff --git a/etc/rc.shutdown b/etc/rc.shutdown index 075881f3d4f4..ebe79d74132b 100644 --- a/etc/rc.shutdown +++ b/etc/rc.shutdown @@ -82,7 +82,13 @@ fi # rcorder_opts="-k shutdown" [ `/sbin/sysctl -n security.jail.jailed` -eq 1 ] && rcorder_opts="$rcorder_opts -s nojail" -files=`rcorder ${rcorder_opts} /etc/rc.d/* 2>/dev/null` + +case ${local_startup} in +[Nn][Oo] | '') ;; +*) find_local_scripts_new ;; +esac + +files=`rcorder ${rcorder_opts} /etc/rc.d/* ${local_rc} 2>/dev/null` for _rc_elem in `reverse_list $files`; do debug "run_rc_script $_rc_elem faststop" diff --git a/etc/rc.subr b/etc/rc.subr index ff88433c5e58..d3d52b71968a 100644 --- a/etc/rc.subr +++ b/etc/rc.subr @@ -1355,4 +1355,42 @@ geli_make_list() echo ${devices2} } +# Find scripts in local_startup directories that use the old syntax +# +find_local_scripts_old () { + zlist='' + slist='' + for dir in ${local_startup}; do + if [ -d "${dir}" ]; then + for file in ${dir}/[0-9]*.sh; do + grep '^# PROVIDE:' $file >/dev/null 2>&1 && + continue + zlist="$zlist $file" + done + for file in ${dir}/[^0-9]*.sh; do + grep '^# PROVIDE:' $file >/dev/null 2>&1 && + continue + slist="$slist $file" + done + fi + done +} + +find_local_scripts_new () { + local_rc='' + for dir in ${local_startup}; do + if [ -d "${dir}" ]; then + for file in `grep -l '^# PROVIDE:' ${dir}/*`; do + case "$file" in + *.sample) ;; + *) if [ -x "$file" ]; then + local_rc="${local_rc} ${file}" + fi + ;; + esac + done + fi + done +} + fi diff --git a/sys/sys/param.h b/sys/sys/param.h index 7a19c81af93f..3cf4e58f33e7 100644 --- a/sys/sys/param.h +++ b/sys/sys/param.h @@ -57,7 +57,7 @@ * is created, otherwise 1. */ #undef __FreeBSD_version -#define __FreeBSD_version 700006 /* Master, propagated to newvers */ +#define __FreeBSD_version 700007 /* Master, propagated to newvers */ #ifndef LOCORE #include