You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
2.6 KiB
130 lines
2.6 KiB
#!/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<NF; i++) {
|
|
if ($i == "state") {
|
|
i++; state=$i
|
|
}
|
|
if ($i ~ /link/) {
|
|
i++; mac=$i;
|
|
classes=classes mac " "
|
|
}
|
|
}
|
|
print "IF" no "_NAME=" name ";IF" no "_STATE=" state ";IF" no "_MAC=" mac ";";
|
|
if ("UP" == state) classes=classes mac " "
|
|
}
|
|
BEGIN {
|
|
classes=""
|
|
}
|
|
END {
|
|
print "CLASSES=\"${CLASSES}" classes " \";";
|
|
print "NINTERFACES=" FNR ";"
|
|
}')
|
|
|
|
eval $(${IP} -o addr | ${AWK} '{
|
|
sub(/:/,"",$1);
|
|
no=$1;
|
|
if ($3 == "inet") {
|
|
sub(/[\/%].*/,"",$4);
|
|
print "IF" no "_IPV4=\"${IF" no "_IPV4}" $4 " \";";
|
|
classes=classes $4 " "
|
|
}
|
|
if ($3 == "inet6") {
|
|
sub(/[\/%].*/,"",$4);
|
|
print "IF" no "_IPV6=\"${IF" no "_IPV6}" $4 " \";";
|
|
classes=classes $4 " "
|
|
}
|
|
}
|
|
BEGIN {
|
|
classes=""
|
|
}
|
|
END {
|
|
print "CLASSES=\"${CLASSES}" classes " \";"
|
|
}')
|
|
}
|
|
|
|
##
|
|
# get interface data via the ifconfig tool
|
|
#
|
|
get_interface_data_ifconfig() {
|
|
eval $(${IFCONFIG} -a | ${AWK} '
|
|
/ether/ { mac=$2 }
|
|
/inet / { ipv4=ipv4 $2 " " }
|
|
/inet6/ { ipv6=ipv6 $2 " " }
|
|
/^[^ \t]/ {
|
|
if ("" != ipv4 || "" != ipv6) state="UP"; else state="DOWN";
|
|
if ("" != name) {
|
|
print "IF" no "_NAME=" name ";IF" no "_STATE=" state ";IF" no "_MAC=" mac ";" \
|
|
"IF" no "_IPV4=\"${IF" no "_IPV4}" ipv4 " \";" \
|
|
"IF" no "_IPV6=\"${IF" no "_IPV6}" ipv6 " \";";
|
|
no++;
|
|
}
|
|
ipv4=ipv6="";
|
|
sub(/:/,"",$1);
|
|
name=$1
|
|
}
|
|
BEGIN {
|
|
no=1;
|
|
}
|
|
END {
|
|
if ("" != ipv4 || "" != ipv6) state="UP"; else state="DOWN";
|
|
print "IF" no "_NAME=" name ";IF" no "_STATE=" state ";IF" no "_MAC=" mac ";" \
|
|
"IF" no "_IPV4=\"${IF" no "_IPV4}" ipv4 " \";" \
|
|
"IF" no "_IPV6=\"${IF" no "_IPV6}" ipv6 " \";";
|
|
print "NINTERFACES=" no
|
|
}')
|
|
}
|
|
|
|
##
|
|
# autorun this if sourced.
|
|
#
|
|
|
|
[ -z "${NINTERFACES}" ] && get_interface_data
|
|
|
|
# vim: set ts=4 sw=4:
|