#!/bin/bash ############################################################################## # # Определение корректности записей в DNS # для доменов заведённых в Zimbra для Zabbix # # Автор: Сергей Калинин # https://nuk-svk.ru # svk@nuk-svk.ru ############################################################################## # # Использование: # # Получение списка доменов из zimbra и копирование его в файл: # zabbix_zimbra_domain_status.sh discover # # Создание json-файла со списком доменов для службы обнаружения zabbix # zabbix_zimbra_domain_status.sh discover-json # # Чтение JSON-файла и вывод на экран (в zabbix) # zabbix_zimbra_domain_status.sh read-json-discover # # Получение MX записей из ДНС для всех доменов и копирование их в файл # zabbix_zimbra_domain_status.sh get-domain-records _RECORD_TYPE_ # где # _RECORD_TYPE_ - тип записи (MX, TXT (для spf)) # # Получение MX записи из файла для домена # zabbix_zimbra_domain_status.sh _ZIMBRA_DOMAIN_NAME_ # где # _ZIMBRA_DOMAIN_NAME_ - имя домена возвращаемое командой 'zmprov gad' # ############################################################################# ZMCOMMAND="sudo -u zimbra /opt/zimbra/bin/zmprov" EXTDNS=8.8.8.8 RECORD_TYPE=${2:-"MX"} FILE_ZIMBRA_DOMAIN_STATUS='/tmp/zimbra_domain_status' FILE_ZIMBRA_DOMAIN_STATUS_TXT='/tmp/zimbra_domain_status_txt' FILE_ZIMBRA_DOMAIN_LIST='/tmp/zimbra_domain_list' case "$1" in discover) $ZMCOMMAND gad > ${FILE_ZIMBRA_DOMAIN_LIST} #;; #discover-json) # Return a list of running services in JSON # And create JSON-file DOMAIN_JSON="{\"data\":[" while read LINE; do DOMAIN_JSON="${DOMAIN_JSON} {\"{#ZIMBRADOMAIN}\":\"$LINE\"}," done < "${FILE_ZIMBRA_DOMAIN_LIST}" echo $(echo $DOMAIN_JSON | sed 's/,\+$//') > ${FILE_ZIMBRA_DOMAIN_LIST}.json #echo ${DOMAIN_JSON} > ${FILE_ZIMBRA_DOMAIN_LIST}.json echo -e "]}" >> ${FILE_ZIMBRA_DOMAIN_LIST}.json exit 0; ;; read-json-discover) # Read a JSON and return if [ ! -f ${FILE_ZIMBRA_DOMAIN_LIST}.json ]; then echo "File ${FILE_ZIMBRA_DOMAIN_LIST}.json not found" exit 1 fi while read LINE; do echo ${LINE} done < "${FILE_ZIMBRA_DOMAIN_LIST}.json" ;; get-domain-records) # Checking file with domains list if [ ! -f ${FILE_ZIMBRA_DOMAIN_LIST} ]; then echo "File ${FILE_ZIMBRA_DOMAIN_LIST} not found" exit 1 fi if [ "${RECORD_TYPE}" = "TXT" ]; then ### Getting TXT records # Delete old file with domain status if [ -f ${FILE_ZIMBRA_DOMAIN_STATUS_TXT} ]; then rm -f ${FILE_ZIMBRA_DOMAIN_STATUS_TXT} fi # checking SPF records while read LINE; do REC=$(dig @${EXTDNS} ${RECORD_TYPE} ${LINE} | grep -i -E -o "spf1 .+") echo "${LINE} ${REC}" >> "${FILE_ZIMBRA_DOMAIN_STATUS_TXT}" done < ${FILE_ZIMBRA_DOMAIN_LIST} else ### Geting MX records from DNS # Delete old file with domain status if [ -f ${FILE_ZIMBRA_DOMAIN_STATUS} ]; then rm -f ${FILE_ZIMBRA_DOMAIN_STATUS} fi while read LINE; do dig @${EXTDNS} ${RECORD_TYPE} ${LINE} | grep -i -E "^([a-z.]+?)\s+?([0-9]+?)\s+?IN\s+?MX\s+?([0-9]+?)" | awk '{print $1 " " $5 " " $6}' | sort -f >> "${FILE_ZIMBRA_DOMAIN_STATUS}" done < ${FILE_ZIMBRA_DOMAIN_LIST} fi ;; *) CHECK_DOMAIN=$1 if [ "$CHECK_DOMAIN" = "" ]; then echo "No Zimbra DOMAIN specified..." exit 1 fi case "${RECORD_TYPE}" in MX) cat ${FILE_ZIMBRA_DOMAIN_STATUS} | grep -i -E "^${CHECK_DOMAIN}" | awk '{print $3 " " $2 }' ;; TXT) #cat ${FILE_ZIMBRA_DOMAIN_STATUS_TXT} | awk -v domain=^${CHECK_DOMAIN} 'match($0,domain) {print substr($0,length(domain)+1)}' REC=$(dig @${EXTDNS} ${RECORD_TYPE} ${CHECK_DOMAIN} | grep -i -E -o "spf1 .+") echo "${REC}" ;; esac ;; esac exit 0;