zimbra-script/zabbix_zimbra_domain_status.sh

120 lines
4.5 KiB
Bash
Raw Normal View History

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