From 8eb08542c0c79b217c8e9cddda74b43e0799cc71 Mon Sep 17 00:00:00 2001 From: Ycarus Date: Thu, 1 Mar 2018 14:56:02 +0100 Subject: [PATCH] Add choice between ping or dns to omr-tracker --- .../luasrc/model/cbi/omr-tracker.lua | 3 + omr-tracker/files/bin/omr-tracker | 67 ++++++++++++++----- omr-tracker/files/etc/config/omr-tracker | 4 +- omr-tracker/files/etc/init.d/omr-tracker | 13 ++-- 4 files changed, 61 insertions(+), 26 deletions(-) diff --git a/luci-app-omr-tracker/luasrc/model/cbi/omr-tracker.lua b/luci-app-omr-tracker/luasrc/model/cbi/omr-tracker.lua index 21497e18d..96d286b8f 100644 --- a/luci-app-omr-tracker/luasrc/model/cbi/omr-tracker.lua +++ b/luci-app-omr-tracker/luasrc/model/cbi/omr-tracker.lua @@ -23,6 +23,9 @@ o.default = "2" o.datatype = "range(1, 100)" o.rmempty = false +o = s:option(Value, "type", translate("Type")) +o:value("ping","ping") +o:value("dns","dns") o = s:option(DynamicList, "hosts", translate("Hosts")) o.placeholder = "4.2.2.1" diff --git a/omr-tracker/files/bin/omr-tracker b/omr-tracker/files/bin/omr-tracker index 318dfa2c2..ffd23ddc1 100755 --- a/omr-tracker/files/bin/omr-tracker +++ b/omr-tracker/files/bin/omr-tracker @@ -73,7 +73,40 @@ _post_tracking() { done } -_restart +_ping() { + local host=$1 + local deviceip=$2 + local localip=$3 + ret=$(ping "${host}" \ + -I "${deviceip}" \ + -W "$OMR_TRACKER_TIMEOUT" \ + -c 1 \ + -q + ) && echo "$ret" | grep -sq "0% packet loss" && { + if [ "$localip" = "yes" ]; then + OMR_TRACKER_LATENCY=$(echo "$ret" | cut -d "/" -s -f4 | cut -d "." -f1) + _update_rto "$OMR_TRACKER_LATENCY" + fi + return + } + false +} + +_dns() { + local host=$1 + local deviceip=$2 + ret=$(dig @"${host}" \ + -b "${deviceip}" \ + +time="$OTB_TRACKER_TIMEOUT" \ + +tries=1 \ + openmptcprouter.com + ) && echo "$ret" | grep -sq "94.23.252.192" && { + OTB_TRACKER_LATENCY=$(echo "$ret" | awk '/Query time/{print $4}') + _update_rto "$OTB_TRACKER_LATENCY" + return + } + false +} # main loop while true; do @@ -86,36 +119,36 @@ while true; do if [ -d "/sys/class/net/$OMR_TRACKER_DEVICE" ]; then # retrieve iface ip and gateway OMR_TRACKER_DEVICE_IP=$(ip -4 -br addr ls dev "$OMR_TRACKER_DEVICE" | awk -F'[ /]+' '{print $3}') + if [ -z "$OMR_TRACKER_DEVICE_GATEWAY" ]; then + OTB_TRACKER_DEVICE_GATEWAY=$(ip -4 r list dev "$OMR_TRACKER_DEVICE" | grep -v default | awk '/proto static/ {print $1}' | tr -d "\n") + fi # execute specific tracker if [ -n "$OMR_TRACKER_DEVICE_IP" ] && [ -n "$OMR_TRACKER_DEVICE_GATEWAY" ]; then - retgw=$(ping "$OMR_TRACKER_DEVICE_GATEWAY" \ - -I "$OMR_TRACKER_DEVICE_IP" \ - -W 1 \ - -c 1 \ - -q - ) && echo "$retgw" | grep -sq "0% packet loss" && { + _ping "$OMR_TRACKER_DEVICE_GATEWAY" "$OMR_TRACKER_DEVICE_IP" "no" + status=$? + if ! $(exit $status); then # setup loop variable tries="$OMR_TRACKER_TRIES" ip route replace "$OMR_TRACKER_HOST" via "$OMR_TRACKER_DEVICE_GATEWAY" dev "$OMR_TRACKER_DEVICE" src "$OMR_TRACKER_DEVICE_IP" # loop until tries attempts have been reached while [ "$tries" -gt 0 ]; do - ret=$(ping "$OMR_TRACKER_HOST" \ - -I "$OMR_TRACKER_DEVICE_IP" \ - -W "$OMR_TRACKER_TIMEOUT" \ - -c 1 \ - -q - ) && echo "$ret" | grep -sq "0% packet loss" && { - OMR_TRACKER_LATENCY=$(echo "$ret" | cut -d "/" -s -f4 | cut -d "." -f1) - _update_rto "$OMR_TRACKER_LATENCY" + if [ "$OMR_TRACKER_TYPE" = "ping" ]; then + _ping "$OMR_TRACKER_HOST" "$OMR_TRACKER_DEVICE_IP" "yes" + status=$? + elif [ "$OMR_TRACKER_TYPE" = "dns" ]; then + _dns "$OMR_TRACKER_HOST" "$OMR_TRACKER_DEVICE_IP" "yes" + status=$? + fi + if ! $(exit $status); then OMR_TRACKER_STATUS="OK" break - } + fi tries=$((tries - 1)) OMR_TRACKER_TIMEOUT=$((OMR_TRACKER_TIMEOUT * 2)) done ip route del "$OMR_TRACKER_HOST" via "$OMR_TRACKER_DEVICE_GATEWAY" dev "$OMR_TRACKER_DEVICE" src "$OMR_TRACKER_DEVICE_IP" - } + fi fi fi diff --git a/omr-tracker/files/etc/config/omr-tracker b/omr-tracker/files/etc/config/omr-tracker index cf7b86c92..b24dd3f75 100644 --- a/omr-tracker/files/etc/config/omr-tracker +++ b/omr-tracker/files/etc/config/omr-tracker @@ -4,7 +4,5 @@ config defaults 'defaults' option timeout '1' option tries '4' option interval '2' + option type 'ping' option options '' - -config rule_type 'tunnel' - option tries '5' diff --git a/omr-tracker/files/etc/init.d/omr-tracker b/omr-tracker/files/etc/init.d/omr-tracker index 7e3dde2a6..23e285e8e 100755 --- a/omr-tracker/files/etc/init.d/omr-tracker +++ b/omr-tracker/files/etc/init.d/omr-tracker @@ -11,13 +11,14 @@ _validate_section() { local tmp_hosts=$hosts tmp_timeout=$timeout tmp_tries=$tries - local tmp_interval=$interval tmp_options=$options + local tmp_interval=$interval tmp_options=$options tmp_type=$type uci_validate_section omr-tracker "$1" "$2" \ - 'hosts:list(host)' \ - 'timeout:uinteger' \ - 'tries:uinteger' \ + 'hosts:list(host)' \ + 'timeout:uinteger' \ + 'tries:uinteger' \ 'interval:uinteger' \ + 'type:string' \ 'options:string' [ -z "$hosts" ] && hosts=$tmp_hosts @@ -25,6 +26,7 @@ _validate_section() { [ -z "$tries" ] && tries=$tmp_tries [ -z "$interval" ] && interval=$tmp_interval [ -z "$options" ] && options=$tmp_options + [ -z "$type" ] && options=$tmp_type } _launch_tracker() { @@ -35,9 +37,8 @@ _launch_tracker() { local interface_type config_get interface_type "$1" type - local hosts timeout tries interval options + local hosts timeout tries interval options type _validate_section "defaults" "defaults" - _validate_section "rule_type" "$interface_type" _validate_section "interface" "$1" local ifname ip4table