localpkg script changes

Mike Makonnen mtm at identd.net
Fri Jul 16 01:23:47 PDT 2004


I forgot to add an updated patch.

Cheers.
-- 
Mike Makonnen  | GPG-KEY: http://www.identd.net/~mtm/mtm.asc
mtm at identd.net | Fingerprint: AC7B 5672 2D11 F4D0 EBF8  5279 5359 2B82 7CD4 1F55
mtm at FreeBSD.Org| FreeBSD - Unleash the Daemon !
-------------- next part --------------
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


More information about the freebsd-rc mailing list