Date: Fri, 16 Jul 2004 11:23:29 +0300 From: Mike Makonnen <mtm@identd.net> To: Oliver Eikemeier <eikemeier@fillmore-labs.com> Cc: freebsd-rc@freebsd.org Subject: Re: localpkg script changes Message-ID: <20040716082329.GA8472@rogue.acs-et.com> In-Reply-To: <20040715150739.GA11628@rogue.acs-et.com> References: <20040713140354.GA1695@rogue.acs-et.com> <19240580-D586-11D8-A6C6-00039312D914@fillmore-labs.com> <20040715150739.GA11628@rogue.acs-et.com>
next in thread | previous in thread | raw e-mail | index | archive | help
--6TrnltStXW4iwmi0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline I forgot to add an updated patch. Cheers. -- Mike Makonnen | GPG-KEY: http://www.identd.net/~mtm/mtm.asc mtm@identd.net | Fingerprint: AC7B 5672 2D11 F4D0 EBF8 5279 5359 2B82 7CD4 1F55 mtm@FreeBSD.Org| FreeBSD - Unleash the Daemon ! --6TrnltStXW4iwmi0 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=diff Index: etc/rc.d/localpkg =================================================================== RCS file: /home/ncvs/src/etc/rc.d/localpkg,v retrieving revision 1.1 diff -u -r1.1 localpkg --- etc/rc.d/localpkg 6 Aug 2003 00:35:13 -0000 1.1 +++ etc/rc.d/localpkg 15 Jul 2004 07:38:51 -0000 @@ -11,31 +11,120 @@ . /etc/rc.subr name="localpkg" -start_cmd="pkg_start" -stop_cmd="pkg_stop" +_arg1="$1" -pkg_start() +# script_is_rcd script +# Checks that script is an rc.d style script. +# Returns 0 if it is, otherwise, it returns 1. +# +script_is_rcd() { - # For each dir in $local_startup, search for init scripts matching *.sh + local _s match + _s="$1" + + [ -z "$_s" ] && return 1 + match=`grep -c -m1 '^# PROVIDE:' "$_s" 2> /dev/null` + [ "$match" = "1" ] && return 0 + return 1 +} + +# cooked_scriptlist type +# Uses values from rc.conf(5) to prepare a list of scripts to +# execute. It assumes the global variable script_name_sep and IFS are set +# properly. If type is set to the string "rcd" the list will contain only +# rc.d style scripts and they will be ordered according to thier +# dependencies. If it is set to "rcOG" then it will contain +# only old style ports startup scripts. The list is echoed on stdout. +# +cooked_scriptlist() +{ + local _type slist fpattern skip + + slist="" + _type="$1" + case "$_type" in + rcd) + fpattern="*" + ;; + rcOG) + fpattern="*.sh" + ;; + *) + return + ;; + esac + for dir in ${local_startup}; do + if [ -d "${dir}" ]; then + for script in ${dir}/${fpattern}; do + + # Weed out scripts that don't belong in the + # category that we are preparing. + # + if [ "$_type" = "rcd" ]; then + case "$script" in + *.sample|*-dist) + continue;; + esac + script_is_rcd "$script" || continue + else + script_is_rcd "$script" && continue + fi + + slist="${slist}${script_name_sep}${script}" + done + fi + done + + # If this is an rc.d list put the scripts in the right order. # + if [ "$_type" = "rcd" ]; then + skip="-s nostart" + [ `/sbin/sysctl -n security.jail.jailed` -eq 1 ] && \ + skip="$skip -s nojail" + + # Some scripts do not define a FreeBSD keyword, so we can't + # specify it in a keep list. + slist=`/sbin/rcorder ${skip} ${slist} 2>/dev/null` + + # Substitute the newlines used by rcorder(8) with the + # script separator. + slist=`echo $slist | /usr/bin/tr "\n" "$script_name_sep"` + fi + + echo -n $slist +} + +pkg_start() +{ + local slist + case ${local_startup} in [Nn][Oo] | '') ;; *) - 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 + + # Do rc.d style scripts. + # + script_save_sep="$IFS" + IFS="${script_name_sep}" + slist=`cooked_scriptlist rcd` + debug "localpkg rc.d scripts: $slist" + for script in ${slist}; do + run_rc_script "$script" "$_arg1" done + IFS="${script_save_sep}" + + # Do old-style ports startup scripts. + # + echo -n 'Local package initialization:' script_save_sep="$IFS" IFS="${script_name_sep}" + slist=`cooked_scriptlist rcOG` + debug "localpkg rcOG scripts: $slist" for script in ${slist}; do if [ -x "${script}" ]; then (set -T @@ -53,26 +142,24 @@ pkg_stop() { - echo -n 'Shutting down daemon processes:' + local slist # For each dir in $local_startup, search for init scripts matching *.sh case ${local_startup} in [Nn][Oo] | '') ;; *) - 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 + + # Do old-style scripts + # script_save_sep="$IFS" IFS="${script_name_sep}" + slist=`cooked_scriptlist rcOG` + debug "localpkg rcOG scripts: $slist" + echo -n 'Shutting down local packages:' for script in `reverse_list ${slist}`; do if [ -x "${script}" ]; then (set -T @@ -82,9 +169,35 @@ done IFS="${script_save_sep}" echo '.' + + # Do rc.d style scripts + # + script_save_sep="$IFS" + IFS="${script_name_sep}" + slist=`cooked_scriptlist rcd` + debug "localpkg rc.d scripts: $slist" + for script in `reverse_list ${slist}`; do + run_rc_script "$script" $_arg1 + done ;; esac } load_rc_config $name -run_rc_command "$1" + +# We can't use the normal rc.subr(8) start/stop plumbing +# because we call run_rc_script(), which unsets all the +# global variables that said plumbing needs. +# +case "$1" in +start|faststart) + pkg_start + ;; +stop|faststop) + pkg_stop + ;; +restart|fastrestart) + pkg_stop + pkg_start + ;; +esac --6TrnltStXW4iwmi0--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040716082329.GA8472>