Code

Auto-detect (Forking|Threading)MixIn for HTTP services
[nagixsc.git] / nagixsc / __init__.py
index 827a104b26c849d855a4e919d3afcad22e342484..a2435134dbb5500b37acde1b917fe3155aa2fd1c 100644 (file)
@@ -2,7 +2,6 @@ import BaseHTTPServer
 import ConfigParser
 import SocketServer
 import base64
-import datetime
 import libxml2
 import mimetools
 import os
@@ -13,6 +12,7 @@ import socket
 import string
 import subprocess
 import sys
+import time
 import urllib2
 
 def debug(level, verb, string):
@@ -116,7 +116,7 @@ def exec_check(host_name, service_descr, cmdline, cmdprefix='', timeout=None, ti
                except OSError:
                        pass
 
-       check['timestamp'] = datetime.datetime.now().strftime('%s')
+       check['timestamp'] = str(long(time.time()))
        return check
 
 
@@ -211,7 +211,7 @@ def dict2out_passive(checks, xmltimestamp, opt_pipe, opt_verb=0):
        FORMAT_HOST = '[%s] PROCESS_HOST_CHECK_RESULT;%s;%s;%s'
        FORMAT_SERVICE = '[%s] PROCESS_SERVICE_CHECK_RESULT;%s;%s;%s;%s'
        count_services = 0
-       now = datetime.datetime.now().strftime('%s')
+       now = str(long(time.time()))
 
        # Prepare
        if opt_verb <= 2:
@@ -252,7 +252,7 @@ def dict2out_checkresult(checks, xmltimestamp, opt_checkresultdir, opt_verb=0):
        count_failed = 0
        list_failed = []
        chars = string.letters + string.digits
-       ctimestamp = datetime.datetime.now().ctime()
+       ctimestamp = time.ctime()
        random.seed()
 
        for check in checks:
@@ -373,7 +373,7 @@ def xml_get_timestamp(xmldoc):
 
 def xml_to_dict(xmldoc, verb=0, hostfilter=None, servicefilter=None):
        checks = []
-       now = int(datetime.datetime.now().strftime('%s'))
+       now = long(time.time())
        filetimestamp = reset_future_timestamp(xml_get_timestamp(xmldoc), now)
 
        if hostfilter:
@@ -449,7 +449,7 @@ def xml_from_dict(checks, encoding='base64'):
        xmldoc = libxml2.newDoc('1.0')
        xmlroot = xmldoc.newChild(None, 'nagixsc', None)
        xmlroot.setProp('version', '1.0')
-       xmltimestamp = xmlroot.newChild(None, 'timestamp', datetime.datetime.now().strftime('%s'))
+       xmltimestamp = xmlroot.newChild(None, 'timestamp', str(long(time.time())))
 
        for entry in db:
                check = entry[1]
@@ -572,23 +572,34 @@ def daemonize(pidfile=None, stdin='/dev/null', stdout='/dev/null', stderr='/dev/
 
 ##############################################################################
 
-class MyHTTPServer(SocketServer.ForkingMixIn, BaseHTTPServer.HTTPServer):
+if 'ForkingMixIn' in SocketServer.__dict__:
+       MixInClass = SocketServer.ForkingMixIn
+else:
+       MixInClass = SocketServer.ThreadingMixIn
+
+class MyHTTPServer(MixInClass, BaseHTTPServer.HTTPServer):
        def __init__(self, server_address, HandlerClass, ssl=False, sslpemfile=None):
+               SocketServer.BaseServer.__init__(self, server_address, HandlerClass)
+
                if ssl:
-                       # FIXME: SSL is in Py2.6
                        try:
-                               from OpenSSL import SSL
+                               import ssl
+                               self.socket = ssl.wrap_socket(socket.socket(self.address_family, self.socket_type), keyfile=sslpemfile, certfile=sslpemfile)
+
                        except:
-                               print 'No Python OpenSSL wrapper/bindings found!'
-                               sys.exit(127)
-
-                       SocketServer.BaseServer.__init__(self, server_address, HandlerClass)
-                       context = SSL.Context(SSL.SSLv23_METHOD)
-                       context.use_privatekey_file (sslpemfile)
-                       context.use_certificate_file(sslpemfile)
-                       self.socket = SSL.Connection(context, socket.socket(self.address_family, self.socket_type))
+
+                               try:
+                                       from OpenSSL import SSL
+                               except:
+                                       print 'No Python SSL or OpenSSL wrapper/bindings found!'
+                                       sys.exit(127)
+
+                               context = SSL.Context(SSL.SSLv23_METHOD)
+                               context.use_privatekey_file (sslpemfile)
+                               context.use_certificate_file(sslpemfile)
+                               self.socket = SSL.Connection(context, socket.socket(self.address_family, self.socket_type))
+
                else:
-                       SocketServer.BaseServer.__init__(self, server_address, HandlerClass)
                        self.socket = socket.socket(self.address_family, self.socket_type)
 
                self.server_bind()