Bug#423095: [Pkg-sysvinit-devel] Bug#423095: sysvinit: Allow
bootsplash packages to hook into fsck events
David Härdeman
david at hardeman.nu
Sat May 12 11:32:01 UTC 2007
On Thu, May 10, 2007 at 10:47:29PM +0200, Petter Reinholdtsen wrote:
>[David Härdeman]
>> Here's a more complete stub (/lib/init/splash-functions-base) file which
>> should allow many more scripts to use the generic functions.
>
>This API looks quite good, and I suspect it will handle most needs.
>We might need some splash_start_if_not_running() or similar, for the
>cases where it need to be restarted.
>
>Also, this function need to have more features:
>
>> # Tells the splash the current boot progress in percent (as $1)
>> splash_progress () { return 0; }
>
>In usplash, the progress bar can go both ways, depending on the sign
>of the progress value. It is used during shutdown. We probably want
>to support it in the API.
I've thought a bit more about the API and also experimented with
implementing it in some different scripts which uncovered some more
functionality that was needed.
I've attached a new version of the hooks and an example implementation
for usplash to give you a fell of how it would work when implemented.
Please review.
--
David Härdeman
-------------- next part --------------
# Usplash hooks for /lib/init/splash-functions-base
# Internal function, do not use in external scripts
usplash_pidfound()
{
pidof usplash > /dev/null 2>&1 || return 1
return 0
}
splash_running()
{
if [ -x /sbin/usplash ] && usplash_pidfound; then
return 0
fi
return 1
}
splash_stop ()
{
local i
splash_running || return 0
# Wait until it is gone or forcibly kill it
i=0
while usplash_pidfound; do
i=$(($i + 1))
if [ $i -gt 10 ]; then
kill -9 $(pidof usplash)
break
fi
sleep 1
done
return 0
}
splash_start ()
{
if splash_running; then
return 0
elif [ ! -x /sbin/usplash ] || [ ! -x /sbin/usplash_down ]; then
return 1
else
/sbin/usplash_down || return 1
return 0
fi
}
private_splash_progress ()
{
splash_running || return 0
/sbin/usplash_write "PROGRESS $1" || return 1
return 0
}
splash_start_indefinate ()
{
splash_running || return 0
/sbin/usplash_write "TIMEOUT 0" || return 1
/sbin/usplash_write "PULSATE" || return 1
return 0
}
splash_stop_indefinate ()
{
splash_running || return 0
/sbin/usplash_write "CLEAR" || return 1
/sbin/usplash_write "TIMEOUT 15" || return 1
return 0
}
splash_user_input ()
{
splash_running || return 1
[ -p /dev/.initramfs/usplash_outfifo ] || return 1
case "$2" in
regular)
/sbin/usplash_write "INPUT $1" || return 1
;;
password)
/sbin/usplash_write "INPUTQUIET $1" || return 1
;;
enter)
/sbin/usplash_write "INPUTENTER $1" || return 1
;;
*)
return 1
;;
esac
cat /dev/.initramfs/usplash_outfifo 2> /dev/null || return 1
return 0
}
-------------- next part --------------
# This script contains hooks to allow init scripts to control
# a splash program during boot and shutdown.
#
# To override these, provide a /lib/init/splash-functions scripts
# with new functions (it is sourced at the end of this file)
#
# Note that scripts have a number of constraints:
# 1) Should avoid using any binaries not found in the initramfs so that
# the same hooks can be used there.
# 2) This also means that bashisms can't be used.
# 3) Scripts must work when running under "set -e".
# 4) "local" should be used to avoid overwriting global variables.
# Detects whether a splash is running
splash_running() { return 1; }
# Tells the splash to quit
splash_stop () { return 0; }
# Tells the splash to start if not already running
splash_start () { return 1; }
# Tells the splash the current boot/shutdown progress
# $1 contains the progress as a percentage value between -100 and 100
# Positive values indicate boot progress
# Negative values indicate shutdown progress
splash_progress ()
{
local progress tmp
progress="$1"
splash_running || return 0
# Sanity check step 1 - must match ^-[0-9]*$
tmp="$progress"
# Strip trailing numbers
while [ "${tmp%[0-9]}" != "$tmp" ]; do
tmp="${tmp%[0-9]}"
done
# Now "-" or no characters should remain
if [ -n "$tmp" ] && [ "$tmp" != "-" ]; then
return 1
fi
# Sanity check step 2 - check for values >= -100 and <= 100
if [ "$progress" != "${progress#-}" ]; then
# Negative value
if [ "$progress" -lt -100 ]; then
return 1
fi
else
# Positive value
if [ "$progress" -gt 100 ]; then
return 1
fi
fi
# Sanity checks passed
private_splash_progress "$progress" || return 1
return 0
}
# Customizations should replace this function instead of splash_progress above
private_splash_progress () { return 0; }
# Tells the splash that a task which may take an unknown amount of
# time has started (such as a fsck). This is useful to make sure the
# splash doesn't time out and to give visual feedback to the user.
splash_start_indefinate () { return 0; }
# Tells the splash that an indefinate task is done
splash_stop_indefinate () { return 0; }
# Gets user input from a splash
# $1 contains the text for the user prompt
# $2 describes the type of input:
# regular = regular input, e.g. a user name
# password = input which should not be echoed to screen, e.g. a password
# enter = A "press enter to continue" type of prompt
#
# Returns 1 if no user input is possible
# Should be called with an alternative non-splash input fallback:
# INPUT="$(splash_user_input "Enter password:" password)" || \
# INPUT="$(manual_method)"
splash_user_input () { return 1; }
# Allow these to be overridden with custom scripts
[ -e /lib/init/splash-functions ] && . /lib/init/splash-functions
More information about the Pkg-sysvinit-devel
mailing list