#!/bin/bash if [[ "${DNS_BASH}" != "" ]] then return else declare -g DNS_BASH=1 fi # Includes #----------------------------------------------------------------------------------------------------------------------------------- if [[ -e /usr/local/lib/default.bash ]] then . /usr/local/lib/default.bash else . /usr/global/lib/default.bash fi # 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 declare -g DNS_CACHE_LOCK #declare -g DNS_CACHE_LOCK="${DNS_CACHE_FILE}" declare -g DNS_CACHE_UPDATED=0 #-------------------------------------------------------------------------------------------------------------------------- # dns_tab_load #-------------------------------------------------------------------------------------------------------------------------- dns_tab_load() { log_trace "DNS" "Loading DNS cache..." file_lock "${DNS_CACHE_LOCK}" READ 9 if [[ ( -e "${DNS_CACHE_FILE}" ) && ( "${NETWORK_CONFIG_FILE}" -ot "${DNS_CACHE_FILE}" ) ]] then log_trace "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_trace "DNS" "Init CacheFile" >${DNS_CACHE_FILE} fi file_unlock 9 DNS_CACHE_UPDATED=0 } #-------------------------------------------------------------------------------------------------------------------------- # dns_tab_save #-------------------------------------------------------------------------------------------------------------------------- dns_tab_save() { log_trace "DNS" "Saving DNS cache..." if [[ "${DNS_CACHE_UPDATED}" != "0" ]] then file_lock "${DNS_CACHE_LOCK}" WRITE 9 log_trace "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_trace "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_trace "DNS" "Lookup failed: Type: [${dns_type}] Key: [${dns_key}]" return 1 fi ;; esac log_trace "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_trace "DNS" "Skiping cache entry: Type: [${dtp_type}] Key: [${dtp_key}] Value: [${dtp_value}]" else log_trace "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_trace "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 } #-------------------------------------------------------------------------------------------------------------------------- # dns_init #-------------------------------------------------------------------------------------------------------------------------- dns_init() { file_dir_init ${DNS_CACHE_FILE} root apache file_dir_init ${DNS_CACHE_LOCK} root apache } #-------------------------------------------------------------------------------------------------------------------------- # dns_deinit #-------------------------------------------------------------------------------------------------------------------------- dns_deinit() { :; }