From bcc521c8bd1604f59cc9bc8c0ef9749f621de7c5 Mon Sep 17 00:00:00 2001 From: Michael Gebetsroither Date: Mon, 7 Nov 2005 13:52:45 +0100 Subject: [PATCH] initial commit --- TODO | 19 ++ debian/changelog | 90 ++++++++ debian/compat | 1 + debian/control | 12 ++ debian/copyright | 11 + debian/dirs | 1 + debian/docs | 0 debian/rules | 99 +++++++++ debian/sh-lib.docs | 1 + sh-lib | 620 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 854 insertions(+) create mode 100644 TODO create mode 100644 debian/changelog create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/copyright create mode 100644 debian/dirs create mode 100644 debian/docs create mode 100755 debian/rules create mode 100644 debian/sh-lib.docs create mode 100644 sh-lib diff --git a/TODO b/TODO new file mode 100644 index 0000000..8c8ed84 --- /dev/null +++ b/TODO @@ -0,0 +1,19 @@ + * service{Start,Stop,Restart} + * 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 (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 index 0000000..d1a57f2 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,90 @@ +sh-lib (1.02.04) unstable; urgency=low + + * added TODO + + -- Michael Gebetsroither Wed, 5 Oct 2005 18:42:31 +0200 + +sh-lib (1.02.03) unstable; urgency=low + + * fixed problems with definition of variables + + -- Michael Gebetsroither 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 Mon, 15 Aug 2005 01:58:55 +0200 + +sh-lib (1.02.01) unstable; urgency=low + + * fixed error in findNextFreeLoop() + + -- Michael Gebetsroither 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 Tue, 9 Aug 2005 16:23:30 +0200 + +sh-lib (1.01.00) unstable; urgency=low + + * new upstream :D + + -- Michael Gebetsroither 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 Sun, 8 May 2005 16:20:21 +0200 + +sh-lib (1.00-6) unstable; urgency=low + + * fixed a small typo + + -- Michael Gebetsroither 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 Wed, 6 Apr 2005 02:33:35 +0200 + +sh-lib (1.00-4) unstable; urgency=low + + * Fixed a few small typos + + -- Michael Gebetsroither 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 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 Mon, 14 Feb 2005 00:55:39 +0100 + +sh-lib (1.00-1) unstable; urgency=low + + * Initial Release. + + -- Michael Gebetsroither Sun, 13 Feb 2005 17:57:20 +0100 + diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..b8626c4 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +4 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..1f4e966 --- /dev/null +++ b/debian/control @@ -0,0 +1,12 @@ +Source: sh-lib +Section: main +Priority: optional +Maintainer: Michael Gebetsroither +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 index 0000000..f689c07 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,11 @@ +This package was debianized by Michael Gebetsroither 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 + +License: +GPLv2. diff --git a/debian/dirs b/debian/dirs new file mode 100644 index 0000000..920e28e --- /dev/null +++ b/debian/dirs @@ -0,0 +1 @@ +etc/grml diff --git a/debian/docs b/debian/docs new file mode 100644 index 0000000..e69de29 diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..f61fca0 --- /dev/null +++ b/debian/rules @@ -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 index 0000000..1333ed7 --- /dev/null +++ b/debian/sh-lib.docs @@ -0,0 +1 @@ +TODO diff --git a/sh-lib b/sh-lib new file mode 100644 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 +# 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 -- 2.1.4