[[PageOutline(2-5,Contents,pullout)]] = Trac XML-RPC Plugin == Description This plugin allows Trac plugins to export select parts of their interface via XML-RPC and JSON-RPC (if json or simplejson is available). Latest trunk version includes a pluggable API for extending protocols, and see for instance TracRpcProtocolsPlugin for more protocols. The browsable XML-RPC URI suffix is `/rpc`, but most XML-RPC clients should use the authenticated URL suffix `/login/rpc` as this will provide authenticated requests through Trac. The `XML_RPC` permission is used to grant users access to using the RPC interface. If you do want to use `/rpc` and unauthenticated access, you must grant the XML_RPC permission to the 'anonymous' user. Method status: * Ticket API is also complete, with the following types exported: component, version, milestone, type, status, resolution, priority and severity. * The [http://www.jspwiki.org/Wiki.jsp?page=WikiRPCInterface2 WikiRPC API] is complete, mostly thanks to [wiki:mgood]. Protocol and method documentation for the latest version of the plugin can be found [/rpc here]. Accessing the RPC handler through a browser (at `/rpc` or `/login/rpc`) will provide the documentation of protocols and available methods: [[Image(tracrpc.png, border=2)]] === Todo Outstanding tasks are roadmap, timeline, user management, for example get a (filtered) user list to assign a task in [http://eclipse.org/mylyn/ mylyn], plugin management. == Bugs/Feature Requests Existing bugs and feature requests for XmlRpcPlugin are [report:9?COMPONENT=XmlRpcPlugin here]. If you have any issues, create a [/newticket?component=XmlRpcPlugin&owner=osimons&cc=olemis new ticket]. [[TicketQuery(component=XmlRpcPlugin&group=type,format=progress)]] == Download Download the zipped source from [export:xmlrpcplugin here]. The plugin is also available on [pypi:TracXmlRpc PyPI]. == Source Check out XmlRpcPlugin using Subversion from [/svn/xmlrpcplugin here] or [source:xmlrpcplugin browse the source] with Trac. Experimental features and work in progress can be found at a [http://bitbucket.org/osimons/trac-rpc-mq/ patches repository hosted by Bitbucket]. Work in progress is developed using [http://hgbook.red-bean.com/read/managing-change-with-mercurial-queues.html Mercurial Queues]. For enhanced compatibility with [wiki:ApacheBloodhound Apacheā„¢ Bloodhound] >= 0.6 download the ''BloodhoundRPC'' fork from [https://bitbucket.org/olemis/bloodhound-rpc this repository] and check out `bloodhound_rpc` branch. == Simple Installation Perform the following commands in your Trac project's directory: {{{#!sh easy_install -Z -U https://trac-hacks.org/svn/xmlrpcplugin/trunk trac-admin . config set components tracrpc.* enabled trac-admin . permission add authenticated XML_RPC }}} Note that sudo may be necessary, so if easy_install fails, try **sudo easy_install** instead of **easy_install**. RPC should now work for all authenticated users. == Advanced Installation Notes This plugin ''requires'' at least Trac 0.10, but Trac 0.11 or 0.12 is recommended. Install in the same manner as any other Trac plugin: {{{#!sh python setup.py bdist_egg cp dist/*.egg /srv/trac/env/plugins }}} Make sure the egg-file in dist/-folder does not contain any letters before you copy. Else, if for example the egg file is TracXMLRPC-1.1.2.post0-py2.7.egg, you will have an error that post0 is not an int, when you connect via XML-RPC from Eclipse, just rename the egg-file to TracXMLRPC-1.1.2-py2.7.egg and you will be fine. If you want it to be installed for all Trac environments, then depending on the version of Trac you are running: {{{#!sh easy_install -Z -U https://trac-hacks.org/svn/xmlrpcplugin/trunk # 0.11/0.12/1.0/++ easy_install -Z -U https://trac-hacks.org/svn/xmlrpcplugin/0.10 # 0.10 easy_install -Z -U /path/to/unpacked/download/version }}} The same command can be run later to refresh the installation. You will also need to enable the plugin in your `trac.ini` file: {{{#!ini [components] tracrpc.* = enabled }}} == Troubleshooting === Problems when AccountManagerPlugin is enabled If you have the AccountManagerPlugin enabled and you followed their advice/example to disable the standard login module as follows: {{{#!ini [components] trac.web.auth.LoginModule = disabled }}} then the /login/xmlrpc URL for authorized access will not work as expected. Every access will look like anonymous access. The recommended approach to make it work is to add the following configuration in TracIni: {{{#!ini [account-manager] environ_auth_overwrite = false }}} === Problems with ''Digest'' HTTP authentication The `xmlrpclib.ServerProxy` client, as demonstrated in the following examples, will not work with a ''Digest''-based HTTP authentication: you need to set up a ''Basic'' HTTP authentication on server side to make the examples work. If you use the standalone Trac daemon, this means that you cannot use the `tracd -a` option (htdigest authentication file). Use `trac --basic-auth` (htpasswd authentication file) instead. === Problems with mod_python, Apache, Python 2.4 XmlRpcPlugin might not work with Apache and Python 2.4 as explained in [t:wiki:0.11/TracInstall#Requirements TracInstall]. Use Python 2.5 if you want to run Trac with mod_python. == Example '''Note''': The '''xmlrpclib''' module has been renamed to '''xmlrpc.client''' in Python 3.0. See [http://docs.python.org/library/xmlrpclib.html] for further information. === Python End-User Usage Obtain and print a list of XML-RPC exported functions available to my user: {{{#!python import xmlrpclib server = xmlrpclib.ServerProxy("http://athomas:password@localhost/trac-dev/login/xmlrpc") for method in server.system.listMethods(): print method print '\n'.join([' ' + x for x in server.system.methodHelp(method).split('\n')]) print print }}} The same example using `system.multicall()`. This reduces network and server load by compacting all of the `system.methodHelp()` calls into one HTTP POST. {{{#!python import xmlrpclib server = xmlrpclib.ServerProxy("http://athomas:password@localhost/trac/devel/login/xmlrpc") multicall = xmlrpclib.MultiCall(server) for method in server.system.listMethods(): multicall.system.methodHelp(method) for help in multicall(): lines = help.splitlines() print lines[0] print '\n'.join([' ' + x for x in lines[2:]]) print }}} List all tickets that are owned by athomas, using the XML-RPC multicall system to issue multiple RPC calls with one HTTP request: {{{#!python import xmlrpclib server = xmlrpclib.ServerProxy("http://athomas:password@localhost/trac/devel/login/xmlrpc") multicall = xmlrpclib.MultiCall(server) for ticket in server.ticket.query("owner=athomas"): multicall.ticket.get(ticket) print map(str, multicall()) }}} Access the Wiki with [http://www.jspwiki.org/Wiki.jsp?page=WikiRPCInterface2 WikiRPC]: {{{#!python import xmlrpclib server = xmlrpclib.ServerProxy("http://athomas:password@localhost/trac-dev/login/xmlrpc") # print the content of WikiStart print server.wiki.getPage("WikiStart") # print WikiStart as HTML print server.wiki.getPageHTML("WikiStart") # write to the SandBox page from a text file sandbox_content = file("sandbox.txt").read() server.wiki.putPage("SandBox", sandbox_content, {"comment": "testing the WikiRPC interface"}) }}} Add an attachment to WikiStart: {{{#!python import xmlrpclib server = xmlrpclib.ServerProxy("http://athomas:password@localhost:8080/trunk/login/xmlrpc") server.wiki.putAttachment('WikiStart/t.py', xmlrpclib.Binary(open('t.py').read())) }}} ==== Using Digest Authentication in Python One can use digest authentication if you know the realm that you are connecting to. This shows up in the login box "server says '