Howto to intercommunicate processes in different(remote) machines through DBus

Introduction

In this post I’m going to try to connect two processes in different machines through DBus. The method is a little bit complex, so be patient if you try.
Also is to advert that this has been the result of 3 days of tests (reference1). So maybe this method may be improved with time and use reference2.

Tools (The actors)

  • dbus
  • gabriel
    • socat
    • libssh
  • ssh
  • your apps

Debian official packages are dbus libssh-2 socat
gabriel is not part of Debian yet (but I’ve build one for myself)

Knowledge (Actors curriculum)

In this section I will describe the basics about the tools we are going to use.

DBus. Extracted from DBus page:

D-Bus is a message bus system, a simple way for applications to talk to one another. In addition to interprocess communication, D-Bus helps coordinate process lifecycle; it makes it simple and reliable to code a “single instance” application or daemon, and to launch applications and daemons on demand when their services are needed.

D-Bus supplies both a system daemon (for events such as “new hardware device added” or “printer queue changed”) and a per-user-login-session daemon (for general IPC needs among user applications). Also, the message bus is built on top of a general one-to-one message passing framework, which can be used by any two apps to communicate directly (without going through the message bus daemon). Currently the communicating applications are on one computer, or through unencrypted TCP/IP suitable for use behind a firewall with shared NFS home directories.

Gabriel is a simple utility to enable D-Bus clients to connect to a D-Bus daemon running on a remote machine, through SSH.
This is the main piece of this puzzle. If you are interested in understanding how it works you should take a look at socat and libssh. As I’ve had to take a look at code, and make some modifications, you should read it as a punishment.

Extracted from socat man page:

socat – Multipurpose relay (SOcket CAT)
socat is a command line based utility that establishes two bidirectional byte streams and transfers data between them. Because the streams can be constructed from a large set of different types of data sinks and sources (see address types), and because lots of address options may be applied to the streams, socat can be used for many different purposes. It might be one of the tools that one ‘has already needed´.

Libssh. Extracted from libssh page:

The ssh library was designed to be used by programmers needing a working SSH implementation by the mean of a library. The complete control of the client is made by the programmer. With libssh, you can remotely execute programs, transfer files, use a secure and transparent tunnel for your remote programs. With its Secure FTP implementation, you can play with remote files easily, without third-party programs others than libcrypto (from openssl).

You should know about ssh and about your application.

Architecture

Local host will run gabriel and your application.
Remove host will need a running ssh server, a running dbus server and will need socat installed and ready to use.
We need to run gabriel, that will act as a server that will connect our host to the remote host through SSH. After that gabriel will use this SSH connection to intercommunicate our local application with remote DBus applications by using socat.

Remote DBus communication Architecture
Remote DBus communication Architecture

Howto (Main action)

At the moment I’ve only achieved to connect a process using session-bus, I’m still testing until I get connection through system-bus which was my initial purpose.
After reading next information, you will be able to connect using session bus and system bus.

As I commented somewhere else, I’ve made some modifications on gabriel code. I needed some common parameters as SSH port (my virtualbox testing environment ), better help explanations or add a verbose output.
Gabriel establish a connection with the remote ssh and by socat commands it communicates with the remote DBus “environment”. You should administrate ssh parameters and Dbus parameters to gabriel.

We have to put special attention to -d, –bus-address=BUS_ADDRESS because this info must be gotten from the REMOTE machine.
That address is the one used by processes to communicate through DBUS. It’s something “internal” and automatically done when you use DBus api/library. I’m going to show you where to get it.

DBUS_SESSION_BUS_ADDRESS, DBUS_SYSTEM_BUS_ADDRESS, DBUS_SYSTEM_BUS_DEFAULT_ADDRESS

Again, this info should be gotten from REMOTE machine.
At the moment I don’t know any nice command where to get this info.
We have two main options of DBus buses. System and Session (more info in DBus page).
If you need SESSION bus address, you can choose what it better fits you:

  • You can can get it from process environment
  • You can stole it from any other process suspicious from being involved in DBus activities…
  • You can create your own dbus-daemon (which, actually, I don’t know if it uses it’s own BUS_ADDRESS)

If you need SYSTEM bus address, you can choose what it better fits you:

  • You can can get it from process environment. If it’s not defined, take a look at /etc/dbus-1/system.conf where you should locate a string like <listen>unix:path=/var/run/dbus/system_bus_socket</listen>
  • You can stole it from any other process suspicious from being involved in DBus activities…

Examples:

This command gives you a dbus-daemon in your session with the one you can contact.

Howto (Main action): Back to local host

Those ugly unix:stri:ngs/asdkaj/numbers we have seen is what we need for -d, –bus-address=BUS_ADDRESS.
See a session example:

See a system example:

The moment we have or gabriel server running we (may have nothing) need to set DBUS_XXX_BUS_ADDRESS. Many apps would use, or have, this environment variable to connect to a DBus instance and intercommunicate with other process.
This is is easy, DBUS_XXX_BUS_ADDRESS should be the address gabriel shows few instants after being launched.
When we have defined this environment variable (in command line) we can execute our app, and it will happily communicate with the remote DBus world.
Example:

dbus-browser is a program that uses a session bus.

Curiosity: DBus protocol messages interchanged

Modifying a couple of lines in gabriel can let you see DBus raw protocol messages. It’s a didactic info.
If you enable verbose code at least at level 2, you will get raw DBus protocol messages.

My modifications and hacks

Code will be publish under GLKM project page.

Links and references
  • dbus site
  • gabriel site
  • socat site
  • libssh site
  • reference 1. (informational note, it had implied jumping into gabriel, libssh, and dbus code and testing with a virtualbox machine)
  • reference 2. (personal note, take a look at “Securing traffic between two socat instances using SSL” article in socat page)

Howto access a Virtualbox guest machine throught ssh (or how to port forwarding)

This is not an original article (see references), it’s just an archived one “por si las moscas”.

Introduction

By default, the network connection in Virtualbox is set to NAT, that is every packet coming from the Guest machine is modified so that it seems as it has come from the Host machine. In this way it’s easy for the Guest machine to connect to all the rest of the network (the Internet included) but nobody can start a connection with the Guest Machine since it’s hidden behind the Host one.

So, if you want to use a server service in your Guest machine (i.e. Apache or SSH) you have two choices:

  1. pass to Virtualbox Host network connection;
  2. make Virtualbox forward all the packets arriving to a certain port of the Host machine.

This article will describe how to do the latter, in particular in the case of the ssh server. This is an interesting case because it allows you to simulate very well a quite common condition: connecting to a remote Linux headless machine.

We have a guest machine with a running ssh server which accepts connections on the TCP port 22.
Our goal is to make any packet arriving at a given TCP port (i.e. 2222) of the host machine, to be forwarded to the TCP port 22 of the guest machine.
Fortunately, there is Virtualbox command which permits to do it almost instantly: VBoxManage.

Configuration needed

In our case we will use Debian as the guest machine name (quote in case guest machine name contains spaces), here are the commands that you have to type in the host machine (real one) console as your user (if you use another user it will try to look for its virtual machines):

user@machine $ VBoxManage list vms
VirtualBox Command Line Management Interface Version 1.5.6_OSE
(C) 2005-2008 innotek GmbH
All rights reserved.
Name: debian
Guest OS: Linux 2.6
UUID: 814e25f4-451e-4582-8d34-71a1cd437cdd
Config file: /mnt/extra/virtualizacion/virtualbox/debian/debian.xml
Memory size: 195MB
[…]
user@machine $ VBoxManage setextradata debian “VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/HostPort” 2222
VirtualBox Command Line Management Interface Version 1.5.6_OSE
(C) 2005-2008 innotek GmbH
All rights reserved.
user@machine $ VBoxManage setextradata debian “VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/GuestPort” 22
VirtualBox Command Line Management Interface Version 1.5.6_OSE
(C) 2005-2008 innotek GmbH
All rights reserved.
user@machine$ VBoxManage setextradata debian “VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/Protocol” TCP
VirtualBox Command Line Management Interface Version 1.5.6_OSE
(C) 2005-2008 innotek GmbH
All rights reserved.

HostPort,GuestPort,Protocol are just string examples and can be changed without any consequence. Just remember your choices if you want to remove them later.
I guess you should be careful with pcnet substring, as maybe it should have something to see with your selected network card type.

Testing

Once you have typed the above commands, you need to close the guest machine (a reboot won’t be sufficient), restart it and then connect via ssh with:

anyuser@machine$ ssh -l >user< -p 2222 localhost

Replace localhost with the host machine ip address if you are connecting from another computer.

By the way, you can check which customizations have been already set for your Guest Machine with VBoxManage by typing:

user@machine$ VBoxManage getextradata debian enumerate
VirtualBox Command Line Management Interface Version 1.5.6_OSE
(C) 2005-2008 innotek GmbH
All rights reserved.
Key: GUI/LastWindowPostion, Value: 0,6,1028,820
Key: GUI/Fullscreen, Value: off
Key: GUI/AutoresizeGuest, Value: off
Key: GUI/LastCloseAction, Value: powerOff
Key: GUI/SaveMountedAtRuntime, Value: yes
Key: GUI/Seamless, Value: off
Key: VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/HostPort, Value: 2222
Key: VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/GuestPort, Value: 22
Key: VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/Protocol, Value: TCP

or remove one, for example “VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/GuestPort”, by setting it without any value:

user@machine$ VBoxManage setextradata “VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/GuestPort”

Links and references

Switch/Migration of Subversion repository without admin access (svn2svn)

Hello fellows.
My latest adventure was about moving a project (unmaintained) from its public subversion repository which of course I was not admin (which means no admin access) over to my own server.

Usually, to do this you’d dump the whole thing with svnadmin into one file (svnadmin dump > file_dump) and load it again at the new location (svnadmin load file_dump). After searching for any similar command without admin access into documentation I figured that something similar might exist for plain svn to svn migration.
I founded a ruby version and a python. I chose python one because it’s recent, it’s python and it’s under google code site.
There was other cause, the ruby version went through all revisions, from 1 till infinity, although many of them didn’t have any change. In the other hand, python version uses subversion logs and made a efficient use of it.

The real action

Create a repository in my server was easy:

root@aristoteles:/var/lib/svn$ rm -rf MY-PROJECT-PATH
root@aristoteles:/var/lib/svn$ svnadmin create MY-PROJECT-PATH
root@aristoteles:/var/lib/svn$ chgrp svn-user MY-PROJECT-PATH/ -R
root@aristoteles:/var/lib/svn$ chmod g+ws MY-PROJECT-PATH/ -R
root@aristoteles:/var/lib/svn$ chmod o-rx MY-PROJECT-PATH/ -R

After solving the problems I talk about, duplicating the repo was not so difficult.

user@othermachine:~$ mkdir tmp
user@othermachine:~$ cd tmp
user@othermachine:~$ svn co URL-DEST-MY-PROJECT-PATH
user@othermachine:~$ python svn2svn-0.1.1.py -r 7382 URL-ORIG URL-DEST-MY-PROJECT-PATH

This process took a while but the new directory was now ready for action.

Be careful with your subversion config files. It may cause conflicts with file in repositories.
As an example, I had some troubles because I use to ignore files like Makefile.in and so. The project I was trying to import did have files like that and svn2svn did bring svn errors because those files were not under revision. When I realized I modified my subversion config without that rules for a while.

References and links

[GLKM] Subversion project stats measures with mpy-svn-stats

A simple command line tool called mpy-svn-stats give us nice graphics using svn xml output.

You can see an example GLKM project statistics

It’s quite easy to use, see:

user@machine:/var/www/svn-stats$ mpy-svn-stats -o ./ svn+ssh://localhost/var/lib/svn/glkm/
Will generate PIL graphs.
getting data
running command: “svn -v –xml log svn+ssh://localhost/var/lib/svn/glkm/”
[…ssh stuff…]
done
parsing data
done
calculating stats
done
writing data
done
Have 13 stats objects, 13 of them are wanted.
user@machine:/var/www/svn-stats$ ll
total 48
-rw-r–r– 1 user user 10379 2008-02-06 17:06 changed_paths_multi_author_graph.png
-rw-r–r– 1 user user 10268 2008-02-06 17:06 commits_group_multi_author_graph.png
-rw-r–r– 1 user user 11762 2008-02-06 17:06 index.html
-rw-r–r– 1 user user 10265 2008-02-06 17:06 log_message_length_group_multi_author_graph.png
user@machine:/var/www/svn-stats$

References and links

eldemonionegro.es

Pues eso, información técnica poco relevante pero interesante. Y necesaria, porque sin nombre seríamos nada.

Desde que se creó, EDN ha ido expandiéndose hasta conseguir la tripleta, para mí, que todo dominio español debería poseer. El .com, el .org y el .es .

eldemonionegro.com
eldemonionegro.es
eldemonionegro.org

Con 3 uves dobles (www) o sin ellas, da igual. Como si quieres acceder a enunlugardelamancha.eldemonionegro.com.

EDN da las gracias a la gratuita gestión que ha realizado CDmon. Sí, esa CDmon a la que critiqué y perdoné en el pasado por ciertos errores inconcebibles (que los lectores habituales puede que recuerden…).
CDmon ha “regalado” más de 5200 dominios entre todos aquellos clientes que se han acogido a la promoción subvencionada por el Plan Avanza del Ministerio de Industria, Turismo y Comercio para fomentar el uso de dominios .es.

Os tengo dejaos de la mano de buda, queridos lectores, pero no ceséis en vuestra labor, que buda sabrá recompensaros. EDN no ha sido abandonado, ni mucho menos. La cantidad de visitantes crecientes y la pasta que dejan (€€€) me animan cada día más. Sólo falta que os deleite con aquello que más os gusta y que nadie más sabe daros bribones/as.

La agricultura debería eliminar a sus intermediarios

El sector primario de este país esta muy mermado. La agricultura y la ganadería, productores iniciales de los alimentos que nos mantienen vivos, no ganan el dinero que deberían. En ocasiones ni siquiera cubren sus gastos de producción. Esto es aberrante.
Es una situación bastante grave desde hace unos cuantos años ya. ¿Cuántas veces y hace cuánto habéis visto regalar a los agricultores patatas, etc?
Por ello ya han surgido ciertas iniciativas para cambiar el paisaje.

Cooperativas y asociaciones. Esas dos ideas que intentan dar un vuelco a la distribución de los alimentos procedentes del campo. Se llevan el dinero quienes se lo deben llevar. Ya se que supone más trabajo, pero eliminar a un intermediario sangrante bien lo vale.

A mi me parece que las medidas abocadas a la transparencia son interesantes. Que el consumidor sepa quien se lleva la pasta es bueno, porque al consumidor le gusta decidir.
En esta dirección, dentro de poco, se quiere que ciertos alimentos cambien su etiquetado. Lo que se pretende es que en un futuro las etiquetas indiquen el precio pagado en el origen y en el destino por el alimento.

Otro paso interesante es el de los emprendedores. Nada de chachara, sólo dos ejemplos: Naranjas Lola y directo del campo.

4346

Referencias y enlaces:

Analizando VuelosBaratos.es

Antecedentes

Esta entrada está patrocinada a través de zync.es.
Como novato en esto de los análisis patrocinados vamos a ver si queda una entrada decente y chula.
Es de interés también aclarar que VuelosBaratos.es tiene una relación curiosa con El Demonio Negro (esos somos nosotros 😉 ), porque ya llevan tiempo manteniendo un enlace en nuestra página principal a través de textlinkads.com ( más sobre anunciarse y donar ).

VuelosBaratos.es usa información de buscadores de cienes de páginas/compañías de/para viajes y la presenta de forma bonita y comprensible, pero no le agregan un sobrecoste a los precio originales de dichas páginas (cosa que pasa en otras páginas).

Lo nuevo de vuelosbaratos.es

Ahora, por lo indagado, VuelosBaratos.es (como les gusta escribirse) lanza su renovado portal y lo hace con una campaña bitacorera (o bloggera para quien guste). Y es que, a parte de nosotros (y de su también inaugurado blog), se de al menos otro análisis en ningunterra.com.

Bueno, bueno, bueno. Vamos llegando a la chicha. Las novedades que ellos más destacan (no hay más que leer su blog) son un comparador multitransporte, el calendario de ofertas, los mapas, la localización dinámica, los filtros y las búsquedas recientes. De todo esto hay cosas que suenan muy bien, pero hay que verlo en funcionamiento.

Mi viaje

Sí, VuelosBaratos.es es una web de viajes, como su nombre no indica.
Lo que me gusta del tema este de los análisis patrocinados es poder diseccionar como yo quiera lo que el anunciante pide. Para ello nada tan simple como inventarse un viajecito a la otra mitad del puente aéreo. Barcelona.

Lo primero, en la pantalla de mi portátil con una resolución de 1024×768 veo toda la web. Una web sencilla y bien dividida en su portada (no cómo EDN…).
Como profesional e informático decido hacer una pequeña prueba para ver si la página respeta los estándares web y la desilusión me sobrecoge el alma. Cachis, todo era tan maravilloso. Por su bien no realizo un test de accesibilidad.

El caso es que mi escapada ficticia a Barcelona para dentro de un par de semanas destapa las bondades de este buscador de buscadores.
El filtrado por fechas, transportes, escalas, lugar de salida, lugar de destino y operadores me parece de lo más intuitivo y cómodo que he visto al tratar de organizar el desplazamiento para un viaje.
Además puedo ver con un sólo click el emplazamiento sobre el mapa de los lugares de salida y llegada. Otro minipunto. Oh, un momento, también me muestran un gráfico para ver que cuesta según que día haga la ida o la vuelta.
Una vez me decido por un horario, etc, selecciono y me redirigen a la web original dónde se ofrece el viaje en cuestión. De ahí la carencia de sobrecoste que comentaba al principio del análisis.

Me decido a probar el buscador de hoteles. Grata sorpresa, se acuerda de quería ir a Barcelona, toda una comodidad. Parece una chorrada, pero si eres un tanto pesetero o indeciso y haces muchas búsquedas lo notas. Existen por el mundo muchas páginas que te limpian los formularios cada vez que cambias lo más mínimo y terminas escribiendo los mismos datos de viaje unas 45 veces (por cada día que te pones a buscar).
Siguiendo con los hoteles, creo que les queda mucho por hacer. Los datos de cada hotel me resultan un tanto escasos como para poder valorar decentemente. Filtrar por la distancia al punto de destino y por características del hotel sería muy de agradecer. Se vuelve complicado decidir que hotel representa la mejor opción.

Resumiendo

Un buen punto de partida para planificar viajes peninsulares y europeos.
Ahora ya sólo queda que me paguen el viaje para quedar plenamente satisfecho con el servicio….

VuelosBaratos.es

La idea

Lo que sería ya la repera es combinar esta web con otras webs que albergan valoraciones sobre hoteles y compañías aéreas.
Otra idea para aguilillas emprendedoras. Vendría bien tener una web con opiniones de usuarios sobre compañías de transporte y el servicio que dan en cada pueblos/ciudades que comunican. Qué tal es tal ruta, cuan cómodo es el autobús/tren….

[GLKM] Funcionalidades

En esta entrada sólo me limito a escribir las principales funcionalidades/objetivos que ya pensé de dotar a mi PFC. Son un poco datos que debí haber publicado hace ya algún tiempo (para variar).
A priori no tengo porque implementarlo todo para poder terminar, ya que como se puede observar, terminan siendo muchas cosas.

Este futuro monitor gráfico de procesos del kernel linux será útil para depurar procesos tanto de la propia máquina como de una máquina remota.
La información monitorizada corresponde a las estructuras internas del sistema operativo, más concretamente, del sistema de ficheros con respecto a los procesos.

  • Orientado a una interfaz gráfica.
  • Monitorización en red.
  • Monitorización de procesos. Específicamente atributos de ficheros Reiser. Por supuesto la arquitectura va encaminada a extensiones que permitan ampliar las estructuras a monitorizar
  • Visualizar/Monitorizar grupos de procesos simultáneamente.
  • Estadísticas del uso de ficheros (opcional)
  • Tipos de monitorización: Tiempo real o asíncrona. En tiempo real se toman datos cada intervalo X de tiempo de forma constante. En el caso de monitorización asíncrona se toman datos en los instantes que se indiquen.
  • Integración con DBUS/HAL. En la medida de lo posible quiero llevar la comunicación entre la interfaz gráfica y el módulo del kernel por DBUS. A ver como sale.

No cabe duda que no quiero perder de vista al dtrace para Linux, systemtap. Systemtap realiza labores similares al fin y al cabo.
Para quien no conozca estas herramientas en los siguiente párrafos hago un breve resumen.
Dtrace y systemtap son muy similares, sólo que una está ligada a Solaris y la otra a Linux. Como en mi caso, monitorizar el núcleo del sistema operativo te cierne (un poco por definición) a ser una herramienta monoplataforma. Ambas proveen unos “lenguajes” propios que permiten extraer/monitorizar variables del sistema operativo.
Con dicha información se pueden realizar estadísticas y depuración como objetivo primordial.