From: Thierry Parmentelat Date: Thu, 31 Mar 2016 17:31:37 +0000 (+0200) Subject: deeper pass on xmlrpclib vs xmlrpc.client as well as configparser X-Git-Tag: sfa-3.1-21~24 X-Git-Url: http://git.onelab.eu/?p=sfa.git;a=commitdiff_plain;h=06768bd605e5d47fadfc90a35c74e30f267226a5 deeper pass on xmlrpclib vs xmlrpc.client as well as configparser --- diff --git a/sfa/client/manifolduploader.py b/sfa/client/manifolduploader.py index 66874bae..a9dd29d7 100755 --- a/sfa/client/manifolduploader.py +++ b/sfa/client/manifolduploader.py @@ -30,9 +30,10 @@ import ssl try: turn_off_server_verify = { 'context' : ssl._create_unverified_context() } except: turn_off_server_verify = {} -import xmlrpclib import getpass +from sfa.util.py23 import xmlrpc_client + class ManifoldUploader: """A utility class for uploading delegated credentials to a manifold/MySlice infrastructure""" @@ -79,12 +80,12 @@ class ManifoldUploader: # if not self._proxy: # url=self.url() # self.logger.info("Connecting manifold url %s"%url) -# self._proxy = xmlrpclib.ServerProxy(url, allow_none = True) +# self._proxy = xmlrpc_client.ServerProxy(url, allow_none = True) # return self._proxy url=self.url() self.logger.debug("Connecting manifold url %s"%url) - proxy = xmlrpclib.ServerProxy(url, allow_none = True, - **turn_off_server_verify) + proxy = xmlrpc_client.ServerProxy(url, allow_none = True, + **turn_off_server_verify) return proxy diff --git a/sfa/client/sfaserverproxy.py b/sfa/client/sfaserverproxy.py index ca62ddf0..333984c6 100644 --- a/sfa/client/sfaserverproxy.py +++ b/sfa/client/sfaserverproxy.py @@ -5,9 +5,10 @@ import ssl try: turn_off_server_verify = { 'context' : ssl._create_unverified_context() } except: turn_off_server_verify = {} -import xmlrpclib from httplib import HTTPS, HTTPSConnection +from sfa.util.py23 import xmlrpc_client + try: from sfa.util.sfalogging import logger except: @@ -23,11 +24,11 @@ except: class ServerException(Exception): pass -class ExceptionUnmarshaller(xmlrpclib.Unmarshaller): +class ExceptionUnmarshaller(xmlrpc_client.Unmarshaller): def close(self): try: - return xmlrpclib.Unmarshaller.close(self) - except xmlrpclib.Fault as e: + return xmlrpc_client.Unmarshaller.close(self) + except xmlrpc_client.Fault as e: raise ServerException(e.faultString) ## @@ -37,10 +38,10 @@ class ExceptionUnmarshaller(xmlrpclib.Unmarshaller): # targetting only python-2.7 we can get rid of some older code -class XMLRPCTransport(xmlrpclib.Transport): +class XMLRPCTransport(xmlrpc_client.Transport): def __init__(self, key_file = None, cert_file = None, timeout = None): - xmlrpclib.Transport.__init__(self) + xmlrpc_client.Transport.__init__(self) self.timeout=timeout self.key_file = key_file self.cert_file = cert_file @@ -74,21 +75,21 @@ class XMLRPCTransport(xmlrpclib.Transport): def getparser(self): unmarshaller = ExceptionUnmarshaller() - parser = xmlrpclib.ExpatParser(unmarshaller) + parser = xmlrpc_client.ExpatParser(unmarshaller) return parser, unmarshaller -class XMLRPCServerProxy(xmlrpclib.ServerProxy): +class XMLRPCServerProxy(xmlrpc_client.ServerProxy): def __init__(self, url, transport, allow_none=True, verbose=False): # remember url for GetVersion # xxx not sure this is still needed as SfaServerProxy has this too - self.url=url - xmlrpclib.ServerProxy.__init__(self, url, transport, allow_none=allow_none, - verbose=verbose, + self.url = url + xmlrpc_client.ServerProxy.__init__(self, url, transport, allow_none=allow_none, + verbose=verbose, **turn_off_server_verify) def __getattr__(self, attr): logger.debug ("xml-rpc %s method:%s" % (self.url, attr)) - return xmlrpclib.ServerProxy.__getattr__(self, attr) + return xmlrpc_client.ServerProxy.__getattr__(self, attr) ########## the object on which we can send methods that get sent over xmlrpc class SfaServerProxy: @@ -99,7 +100,7 @@ class SfaServerProxy: self.certfile = certfile self.verbose = verbose self.timeout = timeout - # an instance of xmlrpclib.ServerProxy + # an instance of xmlrpc_client.ServerProxy transport = XMLRPCTransport(keyfile, certfile, timeout) self.serverproxy = XMLRPCServerProxy(url, transport, allow_none=True, verbose=verbose) diff --git a/sfa/dummy/dummy_testbed_api_client.py b/sfa/dummy/dummy_testbed_api_client.py index 4b3989ef..57a04825 100644 --- a/sfa/dummy/dummy_testbed_api_client.py +++ b/sfa/dummy/dummy_testbed_api_client.py @@ -1,11 +1,11 @@ from __future__ import print_function -import xmlrpclib from datetime import datetime import time +from sfa.util.py23 import xmlrpc_client dummy_url = "http://localhost:8080" -dummy_api = xmlrpclib.ServerProxy(dummy_url) +dummy_api = xmlrpc_client.ServerProxy(dummy_url) # Add a user: my_user_id = dummy_api.AddUser({'email': 'john.doe@test.net', 'user_name': 'john.doe', 'keys': ['copy here your ssh-rsa public key']}) diff --git a/sfa/dummy/dummyshell.py b/sfa/dummy/dummyshell.py index 50e78ac5..67007d7e 100644 --- a/sfa/dummy/dummyshell.py +++ b/sfa/dummy/dummyshell.py @@ -1,9 +1,9 @@ import sys -import xmlrpclib import socket from urlparse import urlparse from sfa.util.sfalogging import logger +from sfa.util.py23 import xmlrpc_client class DummyShell: """ @@ -21,7 +21,7 @@ class DummyShell: def __init__ ( self, config ) : url = config.SFA_DUMMY_URL - self.proxy = xmlrpclib.Server(url, verbose = False, allow_none = True) + self.proxy = xmlrpc_client.ServerProxy(url, verbose = False, allow_none = True) def __getattr__(self, name): def func(*args, **kwds): diff --git a/sfa/federica/fdshell.py b/sfa/federica/fdshell.py index aefbdd1e..1e7349c5 100644 --- a/sfa/federica/fdshell.py +++ b/sfa/federica/fdshell.py @@ -1,6 +1,5 @@ -import xmlrpclib - from sfa.util.sfalogging import logger +from sfa.util.py23 import xmlrpc_client class FdShell: """ @@ -20,9 +19,9 @@ class FdShell: def __init__ ( self, config ) : url=config.SFA_FEDERICA_URL # xxx not sure if java xmlrpc has support for None - # self.proxy = xmlrpclib.Server(url, verbose = False, allow_none = True) + # self.proxy = xmlrpc_client.ServerProxy(url, verbose = False, allow_none = True) # xxx turn on verbosity - self.proxy = xmlrpclib.Server(url, verbose = True) + self.proxy = xmlrpc_client.ServerProxy(url, verbose = True) # xxx get credentials from the config ? # right now basic auth data goes into the URL diff --git a/sfa/managers/component_manager_pl.py b/sfa/managers/component_manager_pl.py index 85188396..ba9b7ebf 100644 --- a/sfa/managers/component_manager_pl.py +++ b/sfa/managers/component_manager_pl.py @@ -1,7 +1,6 @@ -import xmlrpclib - from sfa.util.faults import SliverDoesNotExist from sfa.util.version import version_core +from sfa.util.py23 import xmlrpc_client from sfa.trust.sfaticket import SfaTicket @@ -66,7 +65,7 @@ def redeem_ticket(api, ticket_string): raise SliverDoesNotExist(slicename) # convert ticket to format nm is used to - nm_ticket = xmlrpclib.dumps((ticket.attributes,), methodresponse=True) + nm_ticket = xmlrpc_client.dumps((ticket.attributes,), methodresponse=True) api.driver.nodemanager.AdminTicket(nm_ticket) diff --git a/sfa/nitos/nitosshell.py b/sfa/nitos/nitosshell.py index 2636e6de..cf543f29 100644 --- a/sfa/nitos/nitosshell.py +++ b/sfa/nitos/nitosshell.py @@ -1,9 +1,9 @@ import sys -import xmlrpclib import socket from urlparse import urlparse from sfa.util.sfalogging import logger +from sfa.util.py23 import xmlrpc_client class NitosShell: """ @@ -26,7 +26,7 @@ class NitosShell: # use the 'capability' auth mechanism for higher performance when the PLC db is local def __init__ ( self, config ) : url = config.SFA_NITOS_URL - self.proxy = xmlrpclib.Server(url, verbose = False, allow_none = True) + self.proxy = xmlrpc_client.ServerProxy(url, verbose = False, allow_none = True) def __getattr__(self, name): def func(*args, **kwds): diff --git a/sfa/openstack/shell.py b/sfa/openstack/shell.py index acb9cff5..e31be9dc 100644 --- a/sfa/openstack/shell.py +++ b/sfa/openstack/shell.py @@ -1,5 +1,4 @@ import sys -import xmlrpclib import socket import gettext from urlparse import urlparse diff --git a/sfa/planetlab/nodemanager.py b/sfa/planetlab/nodemanager.py index 1671b9d6..12e7f22e 100644 --- a/sfa/planetlab/nodemanager.py +++ b/sfa/planetlab/nodemanager.py @@ -24,6 +24,8 @@ class NodeManager: (fd, filename) = tempfile.mkstemp(dir=path) scriptname = script_path + os.sep + filename.split(os.sep)[-1:][0] # define the script to execute + # when providing support for python3 wrt xmlrpclib + # looks safer to keep things as-is script = """ #!%(python)s import xmlrpclib diff --git a/sfa/server/sfaapi.py b/sfa/server/sfaapi.py index 9911e466..499e3bdb 100644 --- a/sfa/server/sfaapi.py +++ b/sfa/server/sfaapi.py @@ -19,7 +19,7 @@ from sfa.storage.alchemy import alchemy #################### class SfaApi (XmlrpcApi): """ - An SfaApi instance is a basic xmlrcp service + An SfaApi instance is a basic xmlrpc service augmented with the local cryptographic material and hrn It also has the notion of its own interface (a string describing diff --git a/sfa/server/threadedserver.py b/sfa/server/threadedserver.py index daf40e45..7a26ad27 100644 --- a/sfa/server/threadedserver.py +++ b/sfa/server/threadedserver.py @@ -11,7 +11,6 @@ import socket import traceback import threading from Queue import Queue -import xmlrpclib import SocketServer import BaseHTTPServer import SimpleXMLRPCServer @@ -22,6 +21,7 @@ from sfa.util.config import Config from sfa.util.cache import Cache from sfa.trust.certificate import Certificate from sfa.trust.trustedroots import TrustedRoots +from sfa.util.py23 import xmlrpc_client # don't hard code an api class anymore here from sfa.generic import Generic @@ -195,7 +195,7 @@ class SecureXMLRPCServer(BaseHTTPServer.HTTPServer,SimpleXMLRPCServer.SimpleXMLR # can't use format_exc() as it is not available in jython yet # (even in trunk). type, value, tb = sys.exc_info() - raise xmlrpclib.Fault(1,''.join(traceback.format_exception(type, value, tb))) + raise xmlrpc_client.Fault(1,''.join(traceback.format_exception(type, value, tb))) # override this one from the python 2.7 code # originally defined in class TCPServer diff --git a/sfa/server/xmlrpcapi.py b/sfa/server/xmlrpcapi.py index 167ac880..1711f885 100644 --- a/sfa/server/xmlrpcapi.py +++ b/sfa/server/xmlrpcapi.py @@ -3,7 +3,6 @@ # import string -import xmlrpclib # SOAP support is optional try: @@ -19,6 +18,7 @@ except ImportError: #from sfa.util.faults import SfaNotImplemented, SfaAPIError, SfaInvalidAPIMethod, SfaFault from sfa.util.faults import SfaInvalidAPIMethod, SfaAPIError, SfaFault from sfa.util.sfalogging import logger +from sfa.util.py23 import xmlrpc_client #################### # See "2.2 Characters" in the XML specification: @@ -76,7 +76,9 @@ def xmlrpclib_dump(self, value, write): f(*args) # You can't hide from me! -xmlrpclib.Marshaller._Marshaller__dump = xmlrpclib_dump +# Note: not quite sure if this will still cause +# the expected behaviour under python3 +xmlrpc_client.Marshaller._Marshaller__dump = xmlrpclib_dump class XmlrpcApi: """ @@ -131,9 +133,9 @@ class XmlrpcApi: """ # Parse request into method name and arguments try: - interface = xmlrpclib - self.protocol = 'xmlrpclib' - (args, method) = xmlrpclib.loads(data) + interface = xmlrpc_client + self.protocol = 'xmlrpc' + (args, method) = xmlrpc_client.loads(data) if method_map.has_key(method): method = method_map[method] methodresponse = True @@ -168,10 +170,10 @@ class XmlrpcApi: convert result to a valid xmlrpc or soap response """ - if self.protocol == 'xmlrpclib': + if self.protocol == 'xmlrpc': if not isinstance(result, SfaFault): result = (result,) - response = xmlrpclib.dumps(result, methodresponse = True, encoding = self.encoding, allow_none = 1) + response = xmlrpc_client.dumps(result, methodresponse = True, encoding = self.encoding, allow_none = 1) elif self.protocol == 'soap': if isinstance(result, Exception): result = faultParameter(NS.ENV_T + ":Server", "Method Failed", method) diff --git a/sfa/trust/gid.py b/sfa/trust/gid.py index b7fad178..3f903d98 100644 --- a/sfa/trust/gid.py +++ b/sfa/trust/gid.py @@ -27,14 +27,14 @@ from __future__ import print_function -import xmlrpclib import uuid from sfa.trust.certificate import Certificate from sfa.util.faults import GidInvalidParentHrn, GidParentHrn -from sfa.util.sfalogging import logger from sfa.util.xrn import hrn_to_urn, urn_to_hrn, hrn_authfor_hrn +from sfa.util.sfalogging import logger +from sfa.util.py23 import xmlrpc_client ## # Create a new uuid. Returns the UUID as a string. @@ -176,7 +176,7 @@ class GID(Certificate): dict = {} if data: if data.lower().startswith('uri:http://'): - dict = xmlrpclib.loads(data[11:])[0][0] + dict = xmlrpc_client.loads(data[11:])[0][0] else: spl = data.split(', ') for val in spl: diff --git a/sfa/trust/sfaticket.py b/sfa/trust/sfaticket.py index 78e6d878..6d4a009a 100644 --- a/sfa/trust/sfaticket.py +++ b/sfa/trust/sfaticket.py @@ -26,11 +26,11 @@ from __future__ import print_function -import xmlrpclib - from sfa.trust.certificate import Certificate from sfa.trust.gid import GID +from sfa.util.py23 import xmlrpc_client + # Ticket is tuple: # (gidCaller, gidObject, attributes, rspec, delegate) # @@ -99,13 +99,13 @@ class SfaTicket(Certificate): dict["gidCaller"] = self.gidCaller.save_to_string(save_parents=True) if self.gidObject: dict["gidObject"] = self.gidObject.save_to_string(save_parents=True) - str = "URI:" + xmlrpclib.dumps((dict,), allow_none=True) + str = "URI:" + xmlrpc_client.dumps((dict,), allow_none=True) self.set_data(str) def decode(self): data = self.get_data() if data: - dict = xmlrpclib.loads(self.get_data()[4:])[0][0] + dict = xmlrpc_client.loads(self.get_data()[4:])[0][0] else: dict = {} diff --git a/sfa/util/config.py b/sfa/util/config.py index 48ccd2b7..e5435a7b 100644 --- a/sfa/util/config.py +++ b/sfa/util/config.py @@ -2,11 +2,11 @@ import sys import os import time -import ConfigParser import tempfile import codecs from sfa.util.xml import XML from sfa.util.py23 import StringIO +from sfa.util.py23 import ConfigParser default_config = \ """ diff --git a/sfa/util/faults.py b/sfa/util/faults.py index 7299f27d..702b685d 100644 --- a/sfa/util/faults.py +++ b/sfa/util/faults.py @@ -24,18 +24,14 @@ # SFA API faults # -try: - from xmlrpc.client import Fault as xmlrpcFault -except: - from xmlrpclib import Fault as xmlrpcFault - from sfa.util.genicode import GENICODE +from sfa.util.py23 import xmlrpc_client -class SfaFault(xmlrpcFault): +class SfaFault(xmlrpc_client.Fault): def __init__(self, faultCode, faultString, extra = None): if extra: faultString += ": " + str(extra) - xmlrpcFault.__init__(self, faultCode, faultString) + xmlrpc_client.Fault.__init__(self, faultCode, faultString) class Forbidden(SfaFault): def __init__(self, extra = None): @@ -276,10 +272,10 @@ class SliverDoesNotExist(SfaFault): def __str__(self): return repr(self.value) -class BadRequestHash(xmlrpcFault): +class BadRequestHash(xmlrpc_client.Fault): def __init__(self, hash = None, extra = None): faultString = "bad request hash: " + str(hash) - xmlrpcFault.__init__(self, GENICODE.ERROR, faultString) + xmlrpc_client.Fault.__init__(self, GENICODE.ERROR, faultString) class MissingTrustedRoots(SfaFault): def __init__(self, value, extra = None): diff --git a/sfa/util/py23.py b/sfa/util/py23.py index 723a8e1f..e581e7f9 100644 --- a/sfa/util/py23.py +++ b/sfa/util/py23.py @@ -1,3 +1,4 @@ +# our own simplistic replacement for six try: StringType = basestring except: @@ -7,3 +8,13 @@ try: from StringIO import StringIO except: from io import StringIO + +try: + import xmlrpclib as xmlrpc_client +except: + from xmlrpc import client as xmlrpc_client + +try: + import ConfigParser +except: + import configparser as ConfigParser diff --git a/tests/testCert.py b/tests/testCert.py index 0a6a90c4..b2e81330 100755 --- a/tests/testCert.py +++ b/tests/testCert.py @@ -1,6 +1,6 @@ import unittest -import xmlrpclib from sfa.trust.certificate import Certificate, Keypair +from sfa.util.py23 import xmlrpc_client class TestCert(unittest.TestCase): def setUp(self): @@ -42,7 +42,7 @@ class TestCert(unittest.TestCase): # try something a bit more complicated, like an xmlrpc encoding of # some parameters cert = Certificate(subject="test") - data = xmlrpclib.dumps((1, "foo", ["a", "b"], {"c": "d", "e": "f"}, True)) + data = xmlrpc_client.dumps((1, "foo", ["a", "b"], {"c": "d", "e": "f"}, True)) cert.set_data(data) self.assertEqual(cert.get_data(), data) diff --git a/tools/py2depgraph.py b/tools/py2depgraph.py index 022add32..ef3b6f84 100755 --- a/tools/py2depgraph.py +++ b/tools/py2depgraph.py @@ -23,7 +23,7 @@ import sys, pprint import modulefinder -focus=[ 'sfa' , 'OpenSSL', 'M2Crypto', 'xmlrpclib', 'threading' ] +focus = [ 'sfa' , 'OpenSSL', 'M2Crypto', 'xmlrpclib', 'threading' ] class mymf(modulefinder.ModuleFinder): def __init__(self,*args,**kwargs):