X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=nagixsc_http2nagios.py;h=b0e6fd266e3522e07136c7158d1078cbad5410df;hb=06da2e7c92fffdccdfa3ca89c1e3aaaac37e9eff;hp=f1049576e3dcaa804bf5993feb79cdb24abd123e;hpb=96244f5f2c805eb597c2b083fa5c87a4ae1b36b4;p=nagixsc.git diff --git a/nagixsc_http2nagios.py b/nagixsc_http2nagios.py index f104957..b0e6fd2 100755 --- a/nagixsc_http2nagios.py +++ b/nagixsc_http2nagios.py @@ -1,71 +1,137 @@ #!/usr/bin/python -import cherrypy +import ConfigParser +import base64 +import cgi +import optparse import os import re -import subprocess +import sys -config = { 'server.socket_host': '0.0.0.0', - 'server.socket_port': 15667, - 'log.screen': False, - 'log.access_file': None, - 'log.error_file': None, - } +try: + from hashlib import md5 +except ImportError: + from md5 import md5 -users = { 'nagixsc': '019b0966d98fb71d1a4bc4ca0c81d5cc', # PW: nagixsc - } +############################################################################## -XMLFILESIZE=102400 -X2N='./nagixsc_xml2nagios.py -O passive -vvv -f -' +from nagixsc import * -class CGI2Nagios: - def default(*args, **kwargs): - cmdline = X2N +############################################################################## - if len(args) >= 3: - print 'Ignoring arguments: ', args[2:] +parser = optparse.OptionParser() - if len(args) >= 2: - c_configfile = args[1] - else: - c_configfile = '' +parser.add_option('-c', '', dest='cfgfile', help='Config file') - cherrypy.lib.auth.basic_auth('Nag(ix)SC HTTP', users) +parser.set_defaults(cfgfile='http2nagios.cfg') - print kwargs - if kwargs.has_key('xmlfile'): - if type(kwargs['xmlfile']) == str: - xmltext = kwargs['xmlfile'] - else: - xmltext = kwargs['xmlfile'].file.read(XMLFILESIZE+1) - - if len(xmltext) > 0: - try: - cmd = subprocess.Popen(cmdline.split(' '), stdin=subprocess.PIPE, stdout=subprocess.PIPE) - output = cmd.communicate(xmltext)[0].rstrip() - cherrypy.response.headers['Content-Type'] = 'text/plain' - return output - except OSError: - return 'Nag(IX)SC - Could not execute "%s"' % cmdline - - return 'Nag(IX)SC - OK' - else: - return 'Nag(IX)SC - No data received' - else: - return """ - +(options, args) = parser.parse_args() + +cfgread = ConfigParser.SafeConfigParser() +cfgread.optionxform = str # We need case-sensitive options +cfg_list = cfgread.read(options.cfgfile) + +if cfg_list == []: + print 'Config file "%s" could not be read!' % options.cfgfile + sys.exit(1) + +config = {} +try: + config['ip'] = cfgread.get('server', 'ip') + config['port'] = cfgread.getint('server', 'port') + config['ssl'] = cfgread.getboolean('server', 'ssl') + config['cert'] = cfgread.get('server', 'sslcert') + + config['max_xml_file_size'] = cfgread.get('server', 'max_xml_file_size') + config['checkresultdir'] = cfgread.get('mode_checkresult', 'dir') + +except ConfigParser.NoOptionError, e: + print 'Config file error: %s ' % e + sys.exit(1) + +users = {} +for u in cfgread.options('users'): + users[u] = cfgread.get('users', u) + +############################################################################## + +class HTTP2NagiosHandler(MyHTTPRequestHandler): + + def http_error(self, code, output): + self.send_response(code) + self.send_header('Content-Type', 'text/plain') + self.end_headers() + self.wfile.write(output) + return + + + def do_GET(self): + self.send_response(200) + self.send_header('Content-Type', 'text/html') + self.end_headers() + self.wfile.write('''
filename:
- """ + ''') + return + + + def do_POST(self): + # Check Basic Auth + try: + authdata = base64.b64decode(self.headers['Authorization'].split(' ')[1]).split(':') + if not users[authdata[0]] == md5(authdata[1]).hexdigest(): + raise Exception + except: + self.send_response(401) + self.send_header('WWW-Authenticate', 'Basic realm="Nag(ix)SC HTTP Push"') + self.send_header('Content-Type', 'text/plain') + self.end_headers() + self.wfile.write('Sorry! No action without login!') + return + + (ctype,pdict) = cgi.parse_header(self.headers.getheader('content-type')) + if ctype == 'multipart/form-data': + query = cgi.parse_multipart(self.rfile, pdict) + xmltext = query.get('xmlfile')[0] + + if len(xmltext) > 0: + doc = read_xml_from_string(xmltext) + checks = xml_to_dict(doc) + + (count_services, count_failed, list_failed) = dict2out_checkresult(checks, xml_get_timestamp(doc), config['checkresultdir'], 0) + + if count_failed < count_services: + self.send_response(200) + self.send_header('Content-Type', 'text/plain') + self.end_headers() + self.wfile.write('Wrote %s check results, %s failed' % (count_services, count_failed)) + return + else: + self.http_error(501, 'Could not write all %s check results' % count_services) + return + + else: + self.http_error(502, 'Nag(IX)SC - No data received') + return + + - default.exposed = True +def main(): + if config['ssl'] and not os.path.isfile(config['cert']): + print 'SSL certificate "%s" not found!' % config['cert'] + sys.exit(127) -print 'curl -v -u nagixsc:nagixsc -F \'xmlfile=@xml/nagixsc.xml\' http://127.0.0.1:15667/foo/\n\n\n\n' + server = MyHTTPServer((config['ip'], config['port']), HTTP2NagiosHandler, ssl=config['ssl'], sslpemfile=config['cert']) + try: + server.serve_forever() + except: + server.socket.close() -cherrypy.config.update(config) -cherrypy.tree.mount(CGI2Nagios(), '') -cherrypy.quickstart(config=config) +if __name__ == '__main__': + print 'curl -v -u nagixsc:nagixsc -F \'xmlfile=@xml/nagixsc.xml\' http://127.0.0.1:15667/\n\n' + main()