2012-07-30 28 views
10

मैं supervisord के साथ बातचीत करने की कोशिश कर रहा हूं, और मैं यूनिक्स सॉकेट पर इसके साथ बात करना चाहता हूं (यह एक साझा होस्टिंग वातावरण है)।यूनिक्स डोमेन सॉकेट के साथ पायथन 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 निश्चित रूप से मौजूद है। फॉर्म 'यूनिक्स: ///path/to/supervisor.sock/RPC2' के यूआरआई supervisord द्वारा उपयोग किए जाते हैं, जहां मुझे यह विचार मिला। दस्तावेज़ यूनिक्स सॉकेट पर चर्चा नहीं करते हैं: http://docs.python.org/library/xmlrpclib.html

क्या यह संभव है? क्या मुझे एक अलग पुस्तकालय का उपयोग करना चाहिए?

उत्तर

13

xmlrpclib की आवश्यकता है कि यूआरएल http या https के साथ शुरू हो जाए। इसके आस-पास एक कस्टम परिवहन को परिभाषित करना है जो उस यूआरएल को अनदेखा करता है। यहाँ कुछ पर्यवेक्षक से परिवहन का उपयोग कर कोड है:

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 के साथ एक डमी यूआरएल निर्दिष्ट करने की आवश्यकता: // या 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()