X-Git-Url: http://git.grml.org/?p=grml-shlib.git;a=blobdiff_plain;f=sh-lib;h=e87b9cb1074b4ccb66667a6d23a53708a40f9393;hp=79f0ae6eaece8c2faf510c3457b8a0f0f98c9e51;hb=HEAD;hpb=82236a90db1ea678898ab889fd505ac4edad9be5 diff --git a/sh-lib b/sh-lib index 79f0ae6..e87b9cb 100644 --- a/sh-lib +++ b/sh-lib @@ -4,10 +4,9 @@ # 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] ################################################################################ - +# 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,15 +168,14 @@ function warnLog } # }}} +# 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 @@ -186,6 +183,7 @@ function execute local ret_='' + # NOT A GOOD IDEA eval "$to_exec_" ret_=$? @@ -203,7 +201,7 @@ function execute return $ret_ } -function silentExecute +silentExecute() { unsetVerbose execute "$@" @@ -220,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 @@ -238,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 @@ -246,7 +244,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 @@ -257,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 @@ -279,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 @@ -287,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 @@ -301,13 +299,23 @@ function checkId 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" @@ -318,7 +326,7 @@ function runsFromHd fi } -function runsFromCd +runsFromCd() { if [ -e "/etc/grml_cd" ]; then dprint "runsFromCd(): grml is on CD" @@ -331,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:]/.\-,\(\)' '_'` @@ -344,25 +352,39 @@ function secureInput # 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 @@ -377,7 +399,7 @@ function stringInFile } # same for strings -function stringInString +stringInString() { local to_test_="$1" # matching pattern local source_="$2" # string to search in @@ -387,7 +409,7 @@ function stringInString } # get value for bootparam given as first param -function getBootParam +getBootParam() { local param_to_search_="$1" local result_='' @@ -400,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 @@ -457,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_=$? @@ -483,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 @@ -510,7 +536,7 @@ function netGetNetmask } # FIXME -function netGetIp +netGetIp() { local iface_="$1" local error_function_=${2:-"eprint"} # function to call on error @@ -520,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 @@ -532,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_="" @@ -549,9 +574,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 @@ -569,62 +594,62 @@ function netGetNameservers # }}} # 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_\"" + - service_="${INITD_DIR__}/$service_" - 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 - - "$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 @@ -632,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 @@ -645,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) @@ -663,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_" @@ -693,7 +718,7 @@ function _checkExecutables _checkExecutables -function _checkBootParam +_checkBootParam() { local path_="/proc/cmdline" if [ -e "$path_" ]; then @@ -705,13 +730,17 @@ 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_" } -_checkBootParam +_setDebugLevel # }}} # END OF FILE