2012-07-31 137 views
0

我想通过xmlrpc与supervisor交谈。基于supervisorctl(尤其是this line),我有以下的,这似乎像它应该工作,实际上它的工作原理,在目前为止,因为它连接足以从服务器收到一条错误:通过xmlrpc与supervisord交谈

#socketpath is the full path to the socket, which exists 
# None and None are the default username and password in the supervisorctl options 
In [12]: proxy = xmlrpclib.ServerProxy('http://127.0.0.1', transport=supervisor.xmlrpc.SupervisorTransport(None, None, serverurl='unix://'+socketpath)) 

In [13]: proxy.supervisor.getState() 

在由此产生错误:

--------------------------------------------------------------------------- 
ProtocolError        Traceback (most recent call last) 
/home/marcintustin/webapps/django/oneclickcosvirt/oneclickcos/<ipython-input-13-646258924bc2> in <module>() 
----> 1 proxy.supervisor.getState() 

/usr/local/lib/python2.7/xmlrpclib.pyc in __call__(self, *args) 
    1222   return _Method(self.__send, "%s.%s" % (self.__name, name)) 
    1223  def __call__(self, *args): 
-> 1224   return self.__send(self.__name, args) 
    1225 
    1226 ## 


/usr/local/lib/python2.7/xmlrpclib.pyc in __request(self, methodname, params) 
    1576    self.__handler, 
    1577    request, 
-> 1578    verbose=self.__verbose 
    1579   ) 
    1580 

/home/marcintustin/webapps/django/oneclickcosvirt/lib/python2.7/site-packages/supervisor/xmlrpc.pyc in request(self, host, handler, request_body, verbose) 
    469           r.status, 
    470           r.reason, 
--> 471           '') 
    472   data = r.read() 
    473   p, u = self.getparser() 

ProtocolError: <ProtocolError for 127.0.0.1/RPC2: 401 Unauthorized> 

这是supervisord.confunix_http_server部分:

[unix_http_server] 
file=/home/marcintustin/webapps/django/oneclickcosvirt/tmp/supervisor.sock ; (the path to the socket file) 
;chmod=0700     ; socket file mode (default 0700) 
;chown=nobody:nogroup  ; socket file uid:gid owner 
;username=user    ; (default is no username (open server)) 
;password=123    ; (default is no password (open server)) 

所以,应该有没有认证问题。

看起来好像我的代码在所有重要方面与supervisorctl的等效代码相同,但supervisorctl实际上有效。我究竟做错了什么?

回答

7

您的代码看起来基本正确。我正在监3.0与Python 2.7,并给出了以下几点:

import supervisor.xmlrpc 
import xmlrpclib 

p = xmlrpclib.ServerProxy('http://127.0.0.1', 
     transport=supervisor.xmlrpc.SupervisorTransport(
      None, None, 
      'unix:///home/lars/lib/supervisor/tmp/supervisor.sock')) 

print p.supervisor.getState() 

我得到:

{'statename': 'RUNNING', 'statecode': 1} 

您确定您的运行主管实例使用你认为它是配置文件?如果您在调试模式下运行supervisord,您会看到连接?

+0

套接字只在文件系统上出现后,我添加了'unix_http_server'节到那个文件,所以是的,我相当确定。我将调试调试模式。 – Marcin 2012-07-31 16:45:58

+0

连接在调试模式下不显示。我正在使用django-supervisor,通过它我可以运行supervisorctl,其连接也不会显示出来。不知道这是怎么回事。我相当肯定,这是使用套接字,因为当我将套接字添加到配置而不重新启动supervisor时,它不会连接。 – Marcin 2012-07-31 17:00:06

+0

好吧,出于某种原因,如果我明确设置了用户名和密码,它就可以工作。我猜想在幕后django-supervisor会执行一些无益的魔法。我也有一个相关的问题在这里:http://stackoverflow.com/questions/11729159/use-python-xmlrpclib-with-unix-domain-sockets如果你关心回答它,我也会接受。如果不是,我会添加我自己的答案。 – Marcin 2012-07-31 17:13:37

1

我不使用xmlrpclib中的ServerProxy,而是使用Server类,而不必定义任何传输或路径到套接字。不知道你的目的是否需要,但这里是我经常使用的瘦客户端。这几乎是直接从文档。

python -c "import xmlrpclib;\ 
supervisor_client = xmlrpclib.Server('http://localhost:9001/RPC2');\ 
print(supervisor_client.supervisor.stopProcess(<some_proc_name>))"