@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


Так вообщем то я из этого не понял что данный скрипт проверяем кроме очереди в посфиксе? По сути нужно проверять отправку и получение почты, чтобы не было очередей и пробелов во входящих сообщениях. Выполняет ли он эту фунцию? помогите разобраться.
  • Вопрос задан
  • 1005 просмотров
Пригласить эксперта
Ответы на вопрос 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 решениями, которые можно просто брать и ставить на свой сервер без понимания, что они делают. То есть риск всегда есть, что они делают не все, что вы хотите.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы