Code

Fix: (Now real) random filenames in checkresultdir
[nagixsc.git] / nagixsc / __init__.py
index 182e7332b7c6d4704533303ac352e4c39c314ee1..8f886ac5a9e46c8a75ddc2a2c449204199aabdc2 100644 (file)
@@ -13,6 +13,7 @@ import socket
 import string
 import subprocess
 import sys
+import urllib2
 
 def debug(level, verb, string):
        if level <= verb:
@@ -216,12 +217,13 @@ def dict2out_passive(checks, xmltimestamp, opt_pipe, opt_verb=0):
        return count_services
 
 
-def dict2out_checkresult(checks, xmltimestamp, opt_checkresultdir, opt_verb):
+def dict2out_checkresult(checks, xmltimestamp, opt_checkresultdir, opt_verb=0):
        count_services = 0
        count_failed = 0
        list_failed = []
        chars = string.letters + string.digits
        ctimestamp = datetime.datetime.now().ctime()
+       random.seed()
 
        for check in checks:
                count_services += 1
@@ -254,7 +256,6 @@ def dict2out_checkresult(checks, xmltimestamp, opt_checkresultdir, opt_verb):
 
 def read_xml(options):
        if options.url != None:
-               import urllib2
 
                if options.httpuser and options.httppasswd:
                        passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
@@ -285,6 +286,28 @@ def read_xml_from_string(content):
        return libxml2.parseDoc(content)
 
 
+def write_xml(xmldoc, outfile, httpuser=None, httppasswd=None):
+       if outfile.startswith('http'):
+               (headers, body) = encode_multipart(xmldoc, httpuser, httppasswd)
+
+               try:
+                       response = urllib2.urlopen(urllib2.Request(outfile, body, headers)).read()
+               except urllib2.HTTPError, error:
+                       print error
+                       sys.exit(11)
+               except urllib2.URLError, error:
+                       print error.reason[1]
+                       sys.exit(12)
+
+               print response
+
+       elif outfile == '-':
+               xmldoc.saveFormatFile('-', format=1)
+
+       else:
+               xmldoc.saveFile(outfile)
+
+
 ##############################################################################
 
 def xml_check_version(xmldoc):
@@ -446,7 +469,7 @@ def reset_future_timestamp(timestamp, now):
 
 ##############################################################################
 
-def encode_multipart(xmldoc, httpuser, httppasswd):
+def encode_multipart(xmldoc, httpuser=None, httppasswd=None):
        BOUNDARY = mimetools.choose_boundary()
        CRLF = '\r\n'
        L = []
@@ -544,3 +567,86 @@ class MyHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
 
 ##############################################################################
 
+def prepare_socket(socket_path):
+       try:
+               if socket_path.startswith('/'):
+                       s_family=socket.AF_UNIX
+                       s_sockaddr = socket_path
+               elif socket_path.startswith('unix:'):
+                       s_family=socket.AF_UNIX
+                       s_sockaddr = socket_path[5:]
+               elif socket_path.find(':') >= 0:
+                       s_port = socket_path.split(':')[-1]
+                       s_host = ':'.join(socket_path.split(':')[:-1])
+                       if s_host.startswith('[') and s_host.endswith(']'):
+                               s_host = s_host[1:-1]
+                       (s_family, s_socktype, s_proto, s_canonname, s_sockaddr) = socket.getaddrinfo(s_host, s_port, 0, socket.SOCK_STREAM)[0]
+               else:
+                       return None
+       except:
+               return None
+
+       return (s_family, s_sockaddr)
+
+
+def read_socket(s_opts, commands):
+       # print '%20s => %s %s' % (sock, s_family, s_sockaddr)
+
+       s = socket.socket(s_opts[0], socket.SOCK_STREAM)
+       s.connect(s_opts[1])
+       for line in commands:
+               if not line.endswith('\n'):
+                       line += '\n'
+               s.send(line)
+       s.shutdown(socket.SHUT_WR)
+
+       answer = ''
+       try:
+               while True:
+                       s.settimeout(10)
+                       data = s.recv(32768)
+                       if data:
+                               answer += data
+                       else:
+                               break
+       except socket.timeout:
+               return ''
+
+       return answer
+
+
+def livestatus2dict(s_opts, host=None, service=None):
+       checks = []
+
+       # Get host information only if NO service specified
+       if not service:
+               commands = []
+               commands.append('GET hosts\n')
+               commands.append('Columns: name state plugin_output long_plugin_output last_check\n')
+               if host:
+                       commands.append('Filter: name = %s' % host)
+               answer = read_socket(s_opts, commands)
+
+               for line in answer.split('\n')[:-1]:
+                       line = line.split(';')
+                       checks.append({'host_name':line[0], 'service_description':None, 'returncode':line[1], 'output':'\n'.join([line[2], line[3]]).rstrip(), 'timestamp':str(line[4])})
+
+       # Get service information(s)
+       commands = []
+       commands.append('GET services\n')
+       commands.append('Columns: host_name description state plugin_output long_plugin_output last_check\n')
+       if host:
+               commands.append('Filter: host_name = %s' % host)
+       if service:
+               commands.append('Filter: description = %s' % service)
+
+       answer = read_socket(s_opts, commands)
+
+       for line in answer.split('\n')[:-1]:
+               line = line.split(';')
+               checks.append({'host_name':line[0], 'service_description':line[1], 'returncode':line[2], 'output':'\n'.join([line[3], line[4]]).rstrip(), 'timestamp':str(line[5])})
+                               
+
+       return checks
+##############################################################################
+