#!/bin/sh # Copyright (C) 2022 iopsys Software Solutions AB # Author: AMIN Ben Ramdhane . /usr/share/bbfdm/bbf_api traceroute_launch() { host=$(uci_get_bbf_dmmap dmmap_diagnostics.traceroute.Host) cnt=$(uci_get_bbf_dmmap dmmap_diagnostics.traceroute.NumberOfTries 3) dsize=$(uci_get_bbf_dmmap dmmap_diagnostics.traceroute.DataBlockSize 64) timeout=$(uci_get_bbf_dmmap dmmap_diagnostics.traceroute.Timeout 5000) maxhop=$(uci_get_bbf_dmmap dmmap_diagnostics.traceroute.MaxHops 30) interface=$(uci_get_bbf_dmmap dmmap_diagnostics.traceroute.interface) protocol=$(uci_get_bbf_dmmap dmmap_diagnostics.traceroute.ProtocolVersion Any) [ -n "$interface" ] && device=$(ifstatus "$interface" | jsonfilter -e @.device) && device="-i $device" || device="" if [ "$protocol" = "IPv4" ]; then proto="-4"; elif [ "$protocol" = "IPv6" ]; then proto="-6"; else proto=""; fi ip_addr_used=$(get_ip_addr_used $protocol $interface) $UCI_SET_BBF_DMMAP dmmap_diagnostics.traceroute.IPAddressUsed="$ip_addr_used" [ "$host" = "" ] && return timeout=$((timeout/1000)) [ "$timeout" = "0" ] && timeout="1" i=-2 rm -f /tmp/traceres res=$(traceroute -m $maxhop -w $timeout -q $cnt $proto $device $host $dsize 2>&1 >/tmp/traceres) error_code="$?" ba=$(echo "$res" | grep "bad address") [ -n "$ba" ] && { $UCI_SET_BBF_DMMAP dmmap_diagnostics.traceroute.DiagnosticState=Error_CannotResolveHostName; $UCI_COMMIT_BBF_DMMAP; return; } [ "$error_code" != "0" ] && { $UCI_SET_BBF_DMMAP dmmap_diagnostics.traceroute.DiagnosticState=Error_Other; $UCI_COMMIT_BBF_DMMAP; return; } while read _ host ip time _; do [ "$host" = "*" ] && [ "$ip" = "*" ] && continue i=$((i+1)) [ "$i" = "-1" ] && continue; ip=${ip#(}; ip=${ip%)} time=${time%.*} $UCI_ADD_BBF_DMMAP dmmap_diagnostics RouteHops $UCI_SET_BBF_DMMAP dmmap_diagnostics.@RouteHops[$i].host="$host" $UCI_SET_BBF_DMMAP dmmap_diagnostics.@RouteHops[$i].ip="$ip" $UCI_SET_BBF_DMMAP dmmap_diagnostics.@RouteHops[$i].time="$time" done < /tmp/traceres rm -f /tmp/traceres i=$((i+1)) $UCI_SET_BBF_DMMAP dmmap_diagnostics.traceroute.DiagnosticState=Complete $UCI_SET_BBF_DMMAP dmmap_diagnostics.traceroute.NumberOfHops=$i $UCI_SET_BBF_DMMAP dmmap_diagnostics.traceroute.ResponseTime="$($UCI_GET_BBF_DMMAP dmmap_diagnostics.@RouteHops[-1].time)" $UCI_COMMIT_BBF_DMMAP } traceroute_stop() { pids=$(pgrep -f traceroute_launch) if [ -n "$pids" ]; then kill -9 "$pids" >/dev/null 2>&1 $UCI_SET_BBF_DMMAP dmmap_diagnostics.traceroute.DiagnosticState=None $UCI_COMMIT_BBF_DMMAP fi } if [ "$1" = "run" ]; then traceroute_launch elif [ "$1" = "stop" ]; then traceroute_stop else return fi