# 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]
################################################################################
+. /usr/lib/grml/core.sh
+# VARIABLES {{{
VERBOSE__=0
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)
SYSLOG__="YES"
-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)
}
# 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
kill $$
}
-function warn
+warn()
{
local error_message_="$1" # print this error message
local exit_code_="$2" # command exits with this exit code
fi
}
-function _syslog
+_syslog()
{
local message_="$1" # error message
local exit_code_="$2"
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
fi
}
-function warnLog
+warnLog()
{
local error_message_="$1" # print this error message
local exit_code_="$2" # command exits with this exit code
}
# }}}
+# CORE FUNCTIONS {{{
-###
-#
-# CORE FUNCTIONS
-#
-###
-
-# i don't want to write exit status controle stuff every time
-function execute
+##
+# 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
+execute()
{
local to_exec_="$1" # command to execute
local error_function_=${2:-"eprint"} # function to call on error
local ret_=''
+ # NOT A GOOD IDEA
eval "$to_exec_"
ret_=$?
return $ret_
}
-function silentExecute
+silentExecute()
{
unsetVerbose
execute "$@"
###
# 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
return 0
}
-function isNotExistent
+isNotExistent()
{
local file_to_test_="$1" # file to test
local error_function_=${2:-"eprint"} # function to call on error
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
}
-function checkUser
+checkUser()
{
local to_check_="$1" # username to check against running process
local error_function_=${2:-"eprint"} # function to call on error
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
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
fi
}
-function checkRoot
+checkRoot()
{
checkId 0 "$1" "$2"
}
+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
+runsFromHd()
{
if [ -e "/etc/grml_cd" ]; then
dprint "runsFromHd(): grml is on CD"
fi
}
-function runsFromCd
+runsFromCd()
{
if [ -e "/etc/grml_cd" ]; then
dprint "runsFromCd(): grml is on CD"
# secure input from console
-function secureInput
+secureInput()
{
local to_secure_="$1"
-
+
local secured_=''
secured_=`echo -n "$to_secure_" |tr -c '[:alnum:]/.\-,\(\)' '_'`
# convert all possible path formats to absolute paths
-function relToAbs
+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')
+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
-function stringInFile
+stringInFile()
{
local to_test_="$1" # matching pattern
local source_="$2" # source-file to grep
}
# same for strings
-function stringInString
+stringInString()
{
local to_test_="$1" # matching pattern
local source_="$2" # string to search in
}
# get value for bootparam given as first param
-function getBootParam
+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
+ getbootparam $1
+ return "$?"
}
# Check boot commandline for specified option
-function checkBootParam
+checkBootParam()
{
- stringInString " $1" "$CMD_LINE__"
+ checkbootparam $1
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
}
# 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_=$?
}
# 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}'`
ret_=$?
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
}
# FIXME
-function netGetIp
+netGetIp()
{
local iface_="$1"
local error_function_=${2:-"eprint"} # function to call on error
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_=""
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
# }}}
# SERVICES {{{
-function _touchService
+_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
+ 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
+}
+
+_createServiceFunctions()
+{
+ for i in "start" "stop" "restart" "reload"; do
+ eval "${i}Service() { _touchService ${i} \"\$1\" \"\$2\" \"\$3\"; }"
done
+ 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
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
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)
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_"
_checkExecutables
-function _checkBootParam
+_setDebugLevel()
{
- local path_="/proc/cmdline"
- if [ -e "$path_" ]; then
- CMD_LINE__=`execute "cat $path_" warnLog`
- return 0
+ # accept only integer as arguments
+ if echo "$DEBUG" | grep -E -q '^[0-9]+$' ; then
+ local debug_="${DEBUG:-0}"
+ else
+ local debug_="0"
fi
- warnLog "$path_ does not exist, thus sh-lib may not work reliable!"
- return 1
-}
-_checkBootParam
-
-
-function _setDebugLevel
-{
- local debug_="${DEBUG:-0}"
VERBOSE__="$debug_"
}
-_checkBootParam
+_setDebugLevel
# }}}
# END OF FILE