135 lines
5.5 KiB
Bash
135 lines
5.5 KiB
Bash
|
#!/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;
|