Refactoring etc/grml/lsb-functions
[grml-etc-core.git] / etc / grml / lsb-functions
index c21dd2c..13e20b5 100644 (file)
@@ -1,4 +1,5 @@
-# lsb init-functions {{{
+# lsb init-functions
+# vim:ft=sh:tw=80
 # /lib/lsb/init-functions for Debian -*- shell-script -*-
 #
 # Copyright (c) 2002-03 Chris Lawrence
 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 # SUCH DAMAGE.
 
+TPUT="${TPUT:-"/usr/bin/tput"}"
+
+have_tput() {
+    [ -x "$TPUT" ] && "$TPUT" hpa 60 >/dev/null 2>&1 \
+        && return 0 \
+        || return 1
+}
+
 log_success_msg () {
-    echo " * $@"
+    printf " * $@\n"
 }
 
 log_failure_msg () {
-    TPUT=/usr/bin/tput
-    if [ -x $TPUT ] && $TPUT hpa 60 >/dev/null 2>&1; then
-        RED=`$TPUT setaf 1`
-        #NORMAL=`$TPUT op`
-        echo " ${RED}*${NORMAL} $@"
+    if have_tput ; then
+        RED="$("$TPUT" setaf 1)"
+        #NORMAL="$("$TPUT" op)"
+        printf " ${RED}*${NORMAL} $@\n"
     else
-        echo " * $@"
+        printf " * $@\n"
     fi
 }
 
 log_warning_msg () {
-    TPUT=/usr/bin/tput
-    if [ -x $TPUT ] && $TPUT hpa 60 >/dev/null 2>&1; then
-        YELLOW=`$TPUT setaf 3`
-        #NORMAL=`$TPUT op`
-        # echo " *${NORMAL} $@"
-        echo " ${BLUE}*${NORMAL} $@"
+    if have_tput ; then
+        YELLOW="$("$TPUT" setaf 3)"
+        #NORMAL="$("$TPUT" op")"
+        # printf " *${NORMAL} $@\n"
+        printf " ${BLUE}*${NORMAL} $@\n"
     else
-        echo " * $@"
+        printf " * $@\n"
     fi
 }
 
 log_warning_msg_nn () {
-    TPUT=/usr/bin/tput
-    if [ -x $TPUT ] && $TPUT hpa 60 >/dev/null 2>&1; then
-        YELLOW=`$TPUT setaf 3`
-        echo -n " ${BLUE}*${NORMAL} $@"
+    if have_tput ; then
+        YELLOW="$("$TPUT" setaf 3)"
+        printf " ${BLUE}*${NORMAL} $@"
     else
-        echo -n " * $@"
+        printf " * $@"
     fi
 }
 
 # int log_begin_message (char *message)
 log_begin_msg () {
-        if [ -z "$1" ]; then
+        if [ "$#" -eq 0 ]; then
                 return 1
         fi
-        echo " ${GREEN}*${NORMAL} $@"
+        printf " ${GREEN}*${NORMAL} $@\n"
 }
 
 log_begin_msg_nn () {
-        if [ -z "$1" ]; then
+        if [ "$#" -eq 0 ]; then
                 return 1
         fi
-        echo -n " ${GREEN}*${NORMAL} $@"
+        printf " ${GREEN}*${NORMAL} $@"
 }
 
 
 SUBMSG="   ${GREEN}-${NORMAL} "
-  
+
 # int log_end_message (int exitstatus)
 log_end_msg () {
 
     # If no arguments were passed, return
-    [ -z "$1" ] && return 1
+    [ "$#" -eq 0 ] && return 1
 
     # Only do the fancy stuff if we have an appropriate terminal
     # and if /usr is already mounted
-    TPUT=/usr/bin/tput
-    EXPR=/usr/bin/expr
-    if [ -x $TPUT ] && [ -x $EXPR ] && $TPUT hpa 60 >/dev/null 2>&1; then
-        COLS=`$TPUT cols`
+    if have_tput ; then
+        COLS="$("$TPUT" cols)"
         if [ -n "$COLS" ]; then
-            COL=`$EXPR $COLS - 7`
+            COL=$(( "$COLS" - 7 ))
         else
             COL=73
         fi
-        UP=`$TPUT cuu1`
-        END=`$TPUT hpa $COL`
-        START=`$TPUT hpa 0`
-        #RED=`$TPUT setaf 1`
-        #NORMAL=`$TPUT op`
-        if [ $1 -eq 0 ]; then
-            echo "$UP$END${BLUE}[ ${GREEN}ok ${BLUE}]${NORMAL}"
+        UP="$("$TPUT" cuu1)"
+        END="$("$TPUT" hpa $COL)"
+        START="$("$TPUT" hpa 0)"
+        #RED="$("$TPUT" setaf 1)"
+        #NORMAL="$("$TPUT" op)"
+        if [ "$1" -eq 0 ]; then
+            printf "${UP}${END}${BLUE}[ ${GREEN}ok ${BLUE}]${NORMAL}\n"
         else
-            echo -e "${UP}${START} ${RED}*${NORMAL}${END}[${RED}fail${NORMAL}]"
+            printf "${UP}${START} ${RED}*${NORMAL}${END}[${RED}fail${NORMAL}]\n"
         fi
     else
-        if [ $1 -eq 0 ]; then
-            echo "   ...done."
+        if [ "$1" -eq 0 ]; then
+            printf "   ...done.\n"
         else
-            echo "   ...fail!"
+            printf "   ...fail!\n"
         fi
     fi
-    return $1
+    return "$1"
 }
 
-# void esyslog(char* priority, char* tag, char* message)
-#    use the system logger to log a message
-#esyslog() {
-#        local pri=
-#        local tag=
-#
-#        if [ -x /usr/bin/logger ]
-#        then
-#                pri="$1"
-#                tag="$2"
-#
-#                shift 2
-#                [[ -z "$*" ]] && return 0
-#
-#                /usr/bin/logger -p "${pri}" -t "${tag}" -- "$*"
-#        fi
-#
-#        return 0
-#}
-
 # Copyright 1999-2005 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 # $Header: /var/cvsroot/gentoo-src/rc-scripts/sbin/functions.sh,v 1.81.2.6 2005/05/15 20:00:31 vapier Exp $
@@ -161,7 +145,7 @@ RC_VERBOSE="${RC_VERBOSE:-no}"
 
 # Should we use color?
 if [ -r /proc/cmdline ] ; then
-   grep -q ' nocolor' /proc/cmdline && RC_NOCOLOR='yes'
+    grep -q ' nocolor' /proc/cmdline && RC_NOCOLOR='yes'
 fi
 RC_NOCOLOR="${RC_NOCOLOR:-no}"
 # Can the terminal handle endcols?
@@ -247,7 +231,7 @@ get_libdir() {
        elif [ -x "/usr/bin/portageq" ] ; then
                CONF_LIBDIR="$(/usr/bin/portageq envvar CONF_LIBDIR)"
        fi
-       echo ${CONF_LIBDIR:=lib}
+       printf '%s\n' ${CONF_LIBDIR:=lib}
 }
 
 # void esyslog(char* priority, char* tag, char* message)
@@ -264,7 +248,7 @@ esyslog() {
                tag="$2"
 
                shift 2
-               [[ -z "$*" ]] && return 0
+               [ -z "$*" ] && return 0
 
                /usr/bin/logger -p "${pri}" -t "${tag}" -- "$*"
        fi
@@ -318,9 +302,9 @@ einfo() {
 #    show an informative message (without a newline)
 #
 einfon() {
-       [[ ${RC_QUIET_STDOUT} == yes ]] && return 0
-       [[ ${RC_ENDCOL} != yes && ${LAST_E_CMD} == ebegin ]] && echo
-       echo -ne " ${GOOD}*${NORMAL} ${RC_INDENTATION}$*"
+       [ "${RC_QUIET_STDOUT}" = "yes" ] && return 0
+       [ "${RC_ENDCOL}" != "yes" ] && [ "${LAST_E_CMD}" = "ebegin" ] && echo
+       printf " ${GOOD}*${NORMAL} ${RC_INDENTATION}$*"
        LAST_E_CMD=einfon
        return 0
 }
@@ -330,11 +314,11 @@ einfon() {
 #    show a warning message + log it
 #
 ewarn() {
-       if [[ ${RC_QUIET_STDOUT} == yes ]]; then
-               echo " $*"
+       if [ "${RC_QUIET_STDOUT}" = "yes" ]; then
+               printf " $*\n"
        else
-               [[ ${RC_ENDCOL} != yes && ${LAST_E_CMD} == ebegin ]] && echo
-               echo -e " ${WARN}*${NORMAL} ${RC_INDENTATION}$*"
+               [ "${RC_ENDCOL}" != "yes" ] && [ "${LAST_E_CMD}" = "ebegin" ] && echo
+               printf " ${WARN}*${NORMAL} ${RC_INDENTATION}$*\n"
        fi
 
        # Log warnings to system log
@@ -349,11 +333,11 @@ ewarn() {
 #    show an error message + log it
 #
 eerror() {
-       if [[ ${RC_QUIET_STDOUT} == yes ]]; then
-               echo " $*" >/dev/stderr
+       if [ "${RC_QUIET_STDOUT}" = "yes" ]; then
+               printf " $*\n" >/dev/stderr
        else
-               [[ ${RC_ENDCOL} != yes && ${LAST_E_CMD} == ebegin ]] && echo
-               echo -e " ${BAD}*${NORMAL} ${RC_INDENTATION}$*"
+               [ "${RC_ENDCOL}" != "yes" ] && [ "${LAST_E_CMD}" = "ebegin" ] && echo
+               printf " ${BAD}*${NORMAL} ${RC_INDENTATION}$*\n"
        fi
 
        # Log errors to system log
@@ -368,18 +352,21 @@ eerror() {
 #    show a message indicating the start of a process
 #
 ebegin() {
-       local msg="$*" dots spaces=${RC_DOT_PATTERN//?/ }
-       [[ ${RC_QUIET_STDOUT} == yes ]] && return 0
+       local msg="$*" dots spaces
+       spaces="$(printf '%'"${#RC_DOT_PATTERN}"'s' '')"
+       [ "${RC_QUIET_STDOUT}" = "yes" ] && return 0
 
-       if [[ -n ${RC_DOT_PATTERN} ]]; then
+       if [ -n "${RC_DOT_PATTERN}" ]; then
                dots=$(printf "%$(( COLS - 3 - ${#RC_INDENTATION} - ${#msg} - 7 ))s" '')
-               dots=${dots//${spaces}/${RC_DOT_PATTERN}}
+               while [ "${dots#${spaces}}" != "${dots}" ] ; do
+                       dots="${dots#${spaces}}${RC_DOT_PATTERN}"
+               done
                msg="${msg}${dots}"
        else
                msg="${msg} ..."
        fi
        einfon "${msg}"
-       [[ ${RC_ENDCOL} == yes ]] && echo
+       [ "${RC_ENDCOL}" = "yes" ] && echo
 
        LAST_E_LEN=$(( 3 + ${#RC_INDENTATION} + ${#msg} ))
        LAST_E_CMD=ebegin
@@ -398,21 +385,21 @@ _eend() {
        local retval=${1:-0} efunc=${2:-eerror} msg
        shift 2
 
-       if [[ ${retval} == 0 ]]; then
-               [[ ${RC_QUIET_STDOUT} == yes ]] && return 0
+       if [ "${retval}" -eq 0 ]; then
+               [ "${RC_QUIET_STDOUT}" = "yes" ] && return 0
                msg="${BRACKET}[ ${GOOD}ok${BRACKET} ]${NORMAL}"
        else
-               if [[ -n "$*" ]]; then
-                       ${efunc} "$*"
+               if [ -n "$*" ]; then
+                       "${efunc}" "$*"
                fi
                msg="${BRACKET}[ ${BAD}!!${BRACKET} ]${NORMAL}"
        fi
 
-       if [[ ${RC_ENDCOL} == yes ]]; then
-               echo -e "${ENDCOL}  ${msg}"
+       if [ "${RC_ENDCOL}" = "yes" ]; then
+               printf "${ENDCOL}  ${msg}\n"
        else
-               [[ ${LAST_E_CMD} == ebegin ]] || LAST_E_LEN=0
-               printf "%$(( COLS - LAST_E_LEN - 6 ))s%b\n" '' "${msg}"
+               [ "${LAST_E_CMD}" = "ebegin" ] || LAST_E_LEN=0
+               printf "%$(( "${COLS}" - "${LAST_E_LEN}" - 6 ))s%b\n" '' "${msg}"
        fi
 
        return ${retval}
@@ -450,17 +437,17 @@ ewend() {
 
 # v-e-commands honor RC_VERBOSE which defaults to no.
 # The condition is negated so the return value will be zero.
-veinfo() { [[ "${RC_VERBOSE}" != yes ]] || einfo "$@"; }
-veinfon() { [[ "${RC_VERBOSE}" != yes ]] || einfon "$@"; }
-vewarn() { [[ "${RC_VERBOSE}" != yes ]] || ewarn "$@"; }
-veerror() { [[ "${RC_VERBOSE}" != yes ]] || eerror "$@"; }
-vebegin() { [[ "${RC_VERBOSE}" != yes ]] || ebegin "$@"; }
+veinfo()  { [ "${RC_VERBOSE}" != yes ] || einfo  "$@"; }
+veinfon() { [ "${RC_VERBOSE}" != yes ] || einfon "$@"; }
+vewarn()  { [ "${RC_VERBOSE}" != yes ] || ewarn  "$@"; }
+veerror() { [ "${RC_VERBOSE}" != yes ] || eerror "$@"; }
+vebegin() { [ "${RC_VERBOSE}" != yes ] || ebegin "$@"; }
 veend() {
-       [[ "${RC_VERBOSE}" == yes ]] && { eend "$@"; return $?; }
+       [ "${RC_VERBOSE}" = "yes" ] && { eend "$@"; return $?; }
        return ${1:-0}
 }
 veend() {
-       [[ "${RC_VERBOSE}" == yes ]] && { ewend "$@"; return $?; }
+       [ "${RC_VERBOSE}" = "yes" ] && { ewend "$@"; return $?; }
        return ${1:-0}
 }
 
@@ -469,10 +456,10 @@ veend() {
 #    Return the Major (X of X.Y.Z) kernel version
 #
 KV_major() {
-       [[ -z $1 ]] && return 1
+       [ -z "$1" ] && return 1
 
        local KV=$@
-       echo ${KV%%.*}
+       printf "${KV%%.*}\n"
 }
 
 # char *KV_minor(string)
@@ -480,11 +467,11 @@ KV_major() {
 #    Return the Minor (Y of X.Y.Z) kernel version
 #
 KV_minor() {
-       [[ -z $1 ]] && return 1
+       [ -z "$1" ] && return 1
 
-       local KV=$@
-       KV=${KV#*.}
-       echo ${KV%%.*}
+       local KV="$@"
+       KV="${KV#*.}"
+       printf "${KV%%.*}\n"
 }
 
 # char *KV_micro(string)
@@ -492,11 +479,11 @@ KV_minor() {
 #    Return the Micro (Z of X.Y.Z) kernel version.
 #
 KV_micro() {
-       [[ -z $1 ]] && return 1
+       [ -z "$1" ] && return 1
 
-       local KV=$@
-       KV=${KV#*.*.}
-       echo ${KV%%[^[:digit:]]*}
+       local KV="$@"
+       KV="${KV#*.*.}"
+       printf "${KV%%[^[:digit:]]*}\n"
 }
 
 # int KV_to_int(string)
@@ -505,17 +492,17 @@ KV_micro() {
 #    for easy compairing or versions ...
 #
 KV_to_int() {
-       [[ -z $1 ]] && return 1
+       [ -z "$1" ] && return 1
 
-       local KV_MAJOR=$(KV_major "$1")
-       local KV_MINOR=$(KV_minor "$1")
-       local KV_MICRO=$(KV_micro "$1")
+       local KV_MAJOR="$(KV_major "$1")"
+       local KV_MINOR="$(KV_minor "$1")"
+       local KV_MICRO="$(KV_micro "$1")"
        local KV_int=$(( KV_MAJOR * 65536 + KV_MINOR * 256 + KV_MICRO ))
 
        # We make version 2.2.0 the minimum version we will handle as
        # a sanity check ... if its less, we fail ...
-       if [[ ${KV_int} -ge 131584 ]] ; then
-               echo "${KV_int}"
+       if [ "${KV_int}" -ge 131584 ] ; then
+               printf "${KV_int}\n"
                return 0
        fi
 
@@ -530,9 +517,9 @@ KV_to_int() {
 #    e.g. 2.4.25, 2.6.10, 2.6.4-rc3, 2.2.40-poop, 2.0.15+foo
 #
 get_KV() {
-       local KV=$(uname -r)
+       local KV="$(uname -r)"
 
-       echo $(KV_to_int "${KV}")
+       printf "$(KV_to_int "${KV}")\n"
 
        return $?
 }
@@ -564,7 +551,7 @@ get_bootparam() {
                        do
                                if [ "${x}" = "$1" ]
                                then
-#                                      echo "YES"
+#                                      printf "YES\n"
                                        retval=0
                                fi
                        done
@@ -615,7 +602,7 @@ dolisting() {
                fi
        done
 
-       echo "${mylist}"
+       printf "${mylist}\n"
 }
 
 # char *add_suffix(char * configfile)
@@ -625,9 +612,9 @@ dolisting() {
 add_suffix() {
        if [ "${RC_USE_CONFIG_PROFILE}" = "yes" -a -e "$1.${DEFAULTLEVEL}" ]
        then
-               echo "$1.${DEFAULTLEVEL}"
+               printf "$1.${DEFAULTLEVEL}\n"
        else
-               echo "$1"
+               printf "$1\n"
        fi
 
        return 0
@@ -647,13 +634,19 @@ NET_FS_LIST="afs cifs coda gfs ncpfs nfs nfs4 shfs smbfs"
 is_net_fs() {
        local fstype
        # /proc/mounts is always accurate but may not always be available
-       if [[ -e /proc/mounts ]]; then
-               fstype=$( sed -n -e '/^rootfs/!s:.* '"$1"' \([^ ]*\).*:\1:p' /proc/mounts )
+       if [ -e /proc/mounts ]; then
+               fstype="$( sed -n -e '/^rootfs/!s:.* '"$1"' \([^ ]*\).*:\1:p' /proc/mounts )"
        else
-               fstype=$( mount | sed -n -e 's:.* on '"$1"' type \([^ ]*\).*:\1:p' )
+               fstype="$( mount | sed -n -e 's:.* on '"$1"' type \([^ ]*\).*:\1:p' )"
        fi
-       [[ " ${NET_FS_LIST} " == *" ${fstype} "* ]]
-       return $?
+       case " ${NET_FS_LIST} " in
+               *" ${fstype} "*)
+                       return 0
+                       ;;
+               *)
+                       return 1
+                       ;;
+       esac
 }
 
 # bool is_uml_sys()
@@ -698,11 +691,20 @@ get_mount_fstab() {
 #   Returns the reversed order of list
 #
 reverse_list() {
-       for (( i = $# ; i > 0 ; --i )); do
-               echo -n "${!i} "
+       local ret
+       ret=''
+       while [ "$#" -gt 0 ] ; do
+               if [ -z "${ret}" ] ; then
+                       ret="$1"
+               else
+                       ret="$1 ${ret}"
+               fi
+               shift
        done
+       printf '%s' "${ret}"
 }
 
+
 # bool is_older_than(reference, files/dirs to check)
 #
 #   return 0 if any of the files/dirs are newer than
@@ -710,14 +712,14 @@ reverse_list() {
 #
 #   EXAMPLE: if is_older_than a.out *.o ; then ...
 is_older_than() {
-       local x=
+       local x
        local ref="$1"
        shift
 
        for x in "$@" ; do
-               [[ ${x} -nt ${ref} ]] && return 0
+               [ "${x}" -nt "${ref}" ] && return 0
 
-               if [[ -d ${x} ]] ; then
+               if [ -d "${x}" ] ; then
                        is_older_than "${ref}" "${x}"/* && return 0
                fi
        done
@@ -725,68 +727,49 @@ is_older_than() {
        return 1
 }
 
-if [ -z "${EBUILD}" ] ; then
-       # Setup a basic $PATH.  Just add system default to existing.
-       # This should solve both /sbin and /usr/sbin not present when
-       # doing 'su -c foo', or for something like:  PATH= rcscript start
-       PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin:${PATH}"
-
-       if [ "$(/sbin/consoletype 2> /dev/null)" = "serial" ] ; then
-               # We do not want colors/endcols on serial terminals
-               RC_NOCOLOR="yes"
-               RC_ENDCOL="no"
-       fi
-
-       for arg in "$@" ; do
-               case "${arg}" in
-                       # Lastly check if the user disabled it with --nocolor argument
-                       --nocolor|-nc)
-                               RC_NOCOLOR="yes"
-                               ;;
-               esac
-       done
+# Setup a basic $PATH.  Just add system default to existing.
+# This should solve both /sbin and /usr/sbin not present when
+# doing 'su -c foo', or for something like:  PATH= rcscript start
+PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin:${PATH}"
 
-else
-       # Should we use colors ?
-       if [[ $* != *depend* ]]; then
-               # Check user pref in portage
-               RC_NOCOLOR="$(portageq envvar NOCOLOR 2>/dev/null)"
-               [ "${RC_NOCOLOR}" = "true" ] && RC_NOCOLOR="yes"
-       else
-               # We do not want colors during emerge depend
-               RC_NOCOLOR="yes"
-               # No output is seen during emerge depend, so this is not needed.
-               RC_ENDCOL="no"
-       fi
+if [ "$(/sbin/consoletype 2> /dev/null)" = "serial" ] ; then
+    # We do not want colors/endcols on serial terminals
+    RC_NOCOLOR="yes"
+    RC_ENDCOL="no"
 fi
 
-if [[ -n ${EBUILD} && $* == *depend* ]]; then
-       # We do not want stty to run during emerge depend
-       COLS=80
-else
-       # Setup COLS and ENDCOL so eend can line up the [ ok ]
-       COLS=${COLUMNS:-0}              # bash's internal COLUMNS variable
-       (( COLS == 0 )) && COLS=$(stty size 2>/dev/null | cut -d' ' -f2)
-       (( COLS > 0 )) || (( COLS = 80 ))       # width of [ ok ] == 7
+for arg in "$@" ; do
+    case "${arg}" in
+        # Lastly check if the user disabled it with --nocolor argument
+        --nocolor|-nc)
+            RC_NOCOLOR="yes"
+            ;;
+    esac
+done
+
+# Setup COLS and ENDCOL so eend can line up the [ ok ]
+# width of [ ok ] == 7
+COLS="$(stty size 2>/dev/null | cut -d' ' -f2)"
+if [ -z "${COLS}" ] || [ "${COLS}" -le 0 ] ; then
+    COLS=80
 fi
 
-if [[ ${RC_ENDCOL} == yes ]]; then
-       ENDCOL=$'\e[A\e['$(( COLS - 7 ))'G'
+if [ "${RC_ENDCOL}" = "yes" ]; then
+       ENDCOL="\e[A\e[$(( ${COLS} - 8 ))G"
 else
        ENDCOL=''
 fi
 
 # Setup the colors so our messages all look pretty
-if [[ ${RC_NOCOLOR} == yes ]]; then
+if [ "${RC_NOCOLOR}" = "yes" ]; then
        unset GOOD WARN BAD NORMAL HILITE BRACKET
 else
-       GOOD=$'\e[32;01m'
-       WARN=$'\e[33;01m'
-       BAD=$'\e[31;01m'
-       NORMAL=$'\e[0m'
-       HILITE=$'\e[36;01m'
-       BRACKET=$'\e[34;01m'
+       GOOD='\e[32;01m'
+       WARN='\e[33;01m'
+       BAD='\e[31;01m'
+       NORMAL='\e[0m'
+       HILITE='\e[36;01m'
+       BRACKET='\e[34;01m'
 fi
 
 # vim:ts=4
-# }}}