#!/usr/bin/env python # Copyright (c) 2010-2012 Nagios Enterprises, LLC. # Written by: Scott Wilkerson (nagios@nagios.org) import optparse, sys, urllib, urllib2, cgi, string, xml.dom.minidom from xml.dom.minidom import parseString, parse class check_reflector: options = [ optparse.make_option('-a', '--apikey', action="store", dest="token", help="The api key from the reflector server."), optparse.make_option('-H', '--hostname', '--host', action="store", dest="hostname", help="hostname to get results for"), optparse.make_option('-s', '--servicename', '--service', action="store", dest="servicename", help="servicename to get results for"), optparse.make_option('-r', '--reflector', action="store", dest="reflector", help="reflector server", default="reflector.nagios.com"), optparse.make_option('-S', '--secure', action="store_true", dest="secure", help="secure connection to server", default=False), optparse.make_option('-p', '--port', action="store", dest="port", help="reflector port"), optparse.make_option('-P', '--path', action="store", dest="path", help="reflector custom path", default="/nrdp/"), optparse.make_option('-w', '--warning', action="store", dest="warning", help="age in seconds of last update before marking warning", default="0"), optparse.make_option('-c', '--critical', action="store", dest="critical", help="age in seconds of last update before marking critical", default="0"), optparse.make_option('-m', '--message', action="store", dest="message", help="Custom message to prepend to output if warning or critical is reached", default=""), ] def run(self): parser = optparse.OptionParser(option_list=self.options) (options, args) = parser.parse_args() if not options.hostname: parser.error('You must specify a hostname.') if not options.token: parser.error('You must specify an API key for the reflector server.') if not options.servicename: options.servicename = '' try: self.setup(options, args) sys.exit() except Exception, e: sys.exit(e) def getText(self,nodelist): rc = [] for node in nodelist: if node.nodeType == node.TEXT_NODE: rc.append(node.data) return ''.join(rc) def post_data(self, options): url_string = ("http://","https://")[options.secure] url_string += options.reflector url_string += ("",":"+str(options.port))[options.port is not None] url_string += options.path params = urllib.urlencode({'token': options.token,'cmd': 'getcheck', 'host': options.hostname, 'service': options.servicename}); opener = urllib.FancyURLopener() try: f = opener.open(url_string, params) result = parseString(f.read().strip()) f.close() except Exception, e: print "Cannot connect to url." sys.exit(e) xmlstatus=self.getText(result.getElementsByTagName('status')[0].childNodes) output="" if xmlstatus == "0" or xmlstatus == "1": received=self.getText(result.getElementsByTagName('received')[0].childNodes) if options.critical !="0" and int(received) > int(options.critical): state = ("1","2")[options.servicename!=""] output=("CRITICAL: Last data received "+received+" seconds ago - ",options.message)[options.message is not ""] elif options.warning !="0" and int(received) > int(options.warning): state = ("1","2")[options.servicename!=""] output=("WARNING: Last data received "+received+" seconds ago - ",options.message)[options.message is not ""] else: state=self.getText(result.getElementsByTagName('state')[0].childNodes) output+=self.getText(result.getElementsByTagName('output')[0].childNodes) elif xmlstatus == "2": state="3" output=self.getText(result.getElementsByTagName('message')[0].childNodes) else: state="3" output="An unknown error occured" print output sys.exit(int(state)) def setup(self, options, args): self.post_data(options) if __name__ == "__main__": check_reflector().run()