Code

e0a639b3218cd6595624b13cbe46fb358ddf4052
[nagixsc.git] / nagixsc_http2nagios.py
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()