[Freeipa-users] call implemented methods via xml-rpc
Rob Crittenden
rcritten at redhat.com
Wed Apr 21 15:08:35 UTC 2010
ALAHYANE Rachid wrote:
> Any ideas ? I can provide further explanations if it is not clear ;)
I think that will be needed.
You are doing server->server communication if you are running within Apache.
It would be helpful if you would describe what your end goal is.
rob
>
> Sorry for this mail bombing.
>
> 2010/4/20 ALAHYANE Rachid <afkkir at gmail.com <mailto:afkkir at gmail.com>>
>
> Thanks for your answer, but I think that I don't explained my
> problem very clearly. Lets take this simple situation. I have two
> hosts: my client with apache+mod_python and my ipa server.
>
> This is the apache configuration on client :
>
> ---------------------------------------------------------
> <Files "test">
> ## python conf
>
>
> PythonPath "['/usr/lib/python2.6/site-packages/webservices']+sys.path"
> SetHandler python-program
> PythonHandler my_script
> PythonDebug on
> </Files>
> ---------------------------------------------------------
>
> and this the code of `my_script`
>
> ---------------------------------------------------------
> from mod_python import apache
>
> def handler(req):
> req.content_type = "text/plain"
> req.send_http_header()
> from ipalib import api
> # I am on the client host => mode server is False
> # I also tested this with api.bootstrap(context='example',
> in_server=False) but it doesn't work too
> api.bootstrap_with_global_options(context='example')
> api.finalize()
> api.Backend.xmlclient.connect()
> res = api.Command.user_show(user_name)
> req.write(str(res))
>
> return apache.OK
> ---------------------------------------------------------
>
> when I access to client.domain.org/test
> <http://client.domain.org/test> on my browser I get this error :
>
> ---------------------------------------------------------
> MOD_PYTHON ERROR
>
> ProcessId: 12393
> Interpreter: 'client.domain.org <http://client.domain.org>'
>
> ServerName: 'client.domain.org <http://client.domain.org>'
> DocumentRoot: '/var/www/html'
>
> URI: '/test'
> Location: None
> Directory: None
> Filename: '/var/www/html/test'
> PathInfo: ''
>
> Phase: 'PythonHandler'
> Handler: 'my_script'
>
> Traceback (most recent call last):
>
> File "/usr/lib/python2.6/site-packages/mod_python/importer.py",
> line 1537, in HandlerDispatch
> default=default_handler, arg=req, silent=hlist.silent)
>
> File "/usr/lib/python2.6/site-packages/mod_python/importer.py",
> line 1229, in _process_target
> result = _execute_target(config, req, object, arg)
>
> File "/usr/lib/python2.6/site-packages/mod_python/importer.py",
> line 1128, in _execute_target
> result = object(arg)
>
> File "/usr/lib/python2.6/site-packages/webservices/my_script.py",
> line 7, in handler
> api.bootstrap(context='example', in_server=False)
>
> File "/usr/lib/python2.6/site-packages/ipalib/plugable.py", line
> 380, in bootstrap
> self.__doing('bootstrap')
>
> File "/usr/lib/python2.6/site-packages/ipalib/plugable.py", line
> 365, in __doing
> '%s.%s() already called' % (self.__class__.__name__, name)
>
> StandardError: API.bootstrap() already called
> ---------------------------------------------------------
>
> I don't know where API.bootstrap() was called.
>
> Thanks,
>
> 2010/4/20 Jason Gerard DeRose <jderose at redhat.com
> <mailto:jderose at redhat.com>>
>
> On Tue, 2010-04-20 at 13:03 +0200, ALAHYANE Rachid wrote:
> > Hi,
> >
> >
> > Now I have another error. When I use the code
> > of doc/examples/python-api.py inside my server XML-RPC (not
> the ipa
> > server) that configured like this :
> >
> >
> > == Server ==
> > --------- httpd conf ------------
> > <Files "xmlrpc">
> > ## python conf
> >
> >
> > # ....
> > SetHandler python-program
> > PythonHandler xmlrpchandler
> > PythonDebug on
> > </Files>
> > ------------------------------------
> >
> >
> > the handler xmlrpchandler calls the following method when the
> client
> > requests for the remote method getUserInfos().
> >
> >
> > --------- account.py ------------
> > def getUserInfos(user_name, env=None):
> >
> >
> > from ipalib import api
> >
> >
> > api.bootstrap_with_global_options(context='webservices')
> > api.finalize()
> > api.Backend.xmlclient.connect()
> > return api.Command.user_show(user_name)
> > ------------------------------------
> >
> >
> >
> >
> > == Client ==
> > Now when I call this method from my client, I get this
> exception :
> >
> >
> > ------------------------------------
> > <Fault 2: "account.getUserInfos: <type
> 'exceptions.StandardError'>:
> > API.bootstrap() already called">
> > ------------------------------------
> >
> >
> > I don't know why it does not work, any ideas ??
> >
>
> Initializing ipalib is a somewhat expensive operation, so we only
> initialize it once when the process starts. If you're
> implementing a
> new XML-RPC server that calls ipalib, you will need to slightly
> modify
> the code in the python-api.py example, which I'll explain.
>
> ipalib has 2 modes of operation: client and server. In client mode,
> only plugins in ipalib/plugins/ are loaded. In server mode,
> plugins in
> ipaserver/plugins/ are also loaded.
>
> In a nutshell, client mode will do some sanity checks and the
> forward
> the call to the server. In server mode, the same sanity checks are
> performed, and then the command is executed, which usually means
> creating/modifying LDAP entries.
>
> So assuming you want to initialize ipalib in server mode (sounds
> like
> you do), you will need to do something like this (when the process
> starts):
>
> from ipalib import api
> api.bootstrap(context='example', in_server=True)
> api.finalize()
>
> Note the `in_server=True` that I added. Then in your handler,
> you will
> need to create a context for the request, something like this:
>
> def getUserInfos(user_name, env=None):
> # Where are you getting Kerberos credentials?
> api.Backend.ldap2.connect(
> ccache=api.Backend.krb.default_ccname()
> )
> return api.Command.user_show(user_name)
>
> So the recipe is 1) initialize ipalib once at startup, and 2)
> create a
> context (LDAP connection) at each request. To see how we do
> this is our
> RPC server, look at the ipaserver/rpcserver.py file.
>
> Hope that helps. I'm glad to see someone wanting to use the Python
> API. ;)
>
> > Thanks,
> >
> >
> > 2010/4/19 ALAHYANE Rachid <afkkir at gmail.com
> <mailto:afkkir at gmail.com>>
> > Thank you for your answer, it works !
> >
> > 2010/4/19 Jason Gerard DeRose <jderose at redhat.com
> <mailto:jderose at redhat.com>>
> >
> >
> > On Mon, 2010-04-19 at 16:22 +0200, ALAHYANE
> Rachid
> > wrote:
> > > Hi,
> > >
> > >
> > > Using F12 with the alpha version of ipa, I
> want to
> > know if there is
> > > some ways to call implemented methods like
> > user_show() with my own
> > > script python. My goal is to call these
> methods with
> > a client xml-rpc
> > > that I will to developpe later.
> > >
> > >
> > > On my client, I tried this but it does not
> work :(
> >
> >
> > It needs more documentation, but see
> > doc/examples/python-api.py
> >
> > Let me know if that doesn't work or if you
> get stuck.
> > You will need to
> > do a kinit first.
> >
> >
> > >
> >
> ----------------------------------------------------------------------------
> > > >>> from ipalib import api
> > > >>> api.bootstrap_with_global_options()
> > > (<Values at 0xb74f556c: {'debug': None, 'conf':
> > None, 'env': None,
> > > 'verbose': None}>, [])
> > > >>> api.load_plugins()
> > > >>> api.finalize()
> > > >>> api.Method.user_show.__doc__
> > > '\n Display user.\n '
> > > >>> api.Method.user_show(u'raca')
> > > Traceback (most recent call last):
> > > File "<stdin>", line 1, in <module>
> > > File
> >
> "/usr/lib/python2.6/site-packages/ipalib/frontend.py",
> > line
> > > 398, in __call__
> > > ret = self.run(*args, **options)
> > > File
> >
> "/usr/lib/python2.6/site-packages/ipalib/frontend.py",
> > line
> > > 667, in run
> > > return self.forward(*args, **options)
> > > File
> >
> "/usr/lib/python2.6/site-packages/ipalib/frontend.py",
> > line
> > > 688, in forward
> > > return
> self.Backend.xmlclient.forward(self.name <http://self.name>,
> > *args, **kw)
> > > File
> >
> "/usr/lib/python2.6/site-packages/ipalib/rpc.py", line
> > 403, in
> > > forward
> > > command = getattr(self.conn, name)
> > > File
> >
> "/usr/lib/python2.6/site-packages/ipalib/backend.py",
> > line 96,
> > > in __get_conn
> > > self.id <http://self.id>,
> threading.currentThread().getName())
> > > AttributeError: no context.xmlclient in thread
> > 'MainThread'
> > >
> > >
> > >
> >
> ----------------------------------------------------------------------------
> > >
> > >
> > > Have you any idea ? or some pertinent docs
> > >
> > >
> > > Sorry for my bad English :)
> > >
> > >
> > > --
> > > Meilleures salutations / Best Regards
> > >
> > > Rachid ALAHYANE
> > >
> > >
> >
> > > _______________________________________________
> > > Freeipa-users mailing list
> > > Freeipa-users at redhat.com
> <mailto:Freeipa-users at redhat.com>
> > >
> >
> https://www.redhat.com/mailman/listinfo/freeipa-users
> >
> >
> >
> >
> >
> > --
> > Meilleures salutations / Best Regards
> >
> > Rachid ALAHYANE
> >
> >
> >
> >
> >
> > --
> > Meilleures salutations / Best Regards
> >
> > Rachid ALAHYANE
> >
> >
>
>
>
>
> --
> Meilleures salutations / Best Regards
>
> Rachid ALAHYANE
>
>
>
>
> --
> Meilleures salutations / Best Regards
>
> Rachid ALAHYANE
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Freeipa-users mailing list
> Freeipa-users at redhat.com
> https://www.redhat.com/mailman/listinfo/freeipa-users
More information about the Freeipa-users
mailing list