#!/bin/bash if [[ "${DNS_BASH}" != "" ]] then return else declare -g DNS_BASH=1 fi # Includes #----------------------------------------------------------------------------------------------------------------------------------- . /usr/global/lib/default.bash #[ -e /var/cache/dns.cache ] && . /var/cache/dns.cache # Global Variable #----------------------------------------------------------------------------------------------------------------------------------- declare -Ag DNS_A_TAB declare -g DNS_A_ID_LIST declare -Ag DNS_PTR_TAB declare -g DNS_PTR_ID_LIST declare -g DNS_CACHE_FILE="/var/cache/dns.cache" declare -g DNS_CACHE_LOCK="/var/lock/network/dns.lock" #declare -g DNS_CACHE_LOCK="${DNS_CACHE_FILE}" declare -g DNS_CACHE_UPDATED=0 if [ ! -v LOG ] || [[ "${LOG}" == "" ]] then export LOG=":" fi #-------------------------------------------------------------------------------------------------------------------------- # dns_tab_load #-------------------------------------------------------------------------------------------------------------------------- dns_tab_load() { ${LOG} 1>&2 "Loading DNS cache..." file_lock "${DNS_CACHE_LOCK}" READ 9 if [[ ( -e "${DNS_CACHE_FILE}" ) && ( "${NETWORK_CONFIG_FILE}" -ot "${DNS_CACHE_FILE}" ) ]] then ${LOG} 1>&2 "DNS: Read CacheFile" while IFS= read -r line do line=${line%%#*} if [[ ! -z "$line" ]] then set ${line} dtl_type="$1" dtl_key="$2" dtl_value="$3" dns_tab_put ${dtl_type} "${dtl_key}" "${dtl_value}" fi done < ${DNS_CACHE_FILE} else ${LOG} 1>&2 "DNS: Init CacheFile" >${DNS_CACHE_FILE} fi file_unlock 9 DNS_CACHE_UPDATED=0 } #-------------------------------------------------------------------------------------------------------------------------- # dns_tab_save #-------------------------------------------------------------------------------------------------------------------------- dns_tab_save() { ${LOG} 1>&2 "Saving DNS cache..." if [[ "${DNS_CACHE_UPDATED}" != "0" ]] then file_lock "${DNS_CACHE_LOCK}" WRITE 9 ${LOG} 1>&2 "DNS: Write CacheFile" ( for key in "${!DNS_A_TAB[@]}" do echo "A ${key} ${DNS_A_TAB[${key}]}" done for key in "${!DNS_PTR_TAB[@]}" do echo "PTR ${key} ${DNS_PTR_TAB[${key}]}" done ) | sort -n >${DNS_CACHE_FILE} file_unlock 9 DNS_CACHE_UPDATED=0 fi } #-------------------------------------------------------------------------------------------------------------------------- # dns_tab_get #-------------------------------------------------------------------------------------------------------------------------- dns_tab_get() { dns_type="$1" dns_key="$2" case ${dns_type} in "A") if [[ -v DNS_A_TAB["${dns_key}"] ]] then dns_value="${DNS_A_TAB["${dns_key}"]}" else ${LOG} "DNS: Lookup failed: Type: [${dns_type}] Key: [${dns_key}]" return 1 fi ;; "PTR") if [[ -v DNS_PTR_TAB["${dns_key}"] ]] then dns_value="${DNS_PTR_TAB["${dns_key}"]}" else ${LOG} "DNS: Lookup failed: Type: [${dns_type}] Key: [${dns_key}]" return 1 fi ;; esac ${LOG} "DNS: Lookup succeed: Type: [${dns_type}] Key: [${dns_key}] Value: [${dns_value}]" return 0 } #-------------------------------------------------------------------------------------------------------------------------- # dns_tab_put #-------------------------------------------------------------------------------------------------------------------------- dns_tab_put() { dtp_type="$1" dtp_key="$2" dtp_value="$3" if [[ "${dtp_value}" == "" ]] then ${LOG} 1>&2 "DNS: Skiping cache entry: Type: [${dtp_type}] Key: [${dtp_key}] Value: [${dtp_value}]" else ${LOG} 1>&2 "DNS: Update cache entry: Type: [${dtp_type}] Key: [${dtp_key}] Value: [${dtp_value}]" var_assign DNS_${dtp_type}_ID_LIST "${dtp_key}" INC tab_assign DNS_${dtp_type}_TAB "${dtp_key}" "${dtp_value}" DNS_CACHE_UPDATED=1 fi } #-------------------------------------------------------------------------------------------------------------------------- # dns_lookup #-------------------------------------------------------------------------------------------------------------------------- dns_lookup() { dl_type="$1" dl_key="$2" dl_flag="$3" if [[ "${dl_flag}" != "NOCACHE" ]] then dns_tab_get ${dl_type} ${dl_key} else false fi if [[ "$?" != "0" ]] then ${LOG} "DNS: Out of Cache: Type: [${dl_type}] Key: [${dl_key}] Flag: [${dl_flag}]" case ${dl_type} in "A") dns_value="$( dig +short ${dl_key} 2>/dev/null)" ;; "PTR") dns_value="$( dig +short -x ${dl_key} 2>/dev/null)" dns_value="${dns_value%.}" ;; esac if [[ "${dl_flag}" != "NOCACHE" ]] then dns_tab_put "${dl_type}" "${dl_key}" "${dns_value}" fi fi } #-------------------------------------------------------------------------------------------------------------------------- # dns_tab_dump #-------------------------------------------------------------------------------------------------------------------------- dns_tab_dump() { echo "DNS_A_ID_LIST: [${DNS_A_ID_LIST}]" echo echo "DNS_A_TAB:" for key in "${!DNS_A_TAB[@]}" do echo "[${key}]: [${DNS_A_TAB[${key}]}]" done | sort -n echo echo "DNS_PTR_ID_LIST: [${DNS_PTR_ID_LIST}]" echo echo "DNS_PTR_TAB:" for key in "${!DNS_PTR_TAB[@]}" do echo "[${key}]: [${DNS_PTR_TAB[${key}]}]" done | sort -n echo }