Files
webgui/plugins/dynamix/scripts/show_interfaces
2023-05-24 18:58:15 +02:00

93 lines
2.3 KiB
Bash
Executable File

#!/bin/bash
NETWORK_INI="/var/local/emhttp/network.ini"
SYSTEM="/sys/class/net"
EXTRA="/boot/config/network-extra.cfg"
link() {
grep -Pom1 "^$1=\"\K[^\"]+" $NETWORK_INI.eth
}
zero() {
data=;
for i in ${!bind[@]}; do
[[ ${bind[$i]} == $1 ]] && data=$1
done
echo $data
}
show() {
case $# in
1) ip addr show to $1 2>/dev/null|grep -Pom1 '^\d+: \K[^:]+';;
2) ip addr show $1 $2 2>/dev/null|grep -Pom1 'inet6? \K[^\/]+';;
3) ip $1 addr show $2 $3 2>/dev/null|grep -Pom1 'inet6? \K[^\/]+';;
esac
}
remove() {
[[ $# -eq 0 ]] && return
for i in ${!bind[@]}; do
[[ ${bind[$i]} == $1 ]] && unset 'bind[i]'
done
}
extra() {
source <(/usr/bin/fromdos <$EXTRA)
for net in $include_interfaces; do
if [[ -z ${net//[^.:]} ]]; then
# net is an interface name, validate
[[ -n $(show dev $net) && -z $(zero $net) ]] && bind+=($net)
else
# net is an IP address, convert to name
net=$(show $net)
[[ -n $net && -z $(zero $net) ]] && bind+=($net)
fi
done
for net in $exclude_interfaces; do
if [[ -z ${net//[^.:]} ]]; then
# net is an interface name, remove
remove $net
else
# net is an IP address, convert to name and remove
remove $(show $net)
fi
done
}
bind=();
if [[ -f $NETWORK_INI ]]; then
# get interface and vlan configurations
for eth in $(grep -Po '^\[\K[^\]]+' $NETWORK_INI); do
# main interface
if [[ -e $SYSTEM/$eth ]]; then
sed -n "/^\[$eth\]/,/^\[eth/p" $NETWORK_INI >$NETWORK_INI.eth
net=$eth
[[ $(link BONDING) == yes ]] && net=${eth/eth/bond}
[[ $(link BRIDGING) == yes ]] && net=${eth/eth/br}
net4=$(link IPADDR:0)
net6=$(link IPADDR6:0)
[[ -n $net4 || -n $net6 ]] && bind+=($net)
if [[ $(link TYPE) == trunk ]]; then
# vlan interface
for vlan in $(grep -Po '^VLANID:\K\d+' $NETWORK_INI.eth); do
net4=$(link IPADDR:$vlan)
net6=$(link IPADDR6:$vlan)
[[ -n $net4 || -n $net6 ]] && bind+=($net.$vlan)
done
fi
fi
done
# add active WG tunnels
for wg in $(wg show interfaces); do
net4=$(show -4 dev $wg)
net6=$(show -6 dev $wg)
[[ -n $net4 || -n $net6 ]] && bind+=($wg)
done
# add user defined interfaces
[[ -f $EXTRA ]] && extra
# remove temporary file
rm -f $NETWORK_INI.eth
fi
bind=${bind[@]}
echo ${bind// /, }