pending patches to sysvinit and lsb packages
Mark Hindley
mark at hindley.org.uk
Sun May 8 11:32:59 BST 2022
Adam,
On Sat, May 07, 2022 at 01:55:54PM +0200, Adam Borowski wrote:
> sysvinit-utils would subsume lsb-base.
Patch below as a start on this.
Issues:
- Many packages have versioned depends on lsb-base, so I think we need
versioned provides preserving the lsb-version. This feels messy to me, but I
don't see an alternative.
- Surprisingly (to me, at least), ubuntu still makes even more use of
src:lsb. It builds
* lsb Linux Standard Base support package
* lsb-base Linux Standard Base init script functionality
* lsb-core Linux Standard Base core support package
* lsb-invalid-mta Linux Standard Base sendmail dummy
* lsb-printing Linux Standard Base Printing package
* lsb-release Linux Standard Base version reporting utility
* lsb-security Linux Standard Base Security package
This still makes me wonder about the wisdom of this...
- I dislike the src:sysvinit d/rules which is getting more convoluted. But I
need time to rework it without introducing regressions.
Any comments?
Thanks.
Mark
9 files changed, 623 insertions(+), 1 deletion(-)
debian/changelog | 7 +
debian/control | 8 +-
debian/rules | 10 +
debian/src/lsb-base/conf/conf.yaml | 9 +
debian/src/lsb-base/init-functions | 423 +++++++++++++++++++++
debian/src/lsb-base/init-functions.d/.gitignore | 1 +
.../src/lsb-base/init-functions.d/00-verbose.jinja | 20 +
.../lsb-base/init-functions.d/50-ubuntu-logging | 144 +++++++
debian/sysvinit-utils.install | 2 +
modified debian/changelog
@@ -1,3 +1,10 @@
+sysvinit (3.03-1+lsb1) UNRELEASED; urgency=medium
+
+ * Take over library scripts from lsb-base.
+ * sysvinit-utils: drop unnecessary lsb-base dependency (Closes: #946399).
+
+ -- Mark Hindley <leepen at debian.org> Sun, 08 May 2022 10:30:34 +0100
+
sysvinit (3.03-1) unstable; urgency=medium
* New upstream version 3.03
modified debian/control
@@ -10,6 +10,7 @@ Uploaders:
Mark Hindley <leepen at debian.org>,
Build-Depends:
debhelper-compat (= 12),
+ ionit,
libcrypt-dev,
libselinux1-dev [linux-any],
po-debconf,
@@ -55,14 +56,19 @@ Essential: yes
Architecture: any
Multi-Arch: foreign
Depends:
- lsb-base (>= 11.0.0~),
${misc:Depends},
${shlibs:Depends},
+Conflicts: lsb-base
+Provides: lsb-base (= 11.1.0)
+Replaces: lsb-base
Description: System-V-like utilities
This package contains the important System-V-like utilities.
.
Specifically, this package includes:
init-d-script, fstab-decode, killall5, pidof
+ .
+ It also contains the library scripts sourced by init-d-script and other
+ initscripts that were formally in lsb-base.
Package: sysv-rc
Architecture: all
modified debian/rules
@@ -16,6 +16,8 @@ LC_ALL = POSIX
INSTALL_DATA = install -m 644
INSTALL = install -m 755
+derives_from_ubuntu := $(shell (dpkg-vendor --derives-from Ubuntu && echo "yes") || echo "no")
+
# Handle cross builds
ifneq ($(DEB_HOST_GNU_TYPE),$(DEB_BUILD_GNU_TYPE))
CROSS=CC=$(DEB_HOST_GNU_TYPE)-gcc
@@ -31,6 +33,8 @@ DH_OPTIONS =
override_dh_auto_build:
$(MAKE) $(CROSS) $(CONFFLAGS) DISTRO=Debian LIBDIR=/usr/lib/$(DEB_HOST_MULTIARCH) CFLAGS="$(CFLAGS) $(CPPFLAGS)" LDFLAGS="$(LDFLAGS)"
+ ionit -c debian/src/lsb-base/conf -t debian/src/lsb-base/init-functions.d
+
override_dh_auto_install-arch:
$(MAKE) -C src $(CROSS) ROOT=$(tmp) DISTRO=Debian install
@@ -62,6 +66,12 @@ ifneq (,$(findstring $(DEB_HOST_ARCH_OS),linux kfreebsd))
$(INSTALL) -d $(inittmp)/sys
endif
+ifeq ($(derives_from_ubuntu),yes)
+ifneq (,$(findstring lsb-base, $(shell dh_listpackages)))
+ cp -p debian/src/lsb-base/init-functions.d/50-ubuntu-logging debian/lsb-base/lib/lsb/init-functions.d/
+endif
+endif
+
install-arch: build-arch
dh $@ $(DH_OPTIONS)
new file debian/src/lsb-base/conf/conf.yaml
@@ -0,0 +1,9 @@
+log_functions:
+ - log_daemon_msg
+ - log_begin_msg
+ - log_action_msg
+ - log_action_begin_msg
+ - log_action_end_msg
+
+log_end_functions:
+ - log_end_msg
new file debian/src/lsb-base/init-functions
@@ -0,0 +1,423 @@
+# /lib/lsb/init-functions for Debian -*- shell-script -*-
+#
+#Copyright (c) 2002-08 Chris Lawrence
+#All rights reserved.
+#
+#Redistribution and use in source and binary forms, with or without
+#modification, are permitted provided that the following conditions
+#are met:
+#1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#3. Neither the name of the author nor the names of other contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+#THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+#IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+#WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+#LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+#BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+#WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+#OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+#EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+start_daemon () {
+ local force nice pidfile exec args OPTIND
+ force=""
+ nice=0
+ pidfile=/dev/null
+
+ OPTIND=1
+ while getopts fn:p: opt ; do
+ case "$opt" in
+ f) force="force";;
+ n) nice="$OPTARG";;
+ p) pidfile="$OPTARG";;
+ esac
+ done
+
+ shift $(($OPTIND - 1))
+ if [ "$1" = '--' ]; then
+ shift
+ fi
+
+ exec="$1"; shift
+
+ args="--start --nicelevel $nice --quiet --oknodo"
+ if [ "$force" ]; then
+ /sbin/start-stop-daemon $args \
+ --chdir "$PWD" --startas $exec --pidfile /dev/null -- "$@"
+ elif [ $pidfile ]; then
+ /sbin/start-stop-daemon $args \
+ --chdir "$PWD" --exec $exec --oknodo --pidfile "$pidfile" -- "$@"
+ else
+ /sbin/start-stop-daemon $args --chdir "$PWD" --exec $exec -- "$@"
+ fi
+}
+
+pidofproc () {
+ local pidfile base status specified pid OPTIND
+ pidfile=
+ specified=
+
+ OPTIND=1
+ while getopts p: opt ; do
+ case "$opt" in
+ p) pidfile="$OPTARG"
+ specified="specified"
+ ;;
+ esac
+ done
+ shift $(($OPTIND - 1))
+ if [ $# -ne 1 ]; then
+ echo "$0: invalid arguments" >&2
+ return 4
+ fi
+
+ base=${1##*/}
+ if [ ! "$specified" ]; then
+ pidfile="/var/run/$base.pid"
+ fi
+
+ if [ -n "${pidfile:-}" ]; then
+ if [ -e "$pidfile" ]; then
+ if [ -r "$pidfile" ]; then
+ read pid < "$pidfile"
+ if [ -n "${pid:-}" ]; then
+ if $(kill -0 "${pid:-}" 2> /dev/null); then
+ echo "$pid" || true
+ return 0
+ elif ps "${pid:-}" >/dev/null 2>&1; then
+ echo "$pid" || true
+ return 0 # program is running, but not owned by this user
+ else
+ return 1 # program is dead and /var/run pid file exists
+ fi
+ fi
+ else
+ return 4 # pid file not readable, hence status is unknown.
+ fi
+ else
+ # pid file doesn't exist, try to find the pid nevertheless
+ if [ -x /bin/pidof ] && [ ! "$specified" ]; then
+ status="0"
+ /bin/pidof -c -o %PPID -x $1 || status="$?"
+ if [ "$status" = 1 ]; then
+ return 3 # program is not running
+ fi
+ return 0
+ fi
+ return 3 # specified pid file doesn't exist, program probably stopped
+ fi
+ fi
+ if [ "$specified" ]; then
+ return 3 # almost certain it's not running
+ fi
+ return 4 # Unable to determine status
+}
+
+# start-stop-daemon uses the same algorithm as "pidofproc" above.
+killproc () {
+ local pidfile sig status base name_param is_term_sig OPTIND
+ pidfile=
+ name_param=
+ is_term_sig=
+
+ OPTIND=1
+ while getopts p: opt ; do
+ case "$opt" in
+ p) pidfile="$OPTARG";;
+ esac
+ done
+ shift $(($OPTIND - 1))
+
+ base=${1##*/}
+ if [ ! $pidfile ]; then
+ name_param="--name $base --pidfile /var/run/$base.pid"
+ else
+ name_param="--name $base --pidfile $pidfile"
+ fi
+
+ sig=${2:-} sig=${sig#-} sig=${sig#SIG}
+ if [ "$sig" = 15 ] || [ "$sig" = TERM ]; then
+ is_term_sig="terminate_signal"
+ fi
+ status=0
+ if [ ! "$is_term_sig" ]; then
+ if [ -n "$sig" ]; then
+ /sbin/start-stop-daemon --stop --signal "$sig" \
+ --quiet $name_param || status="$?"
+ else
+ /sbin/start-stop-daemon --stop \
+ --retry 5 \
+ --quiet $name_param || status="$?"
+ fi
+ else
+ /sbin/start-stop-daemon --stop --quiet \
+ --oknodo $name_param || status="$?"
+ fi
+ if [ "$status" = 1 ]; then
+ if [ -z "$sig" ]; then
+ return 0
+ fi
+ return 3 # program is not running
+ fi
+
+ if [ "$status" = 0 ] && [ "$is_term_sig" ] && [ "$pidfile" ]; then
+ pidofproc -p "$pidfile" "$1" >/dev/null || rm -f "$pidfile"
+ fi
+ return 0
+}
+
+# Return LSB status
+status_of_proc () {
+ local pidfile daemon name status OPTIND
+
+ pidfile=
+ OPTIND=1
+ while getopts p: opt ; do
+ case "$opt" in
+ p) pidfile="$OPTARG";;
+ esac
+ done
+ shift $(($OPTIND - 1))
+
+ if [ -n "$pidfile" ]; then
+ pidfile="-p $pidfile"
+ fi
+ daemon="$1"
+ name="$2"
+
+ status="0"
+ pidofproc $pidfile $daemon >/dev/null || status="$?"
+ if [ "$status" = 0 ]; then
+ log_success_msg "$name is running"
+ return 0
+ elif [ "$status" = 4 ]; then
+ log_failure_msg "could not access PID file for $name"
+ return $status
+ else
+ log_failure_msg "$name is not running"
+ return $status
+ fi
+}
+
+log_use_fancy_output () {
+ if [ -t 1 ] &&
+ [ "x${TERM:-}" != "x" ] &&
+ [ "x${TERM:-}" != "xdumb" ]
+ then
+ [ -z $FANCYTTY ] && return 0 || true
+ else
+ return 1
+ fi
+ case "$FANCYTTY" in
+ 1|Y|yes|true) true;;
+ *) false;;
+ esac
+}
+
+log_success_msg () {
+ if [ -n "${1:-}" ]; then
+ log_begin_msg "$@"
+ fi
+ log_end_msg 0
+}
+
+log_failure_msg () {
+ if [ -n "${1:-}" ]; then
+ log_begin_msg "$@" "..."
+ fi
+ log_end_msg 1 || true
+}
+
+log_warning_msg () {
+ if [ -n "${1:-}" ]; then
+ log_begin_msg "$@" "..."
+ fi
+ log_end_msg 255 || true
+}
+
+#
+# NON-LSB HELPER FUNCTIONS
+#
+# int get_lsb_header_val (char *scriptpathname, char *key)
+get_lsb_header_val () {
+ if [ ! -f "$1" ] || [ -z "${2:-}" ]; then
+ return 1
+ fi
+ LSB_S="### BEGIN INIT INFO"
+ LSB_E="### END INIT INFO"
+ sed -n "/$LSB_S/,/$LSB_E/ s/# $2: \+\(.*\)/\1/p" "$1"
+}
+
+# If the currently running init daemon is upstart, return zero; if the
+# calling init script belongs to a package which also provides a native
+# upstart job, it should generally exit non-zero in this case.
+init_is_upstart()
+{
+ if [ -x /sbin/initctl ] && /sbin/initctl version 2>/dev/null | /bin/grep -q upstart; then
+ return 0
+ fi
+ return 1
+}
+
+# int log_begin_message (char *message)
+log_begin_msg () {
+ log_begin_msg_pre "$@"
+ if [ -z "${1:-}" ]; then
+ return 1
+ fi
+ echo -n "$@" || true
+ log_begin_msg_post "$@"
+}
+
+# Sample usage:
+# log_daemon_msg "Starting GNOME Login Manager" "gdm"
+#
+# On Debian, would output "Starting GNOME Login Manager: gdm"
+# On Ubuntu, would output " * Starting GNOME Login Manager..."
+#
+# If the second argument is omitted, logging suitable for use with
+# log_progress_msg() is used:
+#
+# log_daemon_msg "Starting remote filesystem services"
+#
+# On Debian, would output "Starting remote filesystem services:"
+# On Ubuntu, would output " * Starting remote filesystem services..."
+
+log_daemon_msg () {
+ if [ -z "${1:-}" ]; then
+ return 1
+ fi
+ log_daemon_msg_pre "$@"
+
+ if [ -z "${2:-}" ]; then
+ echo -n "$1:" || true
+ return
+ fi
+
+ echo -n "$1: $2" || true
+ log_daemon_msg_post "$@"
+}
+
+# #319739
+#
+# Per policy docs:
+#
+# log_daemon_msg "Starting remote file system services"
+# log_progress_msg "nfsd"; start-stop-daemon --start --quiet nfsd
+# log_progress_msg "mountd"; start-stop-daemon --start --quiet mountd
+# log_progress_msg "ugidd"; start-stop-daemon --start --quiet ugidd
+# log_end_msg 0
+#
+# You could also do something fancy with log_end_msg here based on the
+# return values of start-stop-daemon; this is left as an exercise for
+# the reader...
+#
+# On Ubuntu, one would expect log_progress_msg to be a no-op.
+log_progress_msg () {
+ if [ -z "${1:-}" ]; then
+ return 1
+ fi
+ echo -n " $@" || true
+}
+
+
+# int log_end_message (int exitstatus)
+log_end_msg () {
+ # If no arguments were passed, return
+ if [ -z "${1:-}" ]; then
+ return 1
+ fi
+
+ log_end_msg_pre "$@"
+
+ # Only do the fancy stuff if we have an appropriate terminal
+ if log_use_fancy_output; then
+ esc='' # escape character, printf '\033'
+ red="$esc[31m" # ANSI color escapes
+ yellow="$esc[33m"
+ normal="$esc[0m"
+ else
+ red= yellow= normal=
+ fi
+
+ if [ $1 -eq 0 ]; then
+ echo "." || true
+ elif [ $1 -eq 255 ]; then
+ echo " ${yellow}(warning).${normal}" || true
+ else
+ echo " ${red}failed!${normal}" || true
+ fi
+ log_end_msg_post "$@"
+ return $1
+}
+
+log_action_msg () {
+ log_action_msg_pre "$@"
+ echo "$@." || true
+ log_action_msg_post "$@"
+}
+
+log_action_begin_msg () {
+ log_action_begin_msg_pre "$@"
+ echo -n "$@..." || true
+ log_action_begin_msg_post "$@"
+}
+
+log_action_cont_msg () {
+ echo -n "$@..." || true
+}
+
+log_action_end_msg () {
+ local end
+ log_action_end_msg_pre "$@"
+ if [ -z "${2:-}" ]; then
+ end="."
+ else
+ end=" ($2)."
+ fi
+
+ if [ $1 -eq 0 ]; then
+ echo "done${end}" || true
+ else
+ if log_use_fancy_output; then
+ esc='' # escape character, printf '\033'
+ red="$esc[31m" # ANSI color escapes
+ normal="$esc[0m"
+ echo "${red}failed${end}${normal}" || true
+ else
+ echo "failed${end}" || true
+ fi
+ fi
+ log_action_end_msg_post "$@"
+}
+
+# Pre&Post empty function declaration, to be overriden from /lib/lsb/init-functions.d/*
+log_daemon_msg_pre () { :; }
+log_daemon_msg_post () { :; }
+log_begin_msg_pre () { :; }
+log_begin_msg_post () { :; }
+log_end_msg_pre () { :; }
+log_end_msg_post () { :; }
+log_action_msg_pre () { :; }
+log_action_msg_post () { :; }
+log_action_begin_msg_pre () { :; }
+log_action_begin_msg_post () { :; }
+log_action_end_msg_pre () { :; }
+log_action_end_msg_post () { :; }
+
+# Include hooks from other packages in /lib/lsb/init-functions.d
+for hook in $(run-parts --lsbsysinit --list /lib/lsb/init-functions.d 2>/dev/null); do
+ [ -r $hook ] && . $hook || true
+done
+
+FANCYTTY=
+[ -e /etc/lsb-base-logging.sh ] && . /etc/lsb-base-logging.sh || true
new file debian/src/lsb-base/init-functions.d/.gitignore
@@ -0,0 +1 @@
+00-verbose
new file debian/src/lsb-base/init-functions.d/00-verbose.jinja
@@ -0,0 +1,20 @@
+## Generated automatically. Do not edit! -*- shell-script -*-
+{% for fn in log_functions %}
+v{{ fn }}() {
+ if test x"${VERBOSE:-yes}" != x"no" ; then
+ {{ fn }} "$@"
+ else
+ true
+ fi
+}
+{% endfor %}
+{% for fn in log_end_functions %}
+v{{ fn }}() {
+ if test x"${VERBOSE:-yes}" != x"no" ; then
+ {{ fn }} "$@"
+ else
+ return ${1:-1}
+ fi
+}
+{% endfor %}
+# vim: ft=sh
new file debian/src/lsb-base/init-functions.d/50-ubuntu-logging
@@ -0,0 +1,144 @@
+# Default init script logging functions suitable for Ubuntu.
+# See /lib/lsb/init-functions for usage help.
+LOG_DAEMON_MSG=""
+
+log_use_plymouth () {
+ if [ "${loop:-n}" = y ]; then
+ return 1
+ fi
+ plymouth --ping >/dev/null 2>&1
+}
+
+log_success_msg () {
+ echo " * $@" || true
+}
+
+log_failure_msg () {
+ if log_use_fancy_output; then
+ esc='' # escape character, printf '\033'
+ red="$esc[31m" # ANSI color escapes
+ normal="$esc[0m"
+ echo " $red*$normal $@" || true
+ else
+ echo " * $@" || true
+ fi
+}
+
+log_warning_msg () {
+ if log_use_fancy_output; then
+ esc='' # escape character, printf '\033'
+ yellow="$esc[33m" # ANSI color escapes
+ normal="$esc[0m"
+ echo " $yellow*$normal $@" || true
+ else
+ echo " * $@" || true
+ fi
+}
+
+log_begin_msg () {
+ log_daemon_msg "$1"
+}
+
+log_daemon_msg () {
+ if [ -z "$1" ]; then
+ return 1
+ fi
+
+ TPUT=/usr/bin/tput
+ if log_use_fancy_output && $TPUT xenl >/dev/null 2>&1; then
+ COLS=`$TPUT cols`
+ if [ "$COLS" ] && [ "$COLS" -gt 6 ]; then
+ COL=$(( COLS - 7 ))
+ else
+ COLS=80
+ COL=73
+ fi
+
+ if log_use_plymouth; then
+ # If plymouth is running, don't output anything at this time
+ # to avoid buffering problems (LP: #752393)
+ if [ -z "$LOG_DAEMON_MSG" ]; then
+ LOG_DAEMON_MSG=$*
+ return
+ fi
+ fi
+
+ # We leave the cursor `hanging' about-to-wrap (see terminfo(5)
+ # xenl, which is approximately right). That way if the script
+ # prints anything then we will be on the next line and not
+ # overwrite part of the message.
+
+ # Previous versions of this code attempted to colour-code the
+ # asterisk but this can't be done reliably because in practice
+ # init scripts sometimes print messages even when they succeed
+ # and we won't be able to reliably know where the colourful
+ # asterisk ought to go.
+
+ printf " * $* " || true
+ # Enough trailing spaces for ` [fail]' to fit in; if the message
+ # is too long it wraps here rather than later, which is what we
+ # want.
+ esc='' # escape character, printf '\033'
+ movecur="$esc[${COLS}G" # ANSI horizontal position absolute
+ printf "$movecur " || true
+ else
+ echo " * $@" || true
+ COL=
+ fi
+}
+
+log_progress_msg () {
+ :
+}
+
+log_end_msg () {
+ if [ -z "$1" ]; then
+ return 1
+ fi
+
+ if [ "$COL" ] && [ -x "$TPUT" ]; then
+ # If plymouth is running, print previously stored output
+ # to avoid buffering problems (LP: #752393)
+ if log_use_plymouth; then
+ if [ -n "$LOG_DAEMON_MSG" ]; then
+ log_daemon_msg $LOG_DAEMON_MSG
+ LOG_DAEMON_MSG=""
+ fi
+ fi
+
+ esc='' # escape character, printf '\033'
+ movecur="$esc[$(( COL + 1 ))G" # ANSI horizontal position absolute
+ printf "\r$movecur" || true
+ if [ "$1" -eq 0 ]; then
+ echo "[ OK ]" || true
+ else
+ red="$esc[31m" # ANSI color escapes
+ normal="$esc[0m"
+ echo "[${red}fail${normal}]" || true
+ fi
+ else
+ if [ "$1" -eq 0 ]; then
+ echo " ...done." || true
+ else
+ echo " ...fail!" || true
+ fi
+ fi
+ return $1
+}
+
+log_action_msg () {
+ echo " * $@" || true
+}
+
+log_action_begin_msg () {
+ log_daemon_msg "$@..." || true
+}
+
+log_action_cont_msg () {
+ log_daemon_msg "$@..." || true
+}
+
+log_action_end_msg () {
+ # In the future this may do something with $2 as well.
+ log_end_msg "$1" || true
+}
modified debian/sysvinit-utils.install
@@ -5,3 +5,5 @@ sbin/killall5
usr/share/man/man8/fstab-decode.8
usr/share/man/man8/killall5.8
usr/share/man/man8/pidof.8
+debian/src/lsb-base/init-functions lib/lsb
+debian/src/lsb-base/init-functions.d/00-verbose lib/lsb/init-functions.d
[back]
More information about the Debian-init-diversity
mailing list