Author: sayer Date: 2008-09-26 00:58:57 +0200 (Fri, 26 Sep 2008) New Revision: 1106
Added: trunk/doc/Readme.xmlrpc2di Removed: trunk/apps/xmlrpc2di/Readme.xmlrpc2di Log: moved doc to correct folder Deleted: trunk/apps/xmlrpc2di/Readme.xmlrpc2di =================================================================== --- trunk/apps/xmlrpc2di/Readme.xmlrpc2di 2008-09-25 22:53:14 UTC (rev 1105) +++ trunk/apps/xmlrpc2di/Readme.xmlrpc2di 2008-09-25 22:58:57 UTC (rev 1106) @@ -1,194 +0,0 @@ -xmlrpc2di: DI call via XMLRPC - -This module makes the Dynamic Invocation (DI) Interfaces exported -by component modules accessible from XMLRPC. Additionaly the builtin -methods calls, get_loglevel and set_loglevel are implemented (like in the -stats UDP server). - -Additionally, it can be used as client to access XMLRPC servers. Applications -can use the DI function newConnection to add a new server entry, and sendRequest -to send a request. If sendRequest is executed, an active server is selected from -the list and used to send the request. If sending the request failes, the server -is put inactive for a (configurable) while, and only then retried. - -This module uses the XmlRpc++ library (http://xmlrpcpp.sourceforge.net/). -In order to compile it, the xmlrpc library is needed; install it by -make install-xmlrpcpp, or by hand: -cd apps/examples/xmlrpc2di -wget http://switch.dl.sourceforge.net/sourceforge/xmlrpcpp/xmlrpc++0.7.tar.gz -&& tar xzvf xmlrpc++0.7.tar.gz - -A small patch set needs to be applied as well: -patch -p0 < xmlrpcpp07_sems.patch - -If xmlrpcpp is extracted to a different directory, the path in -the Makefile needs to be adapted. - - -Configuration parameters ------------------------- - - function default description - +--------------------------------------- - xmlrpc_port 8090 port to bind XMLRPC server to - - export_di yes enable 'di' function (see below) - - direct_export none search these interfaces for methods - to export - - run_server yes start an XMLRPC server - - server_retry_after 10 retry a failed server after n seconds - -Using XMLRPC2DI client over DI ------------------------------- - -DI method "newConnection" - arguments: - "ssis": app_name, server, port, uri - example: - -- snip -- - AmDynInvoke* xmlrpc2di; - AmDynInvokeFactory* xfFactory = AmPlugIn::instance()->getFactory4Di("xmlrpc2di"); - if (NULL == xfFactory || - NULL == (xmlrpc2di = xfFactory->getInstance())){ - ERROR("could not get xmlrpc2di. please load the xmlrpc2di module\n"); - return; - } - - AmArg cargs, cret; - cargs.push("conf_auth"); - cargs.push("192.168.0.1"); - cargs.push(8102); - cargs.push(""); - xmlrpc2di->invoke("newConnection", cargs, cret); - -- snip -- - -DI method "sendRequest" - arguments: - "ssa": app_name, method, args - example: - -- snip -- - AmArg args, ret; - args.push("conf_auth"); - args.push("authPin"); // method name - args.assertArray(3); - args[2].push("fancy_parameter"); // some parameters - args[2].push("1234"); - xmlrpc2di->invoke("sendRequest", args, ret); - if (ret[0].asInt() == 0) { - DBG("status %d, description %s, uri %s", - ret[2][0].asInt(), ret[2][1].asCStr(), ret[2][3].asCStr()); - } - -- snip -- - - -Exporting functions from a DI interface to XMLRPC -------------------------------------------------- -The xmlrpc2di module searches the interfaces configured by the -'direct_export' configuration variable for functions to export -via XMLRPC. The interface must provide a function '_list' which -should return a list of methods to export. These methods are -exported as XMLRPC functions in two ways: - <method name> -and - <interface name>.<method name> - -If the function <method name> already exists, only -<interface name>.<method name> is exported. - -As an example, lets set - direct_export=di_dial -in xmlrpc2di.conf, and have a look at -examples/di_dial/DIDial.cpp: -... - } else if(method == "_list"){ - ret.push(AmArg("dial")); - ret.push(AmArg("dial_auth")); - ret.push(AmArg("dial_pin")); - ret.push(AmArg("help")); - } else -... - -When SEMS starts and loads the xmlrpc2di module, the _list -method of the di_dial interface is called, and the functions -are exported: -(23386) DEBUG: onLoad (XMLRPC2DI.cpp:67): direct_export interfaces: di_dial -(23386) DEBUG: onLoad (XMLRPC2DI.cpp:77): XMLRPC Server: Enabling builtin method 'di'. -(23386) DEBUG: XMLRPC2DIServer (XMLRPC2DI.cpp:99): XMLRPC Server: enabled builtin method 'calls' -(23386) DEBUG: XMLRPC2DIServer (XMLRPC2DI.cpp:100): XMLRPC Server: enabled builtin method 'get_loglevel' -(23386) DEBUG: XMLRPC2DIServer (XMLRPC2DI.cpp:101): XMLRPC Server: enabled builtin method 'set_loglevel' -(23386) DEBUG: registerMethods (XMLRPC2DI.cpp:154): XMLRPC Server: adding method 'dial' -(23386) DEBUG: registerMethods (XMLRPC2DI.cpp:160): XMLRPC Server: adding method 'di_dial.dial' -(23386) DEBUG: registerMethods (XMLRPC2DI.cpp:154): XMLRPC Server: adding method 'dial_auth' -(23386) DEBUG: registerMethods (XMLRPC2DI.cpp:160): XMLRPC Server: adding method 'di_dial.dial_auth' -(23386) DEBUG: registerMethods (XMLRPC2DI.cpp:154): XMLRPC Server: adding method 'dial_pin' -(23386) DEBUG: registerMethods (XMLRPC2DI.cpp:160): XMLRPC Server: adding method 'di_dial.dial_pin' -(23386) DEBUG: registerMethods (XMLRPC2DI.cpp:154): XMLRPC Server: adding method 'help' -(23386) DEBUG: registerMethods (XMLRPC2DI.cpp:160): XMLRPC Server: adding method 'di_dial.help' -(23386) DEBUG: XMLRPC2DIServer (XMLRPC2DI.cpp:115): Initialized XMLRPC2DIServer with: -(23386) DEBUG: XMLRPC2DIServer (XMLRPC2DI.cpp:116): port = 8090 - -Now from e.g. python we can do the following: - >>> from xmlrpclib import * - >>> s = ServerProxy("http://127.0.0.1:8090") - >>> s.help() - ['dial <application> <user> <from> <to>', 'dial_auth <application> <user> <from> <to> <realm> <auth_user> <auth_pwd>', 'dial_pin <application> <dialout pin> <local_user> <to_user>'] - >>> s.di_dial.help() - ['dial <application> <user> <from> <to>', 'dial_auth <application> <user> <from> <to> <realm> <auth_user> <auth_pwd>', 'dial_pin <application> <dialout pin> <local_user> <to_user>'] - -a.s.o. - -XMLRPC server function 'di' --------------------------- -Using the function 'di' all methods of all interfaces can be executed -without the interfaces needing to list the methods in the '_list' call. -The first parameter to 'di' is alway the factory name, the second the -function name. Further parameters to XMLRPC calls are converted to DI -ArgArray structure, and result of DI calls are converted back to XMLRPC -parameters. At the moment only string, int and double types are implemented -(no DateTime, struct, binary, ...). - -The 'di' function can be disabled on the XMLRPC server by setting - export_di=no -in xmlrpc2di.conf. By default it is enabled. - - -Examples (that hopefully trigger some creativity in the reader ;) ------------------------------------------------------------------ - -Checking load, setting log level: - from xmlrpclib import * - server = ServerProxy("http://127.0.0.1:8090") - print server.calls() - print "Current log level is ", server.get_loglevel() - server.set_loglevel(3) - -Register fritz at iptel.org using registrar client over XMLRPC -from python: - - from xmlrpclib import * - server = ServerProxy("http://127.0.0.1:8090") - server.di('registrar_client', 'createRegistration', - 'iptel.org', 'fritz', 'Frotz', - 'fritz', 'secretpass', '') - -or, having set - direct_export=registrar_client -directly: - from xmlrpclib import * - server = ServerProxy("http://127.0.0.1:8090") - server.createRegistration('iptel.org', 'fritz', 'Frotz', - 'fritz', 'secretpass', '') - - -To call someone into webconference (supports authenticated dial-out) -over an account at sparvoip.de using di_dial: -from xmlrpclib import * -server = ServerProxy("http://127.0.0.1:8090") -server.di('di_dial', 'dial_auth','webconference', 'roomname', - 'sip:[EMAIL PROTECTED]', 'sip:[EMAIL PROTECTED]', - 'sparvoip.de','myuser','passwd') - - Copied: trunk/doc/Readme.xmlrpc2di (from rev 1104, trunk/apps/xmlrpc2di/Readme.xmlrpc2di) _______________________________________________ Semsdev mailing list [email protected] http://lists.iptel.org/mailman/listinfo/semsdev
