[oe] [PATCH v2] upstart: fix sysvinit compat

Paul Menzel paulepanter at users.sourceforge.net
Wed Aug 25 22:34:16 UTC 2010


Am Mittwoch, den 25.08.2010, 22:49 +0600 schrieb Anatoly Shipitsin:

As written in my other message, what was the problem in the first place
is missing.

> * change PR = "r2"
> * add example-jobs for sysvinit compat
> * add update-alternatives for proper switch
> * add native tty service generate
> * add rc rcS scripts for run sysvinit scripts

Where did you take those from?

> * change reboot halt poweroff shutdown for compatible with update-alternatives
> * move runlevel to upstart-sysvinit
> * change upstart-sysvtools-doc to upstart-sysvcompat-doc

Small commits – like changing the package name – make it easier to
review.

> Signed-off-by: Anatoly Shipitsin <norguhtar at gmail.com>
> ---
>  recipes/upstart/upstart.inc              |  111 ++++++++++++++++++++++++++++-
>  recipes/upstart/upstart/init/rc          |  102 +++++++++++++++++++++++++++
>  recipes/upstart/upstart/init/rcS         |  113 ++++++++++++++++++++++++++++++
>  recipes/upstart/upstart/init/rcS-default |   25 +++++++
>  recipes/upstart/upstart_0.3.11.bb        |   15 +++-
>  recipes/upstart/upstart_0.3.8.bb         |   14 +++--
>  6 files changed, 367 insertions(+), 13 deletions(-)
>  create mode 100755 recipes/upstart/upstart/init/rc
>  create mode 100755 recipes/upstart/upstart/init/rcS
>  create mode 100644 recipes/upstart/upstart/init/rcS-default
> 
> diff --git a/recipes/upstart/upstart.inc b/recipes/upstart/upstart.inc
> index e67774a..7512133 100644
> --- a/recipes/upstart/upstart.inc
> +++ b/recipes/upstart/upstart.inc
> @@ -4,7 +4,7 @@ DEPENDS = ""
>  DESCRIPTION = "Event driven system init"
>  LICENSE = "GPL"
>  
> -inherit autotools pkgconfig 
> +inherit autotools pkgconfig update-alternatives
>  
>  # --enable-compat builds halt, reboot, shutdown tools
>  EXTRA_OECONF += "--enable-compat"
> @@ -17,6 +17,109 @@ FILES_libupstart-dev += "${libdir}/libupstart.* ${includedir}/upstart/"
>  
>  # upstart-sysvcompat provides Sys V Init compatible tools: halt, reboot,
>  # shutdown, telinit. These might be needed by other scripts.
> -PACKAGES =+ "upstart-sysvcompat upstart-sysvtools-doc"
> -FILES_upstart-sysvcompat += "${sbindir}/reboot ${sbindir}/halt ${sbindir}/shutdown ${sbindir}/telinit"
> -FILES_upstart-sysvcompat-doc += "${mandir}/*/reboot.* ${mandir}/*/halt.* ${mandir}/*/shutdown.* ${mandir}/*/telinit.*"
> +PACKAGES =+ "upstart-sysvcompat upstart-sysvcompat-doc"
> +FILES_upstart-sysvcompat += " \
> +    ${base_sbindir}/reboot.* ${base_sbindir}/halt.* ${base_sbindir}/poweroff.* \
> +    ${base_sbindir}/shutdown.* ${base_sbindir}/telinit ${base_sbindir}/runlevel \
> +    ${sysconfdir}/event.d/control-alt-delete \
> +    ${sysconfdir}/event.d/rc* \
> +    ${sysconfdir}/event.d/sulogin \
> +    ${sysconfdir}/init.d \
> +    ${sysconfdir}/default/rcS \
> +"
> +FILES_upstart-sysvcompat-doc += " \
> +    ${mandir}/*/reboot.* ${mandir}/*/halt.* ${mandir}/*/poweroff.* \
> +     ${mandir}/*/shutdown.* ${mandir}/*/telinit.* ${mandir}/*/runlevel.* \
> +"
> +
> +ALTERNATIVE_NAME = "init"
> +ALTERNATIVE_LINK = "${base_sbindir}/init"
> +ALTERNATIVE_PATH = "${base_sbindir}/init.${PN}"
> +ALTERNATIVE_PRIORITY = "60"
> +
> +EXTRA_OEMAKE += "'bindir=${base_bindir}' \
> +		 'sbindir=${base_sbindir}' \
> +		 'usrbindir=${bindir}' \
> +		 'usrsbindir=${sbindir}' \
> +		 'includedir=${includedir}' \
> +		 'mandir=${mandir}'"

Is not that picked up automatically?

> +do_install () {
> +	oe_runmake 'DESTDIR=${D}' install
> +	install -d ${D}${sysconfdir}
> +	install -d ${D}${sysconfdir}/default
> +	install -d ${D}${sysconfdir}/init.d
> +
> +	install -m 0644	${WORKDIR}/init/rcS-default	${D}${sysconfdir}/default/rcS
> +	install -m 0755 ${WORKDIR}/init/rc		${D}${sysconfdir}/init.d
> +	install -m 0755 ${WORKDIR}/init/rcS		${D}${sysconfdir}/init.d
> +	install -m 0644 ${WORKDIR}/rc*			${D}${sysconfdir}/event.d
> +	install -m 0644 ${WORKDIR}/control-alt-delete	${D}${sysconfdir}/event.d
> +	install -m 0644 ${WORKDIR}/sulogin		${D}${sysconfdir}/event.d
> +
> +	if [ ! -z "${SERIAL_CONSOLE}" ]; then
> +	     cat <<EOF >> ${D}${sysconfdir}/event.d/tty-serial
> +# tty-serial - getty
> +#
> +# This service maintains a getty on tty-serial from the point the system is
> +# started until it is shut down again.
> +
> +start on runlevel 2
> +start on runlevel 3
> +start on runlevel 4
> +start on runlevel 5
> +
> +stop on runlevel 0
> +stop on runlevel 1
> +stop on runlevel 6
> +
> +respawn
> +exec ${base_sbindir}/getty ${SERIAL_CONSOLE}
> +EOF
> +	fi
> +	if [ "${USE_VT}" = "1" ]; then
> +	    for n in ${SYSVINIT_ENABLED_GETTYS}
> +	    do
> +	     cat <<EOF >> ${D}${sysconfdir}/event.d/tty$n
> +# tty$n - getty
> +#
> +# This service maintains a getty on tty$n from the point the system is
> +# started until it is shut down again.
> +
> +start on runlevel 2
> +start on runlevel 3
> +start on runlevel 4
> +start on runlevel 5
> +
> +stop on runlevel 0
> +stop on runlevel 1
> +stop on runlevel 6
> +
> +respawn
> +exec ${base_sbindir}/getty 38400 tty$n
> +EOF
> +	    done
> +	fi
> +
> +	mv ${D}${base_sbindir}/init	${D}${base_sbindir}/init.${PN}
> +        mv ${D}${base_sbindir}/halt ${D}${base_sbindir}/halt.${PN}
> +	mv ${D}${base_sbindir}/reboot ${D}${base_sbindir}/reboot.${PN}
> +        mv ${D}${base_sbindir}/shutdown ${D}${base_sbindir}/shutdown.${PN}
> +	mv ${D}${base_sbindir}/poweroff ${D}${base_sbindir}/poweroff.${PN}
> +}
> +
> +pkg_postinst_${PN}-sysvcompat () {
> +#!/bin/sh
> +update-alternatives --install ${base_sbindir}/reboot reboot reboot.${PN} 200
> +update-alternatives --install ${base_sbindir}/halt halt halt.${PN} 200
> +update-alternatives --install ${base_sbindir}/poweroff poweroff poweroff.${PN} 200
> +update-alternatives --install ${base_sbindir}/shutdown shutdown shutdown.${PN} 200
> +}
> +
> +pkg_prerm_${PN}-sysvcompat () {
> +#!/bin/sh
> +update-alternatives --remove reboot reboot.${PN}
> +update-alternatives --remove halt halt.${PN}
> +update-alternatives --remove poweroff reboot.${PN}
> +update-alternatives --remove shutdown shutdown.${PN}
> +}
> diff --git a/recipes/upstart/upstart/init/rc b/recipes/upstart/upstart/init/rc
> new file mode 100755
> index 0000000..fdb0fce
> --- /dev/null
> +++ b/recipes/upstart/upstart/init/rc
> @@ -0,0 +1,102 @@
> +#!/bin/sh
> +#
> +# rc		This file is responsible for starting/stopping
> +#		services when the runlevel changes.
> +#
> +#		Optimization feature:
> +#		A startup script is _not_ run when the service was
> +#		running in the previous runlevel and it wasn't stopped
> +#		in the runlevel transition (most Debian services don't
> +#		have K?? links in rc{1,2,3,4,5} )
> +#
> +# Author:	Miquel van Smoorenburg <miquels at cistron.nl>
> +#		Bruce Perens <Bruce at Pixar.com>
> +#
> +# Version:	@(#)rc  2.78  07-Nov-1999  miquels at cistron.nl
> +#
> +
> +. /etc/default/rcS
> +export VERBOSE
> +
> +#
> +# Start script or program.
> +#
> +startup() {
> +  case "$1" in
> +	*.sh)
> +		sh "$@"
> +		;;
> +	*)
> +		"$@"
> +		;;
> +  esac
> +}
> +
> +  # Ignore CTRL-C only in this shell, so we can interrupt subprocesses.
> +  trap ":" INT QUIT TSTP
> +
> +  # Set onlcr to avoid staircase effect.
> +  stty onlcr 0>&1
> +
> +  # Now find out what the current and what the previous runlevel are.
> +
> +  runlevel=$RUNLEVEL
> +  # Get first argument. Set new runlevel to this argument.
> +  [ "$1" != "" ] && runlevel=$1
> +  if [ "$runlevel" = "" ]
> +  then
> +	echo "Usage: $0 <runlevel>" >&2
> +	exit 1
> +  fi
> +  previous=$PREVLEVEL
> +  [ "$previous" = "" ] && previous=N
> +
> +  export runlevel previous
> +
> +  # Is there an rc directory for this new runlevel?
> +  if [ -d /etc/rc$runlevel.d ]
> +  then
> +	# First, run the KILL scripts.
> +	if [ $previous != N ]
> +	then
> +		for i in /etc/rc$runlevel.d/K[0-9][0-9]*
> +		do
> +			# Check if the script is there.
> +			[ ! -f $i ] && continue
> +
> +			# Stop the service.
> +			startup $i stop
> +		done
> +	fi
> +	# Now run the START scripts for this runlevel.
> +	for i in /etc/rc$runlevel.d/S*
> +	do
> +		[ ! -f $i ] && continue
> +
> +		if [ $previous != N ] && [ $previous != S ]
> +		then
> +			#
> +			# Find start script in previous runlevel and
> +			# stop script in this runlevel.
> +			#
> +			suffix=${i#/etc/rc$runlevel.d/S[0-9][0-9]}
> +			stop=/etc/rc$runlevel.d/K[0-9][0-9]$suffix
> +			previous_start=/etc/rc$previous.d/S[0-9][0-9]$suffix
> +			#
> +			# If there is a start script in the previous level
> +			# and _no_ stop script in this level, we don't
> +			# have to re-start the service.
> +			#
> +			[ -f $previous_start ] && [ ! -f $stop ] && continue
> +		fi
> +		case "$runlevel" in
> +			0|6)
> +				startup $i stop
> +				;;
> +			*)
> +				startup $i start
> +				;;
> +		esac
> +	done
> +  fi
> +# eof /etc/init.d/rc
> diff --git a/recipes/upstart/upstart/init/rcS b/recipes/upstart/upstart/init/rcS
> new file mode 100755
> index 0000000..15b90f7
> --- /dev/null
> +++ b/recipes/upstart/upstart/init/rcS
> @@ -0,0 +1,113 @@
> +#!/bin/sh
> +#
> +# rcS		Call all S??* scripts in /etc/rcS.d in
> +#		numerical/alphabetical order.
> +#
> +# Version:	@(#)/etc/init.d/rcS  2.76  19-Apr-1999  miquels at cistron.nl
> +#
> +
> +PATH=/sbin:/bin:/usr/sbin:/usr/bin
> +runlevel=S
> +prevlevel=N
> +umask 022
> +export PATH runlevel prevlevel
> +
> +#	Make sure proc is mounted
> +#
> +[ -d "/proc/1" ] || mount proc /proc -t proc
> +
> +#	Make sure sys is mounted
> +[ -d "/sys/kernel" ] || mount sysfs /sys -t sysfs
> +
> +#
> +#	See if system needs to be setup. This is ONLY meant to
> +#	be used for the initial setup after a fresh installation!
> +#
> +if [ -x /sbin/unconfigured.sh ]
> +then
> +  /sbin/unconfigured.sh
> +fi
> +
> +#
> +#	Source defaults.
> +#
> +. /etc/default/rcS
> +
> +#
> +#	Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
> +#
> +trap ":" INT QUIT TSTP
> +
> +#
> +#       Do we have /proc/progress and set VERBOSE to "no" ?
> +#       If so, calculate the number of scripts and the incremental step
> +#
> +if [ "$VERBOSE" = no ]; then
> +    if [ -e /proc/progress ]; then
> +        set `ls -1 /etc/rc$runlevel.d/S* | wc`
> +        numscripts=$1
> +        PROGRESS_incstep=`expr 90 / $1`
> +        PROGRESS_value=10
> +        PROGRESS=yes
> +        export PROGRESS_value PROGRESS_incstep
> +    fi
> +fi
> +export VERBOSE PROGRESS
> +
> +#
> +#	Call all parts in order.
> +#
> +for i in /etc/rcS.d/S??*
> +do
> +	# Ignore dangling symlinks for now.
> +	[ ! -f "$i" ] && continue
> +
> +	# Handle verbosity
> +	[ "$VERBOSE" = very ] && echo "INIT: Running $i..."
> +	if [ "$PROGRESS" = yes ]; then
> +		export PROGRESS_value=`expr $PROGRESS_value + $PROGRESS_incstep`
> +		echo "$PROGRESS_value Starting $i..." >/proc/progress
> +	fi
> +
> +	case "$i" in
> +		*.sh)
> +			# Source shell script for speed.
> +			(
> +				trap - INT QUIT TSTP
> +				set start
> +				. $i
> +			)
> +			;;
> +		*)
> +			# No sh extension, so fork subprocess.
> +			$i start
> +			;;
> +	esac
> +
> +        #
> +        # Report status based on result code
> +        #
> +        result=$?
> +        if [ "$PROGRESS" = yes ]; then
> +                if [ "$result" = 0 ]; then
> +                    echo "=s" >/proc/progress
> +                else
> +                    echo "=f" >/proc/progress
> +                fi
> +        fi
> +done
> +
> +#
> +#	For compatibility, run the files in /etc/rc.boot too.
> +#
> +[ -d /etc/rc.boot ] && run-parts /etc/rc.boot
> +
> +#
> +#	Finish setup if needed. The comment above about
> +#	/sbin/unconfigured.sh applies here as well!
> +#
> +if [ -x /sbin/setup.sh ]
> +then
> +  /sbin/setup.sh
> +fi
> +
> diff --git a/recipes/upstart/upstart/init/rcS-default b/recipes/upstart/upstart/init/rcS-default
> new file mode 100644
> index 0000000..7ad3c7b
> --- /dev/null
> +++ b/recipes/upstart/upstart/init/rcS-default
> @@ -0,0 +1,25 @@
> +#
> +#	Defaults for the boot scripts in /etc/rcS.d
> +#
> +
> +# Time files in /tmp are kept in days.
> +TMPTIME=0
> +# Set to yes if you want sulogin to be spawned on bootup
> +SULOGIN=no
> +# Set to no if you want to be able to login over telnet/rlogin
> +# before system startup is complete (as soon as inetd is started)
> +DELAYLOGIN=no
> +# Set UTC=yes if your system clock is set to UTC (GMT), and UTC=no if not.
> +# UTC=yes
> +# Set VERBOSE to "no" if you would like a more quiet bootup.
> +VERBOSE=no
> +# Set EDITMOTD to "no" if you don't want /etc/motd to be editted automatically
> +EDITMOTD=no
> +# Whether to fsck root on boot
> +ENABLE_ROOTFS_FSCK=no
> +# Set FSCKFIX to "yes" if you want to add "-y" to the fsck at startup.
> +FSCKFIX=yes
> +# Set TICKADJ to the correct tick value for this specific machine
> +#TICKADJ=10000
> +# Enable caching in populate-volatile.sh
> +VOLATILE_ENABLE_CACHE=yes
> diff --git a/recipes/upstart/upstart_0.3.11.bb b/recipes/upstart/upstart_0.3.11.bb
> index c4db01b..a0bd17e 100644
> --- a/recipes/upstart/upstart_0.3.11.bb
> +++ b/recipes/upstart/upstart_0.3.11.bb
> @@ -1,11 +1,18 @@
>  require upstart.inc
>  
> -SRC_URI = "http://upstart.ubuntu.com/download/0.3/upstart-${PV}.tar.bz2 \
> +SRC_URI = "http://upstart.ubuntu.com/download/0.3/upstart-${PV}.tar.bz2;name=upstart \
> +    http://upstart.ubuntu.com/download/example-jobs/0.3/example-jobs-${PV}.tar.gz;name=compat \
> +    file://init/rcS-default file://init/rc file://init/rcS \
>  "
>  
>  RRECOMMENDS_${PN} = "libupstart upstart-sysvcompat"
>  
> -PR = "r1"
> +PR = "r2"
>  
> -SRC_URI[md5sum] = "a9e475e1458c876add0441d9d4cfe9c0"
> -SRC_URI[sha256sum] = "d4f7fff9112049eab318518719735d0ac66ff558ed91c2d7c7c41124de2832b6"
> +USE_VT ?= "1"
> +SYSVINIT_ENABLED_GETTYS ?= "1"

Why are those two lines needed in this, but not in the 0.3.8 recipe?

> +SRC_URI[upstart.md5sum] = "a9e475e1458c876add0441d9d4cfe9c0" 
> +SRC_URI[upstart.sha256sum] = "d4f7fff9112049eab318518719735d0ac66ff558ed91c2d7c7c41124de2832b6"
> +SRC_URI[compat.md5sum] = "22d66ef8bc9d167eb822bbfecb584107"
> +SRC_URI[compat.sha256sum] = "f53fae7258fcf67cb29d344e53e1548171e4781af11ff4ba92b8b81caab3c315"
> diff --git a/recipes/upstart/upstart_0.3.8.bb b/recipes/upstart/upstart_0.3.8.bb
> index 1b2cfb5..baf00d2 100644
> --- a/recipes/upstart/upstart_0.3.8.bb
> +++ b/recipes/upstart/upstart_0.3.8.bb
> @@ -1,10 +1,14 @@
>  require upstart.inc
>  
> -SRC_URI = "http://upstart.ubuntu.com/download/0.3/upstart-${PV}.tar.bz2 \
> -file://autoconf_version.patch"
> +SRC_URI = "http://upstart.ubuntu.com/download/0.3/upstart-${PV}.tar.bz2;name=upstart \
> +    http://upstart.ubuntu.com/download/example-jobs/0.3/example-jobs-${PV}.tar.gz;name=compat \
> +    file://init/rcS-default file://init/rc file://init/rcS \
> +    file://autoconf_version.patch \
> +"
>  
>  PR = "r1"
>  
> -
> -SRC_URI[md5sum] = "5cdd2dc3a3f02089c9450edf4e8f4941"
> -SRC_URI[sha256sum] = "9a2a37455ad4e9dd2856b5a0f15adb1a3f84439f60d0f63b041584a2666e9835"
> +SRC_URI[upstart.md5sum] = "5cdd2dc3a3f02089c9450edf4e8f4941"
> +SRC_URI[upstart.sha256sum] = "9a2a37455ad4e9dd2856b5a0f15adb1a3f84439f60d0f63b041584a2666e9835"
> +SRC_URI[compat.md5sum] = "22d66ef8bc9d167eb822bbfecb584107"
> +SRC_URI[compat.sha256sum] = "f53fae7258fcf67cb29d344e53e1548171e4781af11ff4ba92b8b81caab3c315"


Thanks,

Paul
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part
URL: <http://lists.openembedded.org/pipermail/openembedded-devel/attachments/20100826/2c7f1465/attachment-0002.sig>


More information about the Openembedded-devel mailing list