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.
163 lines
3.9 KiB
163 lines
3.9 KiB
##
|
|
# 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.
|
|
#
|
|
gather_interface_info() {
|
|
[ -z "${NINTERFACES}" ] || return
|
|
|
|
local NO=1
|
|
|
|
if [ ${IP} ]
|
|
then
|
|
gather_if_info_ip
|
|
else
|
|
if [ ${IFCONFIG} ]
|
|
then
|
|
gather_if_info_ifconfig
|
|
else
|
|
${LOGGER} -p local0.warn 'Found no way to retrieve interface information.'
|
|
fi
|
|
fi
|
|
|
|
export NINTERFACES
|
|
|
|
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
|
|
#
|
|
gather_if_info_ip() {
|
|
eval $(${IP} -o link | ${AWK} '{
|
|
sub(/:/,"",$1);
|
|
ifno=$1;
|
|
sub(/:/,"",$2);
|
|
name=$2;
|
|
classes=classes "net_iface_" name " ";
|
|
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 " ";
|
|
if_numbers=if_numbers " " ifno;
|
|
no+=1
|
|
}
|
|
BEGIN {
|
|
classes="";
|
|
no=1;
|
|
if_numbers=""
|
|
}
|
|
END {
|
|
print "set_class " classes ";";
|
|
print "NINTERFACES=" FNR ";"
|
|
sub(/^ */,"",if_numbers);
|
|
sub(/ *$/,"",if_numbers);
|
|
print "IF_NUMBERS=\"" if_numbers "\";";
|
|
}')
|
|
|
|
eval $(${IP} -o addr | ${AWK} -v if_numbers="${IF_NUMBERS}" '{
|
|
sub(/:/,"",$1);
|
|
if_no=$1;
|
|
no=r_if_numbers[if_no];
|
|
if ($3 == "inet") {
|
|
split($4,addr,/[\/]/);
|
|
print "IF" no "_IPV4=\"${IF" no "_IPV4}" addr[1] " \";";
|
|
network(no, addr[1], addr[2]);
|
|
classes=classes addr[1] " "
|
|
}
|
|
if ($3 == "inet6") {
|
|
split($4,addr,/[\/]/);
|
|
print "IF" no "_IPV6=\"${IF" no "_IPV6}" addr[1] " \";";
|
|
classes=classes addr[1] " "
|
|
}
|
|
}
|
|
BEGIN {
|
|
classes="";
|
|
sub(/^ */,"",if_numbers);
|
|
sub(/ *$/,"",if_numbers);
|
|
split(if_numbers,tmp_array,/ /)
|
|
for(no in tmp_array) {
|
|
if_no=tmp_array[no];
|
|
r_if_numbers[if_no]=no;
|
|
}
|
|
}
|
|
END {
|
|
print "set_class " classes ";"
|
|
}
|
|
function network(no, addr, cidr) {
|
|
mask="";
|
|
net="";
|
|
full_octets=cidr/8;
|
|
part_octets=cidr%8;
|
|
split(addr,parts,/\./);
|
|
for(i=1; i<5; i++) {
|
|
if(i-1 < full_octets) {
|
|
mask=mask "255";
|
|
net=net parts[i];
|
|
} else {
|
|
if (i-1 == full_octets) {
|
|
mpart=256-lshift(1, 8-part_octets);
|
|
mask=mask mpart;
|
|
net=net and(parts[i],mpart);
|
|
} else {
|
|
mask=mask "0";
|
|
net=net "0";
|
|
}
|
|
}
|
|
if (i < 4) {
|
|
mask=mask ".";
|
|
net=net ".";
|
|
}
|
|
}
|
|
classes=classes net " ";
|
|
print "IF" no "_NETWORK=\"" net "\"; export " name "_NETWORK;";
|
|
print "IF" no "_MASK=\"" mask "\"; export " name "_MASK;";
|
|
}')
|
|
}
|
|
|
|
##
|
|
# get interface data via the ifconfig tool
|
|
# FIXME This is outdated. It does not set classes at all.
|
|
#
|
|
gather_if_info_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
|
|
}')
|
|
}
|
|
|
|
# vim: set ts=4 sw=4:
|