From d591675eb6c4d228ed1571144b792bc9bc95f14d Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Mon, 17 Mar 2014 10:55:27 +0000 Subject: [PATCH] add interface netmask and network --- gatherer/interface_information.sh | 89 +++++++++++++++++++++++-------- run.sh | 2 + 2 files changed, 70 insertions(+), 21 deletions(-) diff --git a/gatherer/interface_information.sh b/gatherer/interface_information.sh index 8f2bace..5b872f6 100644 --- a/gatherer/interface_information.sh +++ b/gatherer/interface_information.sh @@ -36,7 +36,7 @@ gather_interface_info() { gather_if_info_ip() { eval $(${IP} -o link | ${AWK} '{ sub(/:/,"",$1); - no=$1; + ifno=$1; sub(/:/,"",$2); name=$2; classes=classes "net_iface_" name " "; @@ -50,35 +50,82 @@ gather_if_info_ip() { } } print "IF" no "_NAME=" name ";IF" no "_STATE=" state ";IF" no "_MAC=" mac ";"; - if ("UP" == state) classes=classes mac " " + if ("UP" == state) classes=classes mac " "; + if_numbers=if_numbers " " ifno; + no+=1 } BEGIN { - classes="" + 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} '{ - 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 " " + echo "DEBUG: ${IF_NO}" + + 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 $4 " " + } + if ($3 == "inet6") { + split($4,addr,/[\/]/); + print "IF" no "_IPV6=\"${IF" no "_IPV6}" addr[1] " \";"; + classes=classes $4 " " + } + } + 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; } - } - BEGIN { - classes="" - } - END { - print "set_class " classes ";" + } + 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;"; }') } diff --git a/run.sh b/run.sh index ba51783..c37888b 100755 --- a/run.sh +++ b/run.sh @@ -40,6 +40,8 @@ do eval printf \"%15s : %s\\\n\" \"IF${NO}_STATE\" \"\${IF${NO}_STATE}\" eval printf \"%15s : %s\\\n\" \"IF${NO}_IPV4\" \"\${IF${NO}_IPV4}\" eval printf \"%15s : %s\\\n\" \"IF${NO}_IPV6\" \"\${IF${NO}_IPV6}\" + eval printf \"%15s : %s\\\n\" \"IF${NO}_MASK\" \"\${IF${NO}_MASK}\" + eval printf \"%15s : %s\\\n\" \"IF${NO}_NETWORK\" \"\${IF${NO}_NETWORK}\" NO=$((NO+1)) done