From: Tommy Lindgren <tommy.lindgren@gm...> - 2011-06-26 20:21:08
I thought I should share a little rdesktop hack I did.
At work we build a product on top of SuSE Linux. We make nightly iso
builds and we wanted to do fully automatic testing of these,
e.g. automatically install the OS + our software and execute a test
suite. It's trivial to boot a fresh build under VirtualBox in headless
mode, but the installation will of course get stuck, waiting for someone
to enter hostname, IP address, and so on. At first we built a special
version of the iso with an autoyast profile with hard-coded hostname
etc, but it didn't feel like a very elegant solution so I did the
In headless mode, the guest OS is accessible via VirtualBox's built-in
RDP server. I figured it wouldn't be too hard to combine an RDP client
with some optical character recognition software to detected the
installation dialogs, and then make the RDP client send fake key
I had a look at the rdesktop source code and found it to be quite
nice. So I added a -G switch, making it possible to control rdesktop
from an "agent" script. My script in question would run import(1) on the
X11 window, feed the image to gocr(1), then look for strings like "Enter
hostname" in the text dump and finally ask rdesktop to send back an
appropriate key sequence.
To achieve that last bit I snarfed the code at
and basically just replaced the X11 calls with xkeymap_send_keys()...
So, each night our Hudson server will
1. build the iso and and boot it under VirtualBox
2. launch Xvnc with rdesktop -G agentscript
3. wait until rdesktop exists (the agent script will ask rdesktop to
exit after the last dialog), wait until sshd comes up, and then execute
the test suite
The whole setup is pretty ridiculous but works surprisingly well. The
only problem I've noticed is that different versions of gocr can return
slightly different output. Also, too small window size may give poor
results (increasing the video memory size in VirtualBox helps here).
I have uploaded the stuff to
The major changes are the new agent.c (code for communicating with the
agent script) and xkeymap_send_string() in xkeymap.c. I've also
included an example agent script (test.xexpect).
The purpose of this mail is mainly to share my experiences, but if there
is any interest to merge the agent code I would be delighted.