#!/bin/sh # Copyright (C) 2022 iopsys Software Solutions AB # Author: AMIN Ben Ramdhane . /usr/share/bbfdm/bbf_api LOG_FILE="/tmp/nslookup.log" nslookup_launch() { address="" hostname=$(uci_get_bbf_dmmap dmmap_diagnostics.nslookup.HostName) dnsserver=$(uci_get_bbf_dmmap dmmap_diagnostics.nslookup.DNSServer) cnt=$(uci_get_bbf_dmmap dmmap_diagnostics.nslookup.NumberOfRepetitions 1) [ "$hostname" = "" ] && return i=0 j=0 success_count=0 [ -e "${LOG_FILE}" ] && rm ${LOG_FILE} while [ $i -lt "$cnt" ]; do i=$((i+1)) 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 AnswerType="Authoritative" while IFS= read line; do [ -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 var=$(echo "$line" | tr -d '\t' | tr -d ' ' | grep "Name:" | awk -F':' '{print $2}') [ -n "$var" ] && { HostNameReturned=$var; status="Success"; success_count=$((success_count+1)); continue; } var=$(echo "$line" | tr -d '\t' | tr -d ' ' | grep "name=" | awk -F'=' '{print $2}') [ -n "$var" ] && { HostNameReturned=$var; status="Success"; address="$hostname"; 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; } 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="" AnswerType="Authoritative" fi done <${LOG_FILE} rm -f ${LOG_FILE} $UCI_SET_BBF_DMMAP dmmap_diagnostics.nslookup.SuccessCount=$success_count $UCI_SET_BBF_DMMAP dmmap_diagnostics.nslookup.DiagnosticState=Complete $UCI_COMMIT_BBF_DMMAP } nslookup_stop_diagnostic() { pids=$(pgrep -f nslookup_launch) if [ -n "$pids" ]; then kill -9 "$pids" >/dev/null 2>&1 $UCI_SET_BBF_DMMAP dmmap_diagnostics.nslookup.DiagnosticState=None $UCI_COMMIT_BBF_DMMAP fi } if [ "$1" = "run" ]; then nslookup_launch elif [ "$1" = "stop" ]; then nslookup_stop_diagnostic else return fi