1 #!/usr/bin/python
3 import BaseHTTPServer
4 import base64
5 import cgi
6 import md5
7 import os
8 import re
9 import subprocess
11 config = { 'ip': '',
12 'port': 15667,
13 }
15 users = { 'nagixsc': '019b0966d98fb71d1a4bc4ca0c81d5cc', # PW: nagixsc
16 }
18 XMLFILESIZE=102400
19 X2N='./nagixsc_xml2nagios.py -O passive -vvv -f -'
21 class HTTP2NagiosHandler(BaseHTTPServer.BaseHTTPRequestHandler):
23 def http_error(code, output):
24 self.send_response(code)
25 self.send_header('Content-Type', 'text/plain')
26 self.end_headers()
27 self.wfile.write(output)
28 return
31 def do_GET(self):
32 self.send_response(200)
33 self.send_header('Content-Type', 'text/html')
34 self.end_headers()
35 self.wfile.write(''' <html><body>
36 <form action="." method="post" enctype="multipart/form-data">
37 filename: <input type="file" name="xmlfile" /><br />
38 <input type="submit" />
39 </form>
40 </body></html>
41 ''')
42 return
45 def do_POST(self):
46 cmdline = X2N
48 # Check Basic Auth
49 try:
50 authdata = base64.b64decode(self.headers['Authorization'].split(' ')[1]).split(':')
51 if not users[authdata[0]] == md5.md5(authdata[1]).hexdigest():
52 raise Exception
53 except:
54 self.send_response(401)
55 self.send_header('WWW-Authenticate', 'Basic realm="Nag(ix)SC HTTP Push"')
56 self.send_header('Content-Type', 'text/plain')
57 self.end_headers()
58 self.wfile.write('Sorry! No action without login!')
59 return
61 (ctype,pdict) = cgi.parse_header(self.headers.getheader('content-type'))
62 if ctype == 'multipart/form-data':
63 query = cgi.parse_multipart(self.rfile, pdict)
64 xmltext = query.get('xmlfile')[0]
66 if len(xmltext) > 0:
67 try:
68 cmd = subprocess.Popen(cmdline.split(' '), stdin=subprocess.PIPE, stdout=subprocess.PIPE)
69 output = cmd.communicate(xmltext)[0].rstrip()
70 retcode = cmd.returncode
72 if retcode == 0:
73 self.send_response(200)
74 self.send_header('Content-Type', 'text/plain')
75 self.end_headers()
76 self.wfile.write(output)
77 return
78 else:
79 http_error(500, output)
80 return
82 except OSError:
83 http_error(500, 'Nag(IX)SC - Could not execute "%s"' % cmdline)
84 return
86 else:
87 http_error(500, 'Nag(IX)SC - No data received')
88 return
92 def main():
93 try:
94 server = BaseHTTPServer.HTTPServer((config['ip'], config['port']), HTTP2NagiosHandler)
95 server.serve_forever()
96 except:
97 server.socket.close()
99 if __name__ == '__main__':
100 print 'curl -v -u nagixsc:nagixsc -F \'xmlfile=@xml/nagixsc.xml\' http://127.0.0.1:15667/\n\n'
101 main()