#!/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"