[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [Freeipa-users] call implemented methods via xml-rpc



Any ideas ? I can provide further explanations if it is not clear ;)

Sorry for this mail bombing.

2010/4/20 ALAHYANE Rachid <afkkir 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 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 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 gmail com>
>         Thank you for your answer, it works !
>
>         2010/4/19 Jason Gerard DeRose <jderose 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 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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]