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