Release new version 1.04.1
[grml-shlib.git] / sh-lib
diff --git a/sh-lib b/sh-lib
index 5d0ac5b..e87b9cb 100644 (file)
--- a/sh-lib
+++ b/sh-lib
@@ -4,10 +4,9 @@
 # Authors:       grml-team (grml.org), (c) Michael Gebetsroither <gebi@grml.org>
 # Bug-Reports:   see http://grml.org/bugs/
 # License:       This file is licensed under the GPL v2.
-# Latest change: Mon May 02 00:17:44 CEST 2005 [gebi]
 ################################################################################
 
-
+# VARIABLES {{{
 VERBOSE__=0
 VERBOSE_TMP__=0
 
@@ -30,55 +29,54 @@ CMD_LINE__=""   # /proc/cmdline
 
 LANG__="$LANG"
 LC_ALL__="$LC_ALL"
-
+LANGUAGE__="$LANGUAGE"
+# }}}
 
 # CONFIG FUNCTIONS  {{{
 
-function setProgName  { PROG_NAME__="$1"; }
+setProgName() { PROG_NAME__="$1"; }
 
-function setExitFunction  { EXIT_FUNCTION__="$1"; }
+setExitFunction() { EXIT_FUNCTION__="$1"; }
 
-function disableSyslog  { SYSLOG__="NO";  }
-function enableSyslog   { SYSLOG__="YES"; }
+disableSyslog() { SYSLOG__="NO";  }
+enableSyslog() { SYSLOG__="YES"; }
 
-function saveLang { LANG__="$LANG"; LC_ALL__="$LC_ALL"; }
-function restoreLang { LANG="$LANG__"; LC_ALL="$LC_ALL__"; }
-function setCLang { saveLang; LANG="C"; LC_ALL="C"; }
+saveLang() { LANG__="$LANG"; LC_ALL__="$LC_ALL"; LANGUAGE__="$LANGUAGE"; }
+restoreLang() { LANG="$LANG__"; LC_ALL="$LC_ALL__"; LANGUAGE="$LANGUAGE__"; }
+setCLang() { saveLang; LANG="C"; LC_ALL="C"; LANGUAGE="C"; }
 # }}}
 
-
 # DEBUG FRAMEWORK  {{{
 
-function setVerbose     { VERBOSE__=${1:-1}; }
-function unsetVerbose   { VERBOSE_TMP__=$VERBOSE__; VERBOSE__=0; }
-function restoreVerbose { VERBOSE__=$VERBOSE_TMP__; }
-function getVerbose     { echo "$VERBOSE__"; }
+setVerbose()     { VERBOSE__=${1:-1}; }
+unsetVerbose()   { VERBOSE_TMP__=$VERBOSE__; VERBOSE__=0; }
+restoreVerbose() { VERBOSE__=$VERBOSE_TMP__; }
+getVerbose()     { echo "$VERBOSE__"; }
 
-function setDebug       { setVerbose "$DPRINT__"; }
-function unsetDebug     { restoreVerbose; }
+setDebug()       { setVerbose "$DPRINT__"; }
+unsetDebug()     { restoreVerbose; }
 
-function setExitFunction    { EXIT_FUNCTION__="$1"; }
-function resetExitFunction  { EXIT_FUNCTION__="_syslog"; }
+setExitFunction()    { EXIT_FUNCTION__="$1"; }
+resetExitFunction()  { EXIT_FUNCTION__="_syslog"; }
 # }}}
 
-
 # ERROR REPORTING FUNCTIONS  {{{
 
 # default print backend (there may be other functions)
-function vprint
+vprint()
 {
   local level_="$1"
   local type_="$2"
   local message_="$3"
-  
-  if [ $VERBOSE__ -ge $level_ -a -n "$message_" ]; then
+
+  if [ "$VERBOSE__" -ge "$level_" -a -n "$message_" ]; then
     echo -n "$type_" >&2
     echo "$message_" >&2
   fi
 }
 
 # print error output
-function eprint
+eprint()
 {
   # FIXME vprint should be a var, because we want to call user-defined functions
   # global var (there should be a syslog, and vprint + syslog function)
@@ -86,24 +84,24 @@ function eprint
 }
 
 # should be used for intern silentExecutes
-function eeprint
+eeprint()
 {
   vprint $EEPRINT__ "  Error2 - " "$1"
 }
 
 # print debug output (function intern errors)
-function dprint
+dprint()
 {
   vprint $DPRINT__ "Debug - " "$1"
 }
 
 # for program notice messages
-function notice
+notice()
 {
   vprint $EPRINT__ "Notice - " "$1"
 }
 
-function die
+die()
 {
   local error_message_="$1"   # print this error message
   local exit_code_="$2"  # command exited with this exit code
@@ -121,7 +119,7 @@ function die
   kill $$
 }
 
-function warn
+warn()
 {
   local error_message_="$1"   # print this error message
   local exit_code_="$2"  # command exits with this exit code
@@ -134,7 +132,7 @@ function warn
   fi
 }
 
-function _syslog
+_syslog()
 {
   local message_="$1"   # error message
   local exit_code_="$2"
@@ -148,11 +146,11 @@ function _syslog
   fi
 }
 
-function syslog
+syslog()
 {
   local message_="$1"   # error message
   local exit_code_="$2"
-  
+
   if [ -n "$exit_code_" ]; then
     logger -p user.alert -t "$PROG_NAME__" -i "$message_ ret($exit_code_)" >&2
   else
@@ -160,7 +158,7 @@ function syslog
   fi
 }
 
-function warnLog
+warnLog()
 {
   local error_message_="$1"   # print this error message
   local exit_code_="$2"  # command exits with this exit code
@@ -170,19 +168,14 @@ function warnLog
 }
 # }}}
 
-
-###
-#
-# CORE FUNCTIONS
-#
-###
+# CORE FUNCTIONS {{{
 
 ##
-# ATTENTION... THIS FUNCTINOS IS A BIG SECURITY HOLE
+# ATTENTION... THIS FUNCTION IS A BIG SECURITY HOLE
 # this function will be changed in future release
 ##
-# i don't want to write exit status controle stuff every time
-function execute
+# I don't want to write exit status control stuff every time
+execute()
 {
   local to_exec_="$1"   # command to execute
   local error_function_=${2:-"eprint"}    # function to call on error
@@ -208,7 +201,7 @@ function execute
   return $ret_
 }
 
-function silentExecute
+silentExecute()
 {
   unsetVerbose
   execute "$@"
@@ -225,7 +218,7 @@ function silentExecute
 ###
 
 # if the file DOES exist, everything is fine
-function isExistent
+isExistent()
 {
   local file_to_test_="$1"    # file to test
   local error_function_=${2:-"eprint"}    # function to call on error
@@ -243,7 +236,7 @@ function isExistent
   return 0
 }
 
-function isNotExistent
+isNotExistent()
 {
   local file_to_test_="$1"    # file to test
   local error_function_=${2:-"eprint"}    # function to call on error
@@ -262,7 +255,7 @@ function isNotExistent
 }
 
 
-function checkUser
+checkUser()
 {
   local to_check_="$1"    # username to check against running process
   local error_function_=${2:-"eprint"}    # function to call on error
@@ -284,7 +277,7 @@ function checkUser
   fi
 }
 
-function checkId
+checkId()
 {
   local to_check_="$1"    # user-id to check against running process
   local error_function_=${2:-"eprint"}    # function to call on error
@@ -292,8 +285,8 @@ function checkId
 
   local user_id_=''
 
-  user_id_=`id -u`
-  if [ $user_id_ != "$to_check_" ]; then
+  user_id_=$(id -u)
+  if [ "$user_id_" != "$to_check_" ]; then
     if [ -z "$message_" ]; then
       $error_function_ "UID \"$user_id_\" is not \"$to_check_\"" 77
     else
@@ -306,23 +299,23 @@ function checkId
   fi
 }
 
-function checkRoot
+checkRoot()
 {
   checkId 0 "$1" "$2"
 }
 
-function isGrml
+isGrml()
 {
-  if [ -f /etc/grml_version ] ; then 
+  if [ -f /etc/grml_version ] ; then
     dprint "isGrml(): this seems to be a grml system"
-    return 0                       
-  else                               
+    return 0
+  else
     dprint "isGrml(): this is not a grml system"
-    return 1                       
-  fi                                 
+    return 1
+  fi
 }
 
-function runsFromHd
+runsFromHd()
 {
   if [ -e "/etc/grml_cd" ]; then
     dprint "runsFromHd(): grml is on CD"
@@ -333,7 +326,7 @@ function runsFromHd
   fi
 }
 
-function runsFromCd
+runsFromCd()
 {
   if [ -e "/etc/grml_cd" ]; then
     dprint "runsFromCd(): grml is on CD"
@@ -346,10 +339,10 @@ function runsFromCd
 
 
 # secure input from console
-function secureInput
+secureInput()
 {
   local to_secure_="$1"
-  
+
   local secured_=''
 
   secured_=`echo -n "$to_secure_" |tr -c '[:alnum:]/.\-,\(\)' '_'`
@@ -359,7 +352,7 @@ function secureInput
 
 
 # convert all possible path formats to absolute paths
-function relToAbs
+relToAbs()
 {
   local relpath_="$1"
   local abspath_=''
@@ -379,7 +372,7 @@ function relToAbs
 #   carriage return ('\r')
 #   horizontal tab ('\t')
 #   vertical tab ('\v')
-function stringTrim
+stringTrim()
 {
   local str_="$1"
   local result_=""
@@ -391,7 +384,7 @@ function stringTrim
 }
 
 # Simple shell grep
-function stringInFile
+stringInFile()
 {
   local to_test_="$1"   # matching pattern
   local source_="$2"    # source-file to grep
@@ -406,7 +399,7 @@ function stringInFile
 }
 
 # same for strings
-function stringInString
+stringInString()
 {
   local to_test_="$1"   # matching pattern
   local source_="$2"    # string to search in
@@ -416,7 +409,7 @@ function stringInString
 }
 
 # get value for bootparam given as first param
-function getBootParam
+getBootParam()
 {
   local param_to_search_="$1"
   local result_=''
@@ -429,41 +422,41 @@ function getBootParam
 }
 
 # Check boot commandline for specified option
-function checkBootParam
+checkBootParam()
 {
   stringInString " $1" "$CMD_LINE__"
   return "$?"
 }
-
+# }}}
 
 # NETWORK  {{{
 
 # validates an IP FIXME
-function netValidIp
+netValidIp()
 {
-  local ip_="$1"    # ip addresse to validate
+  local ip_="$1"    # ip address to validate
   local error_function_=${2:-"eprint"}    # function to call on error
   local message_="$3"    # user supplied error message
-  
+
   local ret_=''
 
   echo "$ip_" | grep -E -q -e '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.[0-9]{1,3}' \
-    &>/dev/null
+    1>/dev/null 2>&1
   ret_=$?
   if [ $ret_ -ne 0 ]; then
     if [ -z "$message_" ]; then
-      "$error_function_" "ip-addresse \"$ip_\" is NOT valied" $ret_
+      "$error_function_" "ip-address \"$ip_\" is NOT valid" $ret_
     else
       "$error_function_" "$message_" $ret_
     fi
     return 1
   fi
 
-  dprint "ip-addresse \"$ip_\" is valied" $ret_
+  dprint "ip-address \"$ip_\" is valid" $ret_
   return $ret_
 }
 
-function netGetIfaces
+netGetIfaces()
 {
   local error_function_=${1:-"eprint"}    # function to call on error
   local message_="$2"    # user supplied error message
@@ -486,14 +479,14 @@ function netGetIfaces
 }
 
 # FIXME
-function netGetDefaultGateway
+netGetDefaultGateway()
 {
   local error_function_=${1:-"eprint"}    # function to call on error
   local message_="$2"    # user supplied error message
-  
+
   local ip_=''
   local ret_=''
-  
+
   setCLang
   ip_=`route -n | awk '/^0\.0\.0\.0/{print $2; exit}'`
   ret_=$?
@@ -512,23 +505,27 @@ function netGetDefaultGateway
 }
 
 # FIXME
-function netGetNetmask
+netGetNetmask()
 {
   local iface_="$1"
   local error_function_=${2:-"eprint"}    # function to call on error
   local message_="$3"    # user supplied error message
-  
+
   local nm_=''
   local ret_=''
-  
+
   setCLang
-  nm_=`ifconfig "$iface_" | awk '/[Mm]ask/{FS="[:   ]*"; $0=$0; print $8; exit}'`
+  if ifconfig "$iface_" | grep -qi 'Mask:' ; then # old ifconfig output:
+    nm_=$(ifconfig "$iface_" | awk '/[Mm]ask/{FS="[:   ]*"; $0=$0; print $8; exit}')
+  else # new ifconfig output (net-tools >1.60-27):
+    nm_=$(ifconfig "$iface_" | awk '/netmask/{print $4}')
+  fi
   ret_=$?
   restoreLang
   if [ -z "$nm_" ]; then
     if [ -z "$message_" ]; then
       "$error_function_" "could not find a netmask for \"$iface_\"" $ret_
-    else 
+    else
       "$error_function_" "$message_" $ret_
     fi
     return 1
@@ -539,7 +536,7 @@ function netGetNetmask
 }
 
 # FIXME
-function netGetIp
+netGetIp()
 {
   local iface_="$1"
   local error_function_=${2:-"eprint"}    # function to call on error
@@ -549,8 +546,7 @@ function netGetIp
   local ret_=""
 
   setCLang
-  #ip_=`ip addr list eth0 |mawk '/inet/{split($2,A,"/"); print A[1]}'`
-  ip_=`ifconfig "$iface_" | awk '/[Ii]net [Aa]ddr/{FS="[:  ]*"; $0=$0; print $4; exit}'`
+  ip_=$(ip addr show dev "$iface_" | awk '/inet /{split($2,a,"/"); print a[1]}')
   ret_=$?
   restoreLang
   if [ -z "$ip_" ]; then
@@ -561,16 +557,16 @@ function netGetIp
     fi
     return 1
   fi
-  dprint "addresse for \"$iface_\" is \"$ip_\"" $ret_
+  dprint "address for \"$iface_\" is \"$ip_\"" $ret_
   echo "$ip_"
   return 0
-} 
+}
 
-function netGetNameservers
+netGetNameservers()
 {
   local error_function_=${1:-"eprint"}    # function to call on error
   local message_="$2"    # user supplied error message
-  
+
   local file_="/etc/resolv.conf"
   local ns_=""
 
@@ -578,7 +574,7 @@ function netGetNameservers
     warn "file \"$file_\" does not exist, could not get nameservers"
     return 1
   fi
-  
+
   setCLang
   ns_=`awk '/^nameserver/{printf "%s ",$2}' $file_ |xargs echo`
   restoreLang
@@ -598,7 +594,7 @@ function netGetNameservers
 # }}}
 
 # SERVICES {{{
-function _touchService
+_touchService()
 {
   local action_="${1:-"start"}"
   local service_="$2"
@@ -608,7 +604,7 @@ function _touchService
   local i=""
   local known_action_='false'
   for i in "start" "stop" "restart" "reload" "force-reload"; do
-    if [[ $i == $action_ ]]; then
+    if [ "$i" = "$action_" ]; then
       known_action_='true'
       break
     fi
@@ -625,11 +621,11 @@ function _touchService
   if [ ! -x "$service_path_" ]; then
     warn "_touchService(): service is not executable: \"$service_\""
   fi
-  
+
   local ret_=""
   "$service_path_" "$action_"
   ret_=$?
-  if [[ $ret_ != 0 ]]; then
+  if [ "$ret_" != "0" ]; then
     if [ -z "$message_" ]; then
       "$error_function_" "Problems ${action_}ing service \"$service_\"" $ret_
     else
@@ -641,18 +637,19 @@ function _touchService
   return 0
 }
 
-function _createServiceFunctions
+_createServiceFunctions()
 {
   for i in "start" "stop" "restart" "reload"; do
-    eval "function ${i}Service { _touchService ${i} \"\$1\" \"\$2\" \"\$3\"; }"
+    eval "${i}Service() { _touchService ${i} \"\$1\" \"\$2\" \"\$3\"; }"
   done
-  eval "function forceReloadService { _touchService force-reload \"\$1\" \"\$2\" \"\$3\"; }"
+  eval "forceReloadService() { _touchService force-reload \"\$1\" \"\$2\" \"\$3\"; }"
 }
 _createServiceFunctions
 # }}}
 
-# prints the next free /dev/loop* to stdout
-function findNextFreeLoop
+# LOSETUP HELPER FUNCTION {{{
+# print next free /dev/loop* to stdout
+findNextFreeLoop()
 {
   local error_function_=${1:-"eprint"}    # function to call on error
   local message_="$2"    # user supplied error message
@@ -660,7 +657,7 @@ function findNextFreeLoop
   local tmp_=''   # tmp
   local i=''      # counter
   local ret_=''   # saved return value
-  
+
   for i in 'losetup' 'losetup.orig'; do
     tmp_=`$i -f 2>/dev/null`
     if [ $? -eq 0 ]; then
@@ -673,7 +670,7 @@ function findNextFreeLoop
   dprint 'findNextFreeLoop(): losetup does not recognice option -f, searching next free loop device'
   for i in `seq 0 100`; do
     test -e /dev/loop$i || continue
-    losetup /dev/loop$i &>/dev/null
+    losetup /dev/loop$i >/dev/null 2>&1
     ret_=$?
     case "$ret_" in
       2) continue ;;  # losetup could not get status of loopdevice (EPERM)
@@ -691,27 +688,27 @@ function findNextFreeLoop
   fi
   return 1
 }
-
+# }}}
 
 # INIT {{{
 
-function _initProgName
+_initProgName()
 {
   local name_="$1"    # program name
-  
+
   local tmp_name_=`basename "$name_"` || \
     logger -p user.alert -i "Init-initProgName: problems executing ( basename \"$name_\" ) ret($?)" >/dev/null
-  
+
   secureInput "$tmp_name_"
 }
 PROG_NAME__=`_initProgName "$0"`
 
 
-function _checkExecutables
+_checkExecutables()
 {
   local tmp_=""
   for i in tr dirname basename id logger kill cat grep route awk ifconfig; do
-    type -p $i &>/dev/null || tmp_="${tmp_}$i "
+    which $i >/dev/null 2>&1 || tmp_="${tmp_}$i "
   done
   if [ -n "$tmp_" ]; then
     eprint "Init-checkExecutables: following executables not found or not executable:\n$tmp_"
@@ -721,7 +718,7 @@ function _checkExecutables
 _checkExecutables
 
 
-function _checkBootParam
+_checkBootParam()
 {
   local path_="/proc/cmdline"
   if [ -e "$path_" ]; then
@@ -733,10 +730,14 @@ function _checkBootParam
 }
 _checkBootParam
 
-
-function _setDebugLevel
+_setDebugLevel()
 {
-  local debug_="${DEBUG:-0}"
+  # accept only integer as arguments
+  if echo "$DEBUG" | grep -E -q '^[0-9]+$' ; then
+    local debug_="${DEBUG:-0}"
+  else
+    local debug_="0"
+  fi
   VERBOSE__="$debug_"
 }
 _setDebugLevel