Code

Again still PoC, but reworked w/o CherryPy
[nagixsc.git] / nagixsc_http2nagios.py
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()