Difference between revisions of "D-Bus service for Apertium"

From Apertium
Jump to navigation Jump to search
Line 100: Line 100:


* <code>/usr/share/dbus-1/services/</code> &mdash; DBUS <code>.service</code> files.
* <code>/usr/share/dbus-1/services/</code> &mdash; DBUS <code>.service</code> files.
* <code>/usr/share/apertium/dbus-1/</code> &mdash; Python code that actually does the service.
* <code>/usr/share/apertium/dbus-1/</code> &mdash; Python code that actually does the service (<code>info.py</code> and <code>mode.py</code>)


[[Category:Development]]
[[Category:Development]]

Revision as of 11:35, 17 December 2007

D-Bus is a simple inter-process communication system. We are in the process of developing D-Bus services for Apertium which will make programmatic access to the Apertium tools easier.

We have started developing simple D-Bus bindings for Apertium which allow for:

  • discovery of details of the current Apertium installation and,
  • translations via a programmatic interface.

The D-Bus bindings are needed for some of the debugging tools, such as Apertium-view.

Installing the D-Bus bindings for Apertium

You will need:

  • D-Bus for Python - almost every modern UNIX will have a package for this. You can install this in Debian/Ubuntu Linux by issuing:
sudo apt-get install python-dbus.
  • apertium-py, which is a collection of Python routines that might be useful to people writing tools for Apertium. You can check it out using SVN:
svn co http://apertium.svn.sourceforge.net/svnroot/apertium/apertium-tools/apertium-py.
Installation is a breeze thanks to Python's distutils. In checkout directory (probably apertium-py) there should be a file called setup.py. Simply execute:
python setup.py install.
If you are using your system's stock Python interpreter, you'll probably have to execute that as root (sudo python setup.py install).
  • apertium-dbus, which contains the actual D-Bus bindings. This is quite rough around the edges at the moment. To get the code, check out the code from SVN using:
svn co http://apertium.svn.sourceforge.net/svnroot/apertium/apertium-tools/apertium-dbus.
After checkout, you need to execute the install_services.sh script in the checked out directory. This script installs the D-Bus activation files which tell D-Bus how to start up the Apertium D-Bus services if a user wants to use them. The command line format is (NB: This script assumes that your D-Bus activation directory is at /usr/share/dbus-1/services. If you don't know what I'm talking about, then you are probably safe, since this is the default for D-Bus.):
./install_services.sh <path to info.py and mode.py> <path to apertium>
The first parameter is the path to the files info.py and mode.py which are in the same directory as install_services.sh after checkout. Feel free to move them. The second parameter is the prefix to your Apertium installation. If your Apertium binaries are under /usr/local/bin (you can check this by running which apertium on the command line), then the prefix is /usr/local. On my machine, I invoked the script as follows:
./install_services.sh /home/wynand/apertium-git/apertium-tools/apertium-dbus /usr/local
since I keep info.py and mode.py in my development tree. You can also see that my Apertium installation is in /usr/local

If you have gotten to this point, you can check that the bindings work by issuing the command:

dbus-send --print-reply --dest=org.apertium.info / org.apertium.Info.modes

This should return an array of strings of all the Apertium modes installed on your system. It should look something like

user@somewhere:~/home/user$ dbus-send --print-reply --dest=org.apertium.info / org.apertium.Info.modes 
method return sender=:1.567 -> dest=:1.599 reply_serial=2
   array [
      string "en-ca"
      string "ca-en"
      string "en-af"
      string "af-en"
   ]

If D-Bus complains, then you should first check whether the activation files installed correctly. Go to /usr/share/dbus-1/services and look for org.apertium.info.service and org.apertium.mode.service. If these files are missing, then ./install_services.sh wasn't successful; make sure that you have the rights to copy the files to /usr/share/dbus-1/services. If they are there, it might be the case that you mis-specified the path to info.py and mode.py and/or the prefix to your Apertium installation. You can verify if by opening the files. The format is very simple. On my machine, the contents of org.apertium.info.service are:

[D-BUS Service]
Name=org.apertium.info
Exec=/home/wynand/apertium-git/apertium-tools/apertium-dbus/info.py -p /usr/local/

As you will recall, I keep the service executables under /home/wynand/apertium-git/apertium-tools/apertium-dbus/. The flag -p tells info.py that the prefix to my Apertium installation is /usr/local.

If you still have no luck, then it's quite possible that a Python error from our side snuck in. Try running info.py directly; that is

python info.py -p /usr/local

where the prefix for Apertium in the above example is /usr/local. If you get a Python error, please post the error on this page or post a bug report in our bug tracker. If the service starts up without errors, try executing

dbus-send --print-reply --dest=org.apertium.info / org.apertium.Info.modes

again. If there is no output, then open a new terminal and run

dbus-monitor.

This neat utility shows you the activity on the D-Bus. Now try executing dbus-send --print-reply --dest=org.apertium.info / org.apertium.Info.modes again.

If you have no luck, come and talk to us in #apertium at irc.freenode.net.

Installing into a prefix

  • Installing apertium-py into a prefix
  • Installing dbus into a prefix.
    • ./install_services.sh <path to info.py and mode.py> <path to apertium>
$ ./install_services.sh ./ /home/spectre/local
./install_services.sh: line 15: /usr/share/dbus-1/services/org.apertium.info.service: Permission denied
./install_services.sh: line 15: /usr/share/dbus-1/services/org.apertium.mode.service: Permission denied
  • Do: mkdir -p <prefix>/share/lib/apertium
    • Then copy mode.py and info.py into there
    • chmod +x <prefix>/share/lib/apertium/*.py
    • Now edit <prefix>/share/lib/apertium/info.py and add (before the line "import apertium.service")
import sys;
sys.path.append('<prefix>/lib/python2.4/site-packages/');
  • Do: mkdir -p <prefix>/share/dbus-1/services/
  • Copy the .service files into <prefix>/share/dbus-1/services/
  • Edit the files and change the @servdir@ to where you put the info.py and mode.py and change the prefix to your prefix
  • Make a session-local.conf file like it says here under "" Configuration Information"".
    • Change the <servicedir> element value to <prefix>/share/dbus-1/services/
  • Restart dbus. /etc/init.d/dbus restart
  • Log out and log back in again

Apertium D-Bus interfaces

Currently, Apertium offers two D-Bus services:

  • org.apertium.info has a single object /, which offers rudimentary information about the Apertium installation.
  • org.apertium.translate contains an object for each Apertium mode installed in the system.

D-Bus issues

If you make a change to any of the D-Bus configuration files, you will need to restart both the system-wide and session D-Bus daemons. The system-wide daemon can be restarted on a Debian/Ubuntu system with:

  • /etc/init.d/dbus restart

The only real way to restart your session deamon is to logout and log back in again. You will likely run into strange problems if you attempt to kill the session D-Bus daemon.

Filesystem layout

  • /usr/share/dbus-1/services/ — DBUS .service files.
  • /usr/share/apertium/dbus-1/ — Python code that actually does the service (info.py and mode.py)