#!/bin/sh alias echo=/bin/echo rand=$(pwgen -A -0 20 1) test_domain="test.nanl.de" monitoring_domain="nanl.de" hostname=$(cat /etc/mailname) sleep=10 postfixadmin_url="https://mail.nanl.de" postfixadmin_username="monitoring@nanl.de" postfixadmin_password="XXXXX" postfixadmin_key="/etc/ssl/private/nanl_clients.key" postfixadmin_crt="/etc/ssl/certs/nanl_clients.crt" postfixadmin_ca="/etc/ssl/certs/nanl_services.ca" testmail_ssl="yes" testmail_ssl_ca="/etc/ssl/certs/nanl_services.ca" testmail_username="test@test.nanl.de" testmail_password="YYYYYY" testmail_server="mail.nanl.de" wget_args="-O - --quiet --load-cookies /tmp/mail_${monitoring_domain}.cookie" test -z "${postfixadmin_ca}" || wget_args="$wget_args --ca-certificate ${postfixadmin_ca}" test -z "${postfixadmin_key}" || wget_args="$wget_args --private-key ${postfixadmin_key}" test -z "${postfixadmin_crt}" || wget_args="$wget_args --certificate ${postfixadmin_crt}" bail() { output=$(wget ${wget_args} "${postfixadmin_url}/delete.php?table=alias&delete=${rand}@${test_domain}&domain=${test_domain}") rm -f "/tmp/mail_${monitoring_domain}.fetchmail_inbox" "/tmp/mail_${monitoring_domain}.fetchmail_conf" "/tmp/mail_${monitoring_domain}.cookie" "/tmp/mail_${monitoring_domain}.fetchmail_ids" "/tmp/mail_${monitoring_domain}.fetchmail_pid" echo "${2:-Unknown error}" exit ${1:-2} } test -z "$(which pwgen)" && bail 23 '"pwgen" not found in $PATH' test -z "$(which fetchmail)" && bail 23 '"fetchmail" not found in $PATH' output=$(wget ${wget_args} --keep-session-cookies --save-cookies /tmp/mail_${monitoring_domain}.cookie --post-data "fUsername=${postfixadmin_username}&fPassword=${postfixadmin_password}&lang=en&submit=Login" "${postfixadmin_url}/login.php") output=$(wget ${wget_args} --post-data "fAddress=${rand}&fDomain=${test_domain}&fGoto=test@${test_domain}&fActive=on&submit=Add+Alias" "${postfixadmin_url}/create-alias.php?domain=${test_domain}") # iterating over all MX records listed for domain $monitoring_domain and send a mail to test@$test_domain via each of them failed=0 msg= mailservers=$(nslookup -type=mx "${monitoring_domain}" | grep -E -io '(([a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])\.$') for mx in $mailservers; do data="HELO ${hostname}\r\nMAIL FROM: monitoring@${hostname}\r\nRCPT TO: ${rand}@${test_domain}\r\nDATA\r\nSubject: test ${rand} via ${mx}\r\nFrom: monitoring@${hostname}\r\nTo: ${rand}@${test_domain}\r\n\r\nmx:${mx}|rand:${rand}\r\n.\r\nQUIT\r\n" echo -e "${data}" | nc "${mx}" 25 > /dev/null 2>&1 if [ "$?" != 0 ]; then failed=$(($failed+1)) msg="${msg}Could not send mail via ${mx} " fi done [ "$failed" = "$(echo "${mailservers}" | wc -l)" ] && bail 2 "No mailserver reachable at all" sleep ${sleep} # iterating over all MX records listed for domain $monitoring_domain and check for mails identifying this very test run for each MX #args="--nokeep --bsmtp /tmp/mail_${monitoring_domain} --protocol ${testmail_protocol} --username ${testmail_username} ${testmail_server}" fetchmail_args= test -z "${testmail_ssl}" || fetchmail_args="$fetchmail_args ssl" test -z "${testmail_ssl_ca}" || fetchmail_args="$fetchmail_args sslcertck sslcertfile '${testmail_ssl_ca}'" echo -e "poll ${testmail_server} via ${testmail_server}\n with proto IMAP auth password\n user '${testmail_username}' there with password '${testmail_password}' is '${testmail_username}' here options no rewrite nokeep bsmtp '/tmp/mail_${monitoring_domain}.fetchmail_inbox' ${fetchmail_args}" > "/tmp/mail_${monitoring_domain}.fetchmail_conf" chmod 700 "/tmp/mail_${monitoring_domain}.fetchmail_conf" fetchmail --pidfile "/tmp/mail_${monitoring_domain}.fetchmail_pid" -i "/tmp/mail_${monitoring_domain}.fetchmail_ids" -s -f "/tmp/mail_${monitoring_domain}.fetchmail_conf" [ -s "/tmp/mail_${monitoring_domain}.fetchmail_inbox" ] || bail 2 "Did not fetch any mail at all" failed=0 for mx in $mailservers; do if ! grep -q "mx:${mx}|rand:${rand}" "/tmp/mail_${monitoring_domain}.fetchmail_inbox"; then failed=$(($failed+1)) msg="${msg}Did not fetch mail sent via ${mx}" fi done rm "/tmp/mail_${monitoring_domain}.fetchmail_inbox" "/tmp/mail_${monitoring_domain}.fetchmail_conf" [ "$failed" = "$(echo "${mailservers}" | wc -l)" ] && bail 2 "Did not fetch any mail at all" [ "$failed" != "0" ] && bail 1 "${msg}" [ "$failed" = "0" ] && bail 0 "All mail services running and working"