You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

171 lines
3.9 KiB

  1. #!/bin/sh
  2. . /lib/functions.sh
  3. LOG="logger -t $(basename "$0")[$$] -p"
  4. INTERFACE=""
  5. DEVICE=""
  6. IFDOWN_EVENT=0
  7. clean_up() {
  8. $LOG notice "Stopping mwan3track for interface \"${INTERFACE}\""
  9. exit 0
  10. }
  11. if_down() {
  12. $LOG info "Detect ifdown event on interface ${INTERFACE} (${DEVICE})"
  13. IFDOWN_EVENT=1
  14. }
  15. validate_track_method() {
  16. case "$1" in
  17. ping)
  18. # Assume that ping is installed
  19. ;;
  20. arping)
  21. which arping 1>/dev/null 2>&1 || {
  22. $LOG warn "Missing arping. Please install iputils-arping package."
  23. return 1
  24. }
  25. ;;
  26. httping)
  27. which httping 1>/dev/null 2>&1 || {
  28. $LOG warn "Missing httping. Please install httping package."
  29. return 1
  30. }
  31. ;;
  32. *)
  33. $LOG warn "Unsupported tracking method: $track_method"
  34. return 2
  35. ;;
  36. esac
  37. }
  38. main() {
  39. local reliability count timeout interval failure_interval
  40. local recovery_interval down up size
  41. local keep_failure_interval
  42. [ -z "$5" ] && echo "Error: should not be started manually" && exit 0
  43. INTERFACE=$1
  44. DEVICE=$2
  45. STATUS=$3
  46. mkdir -p /var/run/mwan3track/$1
  47. trap clean_up SIGINT SIGTERM
  48. trap if_down SIGUSR1
  49. config_load mwan3
  50. config_get track_method $1 track_method ping
  51. validate_track_method $track_method || {
  52. $LOG warn "Using ping to track interface $INTERFACE avaliability"
  53. track_method=ping
  54. }
  55. config_get reliability $1 reliability 1
  56. config_get count $1 count 1
  57. config_get timeout $1 timeout 4
  58. config_get interval $1 interval 10
  59. config_get down $1 down 5
  60. config_get up $1 up 5
  61. config_get size $1 size 56
  62. config_get failure_interval $1 failure_interval $interval
  63. config_get_bool keep_failure_interval $1 keep_failure_interval 0
  64. config_get recovery_interval $1 recovery_interval $interval
  65. local score=$(($down+$up))
  66. local track_ips=$(echo $* | cut -d ' ' -f 5-99)
  67. local host_up_count=0
  68. local lost=0
  69. local sleep_time=0
  70. local turn=0
  71. if [ "$STATUS" = "offline" ]; then
  72. echo "offline" > /var/run/mwan3track/$1/STATUS
  73. score=0
  74. else
  75. echo "online" > /var/run/mwan3track/$1/STATUS
  76. fi
  77. while true; do
  78. sleep_time=$interval
  79. for track_ip in $track_ips; do
  80. case "$track_method" in
  81. ping)
  82. ping -I $2 -c $count -W $timeout -s $size -q $track_ip &> /dev/null ;;
  83. arping)
  84. arping -I $2 -c $count -w $timeout -q $track_ip &> /dev/null ;;
  85. httping)
  86. httping -y $3 -c $count -t $timeout -q $track_ip &> /dev/null ;;
  87. esac
  88. if [ $? -eq 0 ]; then
  89. let host_up_count++
  90. echo "up" > /var/run/mwan3track/$1/TRACK_${track_ip}
  91. else
  92. let lost++
  93. echo "down" > /var/run/mwan3track/$1/TRACK_${track_ip}
  94. fi
  95. done
  96. if [ $host_up_count -lt $reliability ]; then
  97. let score--
  98. if [ $score -lt $up ]; then
  99. score=0
  100. [ ${keep_failure_interval} -eq 1 ] && {
  101. sleep_time=$failure_interval
  102. }
  103. else
  104. sleep_time=$failure_interval
  105. fi
  106. if [ $score -eq $up ]; then
  107. echo "offline" > /var/run/mwan3track/$1/STATUS
  108. $LOG notice "Interface $1 ($2) is offline"
  109. env -i ACTION=ifdown INTERFACE=$1 DEVICE=$2 /sbin/hotplug-call iface
  110. score=0
  111. fi
  112. else
  113. if [ $score -lt $(($down+$up)) ] && [ $lost -gt 0 ]; then
  114. $LOG info "Lost $(($lost*$count)) ping(s) on interface $1 ($2)"
  115. fi
  116. let score++
  117. lost=0
  118. if [ $score -gt $up ]; then
  119. echo "online" > /var/run/mwan3track/$1/STATUS
  120. score=$(($down+$up))
  121. elif [ $score -le $up ]; then
  122. sleep_time=$recovery_interval
  123. fi
  124. if [ $score -eq $up ]; then
  125. $LOG notice "Interface $1 ($2) is online"
  126. echo "online" > /var/run/mwan3track/$1/STATUS
  127. env -i ACTION=ifup INTERFACE=$1 DEVICE=$2 /sbin/hotplug-call iface
  128. exit 0
  129. fi
  130. fi
  131. let turn++
  132. mkdir -p "/var/run/mwan3track/${1}"
  133. echo "${lost}" > /var/run/mwan3track/$1/LOST
  134. echo "${score}" > /var/run/mwan3track/$1/SCORE
  135. echo "${turn}" > /var/run/mwan3track/$1/TURN
  136. echo "$(date +'%s')" > /var/run/mwan3track/$1/TIME
  137. host_up_count=0
  138. sleep "${sleep_time}" &
  139. wait
  140. if [ "${IFDOWN_EVENT}" -eq 1 ]; then
  141. score=0
  142. echo "offline" > /var/run/mwan3track/$1/STATUS
  143. IFDOWN_EVENT=0
  144. fi
  145. done
  146. }
  147. main "$@"