[Freeipa-users] call implemented methods via xml-rpc
ALAHYANE Rachid
afkkir at gmail.com
Tue Apr 20 15:25:21 UTC 2010
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 on my browser I get this error :
---------------------------------------------------------
MOD_PYTHON ERROR
ProcessId: 12393
Interpreter: 'client.domain.org'
ServerName: '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>
> 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>
> > Thank you for your answer, it works !
> >
> > 2010/4/19 Jason Gerard DeRose <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,
> > *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, 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
> > >
> > 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/freeipa-users/attachments/20100420/6d6c0f2d/attachment.htm>
More information about the Freeipa-users
mailing list