[ Do you want me to re-submit this patch as merge request? ]

[2019-01-11 14:58] Felipe Sateler <fsate...@debian.org>
> > [2011-06-14 11:39] Joey Hess <jo...@debian.org>
> > >
> > > part 1     text/plain                 618
> > > Helmut Grohne wrote:
> > > > A failure from the update-rc.d cannot make postinst fail, because the
> > > > exit code is not checked.
> > >
> > > Yes it is (set -x), but I meant invoke-rc.d anyway, obviously.
> > >
> > > > So in my view the reason for a postinst failure is unrelated to
> > > > update-rc.d. Can you explain your reasoning?
> > >
> > > Simple separation of concerns, invoke-rc.d is responsible for running
> > > the init script and determining if it fails and propigating a failing
> > > exit status. debhelper allows it to do do. The right way to make 6 be
> > > ignored is to get invoke-rc.d to ignore it, not add cruft to every
> > > postinst that calls it.
> >
> > Here I propose patch to implement just that:
> > [...]
> I'm wary of unintended consequences here. Do we have services that return
> exit code 6 but as a failure code?

Seems there is nobody, who use exit code 6 for another purposes. You can
make sure by checking is output of 'grep -R "exit 6" -C6' in directory
with all init scripts unpacked:

munin-node-
munin-node-if [ ! -x $DAEMON ]; then
munin-node-     log_failure_msg "Munin-Node appears to be uninstalled."
munin-node-     exit 5
munin-node-elif [ ! -e $CONFFILE ]; then
munin-node-     log_failure_msg "Munin-Node appears to be unconfigured."
munin-node:     exit 6
munin-node-fi
munin-node-
munin-node-# Figure out if the pid file is in a non-standard location
munin-node-while read line; do
munin-node-     line=${line%%\#*} # get rid of comments
munin-node-     set -f
--
globus-gatekeeper-    fi
globus-gatekeeper-
globus-gatekeeper-    
cert="${GLOBUS_GATEKEEPER_CERT_FILE:-/etc/grid-security/hostcert.pem}"
globus-gatekeeper-    if [ ! -f $cert ]; then
globus-gatekeeper-        echo "Error: Gatekeeper's certificate file ($cert) is 
missing."
globus-gatekeeper-        echo "Failed to start globus-gatekeeper"
globus-gatekeeper:        exit 6
globus-gatekeeper-    fi
globus-gatekeeper-
globus-gatekeeper-    
key="${GLOBUS_GATEKEEPER_KEY_FILE:-/etc/grid-security/hostkey.pem}"
globus-gatekeeper-    if [ ! -f $key ]; then
globus-gatekeeper-        echo "Error: Gatekeeper's private key file is ($key) 
is missing."
globus-gatekeeper-        echo "Failed to start globus-gatekeeper"
globus-gatekeeper:        exit 6
globus-gatekeeper-    fi
globus-gatekeeper-
globus-gatekeeper-    if [ "${GLOBUS_GATEKEEPER_KERBEROS_ENABLED:-false}" = 
"true" ]; then
globus-gatekeeper-        kflag="-k"
globus-gatekeeper-    else
globus-gatekeeper-        kflag=""
--
clamav-milter-  log_failure_msg "'invoke-rc.d clamav-milter start'"
clamav-milter-  if [ "$1" = "status" ]; then
clamav-milter-    # program or service status is unknown
clamav-milter-    exit 4;
clamav-milter-  else
clamav-milter-    # program is not configured
clamav-milter:    exit 6;
clamav-milter-  fi
clamav-milter-fi
clamav-milter-
clamav-milter-slurp_config "$CLAMAVCONF"
clamav-milter-[ -n "$User" ] || User=clamav
clamav-milter-
--
clamav-milter-  log_failure_msg "Please edit $CLAMAVCONF and run 'invoke-rc.d 
clamav-milter start'"
clamav-milter-  if [ "$1" = "status" ]; then
clamav-milter-    # program or service status is unknown
clamav-milter-    exit 4;
clamav-milter-  else
clamav-milter-    # program is not configured
clamav-milter:    exit 6;
clamav-milter-  fi
clamav-milter-fi
clamav-milter-
clamav-milter-if is_true "$Foreground"; then
clamav-milter-  if [ ! -x "$SUPERVISOR" ] ; then
clamav-milter-    log_failure_msg "Foreground specified, but $SUPERVISOR not 
found"
clamav-milter-    if [ "$1" = "status" ]; then
clamav-milter-      # program or service status is unknown
clamav-milter-      exit 4;
clamav-milter-    else
clamav-milter-      # program is not configured correctly
clamav-milter:      exit 6;
clamav-milter-    fi
clamav-milter-  else
clamav-milter-     RUN_SUPERVISED=1
clamav-milter-  fi
clamav-milter-fi
clamav-milter-
--
clamav-milter-  log_failure_msg "$NAME: Can not continue with PidFile not set"
clamav-milter-  if [ "$1" = "status" ]; then
clamav-milter-    # program or service status is unknown
clamav-milter-    exit 4;
clamav-milter-  else
clamav-milter-    # program is not configured correctly
clamav-milter:    exit 6;
clamav-milter-  fi
clamav-milter-fi
clamav-milter-
clamav-milter-if [ -z "$MilterSocket" ]
clamav-milter-then
clamav-milter-  log_failure_msg "$NAME: Can not continue with MilterSocket not 
set"
clamav-milter-  if [ "$1" = "status" ]; then
clamav-milter-    # program or service status is unknown
clamav-milter-    exit 4;
clamav-milter-  else
clamav-milter-    # program is not configured correctly
clamav-milter:    exit 6;
clamav-milter-  fi
clamav-milter-fi
clamav-milter-
clamav-milter-if [ ! -f "$THEPIDFILE" ]
clamav-milter-then
clamav-milter-  touch "$THEPIDFILE"
--
spampd-
spampd-case "$1" in
spampd- start)
spampd-         if ! istrue "${STARTSPAMPD}"; then
spampd-                 log_warning_msg "Starting $DESC: $NAME (disabled in 
/etc/default/$NAME)."
spampd-                 # LSB 2.1: 6 mean unconfigured. This seems appropriate 
here.
spampd:                 exit 6
spampd-         fi
spampd-         log_daemon_msg "Starting $DESC" "$NAME"
spampd-         # if spampd is already running, exit 0 as demanded by LSB 2.1
spampd-         # this also removes the PIDFILE if it exists but has no matching
spampd-         # process
spampd-         if check_pid $PROGRAM $PIDFILE ; then
--
icinga-    return 0   # no named pipe exists
icinga-  fi
icinga-}
icinga-
icinga-if [ ! -f "$ICINGACFG" ]; then
icinga-  log_failure_msg "There is no configuration file for Icinga."
icinga:  exit 6
icinga-fi
icinga-
icinga-THEPIDFILE=$(get_config "lock_file")
icinga-[ -n "$THEPIDFILE" ] || THEPIDFILE='/var/run/icinga/icinga.pid'
icinga-
icinga-start () {
--
icinga-    else
icinga-      log_warning_msg "Not running."
icinga-    fi
icinga-  else
icinga-    log_failure_msg "errors in config!"
icinga-    log_end_msg 6
icinga:    exit 6
icinga- fi
icinga-}
icinga-
icinga-check_run
icinga-
icinga-case "$1" in
--
rtirq-# Check for existence of needed config file and read it.
rtirq-RTIRQ_CONFIG=/etc/sysconfig/rtirq
rtirq-[ -r ${RTIRQ_CONFIG} ] || RTIRQ_CONFIG=/etc/default/rtirq
rtirq-[ -r ${RTIRQ_CONFIG} ] || RTIRQ_CONFIG=/etc/rtirq.conf
rtirq-[ -r ${RTIRQ_CONFIG} ] || {
rtirq-  echo "`basename $0`: ${RTIRQ_CONFIG}: not found."
rtirq:  [ "${RTIRQ_ACTION}" = "stop" ] && exit 0 || exit 6
rtirq-}
rtirq-
rtirq-# Read configuration.
rtirq-source ${RTIRQ_CONFIG}
rtirq-
rtirq-# Colon delimited trail list of already assigned IRQ numbers,
--
conman-  # Exit if the package has been removed.
conman-  ##
conman-  [ -x "$DAEMON" ] || exit 5                    # LSB: program not 
installed
conman-
conman-  # Exit if the configuration has been removed.
conman-  ##
conman:  [ -z "$CONFIG" -o -r "$CONFIG" ] || exit 6    # LSB: program not 
configured
conman-}
conman-
conman-service_fini ()
conman-{
conman-# Return the exit status.
conman-##
--
nagios4-    return 0   # no named pipe exists
nagios4-  fi
nagios4-}
nagios4-
nagios4-if [ ! -f "$NAGIOSCFG" ]; then
nagios4-  log_failure_msg "There is no configuration file for Nagios 3."
nagios4:  exit 6
nagios4-fi
nagios4-
nagios4-THEPIDFILE=$(get_config "lock_file")
nagios4-[ -n "$THEPIDFILE" ] || THEPIDFILE='/var/run/nagios4/nagios.pid'
nagios4-
nagios4-start () {
--
nagios4-    else
nagios4-      log_warning_msg "Not running."
nagios4-    fi
nagios4-  else
nagios4-    log_failure_msg "errors in config!"
nagios4-    log_end_msg 6
nagios4:    exit 6
nagios4- fi
nagios4-}
nagios4-
nagios4-check() {
nagios4-    $DAEMON -v $NAGIOSCFG
nagios4-}
--
powerman-  # Exit if the package has been removed.
powerman-  ##
powerman-  [ -x "$DAEMON" ] || exit 5                    # LSB: program not 
installed
powerman-
powerman-  # Exit if the configuration has been removed.
powerman-  ##
powerman:  [ -z "$CONFIG" -o -r "$CONFIG" ] || exit 6    # LSB: program not 
configured
powerman-}
powerman-
powerman-service_fini ()
powerman-{
powerman-# Return the exit status.
powerman-##
--
oss4-base-      then
oss4-base-        OPTIONS="`grep -v -h '^#' $OSSETCDIR/conf/osscore.conf|sed 
's/ //g'`"
oss4-base-      fi
oss4-base-      if ! /sbin/modprobe osscore $OPTIONS
oss4-base-      then
oss4-base-              log_action_end_msg 60 "Cannot load the osscore module"
oss4-base:              exit 60
oss4-base-      fi
oss4-base-
oss4-base-      # Load oss drivers
oss4-base-      for n in `cat $OSSETCDIR/installed_drivers | sed 's/#.*//'`
oss4-base-      do
oss4-base-              OPTIONS=
--
mumudvb-}
mumudvb-
mumudvb-case "$1" in
mumudvb-  start)
mumudvb-        if [ ! -f "$DEFAULT_FILE" ]; then
mumudvb-                log_failure_msg "$DEFAULT_FILE not found, Can't start 
$NAME"
mumudvb:                exit 6
mumudvb-        fi
mumudvb-
mumudvb-        log_daemon_msg "Starting $DESC: $NAME"
mumudvb-        do_start
mumudvb-        log_end_msg $?
mumudvb-        ;;
--
dhcpcd- local x=
dhcpcd-
dhcpcd- case "$($DHCPCD --version)" in
dhcpcd- [1234].*)
dhcpcd-         log_failure_msg "Not running $NAME because an older version" \
dhcpcd-                 "is currently preferred"
dhcpcd:         exit 6
dhcpcd- esac
dhcpcd-
dhcpcd- for x in /var/run/dhcpcd-*.pid; do
dhcpcd-         [ -f "$x" ] || continue
dhcpcd-         log_failure_msg "Not running $NAME because there is aleady an" \
dhcpcd-                 "interface specific instance"
dhcpcd-         log_failure_msg "$x"
dhcpcd:         exit 6
dhcpcd- done
dhcpcd-         
dhcpcd- if grep -q 
"^[[:space:]]*iface[[:space:]]*.*[[:space:]]*inet[[:space:]]*dhcp" \
dhcpcd- $INTERFACES; then
dhcpcd-         log_failure_msg "Not running $NAME because $INTERFACES"
dhcpcd-         log_failure_msg "defines some interfaces that will use a" \
dhcpcd-                 "DHCP client"
dhcpcd:         exit 6
dhcpcd- fi
dhcpcd-}
dhcpcd-
dhcpcd-case "$1" in
dhcpcd-start)
dhcpcd- sanity
--
clamav-daemon-  log_failure_msg "'invoke-rc.d clamav-daemon start'"
clamav-daemon-  if [ "$1" = "status" ]; then
clamav-daemon-    # program or service status is unknown
clamav-daemon-    exit 4;
clamav-daemon-  else
clamav-daemon-    # program is not configured
clamav-daemon:    exit 6;
clamav-daemon-  fi
clamav-daemon-fi
clamav-daemon-
clamav-daemon-slurp_config "$CLAMAVCONF"
clamav-daemon-
clamav-daemon-if [ -n "$Example" ]; then
--
clamav-daemon-  log_failure_msg "Please edit $CLAMAVCONF and run  'invoke-rc.d 
clamav-daemon start'"
clamav-daemon-  if [ "$1" = "status" ]; then
clamav-daemon-    # program or service status is unknown
clamav-daemon-    exit 4;
clamav-daemon-  else
clamav-daemon-    # program is not configured
clamav-daemon:    exit 6;
clamav-daemon-  fi
clamav-daemon-fi
clamav-daemon-
clamav-daemon-if is_true "$Foreground"; then
clamav-daemon-  if [ ! -x "$SUPERVISOR" ] ; then
clamav-daemon-     log_failure_msg "Foreground specified, but $SUPERVISORNAME 
not found"
clamav-daemon-    if [ "$1" = "status" ]; then
clamav-daemon-      # program or service status is unknown
clamav-daemon-      exit 4;
clamav-daemon-    else
clamav-daemon-      # program is not configured correctly
clamav-daemon:      exit 6;
clamav-daemon-    fi
clamav-daemon-  else
clamav-daemon-     RUN_SUPERVISED=1
clamav-daemon-  fi
clamav-daemon-fi
clamav-daemon-
--
boinc-client-    "executable."
boinc-client-  exit 5
boinc-client-fi
boinc-client-
boinc-client-if [ ! -d "$BOINC_DIR" ]; then
boinc-client-  log_failure_msg "BOINC data directory '$BOINC_DIR' does not 
exist."
boinc-client:  exit 6
boinc-client-fi
boinc-client-
boinc-client-if [ -z "$BOINC_USER" ]; then
boinc-client-  log_failure_msg "BOINC_USER variable is empty. Set it to a user 
to run" \
boinc-client-    "the BOINC core client."
boinc-client:  exit 6
boinc-client-fi
boinc-client-
boinc-client-if [ ! -z "$BOINC_OPTS" ]; then
boinc-client-   (echo $BOINC_OPTS | grep -- '--daemon' 1>/dev/null) &&
boinc-client-           log_warning_msg "\`--daemon' option detected \
boinc-client-                   on /etc/default/boinc-client, this \
--
munge-# Exit if the package has been removed.
munge-##
munge-[ -x "$DAEMON" ] || exit 0                      # program not installed
munge-
munge-# Exit if the configuration has been removed.
munge-##
munge:[ -z "$CONFIG" -o -r "$CONFIG" ] || exit 6      # program not configured
munge-
munge-###############################################################################
munge-
munge-service_init ()
munge-{
munge-# Initialize the environment.
--
drbd-   out=$($DRBDADM sh-nop 2>&1); ex=$?
drbd-   [[ $ex = 127 ]] && exit 5 # LSB for "not installed"
drbd-   log_daemon_msg "Starting DRBD resources"
drbd-   if [[ $ex != 0 ]] ; then
drbd-       printf "\n%s\n" "$out" >&2
drbd-       log_end_msg 1
drbd:       exit 6 # LSB for "not configured"
drbd-   fi
drbd-
drbd-   $DRBDADM adjust-with-progress all
drbd-   [[ $? -gt 1 ]] && exit 20
drbd-
drbd-   # make sure udev has time to create the device files
--
snort-                        fi
snort-                fi
snort-  done
snort-
snort-  if [ "$got_instance" = 0 ] && [ "$ALLOW_UNAVAILABLE" = "no" ]; then
snort-          log_failure_msg "No snort instance found to be started!" >&2
snort:          exit 6
snort-  fi
snort-
snort-        if  [ $myret -eq 0 ] ; then
snort-            log_end_msg 0
snort-        else
snort-            log_end_msg 1
--
snort-                          myret=$(expr "$myret" + 1)
snort-                          ;;
snort-          esac
snort-  done
snort-  if [ "$got_instance" = 0 ]; then
snort-          log_failure_msg "no snort instance found to be started!" >&2
snort:          exit 6
snort-  fi
snort-
snort-        if  [ $myret -eq 0 ] ; then
snort-            log_end_msg 0
snort-        else
snort-            log_end_msg 1
--
smokeping-        return
smokeping-    fi
smokeping-    if [ -z "$SHARED_SECRET" ]
smokeping-    then
smokeping-        log_progress_msg "(missing \$SHARED_SECRET setting)"
smokeping-        log_end_msg 6 # program is not configured
smokeping:        exit 6
smokeping-    fi
smokeping-    if [ ! -r "$SHARED_SECRET" ]
smokeping-    then
smokeping-        log_progress_msg "(invalid \$SHARED_SECRET setting)"
smokeping-        log_end_msg 2 # invalid or excess argument(s)
smokeping-        exit 2
smokeping-    fi
smokeping-    if [ -z "$MASTER_URL" ]
smokeping-    then
smokeping-        log_progress_msg "(missing \$MASTER_URL setting)"
smokeping-        log_end_msg 6 # program is not configured
smokeping:        exit 6
smokeping-    fi
smokeping-    DAEMON_ARGS="$DAEMON_ARGS --master-url $MASTER_URL 
--shared-secret $SHARED_SECRET"
smokeping-    if [ -n "$SLAVE_NAME" ]
smokeping-    then
smokeping-        DAEMON_ARGS="$DAEMON_ARGS --slave-name $SLAVE_NAME"
smokeping-    fi
--
smokeping-    echo "Checking smokeping configuration file syntax..."
smokeping-    # Check whether the configuration file is available
smokeping-    if [ ! -r "$CONFIG" ] && [ "$MODE" = "master" ]
smokeping-    then
smokeping-        log_progress_msg "($CONFIG does not exist)"
smokeping-        log_end_msg 6 # program is not configured
smokeping:        exit 6
smokeping-    fi
smokeping-    if [ ! -d /var/run/smokeping ]; then
smokeping-        mkdir /var/run/smokeping
smokeping-        chown ${DAEMON_USER}.root /var/run/smokeping
smokeping-        chmod 0755 /var/run/smokeping
smokeping-    fi
smokeping:    ${DAEMON} --config=${CONFIG} --check || exit 6
smokeping-}
smokeping-
smokeping-case "$1" in
smokeping-    start)
smokeping-        check_config
smokeping-        log_daemon_msg "Starting $DESC" $NAME
--
fetchmail-      exit 0
fetchmail-fi
fetchmail-
fetchmail-if [ ! -e $CONFFILE ]; then
fetchmail-    log_failure_msg "$CONFFILE not found."
fetchmail-    log_failure_msg "can not start fetchmail daemon... consider 
disabling the script"
fetchmail:    exit 6
fetchmail-fi
fetchmail-
fetchmail-
fetchmail-test -f $DAEMON || exit 0
fetchmail-
fetchmail-if [ "$1" = "start" ]; then

Reply via email to