diff --git a/omr-tracker/files/usr/share/omr/post-tracking.d/001-initialize b/omr-tracker/files/usr/share/omr/post-tracking.d/001-initialize new file mode 100755 index 000000000..d9ef59c14 --- /dev/null +++ b/omr-tracker/files/usr/share/omr/post-tracking.d/001-initialize @@ -0,0 +1,14 @@ + +# Set default multipath status +[ "$OMR_TRACKER_INTERFACE" = "omrvpn" ] && multipath $OMR_TRACKER_DEVICE off 2>&1 >/dev/null +[ "$OMR_TRACKER_INTERFACE" = "omr6in4" ] && multipath $OMR_TRACKER_DEVICE off 2>&1 >/dev/null + +if [ -n "$OMR_TRACKER_INTERFACE" ] && [ -n "$OMR_TRACKER_DEVICE" ] && [ "$OMR_TRACKER_INTERFACE" != "omrvpn" ] && [ "$OMR_TRACKER_INTERFACE" != "omr6in4" ]; then + metric="$(uci -q get network.$OMR_TRACKER_INTERFACE.metric)" + if [ -z "$metric" ] || ([ -n "$OMR_TRACKER_DEVICE_IP" ] && [ -z "$(ip route show table $metric | grep $OMR_TRACKER_DEVICE)" ]) || ([ -n "$OMR_TRACKER_DEVICE_IP6" ] && [ -z "$(ip -6 route show table 6${metric} | grep $OMR_TRACKER_DEVICE)" ]); then + _log "Routes not correctly set for $OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE table $metric) with IPs $OMR_TRACKER_DEVICE_IP $OMR_TRACKER_DEVICE_IP6" + /etc/init.d/mptcp reload "$OMR_TRACKER_DEVICE" + /etc/init.d/omr-tracker restart + exit 0 + fi +fi diff --git a/omr-tracker/files/usr/share/omr/post-tracking.d/002-error b/omr-tracker/files/usr/share/omr/post-tracking.d/002-error new file mode 100755 index 000000000..a74f74df6 --- /dev/null +++ b/omr-tracker/files/usr/share/omr/post-tracking.d/002-error @@ -0,0 +1,292 @@ + + +. /lib/functions/network.sh + +default_gw=$(ip route get 1.1.1.1 | grep via | awk '{print $3}') +default_gw6=$(ip -6 route get 2606:4700:4700::1111 | grep via | awk '{print $3}') + +interface_up=$(ifstatus "$OMR_TRACKER_INTERFACE" 2>/dev/null | jsonfilter -q -e '@["up"]') + +# An interface in error will never be used in MPTCP +if [ "$OMR_TRACKER_STATUS" = "ERROR" ] || ([ "$OMR_TRACKER_INTERFACE" != "omrvpn" ] && [ "$interface_up" != "true" ]); then + #interface_autostart=$(ifstatus "$OMR_TRACKER_INTERFACE" 2>/dev/null | jsonfilter -q -e '@["autostart"]') + #interface_available=$(ifstatus "$OMR_TRACKER_INTERFACE" 2>/dev/null | jsonfilter -q -e '@["available"]') + #interface_pending=$(ifstatus "$OMR_TRACKER_INTERFACE" 2>/dev/null | jsonfilter -q -e '@["pending"]') + #interface_error=$(ifstatus "$OMR_TRACKER_INTERFACE" 2>/dev/null | jsonfilter -q -e '@["errors"][0].code') + + #if [ "$interface_available" = "true" ] && [ -n "$OMR_TRACKER_INTERFACE" ] && ([ "$(uci -q get network.$OMR_TRACKER_INTERFACE.proto)" = "modemmanager" ] || [ "$(uci -q get network.$OMR_TRACKER_INTERFACE.proto)" = "wireguard" ]) && [ "$interface_error" != "MM_PINCODE_REQUIRED" ] && [ "$interface_error" != "MM_FAILED_REASON_SIM_MISSING" ]; then + #if [ "$interface_available" = "true" ] && [ "$interface_up" = "false" ] && [ -n "$OMR_TRACKER_INTERFACE" ] && ([ "$(uci -q get network.$OMR_TRACKER_INTERFACE.proto)" = "modemmanager" ] || [ "$(uci -q get network.$OMR_TRACKER_INTERFACE.proto)" = "wireguard" ]); then + # _log "No answer from $OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE), restart interface" + # _log "Set $OMR_TRACKER_INTERFACE down" + # ifdown $OMR_TRACKER_INTERFACE + # sleep 5 + # _log "Set $OMR_TRACKER_INTERFACE up" + # ifup $OMR_TRACKER_INTERFACE + # sleep 30 + #if [ -n "$OMR_TRACKER_INTERFACE" ] && [ -n "$OMR_TRACKER_DEVICE" ] && [ "$(uci -q get network.$OMR_TRACKER_INTERFACE.proto)" = "modemmanager" ] && [ "$interface_up" = "false" ] && [ "$interface_available" = "false" ] && [ "$interface_pending" = "false" ] && [ "$interface_autostart" = "true" ]; then + if [ -n "$OMR_TRACKER_INTERFACE" ] && [ "$(uci -q get network.$OMR_TRACKER_INTERFACE.proto)" = "modemmanager" ]; then + modemfind="0" + device="$(uci -q get network.$OMR_TRACKER_INTERFACE.device)" + . /usr/share/ModemManager/modemmanager.common + [ -n "$device" ] && MODEM_STATUS="$(timeout 3 mmcli -m $device -K)" + modem=$device + if [ -n "$MODEM_STATUS" ]; then + modemfind="1" + mm_state=$(modemmanager_get_field "${MODEM_STATUS}" "modem.generic.state") + if [ "$mm_state" = "failed" ]; then + mm_state_failed=$(modemmanager_get_field "${MODEM_STATUS}" "modem.generic.state-failed-reason") + if [ "$mm_state_failed" = "unknown-capabilities" ]; then + _log "Interface $OMR_TRACKER_INTERFACE in failed state in ModemManager, reset modem..." + /usr/bin/mmcli -m ${modem} -r 2>&1 >/dev/null + sleep 30 + elif false && [ "$mm_state_failed" = "sim-missing" ]; then + _log "Interface $OMR_TRACKER_INTERFACE in failed state in ModemManager, reset modem..." + /usr/bin/mmcli -m ${modem} -r 2>&1 >/dev/null + #_log "Interface $OMR_TRACKER_INTERFACE in failed state sim-missing in ModemManager, reset modem..." + #mm_primary_port=$(modemmanager_get_field "${MODEM_STATUS}" "modem.generic.primary-port") + #mbimcli -p -d /dev/$mm_primary_port --ms-device-reset 2>&1 >/dev/null + fi + elif [ "$mm_state" = "connected" ] || [ "$mm_state" = "enabled" ]; then + _log "No answer from $OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE), restart interface" + _log "Set $OMR_TRACKER_INTERFACE down" + ifdown $OMR_TRACKER_INTERFACE + sleep 5 + _log "Set $OMR_TRACKER_INTERFACE up" + ifup $OMR_TRACKER_INTERFACE + sleep 30 + elif [ "$mm_state" = "disabled" ]; then + # [ -n "$(echo $modeminfo | grep 'modem.3gpp.registration-state ' | grep home)" ]; then + _log "Interface $OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE) disabled, set it up" + /usr/bin/mmcli -m ${modem} -e 2>&1 >/dev/null + ifup $OMR_TRACKER_INTERFACE + sleep 30 + elif [ "$mm_state" = "registered" ]; then + _log "Interface $OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE) registered, set it up" + ifup $OMR_TRACKER_INTERFACE + sleep 30 + elif [ "$mm_state" = "locked" ]; then + mm_unlock_required=$(modemmanager_get_field "${MODEM_STATUS}" "modem.generic.unlock-required") + mm_generic_sim=$(modemmanager_get_field "${MODEM_STATUS}" "modem.generic.sim") + #mm_primary_port=$(modemmanager_get_field "${MODEM_STATUS}" "modem.generic.primary-port") + #mm_drivers=$(modemmanager_get_multivalue_field "${MODEM_STATUS}" "modem.generic.drivers") + mm_unlock_retries=$(modemmanager_get_multivalue_field "${MODEM_STATUS}" "modem.generic.unlock-retries" | awk '{print substr($2,2,length($2)-2)}') + if [ "$mm_unlock_required" = "sim-pin" ]; then + # Sometimes PIN is not correctly sent to modem + if [ -n "$(uci -q get network.$OMR_TRACKER_INTERFACE.pincode)" ]; then + if [ "$mm_unlock_retries" -gt "1" ] && [ -n "$(uci -q get network.$OMR_TRACKER_INTERFACE.pincode)" ]; then + _log "Interface $OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE) locked, set PIN" + mmcli -a -m ${modem} -i $mm_generic_sim --pin=$(uci -q get network.$OMR_TRACKER_INTERFACE.pincode) 2>&1 >/dev/null + sleep 20 + ifup $OMR_TRACKER_INTERFACE + fi + fi + elif [ "$mm_unlock_required" = "sim-puk" ] && [ "$mm_unlock_retries" -gt "1" ] && [ -n "$(uci -q get network.$OMR_TRACKER_INTERFACE.pukcode)" ] && [ -n "$(uci -q get network.$OMR_TRACKER_INTERFACE.pincode)" ]; then + _log "Interface $OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE) locked, set PUK" + mmcli -i $mm_generic_sim --puk=$(uci -q get network.$OMR_TRACKER_INTERFACE.pukcode) --pin=$(uci -q get network.$OMR_TRACKER_INTERFACE.pincode) 2>&1 >/dev/null + sleep 30 + fi + fi + fi + if [ "$modemfind" = "0" ]; then + #_log "Can't find $OMR_TRACKER_INTERFACE in ModemManager, rescan modem..." + #/usr/bin/mmcli -S 2>&1 >/dev/null + #_log "Can't find $OMR_TRACKER_INTERFACE in ModemManager, restart modemmanager..." + _log "Can't find $OMR_TRACKER_INTERFACE in ModemManager" + #/etc/init.d/modemmanager restart + sleep 30 + fi + fi + #elif [ -n "$OMR_TRACKER_INTERFACE" ] && [ -n "$OMR_TRACKER_DEVICE" ] && [ "$(uci -q get network.$OMR_TRACKER_INTERFACE.proto)" = "modemmanager" ] && [ "$interface_available" = "false" ]; then + # for modem in $(timeout 3 mmcli -L | awk -F/ '{ print $6}' | awk '{print $1}'); do + # if [ -n "$(timeout 2 mmcli -m $modem -K | grep $OMR_TRACKER_DEVICE)" ]; then + # modem_device=$(timeout 2 mmcli -m $modem -K | grep 'modem.generic.device ' | awk '{print $3}') + # [ -n "$modem_device" ] && modem_interface=$(uci -q show network | grep $modem_device | awk -F. '{print $2}') + # [ -n "$modem_interface" ] && { + # _log "No answer from $OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE), restart associed interface $modem_interface" + # ifdown $modem_interface + # sleep 5 + # ifup $modem_interface + # sleep 30 + # } + # fi + # done + #fi + + # This part must be done after modems restart because we have no idea when modems will be ready again... (another solution would be to check ModemManager status) + if [ "$OMR_TRACKER_PREV_STATUS" = "$OMR_TRACKER_STATUS" ]; then + exit 0 + fi + + # Get the current multipath status + multipath_status="off" +# [ "$OMR_TRACKER_INTERFACE" = "omrvpn" ] && multipath $OMR_TRACKER_DEVICE off 2>&1 >/dev/null +# [ "$OMR_TRACKER_INTERFACE" = "omr6in4" ] && multipath $OMR_TRACKER_DEVICE off 2>&1 >/dev/null + if [ -e "/sys/class/net/$OMR_TRACKER_DEVICE" ]; then + case "$(multipath "$OMR_TRACKER_DEVICE")" in + *default*) multipath_status="on" ;; + *backup*) multipath_status="backup" ;; + *handover*) multipath_status="handover" ;; + esac + fi + + if [ "$multipath_status" != "off" ] || ([ -n "$OMR_TRACKER_INTERFACE" ] && [ "$(uci -q get openmptcprouter.$OMR_TRACKER_INTERFACE.multipathvpn)" = "1" ]); then + if [ "$OMR_TRACKER_STATUS_MSG" = "" ]; then + _log "$OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE) switched off (interface up status: $interface_up - Tracker status: $OMR_TRACKER_STATUS)" + else + _log "$OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE) switched off because $OMR_TRACKER_STATUS_MSG" + fi + if [ -n "$OMR_TRACKER_INTERFACE" ]; then + uci -q set openmptcprouter.$OMR_TRACKER_INTERFACE.state='down' + fi + #if [ "$(sysctl -n net.mptcp.mptcp_enabled | tr -d '\n')" = "1" ]; then + # multipath "$OMR_TRACKER_DEVICE" off > /dev/null 2>&1 + #fi + if [ -n "$OMR_TRACKER_DEVICE_IP" ]; then + glorytun-udp path addr $OMR_TRACKER_DEVICE_IP dev tun0 set down > /dev/null 2>&1 + fi + if [ -n "$OMR_TRACKER_DEVICE_IP6" ]; then + glorytun-udp path addr $OMR_TRACKER_DEVICE_IP6 dev tun0 set down > /dev/null 2>&1 + fi + if [ -n "$OMR_TRACKER_INTERFACE" ] && [ "$(uci -q get openmptcprouter.$OMR_TRACKER_INTERFACE.vpn)" = "1" ] && [ "$(uci -q get openmptcprouter.settings.mptcpovervpn)" = "openvpn" ]; then + VPN_BASE_INTF="$(uci -q get openmptcprouter.$OMR_TRACKER_INTERFACE.baseintf)" + VPN_BASE_INTF_IP=$(ubus call network.interface.$VPN_BASE_INTF status | jsonfilter -e '@["ipv4-address"][0].address' | tr -d "\n") + if [ -n "$VPN_BASE_INTF" ]; then + uci -q batch <<-EOF >/dev/null + set openvpn.$VPN_BASE_INTF.local=$VPN_BASE_INTF_IP + commit openvpn + EOF + fi + [ -z "VPN_BASE_INTF" ] && VPN_BASE_INTF="omr" + /etc/init.d/openvpn restart $VPN_BASE_INTF 2>&1 >/dev/null + fi + config_load openmptcprouter + config_foreach del_server_route server + config_foreach del_server_route6 server + #if [ "$(uci -q get openmptcprouter.settings.master)" = "balancing" ] && [ "$(uci -q get openmptcprouter.settings.vpn)" != "mlvpn" ]; then + + if [ -n "$OMR_TRACKER_INTERFACE" ]; then + if ([ "$default_gw" = "$OMR_TRACKER_DEVICE_GATEWAY" ] || [ "$default_gw" = "" ] || [ "$default_gw6" != "$OMR_TRACKER_DEVICE_GATEWAY6" ]) && [ "$(uci -q get openmptcprouter.settings.defaultgw)" != "0" ]; then + [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && _log "Default gw: $default_gw - Set routes (current: $(ip r) )" + config_load network + config_foreach set_route interface $OMR_TRACKER_INTERFACE + config_foreach set_route6 interface $OMR_TRACKER_INTERFACE + [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && _log "New routes $(ip r)" + elif [ "$(uci -q get network.$OMR_TRACKER_INTERFACE.multipath)" = "master" ]; then + config_load network + config_foreach set_route interface $OMR_TRACKER_INTERFACE "no" + config_foreach set_route6 interface $OMR_TRACKER_INTERFACE "no" + elif [ -n "$OMR_TRACKER_DEVICE" ] && [ -n "$(ip r show table 991337 | grep "$OMR_TRACKER_DEVICE ")" ]; then + config_load network + config_foreach set_route interface $OMR_TRACKER_INTERFACE "no" + config_foreach set_route6 interface $OMR_TRACKER_INTERFACE "no" + fi + fi + if [ "$(uci -q get openmptcprouter.settings.master)" = "balancing" ]; then + [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && _log "Set balancing route (current: $(ip r) )" + config_foreach set_server_all_routes server + config_foreach set_server_all_routes6 server + [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && _log "Set balancing route done (new: $(ip r) )" + fi + fi + + mail_alert="" + if [ -n "$OMR_TRACKER_INTERFACE" ]; then + mail_alert="$(uci -q get omr-tracker.$OMR_TRACKER_INTERFACE.mail_alert)" + fi + [ -z "$mail_alert" ] && mail_alert="$(uci -q get omr-tracker.defaults.mail_alert)" + [ "$mail_alert" = "1" ] && [ -n "$(uci -q get mail.default.to)" ] && { + OMR_SYSNAME="$(uci -q get system.@system[0].hostname)" + if [ "$(uci -q get omr-tracker.defaults.mail_down_subject)" != "" ] && [ "$(uci -q get omr-tracker.defaults.mail_down_message)" != "" ]; then + mail_subject="$(uci -q get omr-tracker.defaults.mail_down_subject)" + mail_subject=`echo $mail_subject | sed -e "s/%SYSNAME%/$OMR_SYSNAME/g" -e "s/%INTERFACE%/$OMR_TRACKER_INTERFACE/g" -e "s/%DEVICE%/$OMR_TRACKER_DEVICE/g" -e "s/%MESSAGE%/$OMR_TRACKER_STATUS_MSG/g"` + mail_message="$(uci -q get omr-tracker.defaults.mail_down_message)" + mail_message=`echo $mail_message | sed -e "s/%SYSNAME%/$OMR_SYSNAME/g" -e "s/%INTERFACE%/$OMR_TRACKER_INTERFACE/g" -e "s/%DEVICE%/$OMR_TRACKER_DEVICE/g" -e "s/%MESSAGE%/$OMR_TRACKER_STATUS_MSG/g"` + echo -e "Subject: ${mail_subject}\n\n${mail_message}" | sendmail $(uci -q get mail.default.to) + else + echo -e "Subject: $OMR_SYSNAME: $OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE) is down\n\nConnection failure of $OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE) detected. The reason is \"$OMR_TRACKER_STATUS_MSG\"." | sendmail $(uci -q get mail.default.to) + fi + } + script_alert_down="" + if [ -n "$OMR_TRACKER_INTERFACE" ]; then + script_alert_down="$(uci -q get omr-tracker.$OMR_TRACKER_INTERFACE.script_alert_down)" + fi + [ -n "$script_alert_down" ] && eval $script_alert_down + + restart_down="" + if [ -n "$OMR_TRACKER_INTERFACE" ]; then + restart_down="$(uci -q get omr-tracker.$OMR_TRACKER_INTERFACE.restart_down)" + fi + [ -z "$restart_down" ] && restart_down="$(uci -q get omr-tracker.defaults.restart_down)" + [ "$restart_down" = "1" ] && { + _log "Restart $OMR_TRACKER_INTERFACE" + ifdown $OMR_TRACKER_INTERFACE 2>&1 >/dev/null + sleep 5 + ifup $OMR_TRACKER_INTERFACE 2>&1 >/dev/null + } + + if [ "$OMR_TRACKER_INTERFACE" = "glorytun" ] || [ "$OMR_TRACKER_INTERFACE" = "omrvpn" ] || [ "$OMR_TRACKER_INTERFACE" = "omr6in4" ]; then + if [ "$OMR_TRACKER_STATUS_MSG" = "" ]; then + _log "$OMR_TRACKER_INTERFACE down" + else + _log "$OMR_TRACKER_INTERFACE down because $OMR_TRACKER_STATUS_MSG" + fi + if [ "$(uci -q get openmptcprouter.settings.defaultgw)" != "0" ]; then + config_load network + config_foreach set_route interface $OMR_TRACKER_INTERFACE + config_foreach set_route6 interface $OMR_TRACKER_INTERFACE + else + _log "Default gateway disabled, no default gateway set" + fi + if [ "$(uci -q get openmptcprouter.settings.shadowsocksudp)" = "1" ] && [ "$(uci -q get shadowsocks-libev.sss0.disabled)" != "1" ] && [ "$(uci -q get openmptcprouter.omr.shadowsocks)" = "up" ] && [ "$(uci -q get shadowsocks-libev.ss_rules.redir_udp)" = "" ] && [ "$(uci -q get shadowsocks-libev.hi1.mode)" = "tcp_and_udp" ] && [ "$(uci -q get shadowsocks-libev.sss0.obfs)" != "1" ]; then + _log "Tunnel down use ShadowSocks for UDP" + uci -q set shadowsocks-libev.ss_rules.redir_udp='hi1' + if /etc/init.d/shadowsocks-libev rules_exist ; then + /etc/init.d/shadowsocks-libev rules_down 2>&1 >/dev/null + /etc/init.d/shadowsocks-libev rules_up 2>&1 >/dev/null + fi + fi + if [ "$(uci -q get dsvpn.vpn.enable)" = "1" ]; then + _log "DSVPN down, restart it" + /etc/init.d/dsvpn restart 2>&1 >/dev/null + fi + if [ "$(uci -q get mlvpn.general.enable)" = "1" ]; then + _log "MLVPN down, restart it" + /etc/init.d/mlvpn restart 2>&1 >/dev/null + fi + if [ "$(uci -q get glorytun.vpn.enable)" = "1" ]; then + _log "Glorytun VPN down, restart it" + /etc/init.d/glorytun restart 2>&1 >/dev/null + fi + if [ "$(uci -q get glorytun-udp.vpn.enable)" = "1" ]; then + _log "Glorytun UDP VPN down, restart it" + /etc/init.d/glorytun-udp restart 2>&1 >/dev/null + fi + if [ "$(uci -q get openvpn.omr.enabled)" = "1" ]; then + _log "OpenVPN down, restart it" + /etc/init.d/openvpn restart omr 2>&1 >/dev/null + fi + config_load openmptcprouter + config_foreach disable_pihole server + #if [ "$(uci -q get openmptcprouter.settings.master)" != "balancing" ] || [ "$(uci -q get openmptcprouter.settings.vpn)" = "mlvpn" ]; then + if [ "$(uci -q get openmptcprouter.settings.master)" != "balancing" ]; then + config_foreach set_server_default_route server + config_foreach set_server_default_route6 server + fi + fi + dns_flush + if [ -n "$OMR_TRACKER_INTERFACE" ]; then + uci -q delete openmptcprouter.$OMR_TRACKER_INTERFACE.lc + fi + [ -n "$(uci -q changes openmptcprouter)" ] && uci -q commit openmptcprouter + #ubus call network reload + + # Set a little sleep after an interface error +# if [ -n "$RANDOM" ]; then +# sleep `expr $RANDOM % 100` +# else +# sleep `awk 'BEGIN{srand();print int(rand()*20)}'` +# fi + + exit 0 +fi + diff --git a/mptcp/files/usr/share/omr/post-tracking.d/001-post-tracking b/omr-tracker/files/usr/share/omr/post-tracking.d/003-up similarity index 82% rename from mptcp/files/usr/share/omr/post-tracking.d/001-post-tracking rename to omr-tracker/files/usr/share/omr/post-tracking.d/003-up index 3a4da00c5..c6e78e807 100755 --- a/mptcp/files/usr/share/omr/post-tracking.d/001-post-tracking +++ b/omr-tracker/files/usr/share/omr/post-tracking.d/003-up @@ -1,3 +1,7 @@ +if [ "$OMR_TRACKER_STATUS" = "ERROR" ]; then + exit 0 +fi + SETROUTE=false . /lib/functions/network.sh @@ -705,6 +709,7 @@ dns_flush() { # sleep `awk 'BEGIN{srand();print int(rand()*9)}'` #fi + # Get the current multipath status multipath_status="off" [ "$OMR_TRACKER_INTERFACE" = "omrvpn" ] && multipath $OMR_TRACKER_DEVICE off 2>&1 >/dev/null @@ -717,12 +722,14 @@ if [ -e "/sys/class/net/$OMR_TRACKER_DEVICE" ]; then esac fi + #default_gw=$(ip route show default | awk '/default/ {print $3}') #default_gw6=$(ip -6 route show default | awk '/default/ {print $3}') default_gw=$(ip route get 1.1.1.1 | grep via | awk '{print $3}') default_gw6=$(ip -6 route get 2606:4700:4700::1111 | grep via | awk '{print $3}') #current_interface_gw=$(uci -q get "network.$OMR_TRACKER_INTERFACE.gateway") + initcwrwnd="" interface_up=$(ifstatus "$OMR_TRACKER_INTERFACE" 2>/dev/null | jsonfilter -q -e '@["up"]') @@ -736,276 +743,6 @@ if [ -n "$OMR_TRACKER_INTERFACE" ] && [ -n "$OMR_TRACKER_DEVICE" ] && [ "$OMR_TR fi fi -# An interface in error will never be used in MPTCP -if [ "$OMR_TRACKER_STATUS" = "ERROR" ] || ([ "$OMR_TRACKER_INTERFACE" != "omrvpn" ] && [ "$interface_up" != "true" ]); then - #interface_autostart=$(ifstatus "$OMR_TRACKER_INTERFACE" 2>/dev/null | jsonfilter -q -e '@["autostart"]') - #interface_available=$(ifstatus "$OMR_TRACKER_INTERFACE" 2>/dev/null | jsonfilter -q -e '@["available"]') - #interface_pending=$(ifstatus "$OMR_TRACKER_INTERFACE" 2>/dev/null | jsonfilter -q -e '@["pending"]') - #interface_error=$(ifstatus "$OMR_TRACKER_INTERFACE" 2>/dev/null | jsonfilter -q -e '@["errors"][0].code') - - #if [ "$interface_available" = "true" ] && [ -n "$OMR_TRACKER_INTERFACE" ] && ([ "$(uci -q get network.$OMR_TRACKER_INTERFACE.proto)" = "modemmanager" ] || [ "$(uci -q get network.$OMR_TRACKER_INTERFACE.proto)" = "wireguard" ]) && [ "$interface_error" != "MM_PINCODE_REQUIRED" ] && [ "$interface_error" != "MM_FAILED_REASON_SIM_MISSING" ]; then - #if [ "$interface_available" = "true" ] && [ "$interface_up" = "false" ] && [ -n "$OMR_TRACKER_INTERFACE" ] && ([ "$(uci -q get network.$OMR_TRACKER_INTERFACE.proto)" = "modemmanager" ] || [ "$(uci -q get network.$OMR_TRACKER_INTERFACE.proto)" = "wireguard" ]); then - # _log "No answer from $OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE), restart interface" - # _log "Set $OMR_TRACKER_INTERFACE down" - # ifdown $OMR_TRACKER_INTERFACE - # sleep 5 - # _log "Set $OMR_TRACKER_INTERFACE up" - # ifup $OMR_TRACKER_INTERFACE - # sleep 30 - #if [ -n "$OMR_TRACKER_INTERFACE" ] && [ -n "$OMR_TRACKER_DEVICE" ] && [ "$(uci -q get network.$OMR_TRACKER_INTERFACE.proto)" = "modemmanager" ] && [ "$interface_up" = "false" ] && [ "$interface_available" = "false" ] && [ "$interface_pending" = "false" ] && [ "$interface_autostart" = "true" ]; then - if [ -n "$OMR_TRACKER_INTERFACE" ] && [ "$(uci -q get network.$OMR_TRACKER_INTERFACE.proto)" = "modemmanager" ]; then - modemfind="0" - device="$(uci -q get network.$OMR_TRACKER_INTERFACE.device)" - . /usr/share/ModemManager/modemmanager.common - [ -n "$device" ] && MODEM_STATUS="$(timeout 3 mmcli -m $device -K)" - modem=$device - if [ -n "$MODEM_STATUS" ]; then - modemfind="1" - mm_state=$(modemmanager_get_field "${MODEM_STATUS}" "modem.generic.state") - if [ "$mm_state" = "failed" ]; then - mm_state_failed=$(modemmanager_get_field "${MODEM_STATUS}" "modem.generic.state-failed-reason") - if [ "$mm_state_failed" = "unknown-capabilities" ]; then - _log "Interface $OMR_TRACKER_INTERFACE in failed state in ModemManager, reset modem..." - /usr/bin/mmcli -m ${modem} -r 2>&1 >/dev/null - sleep 30 - elif false && [ "$mm_state_failed" = "sim-missing" ]; then - _log "Interface $OMR_TRACKER_INTERFACE in failed state in ModemManager, reset modem..." - /usr/bin/mmcli -m ${modem} -r 2>&1 >/dev/null - #_log "Interface $OMR_TRACKER_INTERFACE in failed state sim-missing in ModemManager, reset modem..." - #mm_primary_port=$(modemmanager_get_field "${MODEM_STATUS}" "modem.generic.primary-port") - #mbimcli -p -d /dev/$mm_primary_port --ms-device-reset 2>&1 >/dev/null - fi - elif [ "$mm_state" = "connected" ] || [ "$mm_state" = "enabled" ]; then - _log "No answer from $OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE), restart interface" - _log "Set $OMR_TRACKER_INTERFACE down" - ifdown $OMR_TRACKER_INTERFACE - sleep 5 - _log "Set $OMR_TRACKER_INTERFACE up" - ifup $OMR_TRACKER_INTERFACE - sleep 30 - elif [ "$mm_state" = "disabled" ]; then - # [ -n "$(echo $modeminfo | grep 'modem.3gpp.registration-state ' | grep home)" ]; then - _log "Interface $OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE) disabled, set it up" - /usr/bin/mmcli -m ${modem} -e 2>&1 >/dev/null - ifup $OMR_TRACKER_INTERFACE - sleep 30 - elif [ "$mm_state" = "registered" ]; then - _log "Interface $OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE) registered, set it up" - ifup $OMR_TRACKER_INTERFACE - sleep 30 - elif [ "$mm_state" = "locked" ]; then - mm_unlock_required=$(modemmanager_get_field "${MODEM_STATUS}" "modem.generic.unlock-required") - mm_generic_sim=$(modemmanager_get_field "${MODEM_STATUS}" "modem.generic.sim") - #mm_primary_port=$(modemmanager_get_field "${MODEM_STATUS}" "modem.generic.primary-port") - #mm_drivers=$(modemmanager_get_multivalue_field "${MODEM_STATUS}" "modem.generic.drivers") - mm_unlock_retries=$(modemmanager_get_multivalue_field "${MODEM_STATUS}" "modem.generic.unlock-retries" | awk '{print substr($2,2,length($2)-2)}') - if [ "$mm_unlock_required" = "sim-pin" ]; then - # Sometimes PIN is not correctly sent to modem - if [ -n "$(uci -q get network.$OMR_TRACKER_INTERFACE.pincode)" ]; then - if [ "$mm_unlock_retries" -gt "1" ] && [ -n "$(uci -q get network.$OMR_TRACKER_INTERFACE.pincode)" ]; then - _log "Interface $OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE) locked, set PIN" - mmcli -a -m ${modem} -i $mm_generic_sim --pin=$(uci -q get network.$OMR_TRACKER_INTERFACE.pincode) 2>&1 >/dev/null - sleep 20 - ifup $OMR_TRACKER_INTERFACE - fi - fi - elif [ "$mm_unlock_required" = "sim-puk" ] && [ "$mm_unlock_retries" -gt "1" ] && [ -n "$(uci -q get network.$OMR_TRACKER_INTERFACE.pukcode)" ] && [ -n "$(uci -q get network.$OMR_TRACKER_INTERFACE.pincode)" ]; then - _log "Interface $OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE) locked, set PUK" - mmcli -i $mm_generic_sim --puk=$(uci -q get network.$OMR_TRACKER_INTERFACE.pukcode) --pin=$(uci -q get network.$OMR_TRACKER_INTERFACE.pincode) 2>&1 >/dev/null - sleep 30 - fi - fi - fi - if [ "$modemfind" = "0" ]; then - #_log "Can't find $OMR_TRACKER_INTERFACE in ModemManager, rescan modem..." - #/usr/bin/mmcli -S 2>&1 >/dev/null - #_log "Can't find $OMR_TRACKER_INTERFACE in ModemManager, restart modemmanager..." - _log "Can't find $OMR_TRACKER_INTERFACE in ModemManager" - #/etc/init.d/modemmanager restart - sleep 30 - fi - fi - #elif [ -n "$OMR_TRACKER_INTERFACE" ] && [ -n "$OMR_TRACKER_DEVICE" ] && [ "$(uci -q get network.$OMR_TRACKER_INTERFACE.proto)" = "modemmanager" ] && [ "$interface_available" = "false" ]; then - # for modem in $(timeout 3 mmcli -L | awk -F/ '{ print $6}' | awk '{print $1}'); do - # if [ -n "$(timeout 2 mmcli -m $modem -K | grep $OMR_TRACKER_DEVICE)" ]; then - # modem_device=$(timeout 2 mmcli -m $modem -K | grep 'modem.generic.device ' | awk '{print $3}') - # [ -n "$modem_device" ] && modem_interface=$(uci -q show network | grep $modem_device | awk -F. '{print $2}') - # [ -n "$modem_interface" ] && { - # _log "No answer from $OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE), restart associed interface $modem_interface" - # ifdown $modem_interface - # sleep 5 - # ifup $modem_interface - # sleep 30 - # } - # fi - # done - #fi - - # This part must be done after modems restart because we have no idea when modems will be ready again... (another solution would be to check ModemManager status) - if [ "$OMR_TRACKER_PREV_STATUS" = "$OMR_TRACKER_STATUS" ]; then - exit 0 - fi - - if [ "$multipath_status" != "off" ] || ([ -n "$OMR_TRACKER_INTERFACE" ] && [ "$(uci -q get openmptcprouter.$OMR_TRACKER_INTERFACE.multipathvpn)" = "1" ]); then - if [ "$OMR_TRACKER_STATUS_MSG" = "" ]; then - _log "$OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE) switched off (interface up status: $interface_up - Tracker status: $OMR_TRACKER_STATUS)" - else - _log "$OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE) switched off because $OMR_TRACKER_STATUS_MSG" - fi - if [ -n "$OMR_TRACKER_INTERFACE" ]; then - uci -q set openmptcprouter.$OMR_TRACKER_INTERFACE.state='down' - fi - #if [ "$(sysctl -n net.mptcp.mptcp_enabled | tr -d '\n')" = "1" ]; then - # multipath "$OMR_TRACKER_DEVICE" off > /dev/null 2>&1 - #fi - if [ -n "$OMR_TRACKER_DEVICE_IP" ]; then - glorytun-udp path addr $OMR_TRACKER_DEVICE_IP dev tun0 set down > /dev/null 2>&1 - fi - if [ -n "$OMR_TRACKER_DEVICE_IP6" ]; then - glorytun-udp path addr $OMR_TRACKER_DEVICE_IP6 dev tun0 set down > /dev/null 2>&1 - fi - if [ -n "$OMR_TRACKER_INTERFACE" ] && [ "$(uci -q get openmptcprouter.$OMR_TRACKER_INTERFACE.vpn)" = "1" ] && [ "$(uci -q get openmptcprouter.settings.mptcpovervpn)" = "openvpn" ]; then - VPN_BASE_INTF="$(uci -q get openmptcprouter.$OMR_TRACKER_INTERFACE.baseintf)" - VPN_BASE_INTF_IP=$(ubus call network.interface.$VPN_BASE_INTF status | jsonfilter -e '@["ipv4-address"][0].address' | tr -d "\n") - if [ -n "$VPN_BASE_INTF" ]; then - uci -q batch <<-EOF >/dev/null - set openvpn.$VPN_BASE_INTF.local=$VPN_BASE_INTF_IP - commit openvpn - EOF - fi - [ -z "VPN_BASE_INTF" ] && VPN_BASE_INTF="omr" - /etc/init.d/openvpn restart $VPN_BASE_INTF 2>&1 >/dev/null - fi - config_load openmptcprouter - config_foreach del_server_route server - config_foreach del_server_route6 server - #if [ "$(uci -q get openmptcprouter.settings.master)" = "balancing" ] && [ "$(uci -q get openmptcprouter.settings.vpn)" != "mlvpn" ]; then - - if [ -n "$OMR_TRACKER_INTERFACE" ]; then - if ([ "$default_gw" = "$OMR_TRACKER_DEVICE_GATEWAY" ] || [ "$default_gw" = "" ] || [ "$default_gw6" != "$OMR_TRACKER_DEVICE_GATEWAY6" ]) && [ "$(uci -q get openmptcprouter.settings.defaultgw)" != "0" ]; then - [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && _log "Default gw: $default_gw - Set routes (current: $(ip r) )" - config_load network - config_foreach set_route interface $OMR_TRACKER_INTERFACE - config_foreach set_route6 interface $OMR_TRACKER_INTERFACE - [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && _log "New routes $(ip r)" - elif [ "$(uci -q get network.$OMR_TRACKER_INTERFACE.multipath)" = "master" ]; then - config_load network - config_foreach set_route interface $OMR_TRACKER_INTERFACE "no" - config_foreach set_route6 interface $OMR_TRACKER_INTERFACE "no" - elif [ -n "$OMR_TRACKER_DEVICE" ] && [ -n "$(ip r show table 991337 | grep "$OMR_TRACKER_DEVICE ")" ]; then - config_load network - config_foreach set_route interface $OMR_TRACKER_INTERFACE "no" - config_foreach set_route6 interface $OMR_TRACKER_INTERFACE "no" - fi - fi - if [ "$(uci -q get openmptcprouter.settings.master)" = "balancing" ]; then - [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && _log "Set balancing route (current: $(ip r) )" - config_foreach set_server_all_routes server - config_foreach set_server_all_routes6 server - [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && _log "Set balancing route done (new: $(ip r) )" - fi - fi - - mail_alert="" - if [ -n "$OMR_TRACKER_INTERFACE" ]; then - mail_alert="$(uci -q get omr-tracker.$OMR_TRACKER_INTERFACE.mail_alert)" - fi - [ -z "$mail_alert" ] && mail_alert="$(uci -q get omr-tracker.defaults.mail_alert)" - [ "$mail_alert" = "1" ] && [ -n "$(uci -q get mail.default.to)" ] && { - OMR_SYSNAME="$(uci -q get system.@system[0].hostname)" - if [ "$(uci -q get omr-tracker.defaults.mail_down_subject)" != "" ] && [ "$(uci -q get omr-tracker.defaults.mail_down_message)" != "" ]; then - mail_subject="$(uci -q get omr-tracker.defaults.mail_down_subject)" - mail_subject=`echo $mail_subject | sed -e "s/%SYSNAME%/$OMR_SYSNAME/g" -e "s/%INTERFACE%/$OMR_TRACKER_INTERFACE/g" -e "s/%DEVICE%/$OMR_TRACKER_DEVICE/g" -e "s/%MESSAGE%/$OMR_TRACKER_STATUS_MSG/g"` - mail_message="$(uci -q get omr-tracker.defaults.mail_down_message)" - mail_message=`echo $mail_message | sed -e "s/%SYSNAME%/$OMR_SYSNAME/g" -e "s/%INTERFACE%/$OMR_TRACKER_INTERFACE/g" -e "s/%DEVICE%/$OMR_TRACKER_DEVICE/g" -e "s/%MESSAGE%/$OMR_TRACKER_STATUS_MSG/g"` - echo -e "Subject: ${mail_subject}\n\n${mail_message}" | sendmail $(uci -q get mail.default.to) - else - echo -e "Subject: $OMR_SYSNAME: $OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE) is down\n\nConnection failure of $OMR_TRACKER_INTERFACE ($OMR_TRACKER_DEVICE) detected. The reason is \"$OMR_TRACKER_STATUS_MSG\"." | sendmail $(uci -q get mail.default.to) - fi - } - script_alert_down="" - if [ -n "$OMR_TRACKER_INTERFACE" ]; then - script_alert_down="$(uci -q get omr-tracker.$OMR_TRACKER_INTERFACE.script_alert_down)" - fi - [ -n "$script_alert_down" ] && eval $script_alert_down - - restart_down="" - if [ -n "$OMR_TRACKER_INTERFACE" ]; then - restart_down="$(uci -q get omr-tracker.$OMR_TRACKER_INTERFACE.restart_down)" - fi - [ -z "$restart_down" ] && restart_down="$(uci -q get omr-tracker.defaults.restart_down)" - [ "$restart_down" = "1" ] && { - _log "Restart $OMR_TRACKER_INTERFACE" - ifdown $OMR_TRACKER_INTERFACE 2>&1 >/dev/null - sleep 5 - ifup $OMR_TRACKER_INTERFACE 2>&1 >/dev/null - } - - if [ "$OMR_TRACKER_INTERFACE" = "glorytun" ] || [ "$OMR_TRACKER_INTERFACE" = "omrvpn" ] || [ "$OMR_TRACKER_INTERFACE" = "omr6in4" ]; then - if [ "$OMR_TRACKER_STATUS_MSG" = "" ]; then - _log "$OMR_TRACKER_INTERFACE down" - else - _log "$OMR_TRACKER_INTERFACE down because $OMR_TRACKER_STATUS_MSG" - fi - if [ "$(uci -q get openmptcprouter.settings.defaultgw)" != "0" ]; then - config_load network - config_foreach set_route interface $OMR_TRACKER_INTERFACE - config_foreach set_route6 interface $OMR_TRACKER_INTERFACE - else - _log "Default gateway disabled, no default gateway set" - fi - if [ "$(uci -q get openmptcprouter.settings.shadowsocksudp)" = "1" ] && [ "$(uci -q get shadowsocks-libev.sss0.disabled)" != "1" ] && [ "$(uci -q get openmptcprouter.omr.shadowsocks)" = "up" ] && [ "$(uci -q get shadowsocks-libev.ss_rules.redir_udp)" = "" ] && [ "$(uci -q get shadowsocks-libev.hi1.mode)" = "tcp_and_udp" ] && [ "$(uci -q get shadowsocks-libev.sss0.obfs)" != "1" ]; then - _log "Tunnel down use ShadowSocks for UDP" - uci -q set shadowsocks-libev.ss_rules.redir_udp='hi1' - if /etc/init.d/shadowsocks-libev rules_exist ; then - /etc/init.d/shadowsocks-libev rules_down 2>&1 >/dev/null - /etc/init.d/shadowsocks-libev rules_up 2>&1 >/dev/null - fi - fi - if [ "$(uci -q get dsvpn.vpn.enable)" = "1" ]; then - _log "DSVPN down, restart it" - /etc/init.d/dsvpn restart 2>&1 >/dev/null - fi - if [ "$(uci -q get mlvpn.general.enable)" = "1" ]; then - _log "MLVPN down, restart it" - /etc/init.d/mlvpn restart 2>&1 >/dev/null - fi - if [ "$(uci -q get glorytun.vpn.enable)" = "1" ]; then - _log "Glorytun VPN down, restart it" - /etc/init.d/glorytun restart 2>&1 >/dev/null - fi - if [ "$(uci -q get glorytun-udp.vpn.enable)" = "1" ]; then - _log "Glorytun UDP VPN down, restart it" - /etc/init.d/glorytun-udp restart 2>&1 >/dev/null - fi - if [ "$(uci -q get openvpn.omr.enabled)" = "1" ]; then - _log "OpenVPN down, restart it" - /etc/init.d/openvpn restart omr 2>&1 >/dev/null - fi - config_load openmptcprouter - config_foreach disable_pihole server - #if [ "$(uci -q get openmptcprouter.settings.master)" != "balancing" ] || [ "$(uci -q get openmptcprouter.settings.vpn)" = "mlvpn" ]; then - if [ "$(uci -q get openmptcprouter.settings.master)" != "balancing" ]; then - config_foreach set_server_default_route server - config_foreach set_server_default_route6 server - fi - fi - dns_flush - if [ -n "$OMR_TRACKER_INTERFACE" ]; then - uci -q delete openmptcprouter.$OMR_TRACKER_INTERFACE.lc - fi - [ -n "$(uci -q changes openmptcprouter)" ] && uci -q commit openmptcprouter - #ubus call network reload - - # Set a little sleep after an interface error -# if [ -n "$RANDOM" ]; then -# sleep `expr $RANDOM % 100` -# else -# sleep `awk 'BEGIN{srand();print int(rand()*20)}'` -# fi - - exit 0 -fi if [ "$OMR_TRACKER_INTERFACE" = "glorytun" ] || [ "$OMR_TRACKER_INTERFACE" = "omrvpn" ] || [ "$OMR_TRACKER_INTERFACE" = "omr6in4" ]; then if [ "$(uci -q get openmptcprouter.settings.shadowsocksudp)" = "1" ] && [ "$(uci -q get shadowsocks-libev.sss0.disabled)" != "1" ] && [ -n "$(uci -q get shadowsocks-libev.sss0)" ] && [ "$(uci -q get shadowsocks-libev.ss_rules.redir_udp)" = "hi1" ]; then @@ -1029,6 +766,7 @@ if [ "$OMR_TRACKER_INTERFACE" = "glorytun" ] || [ "$OMR_TRACKER_INTERFACE" = "om # Set VPN MTU if [ -n "$OMR_TRACKER_LATENCY" ] && [ -n "$OMR_TRACKER_INTERFACE" ] && ([ "$(uci -q get openmptcprouter.$OMR_TRACKER_INTERFACE.lc)" = "" ] || [ $(($(date +"%s") - $(uci -q get openmptcprouter.$OMR_TRACKER_INTERFACE.lc))) -gt 3600 ]); then + _log "Set VPN MTU" local serverip=$(uci -q get shadowsocks-libev.sss0.server) [ -z "$serverip" ] && serverip=$(uci -q get shadowsocks-rust.sss0.server) [ -z "$serverip" ] && serverip=$(uci -q get v2ray.omrout.s_vless_address) diff --git a/mptcp/files/usr/share/omr/post-tracking.d/020-status b/omr-tracker/files/usr/share/omr/post-tracking.d/020-status similarity index 100% rename from mptcp/files/usr/share/omr/post-tracking.d/020-status rename to omr-tracker/files/usr/share/omr/post-tracking.d/020-status diff --git a/mptcp/files/usr/share/omr/post-tracking.d/021-latencies b/omr-tracker/files/usr/share/omr/post-tracking.d/021-latencies similarity index 100% rename from mptcp/files/usr/share/omr/post-tracking.d/021-latencies rename to omr-tracker/files/usr/share/omr/post-tracking.d/021-latencies diff --git a/mptcp/files/usr/share/omr/post-tracking.d/022-speedtest b/omr-tracker/files/usr/share/omr/post-tracking.d/022-speedtest similarity index 100% rename from mptcp/files/usr/share/omr/post-tracking.d/022-speedtest rename to omr-tracker/files/usr/share/omr/post-tracking.d/022-speedtest