2012-07-30 4 views
10

私はsupervisordと対話しようとしています。私はそれをUNIXソケット(共有ホスティング環境)と話したいと思います。私がこれまで試したどのようなUNIXドメインソケットでPython xmlrpclibを使用しますか?

は次のとおりです。

import xmlrpclib 
server = xmlrpclib.ServerProxy('unix:///path/to/supervisor.sock/RPC2') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/xmlrpclib.py", line 1549, in __init__ 
    raise IOError, "unsupported XML-RPC protocol" 
IOError: unsupported XML-RPC protocol 

/path/to/supervisor.sockは間違いなく存在します。 'unix:///path/to/supervisor.sock/RPC2'の形式のURIは、supervisordによって使用されています。これが私の考えです。ドキュメントでは、UNIXソケットについては説明していません。http://docs.python.org/library/xmlrpclib.html

これは可能ですか?別のライブラリを使用する必要がありますか?

答えて

13

は、URLがhttpまたはhttpsで始まることが必要です。これを回避する方法は、そのURLを無視するカスタムトランスポートを定義することです。ここではスーパーバイザーからのトランスポートを使用していくつかのコードがあります:便利ではありません場合は

import supervisor.xmlrpc 
import xmlrpclib 

proxy = xmlrpclib.ServerProxy('http://127.0.0.1', 
           transport=supervisor.xmlrpc.SupervisorTransport(
            None, None, serverurl='unix://'+socketpath)) 

proxy.supervisor.getState() 

、ここでのコードの更新バージョンだhereが見つかりました:

class UnixStreamHTTPConnection(httplib.HTTPConnection, object): 
    def __init__(self, *args, **kwargs): 
     self.socketpath = kwargs.pop('socketpath') 
     super(UnixStreamHTTPConnection, self).__init__(*args, **kwargs) 

    def connect(self): 
     self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 
     self.sock.connect_ex(self.socketpath) 

class UnixStreamTransport(xmlrpclib.Transport, object): 
    def __init__(self, *args, **kwargs): 
     self.socketpath = kwargs.pop('socketpath') 
     super(UnixStreamTransport, self).__init__(*args, **kwargs) 
6

ここで上司に話をするxmlrpclibを使用するための更新例です:

import httplib 
import socket 
import xmlrpclib 

class UnixStreamHTTPConnection(httplib.HTTPConnection): 
    def connect(self): 
     self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 
     self.sock.connect(self.host) 

class UnixStreamTransport(xmlrpclib.Transport, object): 
    def __init__(self, socket_path): 
     self.socket_path = socket_path 
     super(UnixStreamTransport, self).__init__() 

    def make_connection(self, host): 
     return UnixStreamHTTPConnection(self.socket_path) 


server = xmlrpclib.Server('http://arg_unused', transport=UnixStreamTransport("/var/run/supervisor.sock")) 
print(server.supervisor.getState()) 

すでに我々は、HTTPとダミーのURLを指定する必要が述べたように://またはhttps://、次に処理するカスタムトランスポートを指定しますここに私のためにどのような作品ですが、上記の解答をミキシングドメインソケット

2

...

import httplib 
import socket 
import xmlrpclib 

class UnixStreamHTTPConnection(httplib.HTTPConnection, object): 
    def __init__(self, *args, **kwargs): 
     self.socketpath = kwargs.pop('socketpath') 
     super(UnixStreamHTTPConnection, self).__init__(*args, **kwargs) 

    def connect(self): 
     self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 
     self.sock.connect(self.socketpath) 

class UnixStreamTransport(xmlrpclib.Transport, object): 
    def __init__(self, *args, **kwargs): 
     self.socketpath = kwargs.pop('socketpath') 
     super(UnixStreamTransport, self).__init__(*args, **kwargs) 

    def make_connection(self, host): 
     return UnixStreamHTTPConnection(host, socketpath=self.socketpath) 

server = xmlrpclib.ServerProxy('http://arg_unused', transport=UnixStreamTransport(socketpath="path/to/supervisor.sock")) 
print server.supervisor.getState() 
関連する問題