improve startup and runtime performance by 1) moving common startup procedures out of hotplug script when called from mwan3 start 2) reducing calls to iptables to check status of rules 3) consolidating iptables updates and updating with iptables-restore 4) do not wait for kill if nothing was killed 5) running interface hotplug scripts in parallel 6) eliminate operations in hotplug script that check status on every single interface unnecessarily 7) consolidate how mwan3track makes hotplug calls 8) do not restart mwan3track on connected events This is a significant refactor, but should not result in any breaking changes or require users to update their configurations. version bump to 2.9.0 Signed-off-by: Aaron Goodman <aaronjg@stanford.edu>
104 lines
3.2 KiB
Bash
104 lines
3.2 KiB
Bash
#!/bin/sh
|
|
|
|
. /lib/functions.sh
|
|
. /lib/functions/network.sh
|
|
. /lib/mwan3/mwan3.sh
|
|
. /usr/share/libubox/jshn.sh
|
|
. /lib/mwan3/common.sh
|
|
|
|
SCRIPTNAME="mwan3-hotplug"
|
|
[ "$ACTION" = "ifup" ] || [ "$ACTION" = "ifdown" ] || [ "$ACTION" = "connected" ] || [ "$ACTION" = "disconnected" ] || exit 1
|
|
[ -n "$INTERFACE" ] || exit 2
|
|
if ( [ "$ACTION" = "ifup" ] || [ "$ACTION" = "connected" ] ) && [ -z "$DEVICE" ]; then
|
|
LOG notice "$ACTION called on $INTERFACE with no device set"
|
|
exit 3
|
|
fi
|
|
|
|
[ "$MWAN3_STARTUP" = 1 ] || mwan3_lock "$ACTION" "$INTERFACE"
|
|
|
|
config_load mwan3
|
|
config_get_bool enabled globals 'enabled' '0'
|
|
[ "${enabled}" -gt 0 ] || {
|
|
[ "$MWAN3_STARTUP" = 1 ] || mwan3_unlock "$ACTION" "$INTERFACE"
|
|
LOG notice "mwan3 hotplug on $INTERFACE not called because globally disabled"
|
|
mwan3_flush_conntrack "$INTERFACE" "$ACTION"
|
|
exit 0
|
|
}
|
|
|
|
$IPT4 -S mwan3_hook &>/dev/null || {
|
|
mwan3_unlock "$ACTION" "$INTERFACE"
|
|
LOG warn "hotplug called on $INTERFACE before mwan3 has been set up"
|
|
exit 0
|
|
}
|
|
|
|
mwan3_init
|
|
[ "$MWAN3_STARTUP" = 1 ] || {
|
|
mwan3_set_connected_iptables
|
|
mwan3_set_custom_ipset
|
|
}
|
|
|
|
if [ "$MWAN3_STARTUP" != 1 ]; then
|
|
mwan3_set_user_iface_rules $INTERFACE $DEVICE
|
|
fi
|
|
|
|
config_get initial_state $INTERFACE initial_state "online"
|
|
config_get_bool enabled $INTERFACE 'enabled' '0'
|
|
[ "${enabled}" -eq 1 ] || {
|
|
[ "$MWAN3_STARTUP" = 1 ] || mwan3_unlock "$ACTION" "$INTERFACE"
|
|
LOG notice "mwan3 hotplug on $INTERFACE not called because interface disabled"
|
|
exit 0
|
|
}
|
|
|
|
trackpid=$(pgrep -f "mwan3track $INTERFACE ")
|
|
|
|
if [ "$initial_state" = "offline" ]; then
|
|
status=$(cat $MWAN3TRACK_STATUS_DIR/$INTERFACE/STATUS 2>/dev/null || echo unknown)
|
|
else
|
|
status=online
|
|
fi
|
|
|
|
[ -z "$TRUE_INTERFACE" ] && mwan3_get_true_iface TRUE_INTERFACE $INTERFACE
|
|
|
|
binary_status=$status
|
|
[ "$binary_status" = "online" ] || binary_status=offline
|
|
|
|
LOG notice "Execute "$ACTION" event on interface $INTERFACE (${DEVICE:-unknown})"
|
|
|
|
case "$ACTION" in
|
|
ifup|connected)
|
|
mwan3_create_iface_iptables $INTERFACE $DEVICE
|
|
mwan3_create_iface_rules $INTERFACE $DEVICE
|
|
mwan3_create_iface_route $INTERFACE $DEVICE
|
|
[ "$MWAN3_STARTUP" != 1 ] && mwan3_add_non_default_iface_route $INTERFACE $DEVICE
|
|
mwan3_set_iface_hotplug_state $INTERFACE "$binary_status"
|
|
|
|
mwan3_get_src_ip src_ip "$TRUE_INTERFACE"
|
|
if [ -n "${trackpid}" ]; then
|
|
device_pid=$(pgrep -f "mwan3track $INTERFACE $DEVICE ")
|
|
if [ "$device_pid" = "$trackpid" ]; then
|
|
[ "$ACTION" = ifup ] && kill -USR2 "$trackpid"
|
|
else
|
|
mwan3_track $INTERFACE $DEVICE "$binary_status" "$src_ip"
|
|
LOG notice "Restarted tracker [$!] on interface $INTERFACE (${DEVICE:-unknown})"
|
|
fi
|
|
else
|
|
mwan3_track $INTERFACE $DEVICE "$binary_status" "$src_ip"
|
|
LOG notice "Started tracker [$!] on interface $INTERFACE (${DEVICE:-unknown})"
|
|
fi
|
|
[ "$MWAN3_STARTUP" != 1 ] && [ "$binary_status" == "online" ] && mwan3_set_policies_iptables
|
|
|
|
;;
|
|
ifdown|disconnected)
|
|
mwan3_set_iface_hotplug_state $INTERFACE "offline"
|
|
mwan3_delete_iface_ipset_entries $INTERFACE
|
|
mwan3_delete_iface_rules $INTERFACE
|
|
mwan3_delete_iface_route $INTERFACE
|
|
mwan3_delete_iface_iptables $INTERFACE
|
|
if [ "$ACTION" = "ifdown" ]; then
|
|
[ -n "$trackpid" ] && kill -USR1 "$trackpid"
|
|
fi
|
|
mwan3_set_policies_iptables
|
|
;;
|
|
esac
|
|
[ "$MWAN3_STARTUP" = 1 ] || mwan3_unlock "$ACTION" "$INTERFACE"
|
|
exit 0
|