initial commit
authorMichael Gebetsroither <michael.geb@gmx.at>
Mon, 7 Nov 2005 12:52:45 +0000 (13:52 +0100)
committerMichael Gebetsroither <michael.geb@gmx.at>
Mon, 7 Nov 2005 12:52:45 +0000 (13:52 +0100)
TODO [new file with mode: 0644]
debian/changelog [new file with mode: 0644]
debian/compat [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/copyright [new file with mode: 0644]
debian/dirs [new file with mode: 0644]
debian/docs [new file with mode: 0644]
debian/rules [new file with mode: 0755]
debian/sh-lib.docs [new file with mode: 0644]
sh-lib [new file with mode: 0644]

diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..8c8ed84
--- /dev/null
+++ b/TODO
@@ -0,0 +1,19 @@
+ * service{Start,Stop,Restart} <name from /etc/init.d/>
+ * wrapper arround pgrep
+ * function to set C environment (lang)
+ * debug over function (setdebug), von außen DEBUG=x 1:1 übersetzung nach verbose
+ * paket umbenennen nach grml-shlib
+ * execute (secureInput verbessern) @mika
+ * getUserName <id> (is this user available on this system)
+ * update relToAbs (readlink -f)
+
+function zsh_clear_env () {
+  for V in `set +`; do case "$V" in
+    '!'|'$'|'*'|'@'|'?'|'-'|'#'|[0-9]|V);;
+    **) typeset +r "$V"; unset "$V";;
+  esac; done
+  unset V
+  emulate zsh
+  export IFS=" \t\n"
+  export PATH="/bin:/usr/bin:/sbin:/usr/sbin"
+}
diff --git a/debian/changelog b/debian/changelog
new file mode 100644 (file)
index 0000000..d1a57f2
--- /dev/null
@@ -0,0 +1,90 @@
+sh-lib (1.02.04) unstable; urgency=low
+
+  * added TODO 
+
+ -- Michael Gebetsroither <michael.geb@gmx.at>  Wed,  5 Oct 2005 18:42:31 +0200
+
+sh-lib (1.02.03) unstable; urgency=low
+
+  * fixed problems with definition of variables
+
+ -- Michael Gebetsroither <michael.geb@gmx.at>  Sun, 25 Sep 2005 23:12:58 +0200
+
+sh-lib (1.02.02) unstable; urgency=high
+
+  * fixed a few variable definitions (make nearly all local) 
+
+ -- Michael Gebetsroither <michael.geb@gmx.at>  Mon, 15 Aug 2005 01:58:55 +0200
+
+sh-lib (1.02.01) unstable; urgency=low
+
+  * fixed error in findNextFreeLoop()
+
+ -- Michael Gebetsroither <michael.geb@gmx.at>  Fri, 12 Aug 2005 21:03:14 +0200
+
+sh-lib (1.02.00) unstable; urgency=low
+
+  * added findNextFreeLoop() to search the next free loop device
+
+ -- Michael Gebetsroither <michael.geb@gmx.at>  Tue,  9 Aug 2005 16:23:30 +0200
+
+sh-lib (1.01.00) unstable; urgency=low
+
+  * new upstream :D
+
+ -- Michael Gebetsroither <michael.geb@gmx.at>  Tue,  9 Aug 2005 15:54:39 +0200
+
+sh-lib (1.00-7) unstable; urgency=low
+
+  * fixed checkRoot()
+  * fixed message -> message_ in isExistent(), isNotExistent(), checkUser(),
+    checkId() 
+
+ -- Michael Gebetsroither <michael.geb@gmx.at>  Sun,  8 May 2005 16:20:21 +0200
+
+sh-lib (1.00-6) unstable; urgency=low
+
+  * fixed a small typo 
+
+ -- Michael Gebetsroither <michael.geb@gmx.at>  Sun, 10 Apr 2005 13:36:49 +0200
+
+sh-lib (1.00-5) unstable; urgency=low
+
+  * get the right depencencies into the .deb 
+
+ -- Michael Gebetsroither <michael.geb@gmx.at>  Wed,  6 Apr 2005 02:33:35 +0200
+
+sh-lib (1.00-4) unstable; urgency=low
+
+  * Fixed a few small typos 
+
+ -- Michael Gebetsroither <michael.geb@gmx.at>  Sat, 19 Feb 2005 00:45:44 +0100
+
+sh-lib (1.00-3) unstable; urgency=low
+
+  * removed _checkExecutables() in INIT because it's braindamage
+
+ -- Michael Gebetsroither <michael.geb@gmx.at>  Wed, 16 Feb 2005 01:00:47 +0100
+
+sh-lib (1.00-2) unstable; urgency=low
+
+  * WARN: fixed typo, runsFromCD() => runsFromCd()
+  * fixed a small typo in checkID for error reporting
+  * fixed problem in sh-lib init functions for $PROG_NAME__
+  * lib intern logging function is now _syslog()
+  * added syslog() (not influenced by $SYSLOG__)
+  * added netValidIp() for validating ip addresses
+  * added netGetDefaultGateway()
+  * added netGetNetmask()
+  * added netGetIp()
+  * added netGetNameservers()
+  * added notice() for program notice messages
+
+ -- Michael Gebetsroither <michael.geb@gmx.at>  Mon, 14 Feb 2005 00:55:39 +0100
+
+sh-lib (1.00-1) unstable; urgency=low
+
+  * Initial Release.
+
+ -- Michael Gebetsroither <michael.geb@gmx.at>  Sun, 13 Feb 2005 17:57:20 +0100
+
diff --git a/debian/compat b/debian/compat
new file mode 100644 (file)
index 0000000..b8626c4
--- /dev/null
@@ -0,0 +1 @@
+4
diff --git a/debian/control b/debian/control
new file mode 100644 (file)
index 0000000..1f4e966
--- /dev/null
@@ -0,0 +1,12 @@
+Source: sh-lib
+Section: main
+Priority: optional
+Maintainer: Michael Gebetsroither <michael.geb@gmx.at>
+Build-Depends: debhelper (>= 4.0.0)
+Standards-Version: 3.6.1
+
+Package: sh-lib
+Architecture: all
+Depends: ${misc:Depends}, procps, net-tools, gawk
+Description: Generic shell library
+ The sh-lib is developed on zsh, only partially tested on bash.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644 (file)
index 0000000..f689c07
--- /dev/null
@@ -0,0 +1,11 @@
+This package was debianized by Michael Gebetsroither <michael.geb@gmx.at> on
+Sun, 13 Feb 2005 17:57:20 +0100.
+
+It was downloaded from http://einsteinmg.dyndns.org/projects/grml/sh-lib
+
+Copyright:
+
+Upstream Author: Michael Gebetsroither <michael.geb@gmx.at>
+
+License:
+GPLv2.
diff --git a/debian/dirs b/debian/dirs
new file mode 100644 (file)
index 0000000..920e28e
--- /dev/null
@@ -0,0 +1 @@
+etc/grml
diff --git a/debian/docs b/debian/docs
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/debian/rules b/debian/rules
new file mode 100755 (executable)
index 0000000..f61fca0
--- /dev/null
@@ -0,0 +1,99 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+
+
+
+CFLAGS = -Wall -g
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+       CFLAGS += -O0
+else
+       CFLAGS += -O2
+endif
+
+configure: configure-stamp
+configure-stamp:
+       dh_testdir
+       # Add here commands to configure the package.
+
+       touch configure-stamp
+
+
+build: build-stamp
+
+build-stamp: configure-stamp 
+       dh_testdir
+
+       # Add here commands to compile the package.
+       #$(MAKE)
+       #docbook-to-man debian/sh-lib.sgml > sh-lib.1
+
+       touch build-stamp
+
+clean:
+       dh_testdir
+       dh_testroot
+       rm -f build-stamp configure-stamp
+
+       # Add here commands to clean up after the build process.
+       #-$(MAKE) clean
+
+       dh_clean 
+
+install: build
+       dh_testdir
+       dh_testroot
+       dh_clean -k 
+       dh_installdirs
+
+       # Add here commands to install the package into debian/sh-lib.
+       #$(MAKE) install DESTDIR=$(CURDIR)/debian/sh-lib
+       cp sh-lib $(CURDIR)/debian/sh-lib/etc/grml/
+
+
+# Build architecture-independent files here.
+binary-indep: build install binary-arch
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+       dh_testdir
+       dh_testroot
+       dh_installchangelogs 
+       dh_installdocs
+#      dh_installexamples
+#      dh_install
+#      dh_installmenu
+#      dh_installdebconf       
+#      dh_installlogrotate
+#      dh_installemacsen
+#      dh_installpam
+#      dh_installmime
+#      dh_installinit
+#      dh_installcron
+#      dh_installinfo
+#      dh_installman
+#      dh_link etc/grml/sh-lib-1.00 etc/grml/sh-lib
+       dh_strip
+       dh_compress
+       dh_fixperms
+#      dh_perl
+#      dh_python
+#      dh_makeshlibs
+#      dh_installdeb
+#      dh_shlibdeps
+       dh_gencontrol
+       dh_md5sums
+       dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install configure
diff --git a/debian/sh-lib.docs b/debian/sh-lib.docs
new file mode 100644 (file)
index 0000000..1333ed7
--- /dev/null
@@ -0,0 +1 @@
+TODO
diff --git a/sh-lib b/sh-lib
new file mode 100644 (file)
index 0000000..640a5b6
--- /dev/null
+++ b/sh-lib
@@ -0,0 +1,620 @@
+#!/bin/sh
+# Filename:      sh-lib
+# Purpose:       Shellscript library
+# 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]
+################################################################################
+
+
+VERBOSE__=0
+VERBOSE_TMP__=0
+
+# FIXME maybe PROG_PATH__ for better error reporting?
+PROG_NAME__=""    # initialised within init section
+
+# >= level and the function will print the message
+EPRINT__=1    # eprint (error print)
+EEPRINT__=2   # 2print (intern error print)
+DPRINT__=3    # dprint (debug print)
+
+EXIT_FUNCTION__="_syslog"    # function to call upon die (can be set by user)
+
+SYSLOG__="YES"
+
+CMD_LINE__=""   # /proc/cmdline
+
+
+# CONFIG FUNCTIONS  {{{
+
+function setProgName  { PROG_NAME__="$1"; }
+
+function setExitFunction  { EXIT_FUNCTION__="$1"; }
+
+function disableSyslog  { SYSLOG__="NO";  }
+function enableSyslog   { SYSLOG__="YES"; }
+# }}}
+
+
+# DEBUG FRAMEWORK  {{{
+
+function setVerbose     { VERBOSE__=${1:-1}; }
+function unsetVerbose   { VERBOSE_TMP__=$VERBOSE__; VERBOSE__=0; }
+function restoreVerbose { VERBOSE__=$VERBOSE_TMP__; }
+function getVerbose     { echo "$VERBOSE__"; }
+
+function setExitFunction    { EXIT_FUNCTION__="$1"; }
+function resetExitFunction  { EXIT_FUNCTION__="_syslog"; }
+# }}}
+
+
+# ERROR REPORTING FUNCTIONS  {{{
+
+# default print backend (there may be other functions)
+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
+  fi
+}
+
+# print error output
+function 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)
+  vprint $EPRINT__ "Error - " "$1"
+}
+
+# should be used for intern silentExecutes
+function eeprint
+{
+  vprint $EEPRINT__ "  Error2 - " "$1"
+}
+
+# print debug output (function intern errors)
+function dprint
+{
+  vprint $DPRINT__ "Debug - " "$1"
+}
+
+# for program notice messages
+function notice
+{
+  vprint $EPRINT__ "Notice - " "$1"
+}
+
+function die
+{
+  local error_message_="$1"   # print this error message
+  local exit_code_="$2"  # command exited with this exit code
+
+  echo -n "PANIC: $error_message_" >&2
+  if [ -n "$2" ]; then
+    echo "; ret($exit_code_)" >&2
+  else
+    echo >&2
+  fi
+
+  if [ -n "$EXIT_FUNCTION__" ]; then
+    $EXIT_FUNCTION__ "$error_message_" "$exit_code_" >&2
+  fi
+  kill $$
+}
+
+function warn
+{
+  local error_message_="$1"   # print this error message
+  local exit_code_="$2"  # command exits with this exit code
+
+  echo -n "WARN: $error_message_" >&2
+  if [ -n "$exit_code_" ]; then
+    echo "; ret($exit_code_)" >&2
+  else
+    echo >&2
+  fi
+}
+
+function _syslog
+{
+  local message_="$1"   # error message
+  local exit_code_="$2"
+
+  if [ "$SYSLOG__" = "YES" ]; then
+    if [ -n "$exit_code_" ]; then
+      logger -p user.alert -t "$PROG_NAME__" -i "$message_ ret($exit_code_)" >&2
+    else
+      logger -p user.alert -t "$PROG_NAME__" -i "$message_" >&2
+    fi
+  fi
+}
+
+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
+    logger -p user.alert -t "$PROG_NAME__" -i "$message_" >&2
+  fi
+}
+
+function warnLog
+{
+  local error_message_="$1"   # print this error message
+  local exit_code_="$2"  # command exits with this exit code
+
+  warn "$error_message_" "$exit_code_"
+  syslog "$error_message_" "$exit_code_"
+}
+# }}}
+
+
+###
+#
+# CORE FUNCTIONS
+#
+###
+
+# i don't want to write exit status controle stuff every time
+function execute
+{
+  local to_exec_="$1"   # command to execute
+  local error_function_=${2:-"eprint"}    # function to call on error
+  local message_="$3"   # user supplied error message
+
+  local ret_=''
+
+  eval "$to_exec_"
+  ret_=$?
+
+  if [ $ret_ -eq 127 ]; then
+    syslog "problems executing ( $to_exec_ )" $ret_
+  fi
+  if [ $ret_ -ne 0 ]; then
+    if [ -z "$message_" ]; then
+      $error_function_ "problems executing ( $to_exec_ )" "$ret_"
+    else
+      $error_function_ "$message_" "$ret_"
+    fi
+  fi
+  dprint "exec-$error_function_: ( $to_exec_ ) ret($ret_)"
+  return $ret_
+}
+
+function silentExecute
+{
+  unsetVerbose
+  execute "$@"
+  local ret_=$?
+  restoreVerbose
+  return $ret_
+}
+
+
+###
+#
+# TEST FUNCTIONS
+#
+###
+
+# if the file DOES exist, everything is fine
+function isExistent
+{
+  local file_to_test_="$1"    # file to test
+  local error_function_=${2:-"eprint"}    # function to call on error
+  local message_="$3"    # user supplied error message
+
+  if [ ! -e "$file_to_test_" ]; then
+    if [ -z "$message_" ]; then
+      $error_function_ "file does not exist \"$file_to_test_\"" 66
+    else
+      $error_function_ "$message_"
+    fi
+    return 1
+  fi
+  dprint "isExistent(): file \"$1\" does exist => ready to go"
+  return 0
+}
+
+function isNotExistent
+{
+  local file_to_test_="$1"    # file to test
+  local error_function_=${2:-"eprint"}    # function to call on error
+  local message_="$3"    # user supplied error message
+
+  if [ -e "$file_to_test_" ]; then
+    if [ -z "$message_" ]; then
+      $error_function_ "file does allready exist \"$file_to_test_\"" 67
+    else
+      $error_function_ "$message_"
+    fi
+    return 1
+  fi
+  dprint "isNotExistent(): file \"$1\" does not exist => ready to go"
+  return 0
+}
+
+
+function checkUser
+{
+  local to_check_="$1"    # username to check against running process
+  local error_function_=${2:-"eprint"}    # function to call on error
+  local message_="$3"    # user supplied error message
+
+  local user_=''
+
+  user_=`id -un`
+  if [ $user_ != "$to_check_" ]; then
+    if [ -z "$message_" ]; then
+      $error_function_ "username \"$user_\" is not \"$to_check_\"" 77 $exit_function_
+    else
+      $error_function_ "$message_"
+    fi
+    return 1
+  else
+    dprint "checkUser(): accepted, username matches \"$to_check_\""
+    return 0
+  fi
+}
+
+function checkId
+{
+  local to_check_="$1"    # user-id to check against running process
+  local error_function_=${2:-"eprint"}    # function to call on error
+  local message_="$3"    # user supplied error message
+
+  local user_id_=''
+
+  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
+      $error_function_ "$message_"
+    fi
+    return 1
+  else
+    dprint "checkId(): accepted, UID matches \"$to_check_\""
+    return 0
+  fi
+}
+
+function checkRoot
+{
+  checkId 0 "$1" "$2"
+}
+
+
+function runsFromHd
+{
+  if [ -e "/etc/grml_cd" ]; then
+    dprint "runsFromHd(): grml is on CD"
+    return 1
+  else
+    dprint "runsFromHd(): grml is on HD"
+    return 0
+  fi
+}
+
+function runsFromCd
+{
+  if [ -e "/etc/grml_cd" ]; then
+    dprint "runsFromCd(): grml is on CD"
+    return 0
+  else
+    dprint "runsFromCd(): grml is on HD"
+    return 1
+  fi
+}
+
+
+# secure input from console
+function secureInput
+{
+  local to_secure_="$1"
+  
+  local secured_=''
+
+  secured_=`echo -n "$to_secure_" |tr -c '[:alnum:]/.\-,\(\)' '_'`
+  dprint "secureInput(): \"$to_secure_\" => \"$secured_\""
+  echo "$secured_"
+}
+
+
+# convert all possible path formats to absolute paths
+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_"
+}
+
+# Simple shell grep
+function stringInFile
+{
+  local to_test_="$1"   # matching pattern
+  local source_="$2"    # source-file to grep
+
+  if [ ! -e "$source_" ]; then
+    eprint "stringInFile(): \"$source_\" does not exist"
+    return 1
+  fi
+
+  case "$(cat $source_)" in *$to_test_*) return 0;; esac
+  return 1
+}
+
+# same for strings
+function stringInString
+{
+  local to_test_="$1"   # matching pattern
+  local source_="$2"    # string to search in
+
+  case "$source_" in *$to_test_*) return 0;; esac
+  return 1
+}
+
+# get value for bootparam given as first param
+function getBootParam
+{
+  local param_to_search_="$1"
+  local result_=''
+
+  stringInString " $param_to_search_=" "$CMD_LINE__" || return 1
+  result_="${CMD_LINE__##*$param_to_search_=}"
+  result_="${result_%%[   ]*}"
+  echo "$result_"
+  return 0
+}
+
+# Check boot commandline for specified option
+function checkBootParam
+{
+  stringInString " $1" "$CMD_LINE__"
+  return "$?"
+}
+
+
+# NETWORK  {{{
+
+# validates an IP FIXME
+function netValidIp
+{
+  local ip_="$1"    # ip addresse 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
+  ret_=$?
+  if [ $ret_ -ne 0 ]; then
+    if [ -z "$message_" ]; then
+      "$error_function_" "ip-addresse \"$ip_\" is NOT valied" $ret_
+    else
+      "$error_function_" "$message_" $ret_
+    fi
+    return 1
+  fi
+
+  dprint "ip-addresse \"$ip_\" is valied" $ret_
+  return $ret_
+}
+
+# FIXME
+function netGetDefaultGateway
+{
+  local error_function_=${1:-"eprint"}    # function to call on error
+  local message_="$2"    # user supplied error message
+  
+  local LANG=C
+  local LC_ALL=C
+  local ip_=''
+  local ret_=''
+  
+  ip_=`route -n | awk '/^0\.0\.0\.0/{print $2; exit}'`
+  ret_=$?
+  if [ -z "$ip_" ]; then
+    if [ -z "$message_" ]; then
+      "$error_function_" "no default gateway found" $ret_
+    else
+      "$error_function_" "$message_" $ret_
+    fi
+    return 1
+  fi
+  dprint "default gateway is \"$ip_\"" $ret_
+  echo "$ip_"
+  return 0
+}
+
+# FIXME
+function netGetNetmask
+{
+  local iface_="$1"
+  local error_function_=${2:-"eprint"}    # function to call on error
+  local message_="$3"    # user supplied error message
+  
+  local LANG=C
+  local LC_ALL=C
+  local nm_=''
+  local ret_=''
+  
+  nm_=`ifconfig "$iface_" | awk '/[Mm]ask/{FS="[:   ]*"; $0=$0; print $8; exit}'`
+  ret_=$?
+  if [ -z "$nm_" ]; then
+    if [ -z "$message_" ]; then
+      "$error_function_" "could not find a netmask for \"$iface_\"" $ret_
+    else 
+      "$error_function_" "$message_" $ret_
+    fi
+    return 1
+  fi
+  dprint "netmask on \"$iface_\" is \"$nm_\"" $ret_
+  echo "$nm_"
+  return 0
+}
+
+# FIXME
+function netGetIp
+{
+  local iface_="$1"
+  local error_function_=${2:-"eprint"}    # function to call on error
+  local message_="$3"    # user supplied error message
+
+  local LANG=C
+  local LC_ALL=C
+  local ip_=""
+  local ret_=""
+
+  #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}'`
+  ret_=$?
+  if [ -z "$ip_" ]; then
+    if [ -z "$message_" ]; then
+      "$error_function_" "no ip for \"$iface_\" found" $ret_
+    else
+      "$error_function_" "$message_" $ret_
+    fi
+    return 1
+  fi
+  dprint "addresse 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_=""
+
+  if [ ! -e $file_ ]; then
+    warn "file \"$file_\" does not exist, could not get nameservers"
+    return 1
+  fi
+  
+  ns_=`awk '/^nameserver/{printf "%s ",$2}' $file_`
+  if [ -z "$ns_" ]; then
+    if [ -z "$message_" ]; then
+      "$error_function_" "no nameservers found" $ret_
+    else
+      "$error_function_" "$message_" $ret_
+    fi
+    return 1
+  fi
+  dprint "nameservers: \"$ns_\"" $ret_
+  echo "$ns_"
+  return 0
+}
+
+# }}}
+
+
+# prints the next free /dev/loop* to stdout
+function findNextFreeLoop
+{
+  local error_function_=${1:-"eprint"}    # function to call on error
+  local message_="$2"    # user supplied error message
+
+  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
+      echo $tmp_
+      return 0
+    fi
+  done
+
+  # we have to search
+  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
+    ret_=$?
+    case "$ret_" in
+      2) continue ;;  # losetup could not get status of loopdevice (EPERM)
+      0) continue ;;  # device exist
+      1) echo "/dev/loop$i"; return 0 ;;  # device does not exist and no error
+      ?) continue ;;  # return value not available in 'man losetup'
+    esac
+  done
+
+  # hmm... could not find a loopdevice
+  if [ -z "$message_" ]; then
+    $error_function_ "could not find a free loop device"
+  else
+    $error_function_ "$message_"
+  fi
+  return 1
+}
+
+
+# INIT {{{
+
+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"`
+
+
+function _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 "
+  done
+  if [ -n "$tmp_" ]; then
+    eprint "Init-checkExecutables: following executables not found or not executable:\n$tmp_"
+    #syslog "Init-checkExecutables: following executables not found or not executable: $tmp_"
+  fi
+}
+_checkExecutables
+
+
+function _checkBootParam
+{
+  local path_="/proc/cmdline"
+  if [ -e "$path_" ]; then
+    CMD_LINE__=`execute "cat $path_" warnLog`
+    return 0
+  fi
+  warnLog "$path_ does not exist, thus sh-lib may not work reliable!"
+  return 1
+}
+_checkBootParam
+# }}}
+
+# END OF FILE
+################################################################################
+# vim:foldmethod=marker