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