diff options
author | dougb <dougb@FreeBSD.org> | 2005-12-02 20:06:07 +0000 |
---|---|---|
committer | dougb <dougb@FreeBSD.org> | 2005-12-02 20:06:07 +0000 |
commit | 997405c1cadb59927aff9fe3f831061a3a60fcae (patch) | |
tree | 51bcd0baa3852d62ab93efd232c48f0a2015ed8a | |
parent | f88100d008c54fc484c3dc2634b2079c11aea469 (diff) | |
download | FreeBSD-src-997405c1cadb59927aff9fe3f831061a3a60fcae.zip FreeBSD-src-997405c1cadb59927aff9fe3f831061a3a60fcae.tar.gz |
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.
-rw-r--r-- | etc/rc | 34 | ||||
-rw-r--r-- | etc/rc.d/localpkg | 37 | ||||
-rw-r--r-- | etc/rc.shutdown | 8 | ||||
-rw-r--r-- | etc/rc.subr | 38 | ||||
-rw-r--r-- | sys/sys/param.h | 2 |
5 files changed, 84 insertions, 35 deletions
@@ -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 c4ade87..0eba523 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 075881f..ebe79d7 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 ff88433..d3d52b7 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 7a19c81..3cf4e58 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 <sys/types.h> |