Задать вопрос
@tirael777
SysAdmin

Как настроить мониторинг postfix на zabbix?

Всем салют.
Встала задача мониторить работоспособность почтового релея.
По данному вопросу наткнулся на такую статью.
https://serveradmin.ru/monitoring-postfix-v-zabbix/
Там есть скрипт

spoiler
#!/bin/bash

export LC_ALL=""
export LANG="en_US.UTF-8"
#
if [[ -z "$1" ]]; then
exit 1
fi
##### PARAMETERS #####
MAILQ=$(which mailq)
PFLOGSUMM=$(which pflogsumm)
MAILLOG="/var/log/maillog"
METRIC="$1"
CACHE_TTL="1740"
CACHE_FILE="/tmp/zabbix.postfix.cache"
EXEC_TIMEOUT="4"
NOW_TIME=`date '+%s'`
##### RUN #####
if [ "$METRIC" = "queue" ]; then
TEMP_DATA=`${MAILQ} 2>&1 | tail -n1`
if echo "${TEMP_DATA}" | grep -iq "Mail queue is empty"; then
echo 0
elif echo "${TEMP_DATA}" | grep -iPq "in\s+\d+\s+request"; then
echo "${TEMP_DATA}" | sed -e 's/.*in\s\+\([0-9]\+\)\s\+request.*/\1/gI' 2> /dev/null | head -n1
else
# Error
echo 65535
fi
exit 0
else
if [ -s "${CACHE_FILE}" ]; then
CACHE_TIME=`stat -c"%Y" "${CACHE_FILE}"`
DELTA_TIME=$((${NOW_TIME} - ${CACHE_TIME}))
if [ ${DELTA_TIME} -lt ${EXEC_TIMEOUT} ]; then
sleep $((${EXEC_TIMEOUT} - ${DELTA_TIME}))
elif [ ${DELTA_TIME} -gt ${CACHE_TTL} ]; then
echo "" >> "${CACHE_FILE}" # !!!
DATE_TO=`date +%d\ %H:%M:%S`
DATE_FROM=`date -d @${CACHE_TIME} +%d\ %H:%M:%S`
DATA_CACHE=`sudo cat ${MAILLOG} | sed -e 's/^\([a-zA-Z]\{3\}\s\)\s\([0-9]\s\)/\10\2/g' | awk '$2" "$3>=from && $2" "$3<=to' from="${DATE_FROM}" to="${DATE_TO}" | ${PFLOGSUMM} -h 0 -u 0 --bounce_detail=0 --deferral_detail=0 --reject_detail=0 --smtpd_warning_detail=0 --no_no_msg_size 2>&1`
echo "${DATA_CACHE}" > ${CACHE_FILE} # !!!
chmod 640 ${CACHE_FILE}
fi
else
echo "" > ${CACHE_FILE} # !!!
exit 0
fi
awk "BEGIN{IGNORECASE=1} /${METRIC}/ {print \$1}" ${CACHE_FILE} | awk '{print $1}' | awk '/k|m/{p = /k/?1:2}{printf "%d\n", int($1) * 1024 ^ p}' | head -n1
fi
exit 0


В нём мне непонятна его работа.
1)
if echo "${TEMP_DATA}" | grep -iq "Mail queue is empty"; then

Тут получается что если мы вводим при выполнении скрипта слово "queue" и mailq выдаёт "Mail queue is empty" то возвращает 0 - всё ок, иначе 65535
2)

elif echo "${TEMP_DATA}" | grep -iPq "in\s+\d+\s+request"; then
echo "${TEMP_DATA}" | sed -e 's/.*in\s\+\([0-9]\+\)\s\+request.*/\1/gI' 2> /dev/null | head -n1

тут непонятно что.
3) Далее большой блок

if [ -s "${CACHE_FILE}" ]; then
CACHE_TIME=`stat -c"%Y" "${CACHE_FILE}"`
DELTA_TIME=$((${NOW_TIME} - ${CACHE_TIME}))
if [ ${DELTA_TIME} -lt ${EXEC_TIMEOUT} ]; then
sleep $((${EXEC_TIMEOUT} - ${DELTA_TIME}))
elif [ ${DELTA_TIME} -gt ${CACHE_TTL} ]; then
echo "" >> "${CACHE_FILE}" # !!!
DATE_TO=`date +%d\ %H:%M:%S`
DATE_FROM=`date -d @${CACHE_TIME} +%d\ %H:%M:%S`
DATA_CACHE=`sudo cat ${MAILLOG} | sed -e 's/^\([a-zA-Z]\{3\}\s\)\s\([0-9]\s\)/\10\2/g' | awk '$2" "$3>=from && $2" "$3<=to' from="${DATE_FROM}" to="${DATE_TO}" | ${PFLOGSUMM} -h 0 -u 0 --bounce_detail=0 --deferral_detail=0 --reject_detail=0 --smtpd_warning_detail=0 --no_no_msg_size 2>&1`
echo "${DATA_CACHE}" > ${CACHE_FILE} # !!!
chmod 640 ${CACHE_FILE}
fi

Тут мы берём текущую дату и дату кеш-файла и вычисляем сколько времени прошло после его создания. Если требования подходят то парсим статистику посфикса и записываем в кэш-файл.
4)Тут тоже непонятно что происходит

awk "BEGIN{IGNORECASE=1} /${METRIC}/ {print \$1}" ${CACHE_FILE} | awk '{print $1}' | awk '/k|m/{p = /k/?1:2}{printf "%d\n", int($1) * 1024 ^ p}' | head -n1


Так вообщем то я из этого не понял что данный скрипт проверяем кроме очереди в посфиксе? По сути нужно проверять отправку и получение почты, чтобы не было очередей и пробелов во входящих сообщениях. Выполняет ли он эту фунцию? помогите разобраться.
  • Вопрос задан
  • 1043 просмотра
Подписаться 2 Оценить Комментировать
Ответ пользователя Saboteur К ответам на вопрос (1)
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
if реагирует на 0 (true) и не ноль (false), поэтому суть в том, что если
if echo "${TEMP_DATA}" | grep -iq "Mail queue is empty"; then

возвращает 0 (то есть grep нашел фразу "Mail queue is empty" хотя бы раз), то выполняется условие.
Иначе он пробует другое условие:

elif echo "${TEMP_DATA}" | grep -iPq "in\s+\d+\s+request"; then
В этом условии ищем фразу "in цифры request", если находим то выполняем.

echo "${TEMP_DATA}" | sed -e 's/.*in\s\+\([0-9]\+\)\s\+request.*/\1/gI' 2> /dev/null | head -n1

Таким образом три условия
Если очередь пустая - выводим 0, если не пустая - выводим количество request-s, в противном случае выводим ошибку.

Дальше уже вопрос как это обрабатывает заббикс - просто берет эти цифры и строит график, и реагирует на ошибку, или еще что-то.

А вообще, лучше конечно подучить основы баша и регулярных выражений. Подобные скрипты - это подсказки для тех, кто уже пишет. Они не являются end-user решениями, которые можно просто брать и ставить на свой сервер без понимания, что они делают. То есть риск всегда есть, что они делают не все, что вы хотите.
Ответ написан
Комментировать