zabbix-helpers/check_dns_records/zabbix_dns_records_check.sh

135 lines
5.5 KiB
Bash
Raw Permalink Normal View History

2021-01-15 18:49:37 +03:00
#!/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;