Ñò §ÚêLc@s\dZddkZddklZddkZddkZddkZddkZddkZyddkZWne j o e ZnXe d„Z d„Z d„Zdfd„ƒYZd eifd „ƒYZd eiefd „ƒYZd efd„ƒYZedjoEdGHeddfƒZeieƒeid„dƒeiƒndS(s9 Simple XML-RPC Server. This module can be used to create simple XML-RPC servers by creating a server and either installing functions, a class instance, or by extending the SimpleXMLRPCServer class. It can also be used to handle XML-RPC requests in a CGI environment using CGIXMLRPCRequestHandler. A list of possible usage patterns follows: 1. Install functions: server = SimpleXMLRPCServer(("localhost", 8000)) server.register_function(pow) server.register_function(lambda x,y: x+y, 'add') server.serve_forever() 2. Install an instance: class MyFuncs: def __init__(self): # make all of the string functions available through # string.func_name import string self.string = string def _listMethods(self): # implement this method so that system.listMethods # knows to advertise the strings methods return list_public_methods(self) + ['string.' + method for method in list_public_methods(self.string)] def pow(self, x, y): return pow(x, y) def add(self, x, y) : return x + y server = SimpleXMLRPCServer(("localhost", 8000)) server.register_introspection_functions() server.register_instance(MyFuncs()) server.serve_forever() 3. Install an instance with custom dispatch method: class Math: def _listMethods(self): # this method must be present for system.listMethods # to work return ['add', 'pow'] def _methodHelp(self, method): # this method must be present for system.methodHelp # to work if method == 'add': return "add(2,3) => 5" elif method == 'pow': return "pow(x, y[, z]) => number" else: # By convention, return empty # string if no help is available return "" def _dispatch(self, method, params): if method == 'pow': return pow(*params) elif method == 'add': return params[0] + params[1] else: raise 'bad method' server = SimpleXMLRPCServer(("localhost", 8000)) server.register_introspection_functions() server.register_instance(Math()) server.serve_forever() 4. Subclass SimpleXMLRPCServer: class MathServer(SimpleXMLRPCServer): def _dispatch(self, method, params): try: # We are forcing the 'export_' prefix on methods that are # callable through XML-RPC to prevent potential security # problems func = getattr(self, 'export_' + method) except AttributeError: raise Exception('method "%s" is not supported' % method) else: return func(*params) def export_add(self, x, y): return x + y server = MathServer(("localhost", 8000)) server.serve_forever() 5. CGI script: server = CGIXMLRPCRequestHandler() server.register_function(pow) server.handle_request() iÿÿÿÿN(tFaultcCsk|o|idƒ}n |g}xA|D]9}|idƒotd|ƒ‚q*t||ƒ}q*W|S(sGresolve_dotted_attribute(a, 'b.c.d') => a.b.c.d Resolves a dotted attribute name to an object. Raises an AttributeError if any attribute in the chain starts with a '_'. If the optional allow_dotted_names argument is false, dots are not supported and this function operates similar to getattr(obj, attr). t.t_s(attempt to access private attribute "%s"(tsplitt startswithtAttributeErrortgetattr(tobjtattrtallow_dotted_namestattrsti((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pytresolve_dotted_attributers  cCsSg}t|ƒD];}|idƒ o$tt||ƒdƒo ||qq~S(skReturns a list of attribute strings, found in the specified object, which represent callable attributesRt__call__(tdirRthasattrR(Rt_[1]tmember((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pytlist_public_methodsŠscCs+h}x|D]}d|| [3,1,2] Returns a copy of a list without duplicates. Every list item must be hashable and the order of the items in the resulting list is not defined. i(tkeys(tlsttutx((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pytremove_duplicates’s tSimpleXMLRPCDispatchercBs€eZdZed d„Zed„Zd d„Zd„Zd„Z d d„Z d„Z d„Z d „Z d „Zd „ZRS( s×Mix-in class that dispatches XML-RPC requests. This class is used to register XML-RPC method handlers and then to dispatch them. There should never be any reason to instantiate this class directly. cCs(h|_d|_||_||_dS(N(tfuncstNonetinstancet allow_nonetencoding(tselfRR((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pyt__init__§s   cCs||_||_dS(sRegisters an instance to respond to XML-RPC requests. Only one instance can be installed at a time. If the registered instance has a _dispatch method then that method will be called with the name of the XML-RPC method and its parameters as a tuple e.g. instance._dispatch('add',(2,3)) If the registered instance does not have a _dispatch method then the instance will be searched to find a matching method and, if found, will be called. Methods beginning with an '_' are considered private and will not be called by SimpleXMLRPCServer. If a registered function matches a XML-RPC request, then it will be called instead of the registered instance. If the optional allow_dotted_names argument is true and the instance does not have a _dispatch method, method names containing dots are supported and resolved, as long as none of the name segments start with an '_'. *** SECURITY WARNING: *** Enabling the allow_dotted_names options allows intruders to access your module's global variables and may allow intruders to execute arbitrary code on your machine. Only use this option on a secure, closed network. N(RR (RRR ((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pytregister_instance­s! cCs+|djo |i}n||i| ['add', 'subtract', 'multiple'] Returns a list of the methods supported by the server.t _listMethodsR/N( RRRRRRR=Rtsort(Rtmethods((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pyR&s cCsdS(s#system.methodSignature('add') => [double, int, int] Returns a list describing the signature of the method. In the above example, the add method takes two integers as arguments and returns a double result. This server does NOT support system.methodSignature.ssignatures not supported((Rt method_name((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pyR'+s cCs×d}||ijo|i|}n‚|idj oqt|idƒo|ii|ƒSt|idƒp6yt|i||iƒ}Wq¤tj oq¤Xq¨n|djodSddk}|i |ƒSdS(s…system.methodHelp('add') => "Adds two integers together" Returns a string containing documentation for the specified method.t _methodHelpR/tiÿÿÿÿN( RRRRRAR R Rtpydoctgetdoc(RR@R6RC((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pyR(8s$   c CsÈg}x»|D]³}|d}|d}y |i|i||ƒgƒWq tj o*}|ih|id6|id6ƒq tiƒ\}}} |ihdd6d||fd6ƒq Xq W|S(sísystem.multicall([{'methodName': 'add', 'params': [2, 2]}, ...]) => [[4], ...] Allows the caller to package multiple XML-RPC calls into a single request. See http://www.xmlrpc.com/discuss/msgReader$1208 t methodNameR5t faultCodet faultStringis%s:%s(tappendR/RRFRGR1R2( Rt call_listtresultstcallR@R5R8R9R:R;((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pyR*Xs"      cCsÆd}y|i|}Wn€tj ot|idj o]t|idƒo|ii||ƒSyt|i||iƒ}Wq•tj oq•XqšnX|dj o ||ŒSt d|ƒ‚dS(sóDispatches the XML-RPC method. XML-RPC calls are forwarded to a registered function that matches the called XML-RPC method name. If no such function exists then the call is forwarded to the registered instance, if available. If the registered instance has a _dispatch method then that method will be called with the name of the XML-RPC method and its parameters as a tuple e.g. instance._dispatch('add',(2,3)) If the registered instance does not have a _dispatch method then the instance will be searched to find a matching method and, if found, will be called. Methods beginning with an '_' are considered private and will not be called. R/smethod "%s" is not supportedN( RRtKeyErrorRRR/R R Rt Exception(RR6R5tfunc((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pyR/xs"  N(R!t __module__t__doc__tFalseRRR R$R)R+R<R&R'R(R*R/(((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pyRŸs $  %  tSimpleXMLRPCRequestHandlercBs>eZdZdZd„Zd„Zd„Zddd„ZRS( sƒSimple XML-RPC request handler class. Handles all HTTP POST requests and attempts to decode them as XML-RPC requests. t/s/RPC2cCs#|io|i|ijStSdS(N(t rpc_pathstpathtTrue(R((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pytis_rpc_path_valid±s c Cs¿|iƒp|iƒdSy°d}t|idƒ}g}xZ|oRt||ƒ}|ii|ƒ}|pPn|i|ƒ|t|dƒ8}qAWdi |ƒ}|i i |t |ddƒƒ}Wn|tj op}|idƒt|i d ƒo=|i io0|id t|ƒƒ|id tiƒƒn|iƒnrX|id ƒ|id dƒ|idtt|ƒƒƒ|iƒ|ii|ƒ|iiƒ|iidƒdS(sºHandles the HTTP POST request. Attempts to interpret all HTTP POST requests as XML-RPC calls, which are forwarded to the server's _dispatch method for handling. Ni iscontent-lengthiÿÿÿÿRBR/iôt_send_traceback_headers X-exceptions X-tracebackiÈs Content-typestext/xmlsContent-lengthii(i (RWt report_404tinttheaderstmintrfiletreadRHtlentjointserverR<RRRMt send_responseRRXt send_headertstrt tracebackt format_exct end_headerstwfiletwritetflusht connectiontshutdown( Rtmax_chunk_sizetsize_remainingtLt chunk_sizetchunkR3R7te((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pytdo_POST¸s@         cCsz|idƒd}|iddƒ|idtt|ƒƒƒ|iƒ|ii|ƒ|iiƒ|ii dƒdS(Ni”s No such pages Content-types text/plainsContent-lengthi( RbRcRdR_RgRhRiRjRkRl(RR7((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pyRYôs   t-cCs+|iiotii|||ƒndS(s$Selectively log an accepted request.N(Rat logRequeststBaseHTTPServertBaseHTTPRequestHandlert log_request(Rtcodetsize((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pyRxs (RSs/RPC2(R!RORPRTRWRsRYRx(((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pyRR¦s   < tSimpleXMLRPCServercBs2eZdZeZeZeeeded„Z RS(sgSimple XML-RPC server. Simple XML-RPC server that allows functions and a single instance to be installed to handle requests. The default implementation attempts to dispatch XML-RPC calls to the functions or instance installed in the server. Override the _dispatch method inhereted from SimpleXMLRPCDispatcher to change this behavior. cCsž||_ti|||ƒtii||||ƒtdj oXttdƒoHti|iƒti ƒ}|ti O}ti|iƒti |ƒndS(Nt FD_CLOEXEC( RuRRt SocketServert TCPServertfcntlRRtfilenotF_GETFDR|tF_SETFD(RtaddrtrequestHandlerRuRRtbind_and_activatetflags((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pyRs  N( R!RORPRVtallow_reuse_addressRQRXRRRR(((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pyR{s  tCGIXMLRPCRequestHandlercBs;eZdZedd„Zd„Zd„Zdd„ZRS(s3Simple handler for XML-RPC data passed through CGI.cCsti|||ƒdS(N(RR(RRR((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pyR+scCs8|i|ƒ}dGHdt|ƒGHHtii|ƒdS(sHandle a single XML-RPC requestsContent-Type: text/xmlsContent-Length: %dN(R<R_R1tstdoutRi(Rt request_textR7((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pyt handle_xmlrpc.s cCsvd}tii|\}}tih|d6|d6|d6}d||fGHdGHdt|ƒGHHtii|ƒdS( s‹Handle a single HTTP GET request. Default implementation indicates an error because XML-RPC uses the POST method. iRytmessagetexplains Status: %d %ssContent-Type: text/htmlsContent-Length: %dN(RvRwt responsestDEFAULT_ERROR_MESSAGER_R1R‰Ri(RRyRŒRR7((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pyt handle_get8s cCs¬|djo*tiiddƒdjo|iƒnryttiiddƒƒ}Wnttfj o d}nX|djoti i |ƒ}n|i |ƒdS(sðHandle a single XML-RPC request passed through a CGI post method. If no XML data is given then it is read from stdin. The resulting XML-RPC response is printed to stdout along with the correct HTTP headers. tREQUEST_METHODtGETtCONTENT_LENGTHiÿÿÿÿN( RtostenvirontgetRRZt TypeErrort ValueErrorR1tstdinR^R‹(RRŠtlength((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pythandle_requestOs   N( R!RORPRQRRR‹RR›(((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pyRˆ(s  t__main__s#Running XML-RPC server on port 8000t localhosti@cCs||S(((Rty((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pytistadd(RPR-RR}RvR1R”ReRt ImportErrorRRVR RRRRwRRR~R{RˆR!RaR$tpowt serve_forever(((s*/usr/lib64/python2.6/SimpleXMLRPCServer.pytas4          ÿ` !=