#!/bin/bash ############################################################################## # # Определение корректности записей в DNS # для доменов для Zabbix # Может работать как с zabbix-agent так и zabbix-sender # # Автор: Сергей Калинин # https://nuk-svk.ru # svk@nuk-svk.ru ############################################################################## # # Использование: # # Получение DNS записей доменов и создание JSON-файла для Zabbix: # zabbix_zimbra_domain_status.sh discover # # Чтение JSON-файла и вывод на экран (в zabbix) # zabbix_zimbra_domain_status.sh read-json-discover # # Получение всех записей для домена из DNS # zabbix_zimbra_domain_status.sh get-domain-records _DOMAIN_NAME_ # # Получение всех типов записей для домена из DNS # zabbix_zimbra_domain_status.sh get-domain-records-type _DOMAIN_NAME_ # # Получение ДНС записи определенного типа для домена # zabbix_zimbra_domain_status.sh _ZIMBRA_DOMAIN_NAME_ _DNS_RECORD_TYPE_ # # Где # _DOMAIN_NAME_ - имя домена в DNS # _DNS_RECORD_TYPE_ - тип DNS-записи (A, CNAME, TXT, MX, и т.д.) ############################################################################# BIN_DIR=${BIN_DIR:-/usr/local/bin} ETC_DIR=${ETC_DIR:-/usr/local/etc} EXT_DNS=${EXT_DNS:-8.8.8.8} DOMAIN_LIST=${DOMAIN_LIST:-"example1.com example1.org example3.ru"} FILE_ZIMBRA_DOMAIN_STATUS='/tmp/domain_status' FILE_ZIMBRA_DOMAIN_LIST='/tmp/domain_list' ZABBIX_AGENT=${ZABBIX_AGENT:-FALSE} ZABBIX_SENDER=${ZABBIX_SENDER:-/usr/bin/zabbix_sender} ZABBIX_AGENT_CONFIG=${ZABBIX_AGNT_CONFIG:-/etc/zabbix/zabbix_agentd.conf} ZABBIX_HOST="${ZABBIX_HOST:-DNS records check}" case "$1" in discover) # Return a list of running services in JSON # And create JSON-file DOMAIN_JSON="{\"data\":[" for LINE in ${DOMAIN_LIST}; do RECORDS_TYPE=$($0 get-domain-records-type ${LINE}) DOMAIN_JSON="${DOMAIN_JSON}" for TYPE in ${RECORDS_TYPE}; do DOMAIN_JSON="${DOMAIN_JSON} {\"{#DOMAIN}\":\"$LINE\", \"{#DOMAINDNSRECORD}\":\"$TYPE\"}," done DOMAIN_JSON="${DOMAIN_JSON}" done JSON_STRING="$(echo $DOMAIN_JSON | sed 's/,\+$//') ]}" echo "${JSON_STRING}" > ${FILE_ZIMBRA_DOMAIN_LIST}.json if [ "$ZABBIX_AGENT" = "FALSE" ]; then $ZABBIX_SENDER -vv -c $ZABBIX_AGENT_CONFIG -s "$ZABBIX_HOST" -k domain -o "${JSON_STRING}" fi exit 0; ;; read-json-discover) # create a JSON-file for zabbix $0 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) if [ "$2" = "" ]; then echo "No Zimbra DOMAIN specified..." exit 1 fi dig @${EXT_DNS} +nocmd $2 any +noall +answer > ${FILE_ZIMBRA_DOMAIN_STATUS} ;; get-domain-records-type) if [ "$2" = "" ]; then echo "No DOMAIN specified..." exit 1 fi $0 get-domain-records $2 cat ${FILE_ZIMBRA_DOMAIN_STATUS} | awk '{print $4}' | sort -u ;; *) CHECK_DOMAIN=$1 if [ "$CHECK_DOMAIN" = "" ]; then echo "No DOMAIN specified..." exit 1 fi # Формируем список всех DNS-записей для домена #dig @${EXT_DNS} +nocmd ${CHECK_DOMAIN} any +noall +answer > ${FILE_ZIMBRA_DOMAIN_STATUS} $0 get-domain-records "${CHECK_DOMAIN}" if [ "$ZABBIX_AGENT" = "TRUE" ]; then # получаем данные по конкретному типу записи # использвется при работе через zabbix-agent RECORD_TYPE=$2 if [ "$RECORD_TYPE" = "" ]; then echo "No DNS record type specified..." exit 1 fi grep -E "\s${RECORD_TYPE}\s" ${FILE_ZIMBRA_DOMAIN_STATUS} | awk '{ for(i=5; i<=NF; ++i) printf $i""FS; print "" }' | sort else # Формируем список типов записей для домена #RECORD_TYPES_LIST=$(cat ${FILE_ZIMBRA_DOMAIN_STATUS} | awk '{print $4}' | sort -u) RECORD_TYPES_LIST=$($0 get-domain-records-type "${CHECK_DOMAIN}") for RECORD_TYPE in ${RECORD_TYPES_LIST}; do # Запрос в DNS #dig @${EXT_DNS} +nocmd ${RECORD_TYPE} ${CHECK_DOMAIN} +noall +answer | awk '{ for(i=5; i<=NF; ++i) printf $i""FS; print "" }' | sort # Читаем из файла с ранее полученными данными и шлем в заббикс #grep ${RECORD_TYPE} ${FILE_ZIMBRA_DOMAIN_STATUS} | awk '{ for(i=5; i<=NF; ++i) printf $i""FS; print "" }' | sort $ZABBIX_SENDER -c $ZABBIX_AGENT_CONFIG -s "$ZABBIX_HOST" -k "domain.status[${CHECK_DOMAIN}, ${RECORD_TYPE}]" \ -o "$(grep -E "\s${RECORD_TYPE}\s" ${FILE_ZIMBRA_DOMAIN_STATUS} | awk '{ for(i=5; i<=NF; ++i) printf $i""FS; print "" }' | sort)" done fi ;; esac exit 0;