2012-07-31 3 views
0

나는 xmlrpc를 통해 supervisor과 이야기하려고합니다. supervisorctl (특히 this line)을 바탕으로, 나는 그것이 작동합니다 것 같아 다음을 가지고 있고,이 서버에서 오류가 발생하기에 충분한 연결로 실제로는 지금까지의 작품 :xmlrpc를 통해 감독관에게 말하기

#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() 

이 결과 오류 :

[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)) 

그래서, 거기가 수행해야합니다

--------------------------------------------------------------------------- 
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 섹션 인증에 문제가 없다.

내 코드는 supervisorctl의 코드와 완전히 동일한 것으로 보이지만 supervisorctl 실제로 작동합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

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} 

있습니까 나는 다음과 같은 파이썬 2.7 감독자 3.0을 실행하고, 주어진거야? 디버그 모드에서 supervisord을 실행하면 어떻게됩니까?

+0

'unix_http_server' 섹션을 파일에 추가 한 후에 소켓이 파일 시스템에만 나타 났으므로 확실합니다. 나는 디버그 모드로 바이올린을 잡을 것이다. – Marcin

+0

연결이 디버그 모드로 표시되지 않습니다. 나는 장고 관리자를 사용하고 있는데,이를 통해 supervisorctl을 실행할 수 있으며, 연결도 나타나지 않습니다. 그게 뭔지 잘 모르겠다. 소켓을 사용하고 있다는 것이 확실합니다. 관리자를 다시 시작하지 않고 구성에 소켓을 추가하면 연결되지 않기 때문입니다. – Marcin

+0

사용자 이름과 암호를 명시 적으로 설정하면 어떤 이유로 작동합니다. 장담 할 수없는 마술은 장고 감독관이 수행 한 것 같습니다. 나는 또한 여기에 관련된 질문이 있습니다 : http://stackoverflow.com/questions/11729159/use-python-xmlrpclib-with-unix-domain-sockets 만약 당신이 그것에 관심을 돌보면, 나는 또한 그것을 받아 들일 것입니다. 그렇지 않다면 나는 내 대답을 추가 할 것이다. – Marcin

1

xmlrpclib에서 ServerProxy를 사용하지 않고 대신 Server 클래스를 사용하므로 소켓에 대한 전송 또는 경로를 정의 할 필요가 없습니다. 당신의 목적이 그것을 필요로하는지 확실하지 않지만 여기에 내가 꽤 자주 사용하는 씬 클라이언트가 있습니다. 그것은 거의 문서에서 꽤 똑바로입니다.

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