<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://kb.rvmgroup.it/index.php?action=history&amp;feed=atom&amp;title=Monitorggio_di_record_MX_con_Nagios</id>
	<title>Monitorggio di record MX con Nagios - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://kb.rvmgroup.it/index.php?action=history&amp;feed=atom&amp;title=Monitorggio_di_record_MX_con_Nagios"/>
	<link rel="alternate" type="text/html" href="https://kb.rvmgroup.it/index.php?title=Monitorggio_di_record_MX_con_Nagios&amp;action=history"/>
	<updated>2026-05-06T02:43:55Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://kb.rvmgroup.it/index.php?title=Monitorggio_di_record_MX_con_Nagios&amp;diff=9700&amp;oldid=prev</id>
		<title>Gabriele.vivinetto: Created page with &quot;* Il plugin utilizzato è il seguente:   sudo mkdir -p /usr/local/lib/nagios/plugins/  &lt;pre&gt; cat  | sudo tee /usr/local/lib/nagios/plugins/check_mx  &gt; /dev/null &lt;&lt;&#039;EOFile&#039; #!/...&quot;</title>
		<link rel="alternate" type="text/html" href="https://kb.rvmgroup.it/index.php?title=Monitorggio_di_record_MX_con_Nagios&amp;diff=9700&amp;oldid=prev"/>
		<updated>2016-04-08T13:12:11Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;* Il plugin utilizzato è il seguente:   sudo mkdir -p /usr/local/lib/nagios/plugins/  &amp;lt;pre&amp;gt; cat  | sudo tee /usr/local/lib/nagios/plugins/check_mx  &amp;gt; /dev/null &amp;lt;&amp;lt;&amp;#039;EOFile&amp;#039; #!/...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;* Il plugin utilizzato è il seguente:&lt;br /&gt;
&lt;br /&gt;
 sudo mkdir -p /usr/local/lib/nagios/plugins/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat  | sudo tee /usr/local/lib/nagios/plugins/check_mx  &amp;gt; /dev/null &amp;lt;&amp;lt;&amp;#039;EOFile&amp;#039;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# Nagios plugin to check if an host is configured as mx record for a domain&lt;br /&gt;
#&lt;br /&gt;
# Notes&lt;br /&gt;
# - You need dnspython installed:&lt;br /&gt;
#   sudo apt-get install python-dnspython&lt;br /&gt;
#&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
__author__ = &amp;#039;Gabriele Vivinetto&amp;#039;&lt;br /&gt;
__version__= 0.1&lt;br /&gt;
&lt;br /&gt;
from optparse import OptionParser, OptionGroup&lt;br /&gt;
import logging as log&lt;br /&gt;
&lt;br /&gt;
## These will override any args passed to the script normally. &lt;br /&gt;
## Comment out after testing.&lt;br /&gt;
#testargs = &amp;#039;--help&amp;#039;&lt;br /&gt;
#testargs = &amp;#039;--version&amp;#039;&lt;br /&gt;
#testargs = &amp;#039;-vvv&amp;#039;&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
	&amp;quot;&amp;quot;&amp;quot; Main plugin logic goes here &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	## Parse command-line arguments&lt;br /&gt;
	args, args2 = parse_args()&lt;br /&gt;
&lt;br /&gt;
	## Options variable are accessibles as args.variablename&lt;br /&gt;
&lt;br /&gt;
	## Uncomment to test logging levels against verbosity settings&lt;br /&gt;
	# log.debug(&amp;#039;debug message&amp;#039;)&lt;br /&gt;
	# log.info(&amp;#039;info message&amp;#039;)&lt;br /&gt;
	# log.warning(&amp;#039;warning message&amp;#039;)&lt;br /&gt;
	# log.error(&amp;#039;error message&amp;#039;)&lt;br /&gt;
	# log.critical(&amp;#039;critical message&amp;#039;)&lt;br /&gt;
	# log.fatal(&amp;#039;fatal message&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	import dns.resolver&lt;br /&gt;
&lt;br /&gt;
	# The domain name to check&lt;br /&gt;
	domain = args.domain&lt;br /&gt;
	&lt;br /&gt;
	log.info(&amp;quot;Testing domain: &amp;quot; + domain )&lt;br /&gt;
&lt;br /&gt;
	myResolver = dns.resolver.Resolver()&lt;br /&gt;
&lt;br /&gt;
	## Find The ip address to check from args.hostIp and put into hostIp&lt;br /&gt;
	## Maybe the hostname resolves to multiple IPs&lt;br /&gt;
	&lt;br /&gt;
	try:&lt;br /&gt;
		hostIpAddresses = dns.resolver.query(args.hostIp,&amp;#039;A&amp;#039;)&lt;br /&gt;
	except dns.resolver.NXDOMAIN:&lt;br /&gt;
		gtfo(3,&amp;quot;UNKNOWN No such hostname %s&amp;quot; % args.hostIp)&lt;br /&gt;
	except dns.resolver.Timeout:&lt;br /&gt;
		gtfo(3,&amp;quot;UNKNOWN Timed out while resolving %s&amp;quot; % args.hostIp)&lt;br /&gt;
	except dns.exception.DNSException:&lt;br /&gt;
		gtfo(3, &amp;quot;UNKNOWN Unknown error&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	## Find all the MX Records&lt;br /&gt;
	try:&lt;br /&gt;
		mxRecords = myResolver.query(domain, &amp;#039;MX&amp;#039;)&lt;br /&gt;
	except dns.resolver.NXDOMAIN:&lt;br /&gt;
		gtfo(3,&amp;quot;UNKNOWN No such domain %s&amp;quot; % domain)&lt;br /&gt;
	except dns.resolver.Timeout:&lt;br /&gt;
		gtfo(3,&amp;quot;UNKNOWN Timed out while resolving %s&amp;quot; % domain)&lt;br /&gt;
	except dns.exception.DNSException:&lt;br /&gt;
		gtfo(3, &amp;quot;UNKNOWN Unknown error&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	for ip in hostIpAddresses :&lt;br /&gt;
		hostIp = ip.to_text()&lt;br /&gt;
&lt;br /&gt;
		log.info(&amp;quot;Testing HOST IP &amp;quot; + hostIp )&lt;br /&gt;
&lt;br /&gt;
		for record in mxRecords :&lt;br /&gt;
			mx = record.exchange.to_text()&lt;br /&gt;
			log.info(&amp;quot;Testing MX &amp;quot; + mx )&lt;br /&gt;
			try:&lt;br /&gt;
				ipAddress = dns.resolver.query(mx,&amp;#039;A&amp;#039;)&lt;br /&gt;
			except dns.resolver.NXDOMAIN:&lt;br /&gt;
				gtfo(3,&amp;quot;UNKNOWN No such domain %s&amp;quot; % mx)&lt;br /&gt;
			except dns.resolver.Timeout:&lt;br /&gt;
				gtfo(3,&amp;quot;UNKNOWN Timed out while resolving %s&amp;quot; % mx)&lt;br /&gt;
			except dns.exception.DNSException:&lt;br /&gt;
				gtfo(3, &amp;quot;UNKNOWN Unknown error&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
			for ip in ipAddress :&lt;br /&gt;
				indirizzo = ip.to_text()&lt;br /&gt;
				if hostIp == indirizzo:&lt;br /&gt;
					log.info( hostIp + &amp;quot;=&amp;quot; + indirizzo)&lt;br /&gt;
					gtfo(0,&amp;quot;OK Your host &amp;quot; + args.hostIp + &amp;quot; with ip &amp;quot; + indirizzo + &amp;quot; is MX for domain &amp;quot; + domain)&lt;br /&gt;
		&lt;br /&gt;
		gtfo(2,&amp;quot;CRITICAL Your host &amp;quot; + hostIp + &amp;quot; is NOT an MX record for domain &amp;quot; + domain)&lt;br /&gt;
				&lt;br /&gt;
&lt;br /&gt;
def parse_args():&lt;br /&gt;
	&amp;quot;&amp;quot;&amp;quot; Parse command-line arguments &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	parser = OptionParser(usage=&amp;#039;usage: %prog [-v|vv|vvv] [options]&amp;#039;,&lt;br /&gt;
						  version=&amp;#039;{0}: v.{1} by {2}&amp;#039;.format(&amp;#039;%prog&amp;#039;, __version__, __author__))&lt;br /&gt;
&lt;br /&gt;
	## Verbosity (want this first, so it&amp;#039;s right after --help and --version)&lt;br /&gt;
	parser.add_option(&amp;#039;-v&amp;#039;, help=&amp;#039;Set verbosity level&amp;#039;,&lt;br /&gt;
					  action=&amp;#039;count&amp;#039;, default=0, dest=&amp;#039;v&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	## CLI arguments specific to this script&lt;br /&gt;
	#group = OptionGroup(parser,&amp;#039;Plugin Options&amp;#039;)&lt;br /&gt;
	#group.add_option(&amp;#039;-x&amp;#039;, &amp;#039;--extra&amp;#039;, help=&amp;#039;Your option here&amp;#039;,&lt;br /&gt;
	#				 default=None)&lt;br /&gt;
	#parser.add_option_group(group)&lt;br /&gt;
	&lt;br /&gt;
	parser.add_option(&amp;#039;-H&amp;#039;, &amp;#039;--hostname&amp;#039;, help=&amp;#039;The hostname/ip to check if its mx record&amp;#039;,&lt;br /&gt;
					  dest=&amp;#039;hostIp&amp;#039;, metavar=&amp;#039;##&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	parser.add_option(&amp;#039;-d&amp;#039;, &amp;#039;--domain&amp;#039;, help=&amp;#039;The domain name to check mx records for.&amp;#039;,&lt;br /&gt;
					  dest=&amp;#039;domain&amp;#039;, metavar=&amp;#039;##&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	## Common CLI arguments&lt;br /&gt;
	#parser.add_option(&amp;#039;-c&amp;#039;, &amp;#039;--critical&amp;#039;, help=&amp;#039;Set the critical threshold. Default: %(default)s&amp;#039;,&lt;br /&gt;
	#				  default=97, type=float, dest=&amp;#039;crit&amp;#039;, metavar=&amp;#039;##&amp;#039;)&lt;br /&gt;
	#parser.add_option(&amp;#039;-w&amp;#039;, &amp;#039;--warning&amp;#039;, help=&amp;#039;Set the warning threshold. Default: %(default)s&amp;#039;,&lt;br /&gt;
	#				  default=95, type=float, dest=&amp;#039;warn&amp;#039;, metavar=&amp;#039;##&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	## Try to parse based on the testargs variable. If it doesn&amp;#039;t exist, use args&lt;br /&gt;
	try:&lt;br /&gt;
		args, args2 = parser.parse_args(testargs.split())&lt;br /&gt;
	except NameError:&lt;br /&gt;
		args, args2 = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
	## Set the logging level based on the -v arg&lt;br /&gt;
	log.getLogger().setLevel([log.ERROR, log.WARN, log.INFO, log.DEBUG][args.v])&lt;br /&gt;
&lt;br /&gt;
	log.debug(&amp;#039;Parsed arguments: {0}&amp;#039;.format(args))&lt;br /&gt;
	log.debug(&amp;#039;Other  arguments: {0}&amp;#039;.format(args2))&lt;br /&gt;
&lt;br /&gt;
	return args, args2&lt;br /&gt;
&lt;br /&gt;
def gtfo(exitcode, message=&amp;#039;&amp;#039;):&lt;br /&gt;
	&amp;quot;&amp;quot;&amp;quot; Exit gracefully with exitcode and (optional) message &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	log.debug(&amp;#039;Exiting with status {0}. Message: {1}&amp;#039;.format(exitcode, message))&lt;br /&gt;
	&lt;br /&gt;
	if message:&lt;br /&gt;
		print(message)&lt;br /&gt;
	exit(exitcode)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
	## Initialize logging before hitting main, in case we need extra debuggability&lt;br /&gt;
	log.basicConfig(level=log.DEBUG, format=&amp;#039;%(asctime)s - %(funcName)s - %(levelname)s - %(message)s&amp;#039;)&lt;br /&gt;
	main()&lt;br /&gt;
&lt;br /&gt;
EOFile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 sudo chmod +x /usr/local/lib/nagios/plugins/check_mx&lt;br /&gt;
&lt;br /&gt;
* Definire i check commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 # check-mx&lt;br /&gt;
define command{&lt;br /&gt;
    command_name    check-mx&lt;br /&gt;
    command_line    /usr/local/lib/nagios/plugins/check_mx -H $HOSTNAME$ -d $ARG1$&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# check-mx-host&lt;br /&gt;
define command{&lt;br /&gt;
    command_name    check-mx-host&lt;br /&gt;
    command_line    /usr/local/lib/nagios/plugins/check_mx -H $ARG1$ -d $ARG2$&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Per testare se l&amp;#039;host oggetto del check è un record mx per il dominio example.com:&lt;br /&gt;
 define service{&lt;br /&gt;
    use                 generic-service&lt;br /&gt;
    host_name           server.example.com&lt;br /&gt;
    service_description MX-EXAMPLED.COM&lt;br /&gt;
    check_command       check-mx!example.com&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Per testare se un host specifico otherserver.example.com è un record mx per il dominio example.com:&lt;br /&gt;
 define service{&lt;br /&gt;
    use                 generic-service&lt;br /&gt;
    host_name           server.example.com&lt;br /&gt;
    service_description MX-EXAMPLE.COM&lt;br /&gt;
    check_command       check-mx!otherserver.example.com!exampledomain.com&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Gabriele.vivinetto</name></author>
	</entry>
</feed>