mwan3: add "use" function to mwan3 utils
Use "mwan3 use" to wrap a command with interface bindings so that you can avoid the mwan3 rules and test behavior on a specific interface. eg "mwan3 use wan ping -c1 1.1.1.1" Additional binding arguments to the command will have their system calls intercepted and ignored. eg "mwan3 use wan ping -c1 -I tun0 1.1.1.1" will use the device associated with "wan", rather than "tun0". Signed-off-by: Aaron Goodman <aaronjg@stanford.edu>
This commit is contained in:
parent
bbbc6127ab
commit
d49ca29eca
3 changed files with 44 additions and 17 deletions
|
@ -49,10 +49,12 @@ mwan3_get_true_iface()
|
||||||
|
|
||||||
mwan3_get_src_ip()
|
mwan3_get_src_ip()
|
||||||
{
|
{
|
||||||
local family _src_ip true_iface device addr_cmd default_ip IP sed_str
|
local family _src_ip interface true_iface device addr_cmd default_ip IP sed_str
|
||||||
true_iface=$2
|
interface=$2
|
||||||
|
mwan3_get_true_iface true_iface $interface
|
||||||
|
|
||||||
unset "$1"
|
unset "$1"
|
||||||
config_get family "$true_iface" family ipv4
|
config_get family "$interface" family ipv4
|
||||||
if [ "$family" = "ipv4" ]; then
|
if [ "$family" = "ipv4" ]; then
|
||||||
addr_cmd='network_get_ipaddr'
|
addr_cmd='network_get_ipaddr'
|
||||||
default_ip="0.0.0.0"
|
default_ip="0.0.0.0"
|
||||||
|
|
|
@ -22,7 +22,7 @@ Available commands:
|
||||||
connected Show directly connected networks
|
connected Show directly connected networks
|
||||||
rules Show active rules
|
rules Show active rules
|
||||||
status Show all status
|
status Show all status
|
||||||
|
use <iface> <cmd> Run a command bound to <iface> and avoid mwan3 rules
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,8 +123,33 @@ restart() {
|
||||||
/etc/init.d/mwan3 start
|
/etc/init.d/mwan3 start
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wrap() {
|
||||||
|
# Run a command with the device, src_ip and fwmark set to avoid processing by mwan3
|
||||||
|
# firewall rules
|
||||||
|
|
||||||
|
local interface device src_ip family
|
||||||
|
mwan3_init
|
||||||
|
config_load mwan3
|
||||||
|
|
||||||
|
interface=$1 ; shift
|
||||||
|
[ -z "$*" ] && echo "no command specified for mwan3 wrap" && return
|
||||||
|
network_get_device device $interface
|
||||||
|
[ -z "$device" ] && echo "could not find device for $interface" && return
|
||||||
|
|
||||||
|
mwan3_get_src_ip src_ip $interface
|
||||||
|
[ -z "$src_ip" ] && echo "could not find src_ip for $interface" && return
|
||||||
|
|
||||||
|
config_get family $interface family
|
||||||
|
[ -z "$family" ] && echo "could not find family for $interface. Using ipv4." && family='ipv4'
|
||||||
|
|
||||||
|
echo "Running '$*' with DEVICE=$device SRCIP=$src_ip FWMARK=$MMX_DEFAULT FAMILY=$family"
|
||||||
|
# shellcheck disable=SC2048
|
||||||
|
FAMILY=$family DEVICE=$device SRCIP=$src_ip FWMARK=$MMX_DEFAULT LD_PRELOAD=/lib/mwan3/libwrap_mwan3_sockopt.so.1.0 $*
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
case "$1" in
|
case "$1" in
|
||||||
ifup|ifdown|interfaces|policies|connected|rules|status|start|stop|restart)
|
ifup|ifdown|interfaces|policies|connected|rules|status|start|stop|restart|use)
|
||||||
mwan3_init
|
mwan3_init
|
||||||
# shellcheck disable=SC2048
|
# shellcheck disable=SC2048
|
||||||
$*
|
$*
|
||||||
|
|
|
@ -129,7 +129,7 @@ firstconnect() {
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
mwan3_get_src_ip SRC_IP $true_iface
|
mwan3_get_src_ip SRC_IP $INTERFACE
|
||||||
|
|
||||||
LOG debug "firstconnect: called on $INTERFACE/$true_iface ($DEVICE). Status is $STATUS. SRC_IP is $SRC_IP"
|
LOG debug "firstconnect: called on $INTERFACE/$true_iface ($DEVICE). Status is $STATUS. SRC_IP is $SRC_IP"
|
||||||
|
|
||||||
|
@ -223,7 +223,7 @@ main() {
|
||||||
wait $TRACK_PID
|
wait $TRACK_PID
|
||||||
result=$?
|
result=$?
|
||||||
else
|
else
|
||||||
WRAP $PING -${family#ipv} -I ${SOURCE} -c $count -W $timeout -s $size -t $max_ttl -q $track_ip 2>/dev/null > $TRACK_OUTPUT &
|
WRAP $PING -${family#ipv} -c $count -W $timeout -s $size -t $max_ttl -q $track_ip 2>/dev/null > $TRACK_OUTPUT &
|
||||||
TRACK_PID=$!
|
TRACK_PID=$!
|
||||||
wait $TRACK_PID
|
wait $TRACK_PID
|
||||||
ping_status=$?
|
ping_status=$?
|
||||||
|
|
Loading…
Reference in a new issue