2012-07-30 2 views
10

supervisord과 상호 작용하려고 시도하고 있는데, 유닉스 소켓 (공유 호스팅 환경)을 통해이 문제에 대해 이야기하고 싶습니다. 내가 지금까지 시도했습니다 무엇유닉스 도메인 소켓이있는 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에 의해 사용됩니다. 여기에서 아이디어를 얻었습니다. 문서에서는 유닉스 소켓을 다루지 않습니다 : 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() 
관련 문제