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