[NEW PATCH] Replace m2crypto: re-add kaxmlrpclib (via gerrit-bot)

Dan Kenigsberg danken at redhat.com
Wed Sep 14 20:00:54 UTC 2011


New patch submitted by Dan Kenigsberg (danken at redhat.com)

You can review this change at: http://gerrit.usersys.redhat.com/799

commit bd0a9443e08dda4af82f824454ecbc87d22940f9
Author: Dan Kenigsberg <danken at redhat.com>
Date:   Mon Mar 7 10:35:08 2011 +0200

    Replace m2crypto: re-add kaxmlrpclib
    
    Change-Id: I4f03ebfe4f9ab8e153fb38cbbacf0f15035b7ccf

diff --git a/vdsm/kaxmlrpclib.py b/vdsm/kaxmlrpclib.py
index 64dd37c..23ec8e6 100644
--- a/vdsm/kaxmlrpclib.py
+++ b/vdsm/kaxmlrpclib.py
@@ -100,76 +100,44 @@ class TcpkeepHTTP(httplib.HTTP):
 
 ###################
 # the same, for ssl
-from M2Crypto import m2xmlrpclib, httpslib as m2httpslib, SSL as m2SSL, m2urllib
+import SecureXMLRPCServer
+import ssl
 
 def SslServer(url, ctx, *args, **kwargs):
     kwargs['transport'] = TcpkeepSafeTransport(ctx)
-    server = m2xmlrpclib.Server(url, *args, **kwargs)
+    server = xmlrpclib.Server(url, *args, **kwargs)
     return server
 
 SslServerProxy = SslServer
 
-class TcpkeepSafeTransport(m2xmlrpclib.SSL_Transport):
-
-    def make_connection(self, host, port, ssl_context):
-        conn = TcpkeepHTTPS(host, port, ssl_context=ssl_context)
-        return conn
-
-    # sadly, m2crypto's SSL_Transport does not even have make_connection()
-    # so I have to copy the whole request() from M2Crypto/m2xmlrpclib.py
-    def request(self, host, handler, request_body, verbose=0):
-        # Handle username and password.
-        user_passwd, host_port = m2urllib.splituser(host)
-        _host, _port = m2urllib.splitport(host_port)
-#        h = httpslib.HTTPS(_host, int(_port), ssl_context=self.ssl_ctx) danken
-        h = self.make_connection(_host, int(_port), ssl_context=self.ssl_ctx)
-        if verbose:
-            h.set_debuglevel(1)
-
-        # What follows is as in xmlrpclib.Transport. (Except the authz bit.)
-        h.putrequest("POST", handler)
-
-        # required by HTTP/1.1
-        h.putheader("Host", _host)
-
-        # required by XML-RPC
-        h.putheader("User-Agent", self.user_agent)
-        h.putheader("Content-Type", "text/xml")
-        h.putheader("Content-Length", str(len(request_body)))
-
-        # Authorisation.
-        if user_passwd is not None:
-            import string, base64
-            auth=string.strip(base64.encodestring(user_passwd))
-            h.putheader('Authorization', 'Basic %s' % auth)
+class TcpkeepSafeTransport(SecureXMLRPCServer.VerifyingSafeTransport):
 
-        h.endheaders()
-
-        if request_body:
-            h.send(request_body)
-
-        errcode, errmsg, headers = h.getreply()
-
-        if errcode != 200:
-            raise xmlrpclib.ProtocolError(
-                host + handler,
-                errcode, errmsg,
-                headers
-                )
-
-        self.verbose = verbose
-        return self.parse_response(h.getfile())
-
-class TcpkeepHTTPSConnection(m2httpslib.HTTPSConnection):
+    def make_connection(self, host):
+        chost, self._extra_headers, x509 = self.get_host_info(host)
+        if hasattr(xmlrpclib.SafeTransport, "single_request"): # Python 2.7
+            return TcpkeepHTTPSConnection(
+                        chost, None, key_file=self.key_file, strict=None,
+                        timeout=CONNECTTIMEOUT,
+                        cert_file=self.cert_file, ca_certs=self.ca_certs,
+                        cert_reqs=self.cert_reqs)
+        else:
+            return TcpkeepHTTPS(
+                        chost, None, key_file=self.key_file,
+                        cert_file=self.cert_file, ca_certs=self.ca_certs,
+                        cert_reqs=self.cert_reqs)
+
+
+class TcpkeepHTTPSConnection(SecureXMLRPCServer.VerifyingHTTPSConnection):
+    def __init__(self, host, port=None, key_file=None, cert_file=None,
+                 strict=None, timeout=CONNECTTIMEOUT,
+                 ca_certs=None, cert_reqs=ssl.CERT_REQUIRED):
+        SecureXMLRPCServer.VerifyingHTTPSConnection.__init__(
+                 self, host, port=port, key_file=key_file, cert_file=cert_file,
+                 strict=strict, timeout=timeout,
+                 ca_certs=ca_certs, cert_reqs=cert_reqs)
 
     def connect(self):
-        # taken from m2httpslib.HTTPSConnection.connect(self)
-        # of m2crypto-0.18. Modified a bit to support also m2crypto-0.16.
-        self.sock = m2SSL.Connection(self.ssl_ctx)
-        if 'session' in dir(self) and self.session:
-            self.sock.set_session(self.session)
-
-        self.sock.settimeout(CONNECTTIMEOUT)
+        SecureXMLRPCServer.VerifyingHTTPSConnection.connect(self)
 
         # after TCP_KEEPIDLE seconds of silence, TCP_KEEPCNT probes would be
         # sent, TCP_KEEPINTVL seconds apart of each other. If all of them fail,
@@ -179,8 +147,7 @@ class TcpkeepHTTPSConnection(m2httpslib.HTTPSConnection):
         self.sock.setsockopt(socket.SOL_TCP, socket.TCP_KEEPINTVL, KEEPINTVL)
         self.sock.setsockopt(socket.SOL_TCP, socket.TCP_KEEPCNT, KEEPCNT)
 
-        self.sock.connect((self.host, self.port))
 
-class TcpkeepHTTPS(m2httpslib.HTTPS):
+class TcpkeepHTTPS(SecureXMLRPCServer.VerifyingHTTPS):
     _connection_class = TcpkeepHTTPSConnection
 
diff --git a/vdsm/vm.py b/vdsm/vm.py
index f270e34..6c7afd8 100644
--- a/vdsm/vm.py
+++ b/vdsm/vm.py
@@ -31,6 +31,7 @@ from logUtils import SimpleLogAdapter
 from copy import deepcopy
 import tempfile
 import libvirt
+import vdscli
 
 """
 A module containing classes needed for VM communication.
@@ -116,13 +117,12 @@ class MigrationSourceThread(threading.Thread):
             self.remotePort = self._dst.split(':')[1]
         except:
             pass
+        serverAddress = self.remoteHost + ':' + self.remotePort
         if config.getboolean('vars', 'ssl'):
-            import vdscli
-            serverAddress = 'https://' + self.remoteHost + ':' + self.remotePort
-            self.destServer = vdscli.connect(serverAddress, useSSL=True)
+            self.destServer = vdscli.connect(serverAddress, useSSL=True,
+                    TransportClass=kaxmlrpclib.TcpkeepSafeTransport)
         else:
-            serverAddress = 'http://' + self.remoteHost + ':' + self.remotePort
-            self.destServer = kaxmlrpclib.Server(serverAddress)
+            self.destServer = kaxmlrpclib.Server('http://' + serverAddress)
         self.log.debug('Destination server is: ' + serverAddress)
         try:
             self.log.debug('Initiating connection with destination')
diff --git a/vdsm_cli/vdscli.py.in b/vdsm_cli/vdscli.py.in
index 2a6ebd9..585ae11 100644
--- a/vdsm_cli/vdscli.py.in
+++ b/vdsm_cli/vdscli.py.in
@@ -82,7 +82,8 @@ def cannonizeAddrPort(addrport=None):
     else:
         return addrport + ':' + d_port
 
-def connect(addrport=None, useSSL=None, tsPath=None):
+def connect(addrport=None, useSSL=None, tsPath=None,
+            TransportClass=SecureXMLRPCServer.VerifyingSafeTransport):
     addrport = cannonizeAddrPort(addrport)
     if useSSL is None: useSSL = d_useSSL
     if tsPath is None: tsPath = d_tsPath
@@ -96,7 +97,7 @@ def connect(addrport=None, useSSL=None, tsPath=None):
             CERTFILE = tsPath + '/certs/vdsmcert.pem'
             CACERT = tsPath + '/certs/cacert.pem'
 
-        transport=SecureXMLRPCServer.VerifyingSafeTransport(key_file=KEYFILE,
+        transport=TransportClass(key_file=KEYFILE,
                         cert_file=CERTFILE, ca_certs=CACERT)
         server = xmlrpclib.ServerProxy('https://%s' % addrport,
                                        transport=transport)




More information about the vdsm-patches mailing list