X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=nagixsc_http2nagios.py;h=085609d8d7fb8e12d9e83ac9c23d6fa83ff0af84;hb=4d0f7d8dac760342cf06ead0dbc4df753f51dfec;hp=f1049576e3dcaa804bf5993feb79cdb24abd123e;hpb=96244f5f2c805eb597c2b083fa5c87a4ae1b36b4;p=nagixsc.git diff --git a/nagixsc_http2nagios.py b/nagixsc_http2nagios.py index f104957..085609d 100755 --- a/nagixsc_http2nagios.py +++ b/nagixsc_http2nagios.py @@ -1,71 +1,135 @@ #!/usr/bin/python -import cherrypy +import BaseHTTPServer +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 -' +parser = optparse.OptionParser() -class CGI2Nagios: - def default(*args, **kwargs): - cmdline = X2N +parser.add_option('-c', '', dest='cfgfile', help='Config file') - if len(args) >= 3: - print 'Ignoring arguments: ', args[2:] +parser.set_defaults(cfgfile='http2nagios.cfg') - if len(args) >= 2: - c_configfile = args[1] - else: - c_configfile = '' - - cherrypy.lib.auth.basic_auth('Nag(ix)SC HTTP', users) - - 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['max_xml_file_size'] = cfgread.get('server', 'max_xml_file_size') + config['xml2nagios_cmdline'] = cfgread.get('server', 'xml2nagios_cmdline') + +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(BaseHTTPServer.BaseHTTPRequestHandler): + + 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): + cmdline = config['xml2nagios_cmdline'] + + # 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: + try: + cmd = subprocess.Popen(cmdline.split(' '), stdin=subprocess.PIPE, stdout=subprocess.PIPE) + output = cmd.communicate(xmltext)[0].rstrip() + retcode = cmd.returncode + + if retcode == 0: + self.send_response(200) + self.send_header('Content-Type', 'text/plain') + self.end_headers() + self.wfile.write(output) + return + else: + http_error(500, output) + return + + except OSError: + http_error(500, 'Nag(IX)SC - Could not execute "%s"' % cmdline) + return + + else: + http_error(500, 'Nag(IX)SC - No data received') + return + - default.exposed = True -print 'curl -v -u nagixsc:nagixsc -F \'xmlfile=@xml/nagixsc.xml\' http://127.0.0.1:15667/foo/\n\n\n\n' +def main(): + try: + server = BaseHTTPServer.HTTPServer((config['ip'], config['port']), HTTP2NagiosHandler) + 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()