Доброго дня коллеги. Как то я озаботился получением утреннего дайджеста, а именно среза текущих проблем на момент времени. Не добившись от мидов ясности в глах и азарта впальцах я наковырял сие (иногда используя кусочки чужуго кода. Публикую - вдруг кому понравится.
Работает с базой Zabbix-3.4
zabbix-daily-report.sh
#!/bin/bash
#Working with Zabbix 3.4 Database
SENDWITH0=0
URL=http://zabbix.slocal
MAIL="***@*** ***@*** #emails with spaces here#"
MAILFROM=zabbix@zabbix.slocal
SMTP="your.smtp.server"
SMTPUSER="******"
SMTPPASS="******"
SQLHOST=$(sed -e '/^DBHost/!d; s/.*=\(.*\)/\1/' /etc/zabbix/zabbix_server.conf)
SQLUSER=$(sed -e '/^DBUser/!d; s/.*=\(.*\)/\1/' /etc/zabbix/zabbix_server.conf)
SQLPASS=$(sed -e '/^DBPassword/!d; s/.*=\(.*\)/\1/' /etc/zabbix/zabbix_server.conf)
SQL='SELECT host, t.description, FROM_UNIXTIME(e.clock) as time, t.value, IF(e.acknowledged=1,"Yes","No") as acknowledged, IF(e.acknowledged=1,a.message,"") as message
FROM triggers t
INNER JOIN functions f ON ( f.triggerid = t.triggerid )
INNER JOIN items i ON ( i.itemid = f.itemid )
INNER JOIN hosts h ON ( i.hostid = h.hostid )
INNER JOIN events e ON ( e.objectid = t.triggerid )
LEFT JOIN acknowledges a ON ( a.eventid = e.eventid )
WHERE (e.eventid DIV 100000000000000)
IN (0)
AND e.object = 0
AND (t.value=1 OR (t.value =0 AND unix_timestamp(now()) - t.lastchange <60))
AND h.status = 0
AND i.status = 0
AND t.status = 0
AND e.eventid = (SELECT max(eventid)
FROM events e
WHERE (e.eventid DIV 100000000000000)
IN (0)
AND e.object = 0
AND (t.value=1 OR (t.value =0 AND unix_timestamp(now()) - t.lastchange <60))
AND h.status = 0
AND i.status = 0
AND t.status = 0
AND e.objectid = t.triggerid
)
GROUP BY host, f.triggerid
ORDER BY t.lastchange DESC;'
echo ${SQL}|mysql -h ${SQLHOST} -u ${SQLUSER} -p${SQLPASS} zabbix -t | sed 's/$/\\n/g; /acknowledged/d; 1d;' > /dev/shm/$(basename $0)
body="This is an automatically generated fokin mail message sent by a script running on zabbix.slocal."
subject="Zabbix daily report by $(date): We have "
num=0
if [ -s /dev/shm/$(basename $0) ]; then
num=$(( $(cat /dev/shm/$(basename $0)|wc -l) -2))
body="${body}
The following triggers are currently active:
`echo -e $(cat /dev/shm/$(basename $0))`"
else
body="${body}
All quiet chef!"
fi
body="${body}
Log in to Zabbix at ${URL}
Regards,
Zabbix Server"
subject="${subject} $num fokin problems."
if [ ${num} -eq 0 ] && [ ${SENDWITH0} -eq 0 ]; then
exit 0;
else
for i in $MAIL
do
echo -e "${body}" | sendemail -s $SMTP -xu $SMTPUSER -xp $SMTPPASS -f $MAILFROM -t $i -u ${subject} > /dev/null 2>&1
done
fi