Browse Source

Rework init script

Simplify the code, quote strings where possible, and replace remaining
bashisms.

Aside, the init and default script are used on non-systemd only, so
possibly nobody noticed the LVMGROUP setting would work for a single
volume group only.

Still the entire handling is farily fragile, a mis-configuration could
create a lot of damage. So place an according warning.
Christoph Biedl 7 months ago
parent
commit
a658117bef
2 changed files with 188 additions and 195 deletions
  1. 22 11
      debian/aoetools.default
  2. 166 184
      debian/aoetools.init

+ 22 - 11
debian/aoetools.default

@@ -1,27 +1,38 @@
 # Configuration file for aoetools.
 
 ## NOTE: This file is NOT READ under systemd.
-## If you need to restrict the used interfaces, please read /usr/lib/modules-load.d/aoetools.conf
+
+## If you need to restrict the used interfaces, please read
+## /usr/lib/modules-load.d/aoetools.conf
 ## Filesystems can be mounted using /etc/fstab.
 
-# Enter the list of network interfaces to restrict the AoE discovery to, separated by spaces.
-# It can be blank, i.e. "", if you want to run AoE over all the interfaces.
-# If you do not want AoE discovery at all, enter "none" as the list of interfaces.
+# WARNING: All the following settings are interpolated in the shell.
+# Make sure to not configure anything that is shell syntax, e.g.
+# semicolon.
+
+# Enter the list of network interfaces to restrict the AoE discovery to,
+# separated by spaces. It can be blank, i.e. "", if you want to run AoE
+# over all the interfaces. If you do not want AoE discovery at all,
+# enter "none" as the list of interfaces.
 #
-# If neither the aoe_iflist module load option nor this list of interfaces are used, the aoe driver
-# will use any network interface for AoE traffic.
+# If neither the aoe_iflist module load option nor this list of
+# interfaces are used, the aoe driver will use any network interface for
+# AoE traffic.
 INTERFACES='none'
 
-# Enter a list of RAID arrays to be activated after AoE volumes are ready, separated by spaces,
-# without the /dev/ prefix and quoted.  It may be blank.
+# Enter a list of RAID arrays to be activated after AoE volumes are
+# ready, separated by spaces, without the /dev/ prefix and quoted.  It
+# may be blank.
 # Example:
 #RAID_ARRAYS='md0 md1'
 RAID_ARRAYS=''
 
-# Enter a list of LVM2 volume groups to be activated after AoE volumes are ready, separated by spaces.
+# Enter a list of LVM2 volume groups to be activated after AoE volumes
+# are ready, separated by spaces.
 # It can be blank, i.e., ''.
 LVMGROUPS=''
 
-# Enter a list of file systems to be mounted over AoE.  Note that those entries listed in /etc/fstab
-# that contain "/dev/etherd/" will be automatically added to this list.
+# Enter a list of file systems to be mounted over AoE.  Note that those
+# entries listed in /etc/fstab that contain "/dev/etherd/" will be
+# automatically added to this list.
 AOEMOUNTS=''

+ 166 - 184
debian/aoetools.init

@@ -1,4 +1,4 @@
-#! /bin/sh
+#!/bin/sh
 #
 #       Based on a example file to build /etc/init.d/ scripts,
 #        written by Miquel van Smoorenburg <miquels@cistron.nl>
@@ -6,7 +6,7 @@
 #
 #       Also based on init script mountnfs.sh from initscripts package.
 #
-#       Modified for aoetools by David Martínez Moreno <ender@debian.org>.
+#       Modified for aoetools by David Martínez Moreno <ender@debian.org>.
 #       Copyright 2006-2014.  Under GPLv2.
 #
 #       Support for LVM and other mount points contributed by Glen W. Mabey.
@@ -27,209 +27,191 @@
 NAME=aoetools
 DESC="AoE devices discovery and mounting AoE filesystems"
 
+# shellcheck source=/dev/null
 [ -f /etc/default/rcS ] && . /etc/default/rcS
+
 . /lib/lsb/init-functions
 
 # Include aoetools defaults if available
-if [ -f /etc/default/aoetools ]
-then
-  . /etc/default/aoetools
-fi
+[ -f /etc/default/aoetools ] && . /etc/default/aoetools
 
 set -e
 
+mdadm="$(command -v mdadm || :)"
+vgchange="$(command -v vgchange || :)"
+
 create_fs_list() {
-  # We start with a list from /etc/default/aoetools.
-  waitaoe="$AOEMOUNTS"
-
-  [ -f /etc/fstab ] || return
-  #
-  # Read through fstab line by line. If it contains /dev/etherd, set the flag
-  # for mounting file systems over AoE.
-  #
-
-  exec 9<&0 </etc/fstab
-
-  while read DEV MTPT FSTYPE OPTS REST
-  do
-    case "$OPTS" in
-      noauto|*,noauto|noauto,*|*,noauto,*)
-        continue
-        ;;
-    esac
-    case "$DEV" in
-      ''|\#*)
-        continue
-        ;;
-      /dev/etherd/*)
-        waitaoe="$waitaoe $MTPT"
-    esac
-  done
+    # We start with a list from /etc/default/aoetools.
+    waitaoe="$AOEMOUNTS"
+
+    [ -f /etc/fstab ] || return
+    #
+    # Read through fstab line by line. If it contains /dev/etherd, set the flag
+    # for mounting file systems over AoE.
+    #
+
+    exec 9<&0 </etc/fstab
+
+    # shellcheck disable=SC2034 # fstype is indeed not used
+    while read -r device mountpoint fstype fsopts rest; do
+        case "$fsopts" in
+            noauto | *,noauto | noauto,* | *,noauto,*)
+                continue
+                ;;
+        esac
+        case "$device" in
+            '' | \#*)
+                continue
+                ;;
+            /dev/etherd/*)
+                waitaoe="$waitaoe $mountpoint"
+                ;;
+        esac
+    done
 
-  exec 0<&9 9<&-
+    exec 0<&9 9<&-
 }
 
 do_start() {
-  # We exit if the user does not want us to try this.
-  if [ "$INTERFACES" = "none" ]
-  then
-    log_action_msg "INTERFACES='none' in /etc/default/aoetools, not started."
-    exit 0
-  fi
-
-  # Usually aoe is a module, so we will try to load it.
-  if [ -n "$INTERFACES" ]
-  then
-    modprobe aoe aoe_iflist="$INTERFACES" >/dev/null 2>&1 || true
-  else
-    modprobe aoe >/dev/null 2>&1 || true
-  fi
-
-  # Also, if udev is being used, the /dev/etherd devices
-  # are not created until aoe module insertion, so...
-  sleep 1  # ...we give udev a chance to populate /dev/etherd/.
-
-  if [ ! -c /dev/etherd/discover ]
-  then
-    log_failure_msg "Missing devices under /dev/etherd/.  Please run  aoe-mkdevs /dev/etherd and try again." >&2
-    exit 1
-  fi
-
-  # Try to set up interfaces for discovery, if any.
-  if [ -n "$INTERFACES" ]
-  then
-    aoe-interfaces $INTERFACES
-  fi
-
-  aoe-discover
-
-  create_fs_list
-
-  if [ -n "$waitaoe" ]
-  then
-    echo
-  fi
-
-  if [ ! -x '/sbin/mdadm' -a -n "$RAID_ARRAYS" ]
-  then
-    echo
-    echo "/sbin/mdadm is not present. Please install mdadm package and try again." >&2
-    echo "RAID_ARRAYS option is ignored." >&2
-    RAID_ARRAYS=''
-  fi
-
-  if [ -n "$RAID_ARRAYS" ]
-  then
-    echo "Assembling RAID arrays..."
-    for md in $RAID_ARRAYS
-    do
-      /sbin/mdadm --assemble $md --scan
-    done
-  fi
-
-  if [ ! -x '/sbin/vgchange' -a -n "$LVMGROUPS" ]
-  then
-    echo
-    echo "The LVM2 tools are not present.  Please install lvm2 package and try again." >&2
-    echo "We will not honour LVMGROUPS." >&2
-    LVMGROUPS=''
-  fi
-
-  if [ -n "$LVMGROUPS" ]
-  then
-    echo "Assembling LVM2 groups..."
-    for vg in "$LVMGROUPS"
-    do
-      vgchange --available=y $vg
-    done
-  fi
-
-  if [ -n "$waitaoe" ]
-  then
-    for mountpt in $waitaoe
-    do
-      echo "Mounting $mountpt..."
-      mount $mountpt
-      #log_action_begin_msg "Waiting for $mountpt."
-    done
-  else
-    echo "Nothing to mount."
-  fi
+    # We exit if the user does not want us to try this.
+    if [ "$INTERFACES" = "none" ]; then
+        log_action_msg "INTERFACES='none' in /etc/default/aoetools, not started."
+        exit 0
+    fi
+
+    # Usually aoe is a module, so we will try to load it.
+    if [ -n "$INTERFACES" ]; then
+        modprobe aoe aoe_iflist="$INTERFACES" >/dev/null 2>&1 || true
+    else
+        modprobe aoe >/dev/null 2>&1 || true
+    fi
+
+    # Also, if udev is being used, the /dev/etherd devices
+    # are not created until aoe module insertion, so...
+    sleep 1 # ...we give udev a chance to populate /dev/etherd/.
+
+    if [ ! -c /dev/etherd/discover ]; then
+        log_failure_msg "Missing devices under /dev/etherd/.  Please run  aoe-mkdevs /dev/etherd and try again." >&2
+        exit 1
+    fi
+
+    # Try to set up interfaces for discovery, if any.
+    if [ -n "$INTERFACES" ]; then
+        # shellcheck disable=SC2086 # See warning in /etc/default/aoetools
+        aoe-interfaces $INTERFACES
+    fi
+
+    aoe-discover
+
+    create_fs_list
+
+    if [ -n "$waitaoe" ]; then
+        echo
+    fi
+
+    if [ "$mdadm" ] && [ -n "$RAID_ARRAYS" ]; then
+        echo
+        echo "/sbin/mdadm is not present. Please install mdadm package and try again." >&2
+        echo "RAID_ARRAYS option is ignored." >&2
+        RAID_ARRAYS=''
+    fi
+
+    if [ -n "$RAID_ARRAYS" ]; then
+        echo "Assembling RAID arrays..."
+        for md in $RAID_ARRAYS; do
+            /sbin/mdadm --assemble "$md" --scan
+        done
+    fi
+
+    if [ "$vgchange" ] && [ -n "$LVMGROUPS" ]; then
+        echo
+        echo "The LVM2 tools are not present.  Please install lvm2 package and try again." >&2
+        echo "We will not honour LVMGROUPS." >&2
+        LVMGROUPS=''
+    fi
+
+    if [ -n "$LVMGROUPS" ]; then
+        echo "Assembling LVM2 groups..."
+        for vg in $LVMGROUPS; do
+            vgchange --available=y "$vg"
+        done
+    fi
+
+    if [ -n "$waitaoe" ]; then
+        for mountpt in $waitaoe; do
+            echo "Mounting $mountpt..."
+            mount "$mountpt"
+            #log_action_begin_msg "Waiting for $mountpt."
+        done
+    else
+        echo "Nothing to mount."
+    fi
 }
 
 do_stop() {
-  create_fs_list
-
-  if [ -n "$waitaoe" ]
-  then
-    for mountpt in $waitaoe; do
-      if [ -z "`awk '{print $2}' < /proc/mounts | grep -w $mountpt$`" ]
-      then
-        # It's already been unmounted.
-        continue
-      fi
-      echo "Unmounting $mountpt..."
-      umount $mountpt
-    done
-  fi
-
-  if [ -n "$LVMGROUPS" ]
-  then
-    for vg in "$LVMGROUPS"
-    do
-      vgchange --available=n $vg
-    done
-  fi
-
-  if [ -x /sbin/mdadm -a -n "$RAID_ARRAYS" ]
-  then
-    echo "Stopping RAID arrays..."
-    for md in $RAID_ARRAYS
-    do
-      /sbin/mdadm --stop /dev/$md
-    done
-  fi
-
-  # Removing the module prevents LVM's "Shutting down LVM Volume Groups..."
-  # from hanging when an LVM has been setup on a device in /dev/etherd/.
-  modprobe --remove aoe >/dev/null 2>&1 || true
+    create_fs_list
+
+    if [ -n "$waitaoe" ]; then
+        for mountpt in $waitaoe; do
+            if awk '{print $2}' </proc/mounts | grep -qFx "$mountpt"; then
+                echo "Unmounting $mountpt..."
+                umount "$mountpt"
+            fi
+        done
+    fi
+
+    if [ -n "$LVMGROUPS" ]; then
+        for vg in $LVMGROUPS; do
+            vgchange --available=n "$vg"
+        done
+    fi
+
+    if [ "$mdadm" ] && [ -n "$RAID_ARRAYS" ]; then
+        echo "Stopping RAID arrays..."
+        for md in $RAID_ARRAYS; do
+            /sbin/mdadm --stop "/dev/$md"
+        done
+    fi
+
+    # Removing the module prevents LVM's "Shutting down LVM Volume Groups..."
+    # from hanging when an LVM has been setup on a device in /dev/etherd/.
+    modprobe --remove aoe >/dev/null 2>&1 || true
 }
 
 do_status() {
-  if $(lsmod |grep -qw '^aoe\s')
-  then
-    echo 'The aoe module is loaded.'
-  fi
-  # FIXME: Make something smarter like detect udev or a monolithic kernel.
-
-  AOE_MOUNTS="$(grep '/dev/etherd/' /proc/mounts || true)"
-  if [ -n "$AOE_MOUNTS" ]
-  then
-    echo 'The following AoE file systems are mounted:'
-    echo "$AOE_MOUNTS" | awk '{print $2}'
-  else
-    echo 'No AoE file systems mounted.'
-  fi
-
+    local aoe_mounts
+
+    if lsmod | grep -qFx 'aoe'; then
+        echo 'The aoe module is loaded.'
+    fi
+    # FIXME: Make something smarter like detect udev or a monolithic kernel.
+
+    aoe_mounts="$(grep '/dev/etherd/' /proc/mounts || true)"
+    if [ -n "$aoe_mounts" ]; then
+        echo 'The following AoE file systems are mounted:'
+        echo "$aoe_mounts" | awk '{print $2}'
+    else
+        echo 'No AoE file systems mounted.'
+    fi
 }
 
 case "$1" in
-  start|restart|reload|force-reload)
-    echo -n "Starting $DESC: "
-    do_start
-    ;;
-  stop)
-    echo "Stopping $DESC: "
-    do_stop
-    ;;
-  status)
-    do_status
-    ;;
-  *)
-    N=/etc/init.d/$NAME
-    echo "Usage: $N {start|stop|restart|reload|force-reload|status}" >&2
-    exit 1
-    ;;
+    start | restart | reload | force-reload)
+        printf '%s' "Starting $DESC: "
+        do_start
+        ;;
+    stop)
+        echo "Stopping $DESC: "
+        do_stop
+        ;;
+    status)
+        do_status
+        ;;
+    *)
+        N=/etc/init.d/$NAME
+        echo "Usage: $N {start|stop|restart|reload|force-reload|status}" >&2
+        exit 1
+        ;;
 esac
 
 exit 0