X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=sh-lib;h=4511f21ae1c8a3d8d15f0f870e1230a4648e410a;hb=c5ae648293b56789e8d8ed036fdf4c56d6749692;hp=53244ac7566aeb16b7b3e1f504d21ec8144893e8;hpb=a135f075e5e52c8a4fd090337b5fa8c447d84dda;p=grml-shlib.git diff --git a/sh-lib b/sh-lib index 53244ac..4511f21 100644 --- a/sh-lib +++ b/sh-lib @@ -4,7 +4,7 @@ # Authors: grml-team (grml.org), (c) Michael Gebetsroither # 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] +# Latest change: Mon Jun 04 01:17:23 CEST 2007 [mika] ################################################################################ @@ -14,6 +14,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) @@ -51,6 +54,9 @@ function unsetVerbose { VERBOSE_TMP__=$VERBOSE__; VERBOSE__=0; } function restoreVerbose { VERBOSE__=$VERBOSE_TMP__; } function getVerbose { echo "$VERBOSE__"; } +function setDebug { setVerbose "$DPRINT__"; } +function unsetDebug { restoreVerbose; } + function setExitFunction { EXIT_FUNCTION__="$1"; } function resetExitFunction { EXIT_FUNCTION__="_syslog"; } # }}} @@ -64,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 @@ -146,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 @@ -171,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 @@ -180,6 +190,7 @@ function execute local ret_='' + # NOT A GOOD IDEA eval "$to_exec_" ret_=$? @@ -240,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 @@ -300,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 { @@ -328,7 +349,7 @@ function runsFromCd function secureInput { local to_secure_="$1" - + local secured_='' secured_=`echo -n "$to_secure_" |tr -c '[:alnum:]/.\-,\(\)' '_'` @@ -341,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 @@ -406,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}' \ @@ -417,37 +452,37 @@ 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_ } function netGetIfaces { - local error_function_=${1:-"eprint"} # function to call on error - local message_="$2" # user supplied error message - local if_='' - local ret_='' - - #ip a|grep 'inet ' |awk '$NF !~ /lo/{print $NF}' - if_="`ip a|grep 'inet ' |awk '{print $NF}'`" - ret_=$? - if [ -z "$if_" ]; then - if [ -z "$message_" ]; then - "$error_function_" "no interfaces found" $ret_ - else - "$error_function_" "$message_" $ret_ - fi - return 1 - fi - dprint "interfaces found" $ret_ - echo "$if_" + local error_function_=${1:-"eprint"} # function to call on error + local message_="$2" # user supplied error message + local if_='' + local ret_='' + + #ip a|grep 'inet ' |awk '$NF !~ /lo/{print $NF}' + if_="`ip a|grep 'inet ' |awk '{print $NF}'`" + ret_=$? + if [ -z "$if_" ]; then + if [ -z "$message_" ]; then + "$error_function_" "no interfaces found" $ret_ + else + "$error_function_" "$message_" $ret_ + fi + return 1 + fi + dprint "interfaces found" $ret_ + echo "$if_" } # FIXME @@ -455,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_=$? @@ -482,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_=$? @@ -493,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 @@ -526,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_="" @@ -543,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 @@ -562,6 +597,59 @@ function netGetNameservers # }}} +# SERVICES {{{ +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 + done + $known_action_ || warn "_touchService(): unknown action \"$action_\"" + + + 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_path_" ]; then + warn "_touchService(): service is not executable: \"$service_\"" + fi + + 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_ + 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 function findNextFreeLoop @@ -572,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 @@ -610,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"` @@ -644,6 +732,14 @@ function _checkBootParam return 1 } _checkBootParam + + +function _setDebugLevel +{ + local debug_="${DEBUG:-0}" + VERBOSE__="$debug_" +} +_setDebugLevel # }}} # END OF FILE