From: Sven Velt Date: Mon, 14 Dec 2009 23:07:43 +0000 (+0100) Subject: Still PoC, but reworked w/o CherryPy X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=842bc2cc5727b101fe859ba73fb8f717c093bce9;p=nagixsc.git Still PoC, but reworked w/o CherryPy --- diff --git a/nagixsc_conf2http.py b/nagixsc_conf2http.py index 96d86ac..4200af2 100755 --- a/nagixsc_conf2http.py +++ b/nagixsc_conf2http.py @@ -1,15 +1,14 @@ #!/usr/bin/python -import cherrypy +import BaseHTTPServer +import base64 +import md5 import os import re import subprocess -config = { 'server.socket_host': '0.0.0.0', - 'server.socket_port': 15666, - 'log.screen': False, - 'log.access_file': None, - 'log.error_file': None, +config = { 'ip': '', + 'port': 15666, } users = { 'nagixsc': '019b0966d98fb71d1a4bc4ca0c81d5cc', # PW: nagixsc @@ -17,56 +16,94 @@ users = { 'nagixsc': '019b0966d98fb71d1a4bc4ca0c81d5cc', # PW: nagixsc CONFDIR='./examples' C2X='./nagixsc_conf2xml.py' -class Conf2CGI: - def default(*args, **kwargs): + +class Conf2HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): + + def http_error(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): cmdline = C2X - if len(args) >= 5: - print 'Ignoring arguments: ', args[4:] + path = self.path.split('/') - if len(args) >= 4: - c_service = args[3] + # Check Basic Auth + try: + authdata = base64.b64decode(self.headers['Authorization'].split(' ')[1]).split(':') + if not users[authdata[0]] == md5.md5(authdata[1]).hexdigest(): + raise Exception + except: + self.send_response(401) + self.send_header('WWW-Authenticate', 'Basic realm="Nag(ix)SC"') + self.send_header('Content-Type', 'text/plain') + self.end_headers() + self.wfile.write('Sorry! No action without login!') + return + + + if len(path) >= 4: + service = path[3] else: - c_service = '' + service = '' - if len(args) >= 3: - c_host = args[2] + if len(path) >= 3: + host = path[2] else: - c_host = '' + host = '' - if len(args) >= 2: - c_configfile = args[1] + if len(path) >= 2: + configfile = path[1] else: - c_configfile = '' - print 'No config file specified!' - - if c_configfile: - cherrypy.lib.auth.basic_auth('Nag(ix)SC HTTP', users) - - if re.search('\.\.', c_configfile): - return 'Found ".." in config file name' - if not re.search('^[a-zA-Z0-9-_\.]+$', c_configfile): - return 'Config file name contains invalid characters' - cmdline += ' -c ' + os.path.join(CONFDIR, c_configfile) - - if c_host: - cmdline += ' -H %s' % c_host - if c_service: - cmdline += ' -D %s' % c_service - try: - cmd = subprocess.Popen(cmdline.split(' '), stdout=subprocess.PIPE) - output = cmd.communicate()[0].rstrip() - except OSError: - return 'Could not execute "%s"' % cmdline - - cherrypy.response.headers['Content-Type'] = 'text/xml' - return output + configfile ='' + + if re.search('\.\.', configfile): + http_error(500, 'Found ".." in config file name') + return + if configfile and not re.search('^[a-zA-Z0-9-_\.]+$', configfile): + http_error(500, 'Config file name contains invalid characters') + return + + if configfile: + configfile += '.conf' + cmdline += ' -c ' + os.path.join(CONFDIR, configfile) + + if host: + cmdline += ' -H %s' % host + if service: + cmdline += ' -D %s' % service + + try: + cmd = subprocess.Popen(cmdline.split(' '), stdout=subprocess.PIPE) + output = cmd.communicate()[0].rstrip() + retcode = cmd.returncode + except OSError: + http_error(500, 'Could not execute "%s"' % cmdline) + return + + if retcode == 0: + self.send_response(200) + self.send_header('Content-Type', 'text/xml') + self.end_headers() + self.wfile.write(output) else: - return '42' + http_error(500, output) + + return + + - default.exposed = True +def main(): + try: + server = BaseHTTPServer.HTTPServer((config['ip'], config['port']), Conf2HTTPHandler) + server.serve_forever() + except: + server.socket.close() -cherrypy.config.update(config) -cherrypy.tree.mount(Conf2CGI(), '') -cherrypy.quickstart(config=config) +if __name__ == '__main__': + main()