diff --git a/dmdiagnostics.c b/dmdiagnostics.c index f1ef6bc7..8a01d2a8 100644 --- a/dmdiagnostics.c +++ b/dmdiagnostics.c @@ -78,6 +78,16 @@ void init_diagnostics_operation(char *sec_name, char *operation_path) dmcmd("/bin/sh", 2, operation_path, "stop"); } +void remove_unused_diagnostic_sections(char *sec_name) +{ + struct uci_section *s = NULL, *stmp = NULL; + + check_create_dmmap_package(DMMAP_DIAGNOSTIGS); + uci_path_foreach_sections_safe(bbfdm, DMMAP_DIAGNOSTIGS, sec_name, stmp, s) { + dmuci_delete_by_section_bbfdm(s, NULL, NULL); + } +} + void set_diagnostics_interface_option(struct dmctx *ctx, char *sec_name, char *value) { char *linker = NULL; diff --git a/dmdiagnostics.h b/dmdiagnostics.h index 3d23b8c9..32d1327e 100644 --- a/dmdiagnostics.h +++ b/dmdiagnostics.h @@ -63,6 +63,7 @@ char *get_diagnostics_option_fallback_def(char *sec_name, char *option, char *de void set_diagnostics_option(char *sec_name, char *option, char *value); void reset_diagnostic_state(char *sec_name); void init_diagnostics_operation(char *sec_name, char *operation_path); +void remove_unused_diagnostic_sections(char *sec_name); void set_diagnostics_interface_option(struct dmctx *ctx, char *sec_name, char *value); int start_upload_download_diagnostic(int diagnostic_type); int bbf_upload_log(const char *url, const char *username, const char *password, diff --git a/dmtree/tr143/diagnostics.c b/dmtree/tr143/diagnostics.c index b588fd06..0c3646ee 100644 --- a/dmtree/tr143/diagnostics.c +++ b/dmtree/tr143/diagnostics.c @@ -1847,8 +1847,8 @@ static int operate_IPDiagnostics_TraceRoute(char *refparam, struct dmctx *ctx, v char *route_hops_errorcode = NULL; int i = 1; - init_diagnostics_operation("RouteHops", TRACEROUTE_PATH); init_diagnostics_operation("traceroute", TRACEROUTE_PATH); + remove_unused_diagnostic_sections("RouteHops"); char *host = dmjson_get_value((json_object *)value, 1, "Host"); if (host[0] == '\0') diff --git a/dmtree/tr181/dns.c b/dmtree/tr181/dns.c index 660854af..8a14c337 100644 --- a/dmtree/tr181/dns.c +++ b/dmtree/tr181/dns.c @@ -771,8 +771,8 @@ static int operate_DNSDiagnostics_NSLookupDiagnostics(char *refparam, struct dmc char *nslookup_response_time[2] = {0}; int i = 1; - init_diagnostics_operation("NSLookupResult", NSLOOKUP_PATH); init_diagnostics_operation("nslookup", NSLOOKUP_PATH); + remove_unused_diagnostic_sections("NSLookupResult"); char *hostname = dmjson_get_value((json_object *)value, 1, "HostName"); if (hostname[0] == '\0') diff --git a/scripts/nslookup_launch b/scripts/nslookup_launch index 9f77113f..279c6a41 100755 --- a/scripts/nslookup_launch +++ b/scripts/nslookup_launch @@ -18,54 +18,49 @@ nslookup_launch() { [ -e "${LOG_FILE}" ] && rm ${LOG_FILE} while [ $i -lt "$cnt" ]; do i=$((i+1)) - time1=$(date +%s) - if [ -z "$dnsserver" ]; then - nslookup "$hostname" >>${LOG_FILE} 2>&1 - else - nslookup "$hostname" "$dnsserver" >>${LOG_FILE} 2>&1 - fi - time2=$(date +%s) - timeresponse=$(($(($time2-$time1))*1000)) - echo "ResponseTime: $timeresponse" >>${LOG_FILE} + nslookup -debug $hostname $dnsserver >>${LOG_FILE} 2>&1 + error_code="$?" + nxd=$(cat ${LOG_FILE} | grep "NXDOMAIN") + [ -n "$nxd" ] && { $UCI_SET_BBF_DMMAP dmmap_diagnostics.nslookup.DiagnosticState=Error_DNSServerNotResolved; $UCI_COMMIT_BBF_DMMAP; return; } + [ "$error_code" != "0" ] && { $UCI_SET_BBF_DMMAP dmmap_diagnostics.nslookup.DiagnosticState=Error_Other; $UCI_COMMIT_BBF_DMMAP; return; } echo "++++++++++++++++++++++++++++++" >>${LOG_FILE} done while IFS= read line; do - [ -z "$line" ] && continue; - server=$(echo "$line" | tr -d '\t' | tr -d ' ' | grep "Server:" | awk -F':' '{print $2}') + [ -z "$line" ] && continue; + server=$(echo "$line" | tr -d '\t' | tr -d ' ' | grep "Server:" | awk -F':' '{print $2}') + + if [ -n "$server" ] && [ "$server" = "0.0.0.0" ]; then + status="Error_DNSServerNotAvailable" + continue + elif [ -n "$server" ]; then + dns_server_ip=$server + continue + fi - if [ -n "$server" ] && [ "$server" = "0.0.0.0" ]; then - status="Error_DNSServerNotAvailable" - continue - elif [ -n "$server" ]; then - dns_server_ip=$server - continue - fi + var=$(echo "$line" | tr -d '\t' | tr -d ' ' | grep "Name:" | awk -F':' '{print $2}') + [ -n "$var" ] && { HostNameReturned=$var; status="Success"; AnswerType="Authoritative"; success_count=$((success_count+1)); continue; } + + var=$(echo "$line" | grep "Address: " | awk -F':' '{print substr($0, index($0,$2))}' | tr -d '\t' | tr -d ' ') + [ -n "$var" ] && { [ -z "$address" ] && address="$var" || address="$address,$var"; continue; } + + var=$(echo "$line" | grep "completed" | awk -F'in' '{print $2}' | tr -d 'ms:\t ') + [ -n "$var" ] && { ResponseTime=$var; continue; } - var=$(echo "$line" | tr -d '\t' | tr -d ' ' | grep "Name:" | awk -F':' '{print $2}') - [ -n "$var" ] && { HostNameReturned=$var; status="Success"; AnswerType="Authoritative"; success_count=$((success_count+1)); continue; } - - var=$(echo "$line" | grep "Address: " | awk -F':' '{print substr($0, index($0,$2))}' | tr -d '\t' | tr -d ' ') - [ -n "$var" ] && { [ -z "$address" ] && address="$var" || address="$address,$var"; continue; } - - var=$(echo "$line" | tr -d '\t' | tr -d ' ' | grep "ResponseTime:" | awk -F':' '{print $2}') - [ -n "$var" ] && { ResponseTime=$var; continue; } - - echo "$line" | grep 'Can' >/dev/null 2>&1 && { continue; } - echo "$line" | grep 'connection timed out' >/dev/null 2>&1 && { AnswerType="None"; status="Error_Timeout"; continue; } - echo "$line" | grep 'Non-authoritative' >/dev/null 2>&1 && { AnswerType="NonAuthoritative"; continue; } - - if echo "$line" | grep '++++++++++++++++++++++' >/dev/null 2>&1; then - $UCI_ADD_BBF_DMMAP dmmap_diagnostics NSLookupResult - $UCI_SET_BBF_DMMAP dmmap_diagnostics.@NSLookupResult[$j].Status="$status" - $UCI_SET_BBF_DMMAP dmmap_diagnostics.@NSLookupResult[$j].AnswerType="$AnswerType" - $UCI_SET_BBF_DMMAP dmmap_diagnostics.@NSLookupResult[$j].HostNameReturned="$HostNameReturned" - $UCI_SET_BBF_DMMAP dmmap_diagnostics.@NSLookupResult[$j].IPAddresses="$address" - $UCI_SET_BBF_DMMAP dmmap_diagnostics.@NSLookupResult[$j].DNSServerIP="$dns_server_ip" - $UCI_SET_BBF_DMMAP dmmap_diagnostics.@NSLookupResult[$j].ResponseTime="$ResponseTime" - j=$((j+1)) - address="" - fi + echo "$line" | grep 'connection timed out' >/dev/null 2>&1 && { AnswerType="None"; status="Error_Timeout"; continue; } + echo "$line" | grep 'Non-authoritative' >/dev/null 2>&1 && { AnswerType="NonAuthoritative"; continue; } + + if echo "$line" | grep '++++++++++++++++++++++' >/dev/null 2>&1; then + $UCI_ADD_BBF_DMMAP dmmap_diagnostics NSLookupResult + $UCI_SET_BBF_DMMAP dmmap_diagnostics.@NSLookupResult[$j].Status="$status" + $UCI_SET_BBF_DMMAP dmmap_diagnostics.@NSLookupResult[$j].AnswerType="$AnswerType" + $UCI_SET_BBF_DMMAP dmmap_diagnostics.@NSLookupResult[$j].HostNameReturned="$HostNameReturned" + $UCI_SET_BBF_DMMAP dmmap_diagnostics.@NSLookupResult[$j].IPAddresses="$address" + $UCI_SET_BBF_DMMAP dmmap_diagnostics.@NSLookupResult[$j].DNSServerIP="$dns_server_ip" + $UCI_SET_BBF_DMMAP dmmap_diagnostics.@NSLookupResult[$j].ResponseTime="$ResponseTime" + j=$((j+1)) + address="" + fi done <${LOG_FILE} rm -f ${LOG_FILE} $UCI_SET_BBF_DMMAP dmmap_diagnostics.nslookup.SuccessCount=$success_count diff --git a/scripts/serverselection_launch b/scripts/serverselection_launch index 14bb7c3b..36ebc886 100755 --- a/scripts/serverselection_launch +++ b/scripts/serverselection_launch @@ -33,11 +33,11 @@ serverselection_launch() { i=$((i+1)) res=$(ping -q $proto -c 1 -W $timeout $device $host 2>&1) ba=$(echo "$res" | grep "bad address") - [ -n "$ba" ] && { $UCI_SET_BBF_DMMAP dmmap_diagnostics.serverselection.DiagnosticState=Error_CannotResolveHostName; $UCI_COMMIT_BBF_DMMAP; break; } + [ -n "$ba" ] && { $UCI_SET_BBF_DMMAP dmmap_diagnostics.serverselection.DiagnosticState=Error_CannotResolveHostName; $UCI_COMMIT_BBF_DMMAP; return; } ba=$(echo "$res" | grep "unknown host") - [ -n "$ba" ] && { $UCI_SET_BBF_DMMAP dmmap_diagnostics.serverselection.DiagnosticState=Error_CannotResolveHostName; $UCI_COMMIT_BBF_DMMAP; break; } + [ -n "$ba" ] && { $UCI_SET_BBF_DMMAP dmmap_diagnostics.serverselection.DiagnosticState=Error_CannotResolveHostName; $UCI_COMMIT_BBF_DMMAP; return; } stc=$(echo "$res" | grep "received") - [ -z "$stc" ] && { $UCI_SET_BBF_DMMAP dmmap_diagnostics.serverselection.DiagnosticState=Error_Other; $UCI_COMMIT_BBF_DMMAP; break; } + [ -z "$stc" ] && { $UCI_SET_BBF_DMMAP dmmap_diagnostics.serverselection.DiagnosticState=Error_Other; $UCI_COMMIT_BBF_DMMAP; return; } times=$(echo "$res" | grep "min/avg/max") [ -z "$times" ] && break sc1=$(echo "$stc" | awk '{print $4}') diff --git a/scripts/traceroute_launch b/scripts/traceroute_launch index 569b2edf..40fe5a31 100755 --- a/scripts/traceroute_launch +++ b/scripts/traceroute_launch @@ -21,7 +21,11 @@ traceroute_launch() { [ "$timeout" = "0" ] && timeout="1" i=-2 rm -f /tmp/traceres - traceroute -m $maxhop -w $timeout -q $cnt $proto $device $host $dsize 2>&1 >/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))