Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Jul 2004 17:03:54 +0300
From:      Mike Makonnen <mtm@identd.net>
To:        freebsd-rc@freebsd.org
Subject:   localpkg script changes
Message-ID:  <20040713140354.GA1695@rogue.acs-et.com>

next in thread | raw e-mail | index | archive | help

--XsQoSWH+UP9D9v3l
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Hi folks,

I was looking at integrating ports rc.d scripts a bit better, and the following is
what I came up with. I would appreciate reviews, tests, etc..

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 !

--XsQoSWH+UP9D9v3l
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename=exp

Ports related rc.d cleanups:
o Separate out local (ports) scripts that use rc.d, and the old style
  startup/shutdown scripts and execute them separately. On startup the
  rc.d style scripts are executed first and then the old-style scripts.
  On shutdown, exactly the reverse happens.
o The rc.d ports scripts should now behave more like base system scripts.
  Scripts ending in .sh will be sourced into the current shell, while the
  rest will be executed in a subshell. Previously, all ports scripts,
  regardless of the .sh suffix, were executed in a subshell.
o The parent script, /etc/rc.d/localpkg, passes its command line arguments
  straight to the rc.d ports scripts. This means they should now honor
  faststop and faststart commands as well. Old style scripts, should not see
  any differences. They will still get either a start or stop command.
o The initial phrase shown during shutdown has been changed to use
  "local packages" instead of "daemon processes" to be more inline with the
  phrase used during local package startup. The phrases are also used only for
  old-style ports script startup/shutdown, whereas previously they were being
  used for both rc.d and old-style scripts. This should make startup/shutdown
  output a bit less ugly.

--XsQoSWH+UP9D9v3l
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	13 Jul 2004 11:30:20 -0000
@@ -11,31 +11,102 @@
 . /etc/rc.subr
 
 name="localpkg"
-start_cmd="pkg_start"
-stop_cmd="pkg_stop"
+_arg1="$1"
+
+# 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()
+{
+	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. 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
+
+	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
+	echo -n $slist
+}
 
 pkg_start()
 {
-	# For each dir in $local_startup, search for init scripts matching *.sh
-	#
+	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 +124,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 +151,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

--XsQoSWH+UP9D9v3l--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040713140354.GA1695>