سؤال

I'm trying to talk to supervisor over xmlrpc. Based on supervisorctl (especially this line), I have the following, which seems like it should work, and indeed it works, in so far as it connects enough to receive an error from the server:

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

Resulting in this error:

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

This is the unix_http_server section of supervisord.conf:

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

So, there should be no authentication problems.

It seems like my code is in all material respects identical to the equivalent code from supervisorctl, but supervisorctl actually works. What am I doing wrong?

هل كانت مفيدة؟

المحلول

Your code looks substantially correct. I'm running Supervisor 3.0 with Python 2.7, and given the following:

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

I get:

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

Are you certain that your running Supervisor instance is using the configuration file you think it is? What if you run supervisord in debug mode, do you see the connection?

نصائح أخرى

I don't use the ServerProxy from xmlrpclib, I use the Server class instead and I don't have to define any transports or paths to sockets. Not sure if your purposes require that, but here's a thin client I use fairly frequently. It's pretty much straight out of the docs.

python -c "import xmlrpclib;\
supervisor_client = xmlrpclib.Server('http://localhost:9001/RPC2');\
print( supervisor_client.supervisor.stopProcess(<some_proc_name>) )"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top