diff --git a/interface_information.sh b/interface_information.sh new file mode 100755 index 0000000..afd97e6 --- /dev/null +++ b/interface_information.sh @@ -0,0 +1,130 @@ +#!/bin/dash + +## +# This creates function that will gather some system informations +# and propagate them as environment variables. +# + +. ./utils.sh + +## +# retrieve interfaces. I prefer using ip if it is +# available, else I fallback to ifconfig... don't know +# how to retrieve this information on other systems. +# This also exports the environment variables. +# +get_interface_data() { + local NO=1 + + if [ ${IP} ] + then + get_interface_data_ip + else + if [ ${IFCONFIG} ] + then + get_interface_data_ifconfig + else + ${LOGGER} -p local0.warn 'Found no way to retrieve interface information.' + fi + fi + + export NINTERFACES + export CLASSES + + while [ ${NO} -le ${NINTERFACES:=0} ] + do + export IF${NO}_NAME IF${NO}_MAC IF${NO}_STATE IF${NO}_IPV4 IF${NO}_IPV6 + NO=$((NO+1)) + done +} + +## +# get the interface information from the ip tool +# +get_interface_data_ip() { + eval $(${IP} -o link | ${AWK} '{ + sub(/:/,"",$1); + no=$1; + sub(/:/,"",$2); + name=$2; + for (i=3; i/dev/null +if [ $? -ne 0 ] +then + filename2symbol() { + local SYM="${1}" + + if [ 1 -ne $# ] + then + logger -p syslog.err 'filename2sybol: missing filename' + exit 1 + fi + + while [ "${SYM}" != "${SYM%/*}" -o "${SYM}" != "${SYM%.*}" ] + do + if [ "${SYM}" != "${SYM%.*}" ] + then + SYM="${SYM%%.*}_${SYM#*.}" + else + SYM="${SYM%%/*}_${SYM#*/}" + fi + done + + echo "${SYM}" + } + + canonify_name() { + local FILE="${1}" + local DIR="${PWD}" + + # if FILE starts with a / its already canonified + if [ "${FILE}" != ${FILE#/} ] + then + echo "${FILE}" + return 0 + fi + + # simply remove ./ and make a ../ remove a part from pwd + while [ "${FILE}" != ${FILE#./} -o "${FILE}" != ${FILE#../} ] + do + if [ "${FILE}" != ${FILE#./} ] + then + FILE="${FILE#./}" + else + FILE="${FILE#../}" + DIR="${DIR%/*}" + fi + done + + echo "${DIR}/${FILE}" + } + + include_once() { + local FILE="$(canonify_name "${1}")" + local SYM="$(filename2symbol "${FILE}")" + + if [ 1 -ne $# ] + then + logger -p syslog.err 'include_once: missing filename' + exit 1 + fi + + if eval [ -z \"\${SOURCED_${SYM}}\" ] + then + . ${FILE} + eval export SOURCED_${SYM}=\"\${FILE}\" + fi + } + + ## + # get and export the locations of used programs and export them + # I assume that on every UNIX/shell variant at least [ is globally + # available. I will use it throughout all other scripts without + # checking for existence. + # I also assume through all scripts that eval is available. + # + [ -z "${WHICH}" ] && WHICH="/usr/bin/which" + [ -z "${UNAME}" ] && UNAME="$(${WHICH} uname)" + [ -z "${GREP}" ] && GREP="$(${WHICH} grep)" + [ -z "${AWK}" ] && AWK="$(${WHICH} awk)" + [ -z "${ECHO}" ] && ECHO="$(${WHICH} echo)" + [ -z "${SORT}" ] && SORT="$(${WHICH} sort)" + [ -z "${TR}" ] && TR="$(${WHICH} tr)" + [ -z "${PRINTF}" ] && PRINTF="$(${WHICH} printf)" + [ -z "${LOGGER}" ] && LOGGER="$(${WHICH} logger)" + [ -z "${IP}" ] && IP="$(${WHICH} ip)" + [ -z "${IFCONFIG}" ] && IFCONFIG="$(${WHICH} ifconfig)" + + export WHICH UNAME GREP AWK ECHO SORT TR PRINTF LOGGER IP IFCONFIG +fi + +# vim: set ts=4 sw=4: