Update copyright file
[grml-shlib.git] / sh-lib
diff --git a/sh-lib b/sh-lib
index 27e8ff3..7c4dfab 100644 (file)
--- a/sh-lib
+++ b/sh-lib
@@ -4,7 +4,6 @@
 # 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]
 ################################################################################
 
 
@@ -14,6 +13,9 @@ VERBOSE_TMP__=0
 # FIXME maybe PROG_PATH__ for better error reporting?
 PROG_NAME__=""    # initialised within init section
 
+# directory for init scripts
+INITD_DIR__="/etc/init.d/"
+
 # >= level and the function will print the message
 EPRINT__=1    # eprint (error print)
 EEPRINT__=2   # 2print (intern error print)
@@ -27,6 +29,7 @@ CMD_LINE__=""   # /proc/cmdline
 
 LANG__="$LANG"
 LC_ALL__="$LC_ALL"
+LANGUAGE__="$LANGUAGE"
 
 
 # CONFIG FUNCTIONS  {{{
@@ -38,9 +41,9 @@ function setExitFunction  { EXIT_FUNCTION__="$1"; }
 function disableSyslog  { SYSLOG__="NO";  }
 function 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"; }
+function saveLang { LANG__="$LANG"; LC_ALL__="$LC_ALL"; LANGUAGE__="$LANGUAGE"; }
+function restoreLang { LANG="$LANG__"; LC_ALL="$LC_ALL__"; LANGUAGE="$LANGUAGE__"; }
+function setCLang { saveLang; LANG="C"; LC_ALL="C"; LANGUAGE="C"; }
 # }}}
 
 
@@ -67,7 +70,7 @@ function vprint
   local level_="$1"
   local type_="$2"
   local message_="$3"
-  
+
   if [ $VERBOSE__ -ge $level_ -a -n "$message_" ]; then
     echo -n "$type_" >&2
     echo "$message_" >&2
@@ -149,7 +152,7 @@ function 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
@@ -174,7 +177,11 @@ function warnLog
 #
 ###
 
-# i don't want to write exit status controle stuff every time
+##
+# ATTENTION... THIS FUNCTION IS A BIG SECURITY HOLE
+# this function will be changed in future release
+##
+# I don't want to write exit status control stuff every time
 function execute
 {
   local to_exec_="$1"   # command to execute
@@ -183,6 +190,7 @@ function execute
 
   local ret_=''
 
+  # NOT A GOOD IDEA
   eval "$to_exec_"
   ret_=$?
 
@@ -243,7 +251,7 @@ function isNotExistent
 
   if [ -e "$file_to_test_" ]; then
     if [ -z "$message_" ]; then
-      $error_function_ "file does allready exist \"$file_to_test_\"" 67
+      $error_function_ "file does already exist \"$file_to_test_\"" 67
     else
       $error_function_ "$message_"
     fi
@@ -303,6 +311,16 @@ function checkRoot
   checkId 0 "$1" "$2"
 }
 
+function isGrml
+{
+  if [ -f /etc/grml_version ] ; then
+    dprint "isGrml(): this seems to be a grml system"
+    return 0
+  else
+    dprint "isGrml(): this is not a grml system"
+    return 1
+  fi
+}
 
 function runsFromHd
 {
@@ -331,7 +349,7 @@ function runsFromCd
 function secureInput
 {
   local to_secure_="$1"
-  
+
   local secured_=''
 
   secured_=`echo -n "$to_secure_" |tr -c '[:alnum:]/.\-,\(\)' '_'`
@@ -344,18 +362,32 @@ function secureInput
 function relToAbs
 {
   local relpath_="$1"
-
-  local D_=''
-  local B_=''
   local abspath_=''
-  local end_path_=''
 
-  D_=`dirname "$relpath_"`
-  B_=`basename "$relpath_"`
-  abspath_=`cd "$D_" 2>/dev/null && pwd || echo "$D_"`/$B_
-  end_path_=`echo "$abspath_" |tr --squeeze-repeats /`
-  dprint "relToAbs(): \"$relpath_\" => \"$end_path_\""
-  echo "$end_path_"
+  abspath_="`readlink -f \"$relpath_\"`" || \
+    warn "relToAbs(): Problems getting absolute path" "$?" || return 1
+  dprint "relToAbs(): \"$relpath_\" => \"$abspath_\""
+  echo "$abspath_"
+}
+
+
+# Trim off white-space characters
+# white-space in the "C" and "POSIX" locales are:
+#   space
+#   form-feed ('\f')
+#   newline ('\n')
+#   carriage return ('\r')
+#   horizontal tab ('\t')
+#   vertical tab ('\v')
+function stringTrim
+{
+  local str_="$1"
+  local result_=""
+
+  result_="`echo "$str_" | sed -e 's/^\s*//' -e 's/\s*$//'`" || \
+    warn "stringTrim(): Problems stripping of blanks" || return 1
+  dprint "stringTrim(): \"$str_\" => \"$result_\""
+  echo "$result_"
 }
 
 # Simple shell grep
@@ -409,10 +441,10 @@ function checkBootParam
 # validates an IP FIXME
 function 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}' \
@@ -420,14 +452,14 @@ function netValidIp
   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_
 }
 
@@ -458,10 +490,10 @@ function 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_=$?
@@ -485,10 +517,10 @@ function 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}'`
   ret_=$?
@@ -496,7 +528,7 @@ function netGetNetmask
   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
@@ -529,16 +561,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
 {
   local error_function_=${1:-"eprint"}    # function to call on error
   local message_="$2"    # user supplied error message
-  
+
   local file_="/etc/resolv.conf"
   local ns_=""
 
@@ -546,9 +578,9 @@ function netGetNameservers
     warn "file \"$file_\" does not exist, could not get nameservers"
     return 1
   fi
-  
+
   setCLang
-  ns_=`awk '/^nameserver/{printf "%s ",$2}' $file_`
+  ns_=`awk '/^nameserver/{printf "%s ",$2}' $file_ |xargs echo`
   restoreLang
   if [ -z "$ns_" ]; then
     if [ -z "$message_" ]; then
@@ -571,53 +603,52 @@ function _touchService
   local action_="${1:-"start"}"
   local service_="$2"
   local error_function_=${3:-"eprint"}    # function to call on error
+  local message_="$4"     # user supplied error message
 
   local i=""
+  local known_action_='false'
   for i in "start" "stop" "restart" "reload" "force-reload"; do
     if [[ $i == $action_ ]]; then
+      known_action_='true'
       break
     fi
-    $error_function_ "unknown action: \"$action\""
-    return 1
   done
+  $known_action_ || warn "_touchService(): unknown action \"$action_\""
+
 
-  if [ ! -e "$service_" ]; then
-    $error_function_ "service does not exist: \"$service_\""
+  local service_path_=""
+  service_path_="${INITD_DIR__}/$service_"
+  if [ ! -e "$service_path_" ]; then
+    warn "_touchService(): service does not exist: \"$service_\""
     return 1
   fi
-  if [ ! -x "$service_" ]; then
-    $error_function_ "service is not executable: \"$service_\""
+  if [ ! -x "$service_path_" ]; then
+    warn "_touchService(): service is not executable: \"$service_\""
   fi
-  
-  /etc/init.d/$service_ $action_
-}
 
-function _createServiceFunctions
-{
-  for i in "start" "stop" "restart" "reload" "force-reload"; do
-    eval "\
-function ${i}Service
-{
-  local service_=\"\$1\"
-  local error_function_=\${2:-\"eprint\"}    # function to call on error
-  local message_=\"\$3\"    # user supplied error message
-  
-  local ret_=\"\"
-  _touchService ${i} \"\$service_\"
-  ret_=\$?
-  if [[ \$ret_ != 0 ]]; then
-    if [ -z \"\$message_\" ]; then
-      \"\$error_function_\" \"Problems ${i}ing service \"\$service_\"\" \$ret_
+  local ret_=""
+  "$service_path_" "$action_"
+  ret_=$?
+  if [[ $ret_ != 0 ]]; then
+    if [ -z "$message_" ]; then
+      "$error_function_" "Problems ${action_}ing service \"$service_\"" $ret_
     else
-      \"\$error_function_\" \"\$message_\" \$ret_
+      "$error_function_" "$message_" $ret_
     fi
     return 1
   fi
-}"
+  dprint "_touchService(): successfully started service \"$service_\""
+  return 0
+}
+
+function _createServiceFunctions
+{
+  for i in "start" "stop" "restart" "reload"; do
+    eval "function ${i}Service { _touchService ${i} \"\$1\" \"\$2\" \"\$3\"; }"
   done
+  eval "function forceReloadService { _touchService force-reload \"\$1\" \"\$2\" \"\$3\"; }"
 }
 _createServiceFunctions
-
 # }}}
 
 # prints the next free /dev/loop* to stdout
@@ -629,7 +660,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
@@ -667,10 +698,10 @@ function findNextFreeLoop
 function _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"`
@@ -708,7 +739,7 @@ function _setDebugLevel
   local debug_="${DEBUG:-0}"
   VERBOSE__="$debug_"
 }
-_checkBootParam
+_setDebugLevel
 # }}}
 
 # END OF FILE