archives/2009/05StyXman's globhttp://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/StyXman's globikiwiki2010-01-27T22:55:55Z04http://grulicueva.homelinux.net/~mdione/glob//archives/2009/04/2010-01-27T22:55:55Z2009-05-27T15:40:29Z
<div class="inlinepage">
<div class="inlineheader">
<span class="header">
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../posts/charla-ssh-scp-screen/">charla-ssh-scp-screen</a>
</span>
</div>
<div class="inlinecontent">
<p>El otro día dí una charlita un poquito larga de ssh/scp y screen en el
<a href="http://iate.oac.uncor.edu/">IATE</a>, el lugar donde laburo. En la misma
hablo de <code>ssh/scp</code> básico, mas cómo poner claves públicas/privadas y
cómo usar el <code>ssh-agent</code> para administrarlas (algo de lo que <a href="http://grulicueva.homelinux.net/~mdione/glob/posts/ssh-agent/">ya hablé
en este
glob</a>),
mas otros temas como el X11 forwarding y el agent-forwarding. Además
hablé de <code>screen</code>, una herramineta que se complementa muy bien con
<code>ssh</code>. Dejo las filminas
<a href="http://grulicueva.homelinux.net/~mdione/charlas/ssh-screen-2.odp">acá</a>.</p>
<p><a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/security/">security</a> <a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/utils/">utils</a></p>
</div>
<div class="inlinefooter">
<span class="pagedate">
Posted <span class="date">Sat 18 Apr 2009 11:49:35 PM CEST</span>
</span>
<span class="tags">
Tags:
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/security/" rel="tag">security</a>
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/utils/" rel="tag">utils</a>
</span>
</div>
</div>
<div class="inlinepage">
<div class="inlineheader">
<span class="header">
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../posts/recuperando-particiones-con-papel-y-lapiz/">recuperando-particiones-con-papel-y-lapiz</a>
</span>
</div>
<div class="inlinecontent">
<p>El sábado pasado recibo un mail de un chango del laburo con subject
«ayuuuudaaa urgenteeeeee»[sic]. Me dice que estaba boludeando el viernes
a la noche cuando la máquina se quedó primero sin sonido y luego se
tildaba. Cuando la quizo reiniciar no arrancó más. «dice algo de disco
no booteable...».</p>
<p>El lunes caigo como siempre y me voy a verla. Efectivamente, decía algo
de disco no booteable. Booteo con un <a href="http://grml.org/">GRML</a> que tengo
en un pendrive y descubro que el disco no tiene particiones.</p>
<p>Pánico. </p>
<p>El tipo está acá haciendo un posdoc en algo astronómico (literalmente) y
todo su laburo está ahí dentro. No hay backups, como corresponde, así
que me preparo a hacer un rescate de particiones.</p>
<p>En el mismo pendrive tengo un sistema con
<a href="http://www.gnu.org/software/parted/">parted</a>. Booteo con eso y trato de
usar el rescue del parted. Naranja. Le pregunto cómo eran las
particiones, etc. Me responde que él sólo instaló un Kubuntu por
defecto. Por defecto Kubuntu crea una partición swap y una ext3 para / y
eso es todo, lo cual hacía mas fácil lo que estaba por venir.</p>
<p>Reninicio en el GRML y con <code>hexdump -C /dev/sda | more</code> me pongo a ver
el contenido del diso a pelo. No es la primera vez que hago malabares
con particiones y MBRs, pero antes lo hacía con una herramienta que creo
que a esta ahora está discontinuada (El programa se llamaba
adecuadamente DiskEdit, de una empresa que lleva el mismo nobre que un
vino y que el apellido del dueño, cuyo nombre es el mismo que el padre
en Family Guy, y que vienen haciendo Utilities para Windows desde que
las hacían para DOS) y que tenía visores especiales para estos sectores
y también editar FATs y un montón cosas útiles... en el universo M$.</p>
<p>Primero confirmo que, efectivamente, el primer sector es un MBR (al
menos tiene el signature <code>0x55aa</code> en los últimos dos bytes), y toda la
<a href="http://en.wikipedia.org/wiki/Mbr#MBRs_and_disk_partitioning">tabla de
particiones</a>
está vacía, pero que en el segundo sector parece haber una copia. Agarro
papel y lápiz, transcribo lo que parece haber, pero al final resulta que
no sólo tengo la mitad de los datos, sino que es una partición muy
chica.</p>
<p>Entonces me propongo buscar la partición ext3 a mano. Para ello tuve que
averiguar cómo es que hace un ext3 para saber que la partición realmente
es una ext3 y no cualquier verdura. Sabía que que sería con un magic,
pero no tenía ni idea. Instalé las fuentes del 2.6.29 en mi laptop y me
puse a mirar el código de ext3. Después de dar bastante vueltas,
incluyendo seguir el código que se ejecuta cuando
<a href="http://lxr.linux.no/linux+v2.6.29/fs/super.c#L917">montás</a>
<a href="http://lxr.linux.no/linux+v2.6.29/fs/super.c#L779">un</a>
<a href="http://lxr.linux.no/linux+v2.6.29/fs/super.c#L357">filesystem</a>
<a href="http://lxr.linux.no/linux+v2.6.29/fs/ext3/super.c#L1546">ext3</a>, donde
<a href="http://lxr.linux.no/linux+v2.6.29/fs/ext3/super.c#L1614">podemos ver que
usa</a> un
<a href="http://lxr.linux.no/linux+v2.6.29/include/linux/magic.h#L16">magic</a>[3] y
<a href="http://lxr.linux.no/linux+v2.6.29/include/linux/ext3_fs.h#L454">también</a>
la <a href="http://lxr.linux.no/linux+v2.6.29/include/linux/ext3_fs.h#L454">estructura del superblock del
ext3</a>,
donde vemos que <a href="http://lxr.linux.no/linux+v2.6.29/include/linux/ext3_fs.h#L470">el offset del
magic</a>
es 0x38.</p>
<p>Entonces el problema de encontrar un ext3 en un disco se reduce a buscar
un 0x53ef (fucking little endian) en la posición 0x38 de un sector en el
disco. Por suerte <code>more</code> tiene para buscar, así que me siento a buscar
toooodas las ocurrencias de <code>53 ef</code> esperando que la dirección a la
derecha termine con <code>30</code> y que sean el 9no y el 10mo byte de la línea
(maldito 0 based).</p>
<p>Unos cuantos next después, tengo mi primer candidato. Pinta muy bien,
porque además lo estaba comparando con el mismo dump pero del pendrive
(que tengo formateado en ext2, y por suerte ext2 y ext3 comparten todas
estas estructuras), y además pude ver algo que tenía toda la pinta de
ser un
<a href="http://lxr.linux.no/linux+v2.6.29/include/linux/ext3_fs.h#L499"><code>uuid</code></a>.</p>
<p>Saco que la dirección del magic es <code>0x80731038</code>. A eso le resto los
<code>0x38</code> y me da que el superblock empieza en <code>0x80731000</code>, un lindo
número redondito. Pasado a decimal me dá el byte <code>2.155.024.384</code>, unos
2GiB desde del comienzo del disco. ¡Pinta muy bien! El swap podría estar
primero, y ser de unos 2GiB.</p>
<p>Arranco un <code>fdisk /dev/sda</code> y al mostrar la tabla (aún vacía) de
particiones me dice que hay <code>16.065</code> sectores por cilindro*<code>512</code> bytes
por sector= <code>8.225.280</code> bytes por cilindro. Casi todas las distros (en
realidad creo que todas) particionan los discos por cilindros[1], por lo
que si el sector éste está justo al principio de un cilindro...</p>
<p>Divido <code>2.155.024.384/8.225.280=...</code></p>
<p>(suspenso)[2]</p>
<p><code>262.000124494...</code></p>
<p>¡Damn! Casi lo tenía... Hmm, ¿y cuánto es lo que sobra?
<code>(262.000124494-262)*8.225.280=...</code> ¡<code>1024</code>! ¿Será que...?</p>
<p>Arranco un <code>strace debugfs -R show_super_stats /dev/sdb1</code> (la partición
en mi pendrive) y veo que ¡efectivamente hace un seek de <code>1024</code> bytes
dentro de la partición para leer el superblock!</p>
<p>This is it. Con el 262 en la cabeza arranco <code>fdisk /dev/sda</code> y creo dos
particiones: un swap en los cilindros 1-261 y una linux del cilindro 262
en adelante. Guardo, salgo, cruzo los dedos y corro un <code>debugfs -R
show_super_stats /dev/sda1</code>. ¡Fail! ¿Qué pasa? Reinicio y pruebo de
nuevo, no vaya a ser que el kernel no haya leído bien la nueva tabla de
particiones. Tampoco. ¿WTF? </p>
<p>Ah, duh, es <code>sda2</code>. Ok, <code>debugfs -R show_super_stats /dev/sda2</code>...
¡Anda, el muy HDP anda! No lo puedo creer. Me la juego: <code>fsck -n
/dev/sda2</code>. «Filesystem is clean» Damn, vamos de nuevo: <code>fsck -n -f
/dev/sda2</code>...</p>
<pre><code>Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sda2 sarasa sarasa...
</code></pre>
<p>¡Intacto! Pero el MBR no tiene un grub, así que hago el habitual proceso
de reinstalar Grub, reinicio... </p>
<p>Bootea perfecto, y termina en un hermoso login. Satisfecho, me doy unas
palmaditas en la espalda, cargo mis cosas y comienzo el fin de semana.</p>
<p><a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/sysadmin/">sysadmin</a> rescue</p>
<hr />
<p>[1] ... desperdiciando unos 8MiB entre el MBR y la primera partición</p>
<p>[2] Los perspicaces se darán cuenta al toque que eso no puede ni a
ganchos dar entero.</p>
<p>[3] Son muy graciosos los magics de Reiser. Parece haber iniciado una
moda que ahora usan los AdOlEsCeNtEs.</p>
</div>
<div class="inlinefooter">
<span class="pagedate">
Posted <span class="date">Fri 17 Apr 2009 07:11:48 PM CEST</span>
</span>
<span class="tags">
Tags:
rescue
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/sysadmin/" rel="tag">sysadmin</a>
</span>
</div>
</div>
<div class="inlinepage">
<div class="inlineheader">
<span class="header">
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../posts/pycamp-2009/">pycamp-2009</a>
</span>
</div>
<div class="inlinecontent">
<p>Acaba de terminar la edición 2009 de pyCamp. Esta vez vinieron cerca de
40 personas, lo cual hizo que hubiera más proyectos dando vueltas y mas
gente en los proyectos. Fueron 4 días fantásticos llenos de ideas,
código, reuniones, juegos, algo de alcohol y mucho mas. A diferencia del
año pasado, esta vez vienieron algunos audaces con familia, no sé cómo
les habrá ido.</p>
<p>Este año estuve mucho mas enganchado. El primer día hicimos un schedule
cuasi definitivo y en el momento se me ocurrió hacer cosas con Fuse y
Python. Cuando tocó el slot, di una charla de cómo funciona Fuse y
algunas puntas de cómo implementar file systems con él. Al final del
evento yo había terminado el wrapper que venía haciendo hace unas
semanas (ok, ok, falta <code>statvfs</code>) y <a href="http://perrito666.com.ar">perrito</a>
se hizo un filesystem para acceder los iPod. Lucio me hizo prometer ver
cómo combinar Fuse async con Twisted. También le estuve explicando
<code>ctypes</code> al Polako, con lo que creo que terminé de entender el módulo y
me ayudó a entender algunas cosas que había hecho para el wrapper.</p>
<p>También estuve en el diseño y (re)implementación del bot de irc. En
apenas 2 días y medio ya tenemos el core y unos cuantos plugins, y hay
varios desarrolladores haciendo mas. Sólo faltan implementar pedezos de
infraestructura, sobre todo la parte de bases de datos, pero me veo
metiendo un par de plugins mas y ponerla en producción muy muy pronto
(en relaidad perrito le va a dar hosting). También fue una oportunidad
para (re)aprender Twisted, y enterarse de cosas como que <a href="http://twistedmatrix.com/projects/core/documentation/howto/gendefer.html#auto2">no podés hacer
asincrónico un proceso
sincrónico</a>,
y de aprender de boca de Guillo cómo usar <code>bzr</code> para laburar entre los 6
u 8 que metíamos código.</p>
<p>También estuve renegando los dos primeros días con el applet de batería
de KDE4. Terminé encontrando (un bug en
Solid)[https://bugs.kde.org/show_bug.cgi?id=187600] y aprendiendo
detalles sobre Hal, D-Bus, algunos bastante oscuros y bizarros. Al mismo
tiempo estuve viendo cómo se comportan los algoritmos de recarga de
batería y de estimación de los tiempos de descarga y de descarga.
Resulta que cuando está terminando de cargar se empieza a estirar el
tiempo y los últimos 5 minutos pueden termiar siendo 20.</p>
<p>Estuvo genial poder conocer más gente y de volver a ver algunas caras
conocidas (hace rato que no estaba en un evento de alguna comunidad).
Entre los nuevos encontré a gente de <a href="http://kde.org.ar">Kde-ar</a> como
Leo u otros jugando con PyQt. Me encantó volver a sentir que programaba,
ver unos proyectos arrancar y otros continuar a velocidades de la
hostia, con features apareciendo como hongos y bugs desapareciendo
como... bueno, no es una buena fecha para hablar de desapariciones :|</p>
<p>El último sprint estuvo genial; monitoreen la lista y/o el canal para
enterarse de los resultados ;-)</p>
<p><a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/python/">python</a> <a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/twisted/">twisted</a> <a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/bazaar/">bazaar</a> <a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/pyar/">pyar</a> <a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/kde/">kde</a></p>
</div>
<div class="inlinefooter">
<span class="pagedate">
Posted <span class="date">Wed 08 Apr 2009 06:27:04 AM CEST</span>
</span>
<span class="tags">
Tags:
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/bazaar/" rel="tag">bazaar</a>
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/kde/" rel="tag">kde</a>
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/pyar/" rel="tag">pyar</a>
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/python/" rel="tag">python</a>
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/twisted/" rel="tag">twisted</a>
</span>
</div>
</div>
03http://grulicueva.homelinux.net/~mdione/glob//archives/2009/03/2010-01-27T22:55:55Z2009-05-27T15:40:27Z
<div class="inlinepage">
<div class="inlineheader">
<span class="header">
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../posts/man-and-battery/">man-and-battery</a>
</span>
</div>
<div class="inlinecontent">
<p>When I arrived to pyCamp (I'm at
<a href="http://www.python.com.ar/moin/PyCamp/2009">pyCamp</a>!) I was fighting
with a battery applet bug. When the battery is almost full the applet
got 'confused' and thought the battery just finished charging, and if it
where showing the remaining time, it switched to charge percentage,
which actually showed that it wasn't fully charged, but somewhere near
96% or so (this is wrong assuming the battery can fully charge up to
100%, as my 6 month old Dell battery). The problem was really that my
code was checking if the remaining time were 0 or not. So I started from
there down.</p>
<p>Down was it indeed. Seems like from time to time, when the bettry is
filling up, one can't ask hal about the remaining time. Using <code>qdbus</code> to
ask <code>hal</code> directly we get this answer:</p>
<pre><code>Error: org.freedesktop.Hal.NoSuchProperty
No property battery.remaining_time on device
</code></pre>
<p>This situation is not stable; sometimes I get the value I want. Not only
that, when the battery is full, the values get horrobly wrong. Here's
some samples (values are seconds since epoch and remaining time in
seconds):</p>
<pre><code>1237677446 1134
1237677746 261
1237677806 235
1237677866 313
1237677927 190
# at some moment in this gap the battery is fully charged
1237678167 188836
1237678227 152509
1237678287 112581
</code></pre>
<p>So I changed the algorithm to a more correct one; that is, ask if the
battery is charging or discharging or none of those (in that case the
battery is full) and show the time or the percentage accordingly. This
works, except that it doesn't.</p>
<p>The problem has shifted to another place. Now I don't get the signal
when <code>is_chaging</code> goes false. With <code>lshal -m</code> I can see the event:</p>
<pre><code>11:48:46.823: computer_power_supply_battery_BAT0 property battery.rechargeable.is_charging = false
</code></pre>
<p>but I keep getting <code>"Charging"</code> from this code:</p>
<pre><code>battery_data.value()["State"].toString()
</code></pre>
<p>where <code>battery</code> is a powermanagement data engine. Interesting enough, if
I close the applet and load it again (as anyone debugging plasmoids,
I'm using <code>plasmoidviewer</code>), that line returns the correct value of
<code>"NoCharge"</code>, which is what's spected.</p>
<p>I will try to file a bug against the data engine, or maybe Solid, and
wait for the fix before comitting the fix to this bug.</p>
<hr />
<p>Update: it ended being <a href="https://bugs.kde.org/show_bug.cgi?id=187600">a bug in
Solid</a>, after all. I posted
a fix.</p>
<p><a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/kde/">kde</a></p>
</div>
<div class="inlinefooter">
<span class="pagedate">
Posted <span class="date">Mon 23 Mar 2009 09:41:16 PM CET</span>
</span>
<span class="tags">
Tags:
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/kde/" rel="tag">kde</a>
</span>
</div>
</div>
<div class="inlinepage">
<div class="inlineheader">
<span class="header">
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/c/">c</a>
</span>
</div>
<div class="inlinecontent">
<div class="inlinepage">
<div class="inlineheader">
<span class="header">
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../posts/ctypes-and-buffers/">ctypes-and-buffers</a>
</span>
</div>
<div class="inlinecontent">
<p>I'm implementing a wrapper of a C library for Python. The obvious choice
is to write some C linked to <code>libpython</code>, and the not so obvious but
simpler one is to use <code>ctypes</code>. <code>ctypes</code> is really simple to use: it has
ways to declare structures and function types, with several classes that
represents the simple types: <code>c_int</code>, <code>c_char</code>, <code>c_char_p</code>, <code>c_void_p</code>,
etc.</p>
<p>Now, this library has a function, <code>write()</code>, that handles a buffer. In
this case, for buffer I mean a fixed size space in memory with data,
paired with an integer telling us how much of the space is really data.
So basically its declaration is like this:</p>
<pre><code>void (*write) (const char *buf, size_t size);
</code></pre>
<p>The void pointer is because this is the type of a struct member that has
to point to such a function. Looking at that declaration, one would
think that, assuming a <code>c_size_t</code> is already declared with the correct
type, the corresponding declaration in ctypes is:</p>
<pre><code>write_t = CFUNCTYPE(c_void_p, c_char_p, c_size_t)
</code></pre>
<p>This is what <a href="http://docs.python.org/library/ctypes.html#callback-functions">the <code>ctypes</code>
documentation</a>
calls a <em>callback function</em>.</p>
<p>The problem arises with the <code>c_char_p</code> there. With this class, <code>ctypes</code>
assumes that the parameter is a string, and not a buffer. Both strings
and buffers in C are fixed size space in memory. The difference between
them is that strings are <code>\x00</code> ended, so its size it's determined by
the first occurence of a <code>\x00</code> in the memory space, while a buffer has
to be accompanied by an integer, as I mentioned before. A <code>\x00</code> cannot
occur in a string (the trailing one is not always considered as part of
the string <em>per se</em>), while it can occur several times in a buffer. In
fact, a buffer can be entirely full of <code>\x00</code>'s.</p>
<p>So what <code>ctypes</code> does here is to convert our buffer into a string. Any
occurence of a <code>\x00</code> in the original data will make <code>c_char_p</code> end the
string and forget about the rest of the data, ignoring the real size of
the buffer. Even more, if the original data has no <code>\x00</code> in it,
<code>ctypes</code> might cause a segmentation fault trying to find one beyond the
process' memory space. This not only corrupts data, but might even crash
the app!</p>
<p>The solution is simple, luckly enough. You just neet to treat your
buffer as a <code>void *</code> instead of a <code>char *</code>. So the declaration ends up
being:</p>
<pre><code>write_t = CFUNCTYPE(c_void_p, c_void_p, c_size_t)
</code></pre>
<p>The later, in our callback, we can convert that buffer into a
<code>str()</code>[1] to manipulate it as such:</p>
<pre><code>def write(buf, size):
data = string_at(buf, size)
</code></pre>
<p>The <code>size</code> parameter is again important; if not, <code>string_at()</code> will
again think in terms of string and not of buffer. I think this has to be
improved a little. Maybe <a href="http://www.python.com.ar/moin/PyCamp/2009">next
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../posts/pycamp/">PyCamp</a></a> I'll file a bug and
develope a patch, either for the code or the documentation; maybe both.</p>
<hr />
<p>[1] This is Python 2.5</p>
<p><a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/python/">python</a> <a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/c/">c</a></p>
</div>
<div class="inlinefooter">
<span class="pagedate">
Posted <span class="date">Thu 12 Mar 2009 03:24:20 PM CET</span>
</span>
<span class="tags">
Tags:
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/c/" rel="tag">c</a>
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/python/" rel="tag">python</a>
</span>
</div>
</div>
</div>
<div class="inlinefooter">
<span class="pagedate">
Posted <span class="date">Thu 12 Mar 2009 03:24:30 PM CET</span>
</span>
</div>
</div>
<div class="inlinepage">
<div class="inlineheader">
<span class="header">
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../posts/ctypes-and-buffers/">ctypes-and-buffers</a>
</span>
</div>
<div class="inlinecontent">
<p>I'm implementing a wrapper of a C library for Python. The obvious choice
is to write some C linked to <code>libpython</code>, and the not so obvious but
simpler one is to use <code>ctypes</code>. <code>ctypes</code> is really simple to use: it has
ways to declare structures and function types, with several classes that
represents the simple types: <code>c_int</code>, <code>c_char</code>, <code>c_char_p</code>, <code>c_void_p</code>,
etc.</p>
<p>Now, this library has a function, <code>write()</code>, that handles a buffer. In
this case, for buffer I mean a fixed size space in memory with data,
paired with an integer telling us how much of the space is really data.
So basically its declaration is like this:</p>
<pre><code>void (*write) (const char *buf, size_t size);
</code></pre>
<p>The void pointer is because this is the type of a struct member that has
to point to such a function. Looking at that declaration, one would
think that, assuming a <code>c_size_t</code> is already declared with the correct
type, the corresponding declaration in ctypes is:</p>
<pre><code>write_t = CFUNCTYPE(c_void_p, c_char_p, c_size_t)
</code></pre>
<p>This is what <a href="http://docs.python.org/library/ctypes.html#callback-functions">the <code>ctypes</code>
documentation</a>
calls a <em>callback function</em>.</p>
<p>The problem arises with the <code>c_char_p</code> there. With this class, <code>ctypes</code>
assumes that the parameter is a string, and not a buffer. Both strings
and buffers in C are fixed size space in memory. The difference between
them is that strings are <code>\x00</code> ended, so its size it's determined by
the first occurence of a <code>\x00</code> in the memory space, while a buffer has
to be accompanied by an integer, as I mentioned before. A <code>\x00</code> cannot
occur in a string (the trailing one is not always considered as part of
the string <em>per se</em>), while it can occur several times in a buffer. In
fact, a buffer can be entirely full of <code>\x00</code>'s.</p>
<p>So what <code>ctypes</code> does here is to convert our buffer into a string. Any
occurence of a <code>\x00</code> in the original data will make <code>c_char_p</code> end the
string and forget about the rest of the data, ignoring the real size of
the buffer. Even more, if the original data has no <code>\x00</code> in it,
<code>ctypes</code> might cause a segmentation fault trying to find one beyond the
process' memory space. This not only corrupts data, but might even crash
the app!</p>
<p>The solution is simple, luckly enough. You just neet to treat your
buffer as a <code>void *</code> instead of a <code>char *</code>. So the declaration ends up
being:</p>
<pre><code>write_t = CFUNCTYPE(c_void_p, c_void_p, c_size_t)
</code></pre>
<p>The later, in our callback, we can convert that buffer into a
<code>str()</code>[1] to manipulate it as such:</p>
<pre><code>def write(buf, size):
data = string_at(buf, size)
</code></pre>
<p>The <code>size</code> parameter is again important; if not, <code>string_at()</code> will
again think in terms of string and not of buffer. I think this has to be
improved a little. Maybe <a href="http://www.python.com.ar/moin/PyCamp/2009">next
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../posts/pycamp/">PyCamp</a></a> I'll file a bug and
develope a patch, either for the code or the documentation; maybe both.</p>
<hr />
<p>[1] This is Python 2.5</p>
<p><a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/python/">python</a> <a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/c/">c</a></p>
</div>
<div class="inlinefooter">
<span class="pagedate">
Posted <span class="date">Thu 12 Mar 2009 03:24:20 PM CET</span>
</span>
<span class="tags">
Tags:
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/c/" rel="tag">c</a>
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/python/" rel="tag">python</a>
</span>
</div>
</div>
<div class="inlinepage">
<div class="inlineheader">
<span class="header">
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/kde-ar/">kde-ar</a>
</span>
</div>
<div class="inlinecontent">
<div class="inlinepage">
<div class="inlineheader">
<span class="header">
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../posts/kde-cba-primera-reunion/">kde-cba-primera-reunion</a>
</span>
</div>
<div class="inlinecontent">
<p>No somos muchos en Córdoba. Tal vez uno 10, tal vez menos. Pero tenemos
un objetivo común: hacer KDE, y hacerlo una mejor plataforma para
nosotros, y para todo el mundo. Este objetivo tan amplio incluye desde
desarrollar aplicaciones o simples features, arreglar bugs, hasta
reportarlos, difundir un poco su potencia y <em>lindura</em> (no me pidan
redacción a esta hora de la noche).</p>
<p>Por eso nos juntamos esta noche a tomar unas cervezas y ver en qué parte
de este objetivo quiere estar cada uno, y hasta dónde cree llegar hoy
día y <em>slogan-de-una-empresa-gigantesca-de-software</em>.
<a href="http://grulicueva.homelinux.net/~mdione/gallerpy/index.py/pictures/kde-ar/M01CBA/IMG_5571.JPG">Estuvimos</a>
Emanuel
<em>emanuel</em> Sartori, Franco <em>frapell</em> Pellegrini, Manuel <em>elpreto</em> Ramírez
y yo. Tomamos unos cafecitos, comimos unos tostaditos y charlamos.</p>
<p>Cosas concretas aún no tenemos; somos pocos, y si bien eso parece
simplificar la organización, hace que sea difícil que pensemos en
exactamente lo mismo. Lo que sí sabemos que ésta no es la última
reunión, y que en las siguientes vamos a estar viendo de hacer lo que
cada uno quiere aprovechando lo que el otro sabe. Esto puede parecer
poco, pero la idea es fortalecernos con el tiempo.</p>
<p>Aún no hay fecha fija; queremos que sea la semana que viene, pero
empiezan las clases y eso significa cambios de horarios para muchos. Ya
avisaremos con anticipación en <a href="https://listas.usla.org.ar/cgi-bin/mailman/listinfo/kde-ar">la lista
kde-ar</a>.</p>
<p><a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/kde/">kde</a> <a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/kde-ar/">kde-ar</a></p>
</div>
<div class="inlinefooter">
<span class="pagedate">
Posted <span class="date">Fri 06 Mar 2009 04:45:30 AM CET</span>
</span>
<span class="tags">
Tags:
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/kde/" rel="tag">kde</a>
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/kde-ar/" rel="tag">kde-ar</a>
</span>
</div>
</div>
</div>
<div class="inlinefooter">
<span class="pagedate">
Posted <span class="date">Fri 06 Mar 2009 05:01:19 AM CET</span>
</span>
</div>
</div>
<div class="inlinepage">
<div class="inlineheader">
<span class="header">
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../posts/kde-cba-primera-reunion/">kde-cba-primera-reunion</a>
</span>
</div>
<div class="inlinecontent">
<p>No somos muchos en Córdoba. Tal vez uno 10, tal vez menos. Pero tenemos
un objetivo común: hacer KDE, y hacerlo una mejor plataforma para
nosotros, y para todo el mundo. Este objetivo tan amplio incluye desde
desarrollar aplicaciones o simples features, arreglar bugs, hasta
reportarlos, difundir un poco su potencia y <em>lindura</em> (no me pidan
redacción a esta hora de la noche).</p>
<p>Por eso nos juntamos esta noche a tomar unas cervezas y ver en qué parte
de este objetivo quiere estar cada uno, y hasta dónde cree llegar hoy
día y <em>slogan-de-una-empresa-gigantesca-de-software</em>.
<a href="http://grulicueva.homelinux.net/~mdione/gallerpy/index.py/pictures/kde-ar/M01CBA/IMG_5571.JPG">Estuvimos</a>
Emanuel
<em>emanuel</em> Sartori, Franco <em>frapell</em> Pellegrini, Manuel <em>elpreto</em> Ramírez
y yo. Tomamos unos cafecitos, comimos unos tostaditos y charlamos.</p>
<p>Cosas concretas aún no tenemos; somos pocos, y si bien eso parece
simplificar la organización, hace que sea difícil que pensemos en
exactamente lo mismo. Lo que sí sabemos que ésta no es la última
reunión, y que en las siguientes vamos a estar viendo de hacer lo que
cada uno quiere aprovechando lo que el otro sabe. Esto puede parecer
poco, pero la idea es fortalecernos con el tiempo.</p>
<p>Aún no hay fecha fija; queremos que sea la semana que viene, pero
empiezan las clases y eso significa cambios de horarios para muchos. Ya
avisaremos con anticipación en <a href="https://listas.usla.org.ar/cgi-bin/mailman/listinfo/kde-ar">la lista
kde-ar</a>.</p>
<p><a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/kde/">kde</a> <a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/kde-ar/">kde-ar</a></p>
</div>
<div class="inlinefooter">
<span class="pagedate">
Posted <span class="date">Fri 06 Mar 2009 04:45:30 AM CET</span>
</span>
<span class="tags">
Tags:
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/kde/" rel="tag">kde</a>
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/kde-ar/" rel="tag">kde-ar</a>
</span>
</div>
</div>
02http://grulicueva.homelinux.net/~mdione/glob//archives/2009/02/2010-01-27T22:55:55Z2009-05-27T15:40:25Z
<div class="inlinepage">
<div class="inlineheader">
<span class="header">
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../posts/compilando-kde4/">compilando-kde4</a>
</span>
</div>
<div class="inlinecontent">
<p><a href="http://listas.usla.org.ar/pipermail/kde-ar/2009-February/000146.html">Estoy organizado un code jam en
Córdoba</a>
y <a href="http://perezmeyer.blogspot.com/">Lisandro</a> <a href="http://listas.usla.org.ar/pipermail/kde-ar/2009-February/000149.html">está organizando una en
Bahía
Blanca</a>.
La idea es que nos juntemos a laburar un poco en KDE, aprendiendo y
haciendo o features o cerrando bugs o lo que sea. En función de eso
estaría piola que cada uno ya lleve un kde trunk compiladito, al menos
la parte que les interese. Este post apunta a explicar cómo hacerlo.
Casi toda la info la saqué en su momento de
<a href="http://techbase.kde.org/Getting_Started">techbase</a> y/o preguntando en
IRC, listas de correo y hasta en DebConf.</p>
<p>Veamos cómo se organiza el código de KDE. Éste reside en un repositorio
subversion que tiene dos formas de acceso: uno autenticado por ssh para
los desarrolladores que tienen cuenta y uno anónimo que es de sólo
lectura. Los que ya tienen cuenta ya deberían saber usarlo y hasta cómo
compilar, así que para ellos este post no sirve. Cuando mencioné a trunk
en el párrafo anterior me refería a la rama principal de este repo.</p>
<p>A su vez el código está diseminado en distintos módulos: kdesupport,
kdelibs, kdepimlibs, kdebase, etc. Estos módulos y otras porciones de
código que andan dando vueltas están en un árbol:</p>
<pre><code>anonsvn.kde.org/home/kde/
+ branches
| + ...
+ tags
| + ...
+ trunk
+ extragear
| + ...
+ kdereview
| + ...
+ playground
| + ...
+ kdesupport
| + ...
+ qt-copy
+ KDE
+ kdebase
+ kdegraphics
+ kdelibs
+ kdemultimedia
+ kdenetwork
+ kdepim
+ kdepimlibs
+ ...
</code></pre>
<p><a href="http://websvn.kde.org/">Pueden ver este mismo árbol por web</a>. La rama
<code>KDE</code> es la que tiene el código de los distintos módulos de KDE.
<code>kdesupport</code> contiene un montón de software que no es de KDE, pero que
es necesario para correrlo. Allí van a encontrar las versiones adecuadas
de los mismos, y por lo general es muy aconsejable compilarlo. <code>qt-copy</code>
es una copia del código de Qt a su última versión, con el agregado de
varios parches. <code>kdereview</code> son proyectos que están siendo considerados
para la inclusión en KDE. <code>playground</code> está llenos de proyectos a medias
o casi completos, pero que no tienen pinta de estar listos para
revisión. Los nuevos proyectos normalmente nacen y/o crecen allí. Sin
embargo, mucho de lo que hay ahí funciona. Por último, <code>extragear</code>
contiene aplicaciones KDE que no se ajustan al ciclo de desarrollo de
KDE (actualemnte, un release menor cada 6 meses). En este directorio
podemos encontrar aplicaciones grosas como el <code>amarok</code>, el <code>k3b</code> o el
<code>digikam</code>.</p>
<p>Una instalación mínima de KDE consta de los módulos <code>qt-copy</code>,
<code>kdesupport</code>, <code>kdelibs</code>, <code>kdepimlibs</code> y <code>kdebase</code>. Compilarlos uno por
uno es un garrón, por lo que vamos a usar
<a href="http://kdesvn-build.kde.org/">kdesvn-build</a>, un script que lo
automatiza todo. Pero antes, las dependencias.</p>
<p>Por un lado necesitamos las herramientas de configuración y de
compiloación. Éstas son <code>cmake</code> y <code>g++</code> (en realidad es cualquier
compilador de C++, pero para hacerla fácil me voy a limitar a <code>g++</code>.
También me voy a limitar a distros basadas en Debian, como *buntu, sólo
porque es lo que más conozco.). El <code>cmake</code> de Debian Sid es el 2.6.0 y
desde hace un rato KDE necesita el 2.6.2 [ <strong>Update: 2.6.2 acaba de
entrar en Sid</strong> ], así que capaz haya que bajar y compilar ése también.
Si lo hacen, les aconsejo que corran el <code>configure</code> con la opción
<code>--prefix=/usr/local</code> o mejor, apuntando a algún lado de su propio home.
En mi caso, instalé todo en <code>~/local/soft/kde4</code>.</p>
<p>Luego están las dependencias de cada módulo per se. La siguiente es una
tabla que he ido creando con el tiempo y que trata de ser tan completa
como pude, pero seguro se me ha escapado más de un paquete. Los nombres
corresponden a los de los paquetes en Debian Sid, y que deben ser muy
similares a los de los *buntu. En cada módulo encontramos dos grupos de
dependencias: las estrictamente necesarias, sin las cuales el módulo no
compila, seguido de una línea en blanco, seguida por otra lista con las
dependencias opcionales. Estas dependencias hacen que el módulo ofrezca
más funcionalidad. Yo puse las que me interesan; después veremos cómo
ver qué otras son posibles.</p>
<pre><code>cmake:
~~~~~~
libncurses5-dev
qt-copy:
~~~~~~~~
libssl-dev
libpng12-dev
zlib1g-dev
libsqlite3-dev
libxinerama-dev
libdbus-1-dev
libjpeg62-dev
libsm-dev
kdesupport:
~~~~~~~~~~~
cmake
mysql
libclucene-dev
doxygen
dotty
librdf0-dev
libbz2-dev
libxml2-dev
libexiv2-dev
libgstreamer0.10-dev
libgstreamer-plugins-base0.10-dev
libgl1-mesa-dev
libgamin-dev
sun-java6-jdk
kdelibs:
~~~~~~~~
libsm-dev
libpcre3-dev
libgif-dev
libxrender-dev
libglu1-mesa-dev
libopenexr-dev
libenchant-dev
libgamin-dev
kdepimlibs
~~~~~~~~~~
libical-dev
libgpg-error-dev
libgpgme11-dev
libboost-dev
libsasl2-dev
kdebase
~~~~~~~
libfontconfig1-dev
libxt-dev
libsensors4-dev
libxklavier12-dev
libusb-1.0-0-dev
libxcomposite-dev
libxdamage-dev
libxtst-dev
libusb++-dev
libasound2-dev
libxss-dev
libxft-dev
libxkbfile-dev
kdemultimedia
~~~~~~~~~~~~~
libvorbis-dev
libcdparanoia0-dev
libxine-dev
kdegraphics
~~~~~~~~~~~
liblcms1-dev
libgphoto2-2-dev
libxxf86vm-dev
libimlib2-dev
kdepim
~~~~~~
libopensync0-dev
libpisock-dev
extragear
~~~~~~~~~
libjasper-dev
kdenetwork
~~~~~~~~~~
libavahi-compat-libdnssd-dev
</code></pre>
<p>Muchas, eh? Y éstos son sólo algunos de los módulos.</p>
<p>Ah! Antes de que nos mandemos a compilar, tenemos que preparar tres
cosas: un directorio donde van a ir las fuentes, otro donde vamos a
compilar y otro donde lo vamos a instalar. Yo personalmente prefiero
mantener todo a nivel de usuario, por lo que las fuentes las pongo en
<code>~/src/system/kde4</code>, compilo en <code>build</code> dentro de ese directorio y lo
instalo en <code>~/local/soft/kde4</code>. El primero en realidad puede ser
cualquier directorio, realmente no es relevante, salvo por el espacio
que ocupa. Las fuentes de cada módulo (en MiB):</p>
<pre><code>316 extragear[*]
549 kdebase
42 kdegraphics
185 kdelibs
18 kdemultimedia
106 kdenetwork
156 kdepim
41 kdepimlibs
10 kdereview
160 kdesupport
81 playground[*]
570 qt-copy
</code></pre>
<p>Los marcados con [*] no están completos, sino que elegí algunas cosas
que me interesaban. Los directorios donde compilamos, también en MiB:</p>
<pre><code>2146 build/extragear
1152 build/kdebase
253 build/kdegraphics
971 build/kdelibs
99 build/kdemultimedia
570 build/kdenetwork
1045 build/kdepim
194 build/kdepimlibs
33 build/kdereview
623 build/kdesupport
264 build/playground
1441 build/qt-copy
</code></pre>
<p>El último directorio sí me parece relevante; si no les gusta instalarlo
en su home, les aconsejo que lo hagan en <code>/opt</code> o al menos en
<code>/usr/local</code>, de forma de no destruir lo que haya instalado sus
sistemas.</p>
<p>Ok, suficiente introducción, vamos a los bifes. Bajamos <code>kdesvn-build</code>
en el directorio de compilación, lo descomprimimos y lo configuramos. La
configuración pasa por darle algunos detalles de qué, cómo y dónde
compilar e instalar. Pueden tomar del <code>kdesvn-buildrc-sample</code> que viene
incluido o tomar <a href="http://grulicueva.homelinux.net/~mdione/kde4/kdesvn-buildrc">del que estoy usando
yo</a>.
Revísenlo bien; la mayoría del trabajo es configurar la sección
<code>global</code>, que es la que está al principio del archivo; está bastante
comentada. Vean en particular <code>source-dir</code>, <code>build-dir</code>, <code>kdedir</code>
(donde va a ser instalado), <code>qtdir</code> (donde vamos a instalar
<code>qt-copy</code>; yo lo puse en el mismo directorio que todo kde4),
<code>svn-server</code> (ojo que mi copia apunta al servicio autenticado, pero
tiene el anónimo comentado), <code>cmake-options</code>, y lo que mas o menos les
pinte. Ponemos este archivo en <code>~/.kdesvn-buildrc</code> y ya casi estamos.</p>
<p>Otra cosa que hay que hacer es poner todo un conjunto de variables de
entorno a tono. Yo robé mucho de <a href="http://techbase.kde.org/Getting_Started/Increased_Productivity_in_KDE4_with_Scripts/.bashrc">un script en
techbase</a>.
A diferencia de todos los tutoriales en techbase, en vez de crear todo
un usuario para hacer toda la bola, yo simplemente puse todas esas
variables en <a href="http://grulicueva.homelinux.net/~mdione/kde4/environ.sh">un
script</a> que
podía cargar a piaccere. Allí tambié puse que el directorio donde KDE4
va a guardar la configuración es <code>.kde4-dev</code>, así no me pisa la
configuración de KDE3. también péguenle una revisada así pega con lo que
tienen puesto en otros lados.</p>
<p>Bueno, ya estamos listos. Levantamos las variables de entorno y lanzamos
el script de compilación:</p>
<pre><code>$ source environ.sh
$ ./kdesvn-build-1.7.1/kdesvn-build --reconfigure --verbose --color
</code></pre>
<p>¡Eso es todo! El script saca los módulos unos a uno de svn; a medida que
los tiene bajado los va compilando e instalando en paralelo. La primera
vez tarda muchisimo, sobre todo si configuraron muchos módulos.
Recomiendo compilar primero lo mínimo indispensable, dejarlo compilado
de noche, y luego ir compilando de a pedacitos.</p>
<p>El script va dejando en <code>log/latest</code> logs de la compilación de cada
módulo. Allí podemos encontrar la salida del proceso de configuración,
donde veremos qué dependencias encontró y cuáles faltan. Si hay errores
deja un <code>error.log</code> con la falla.</p>
<p>Para ejecutar la bestia, la cosa no se complica mucho mas. Yo no sé bien
cómo hacer para que me lo tome el DM de turno (KDM, GDM, el que sea),
por lo que lo lanzo a mano desde una terminal de texto:</p>
<pre><code>$ source ~/src/system/kde4/environ.sh
$ xinit /home/mdione/local/soft/kde4/bin/startkde
</code></pre>
<p>También podemos lanzarlo en un Xephir, que es como un X dentro de X. Eso
sí, no le pidan OpenGL (necdesario para los efectos de escritorio).
Abrimos un <code>konsole</code> o la terminal que prefieran y:</p>
<pre><code>$ Xephyr :1 -screen 1280x800 -ac -extension GLX
$ export DISPLAY=:1
$ ~/local/soft/kde4/bin/startkde
</code></pre>
<p>Una forma truchísima mal es entrar en una sesión failsafe (*buntu le
llama 'Terminal a prueba de fallos' últimamente). Esto nos da un X
pelado con una <code>xterm</code> y ni siquiera un Window Manager. En la terminal
entramos levantamos el entorno y lanzamos KDE4:</p>
<pre><code>$ source ~/src/system/kde4/environ.sh
$ ~/local/soft/kde4/bin/startkde
</code></pre>
<p>Voilá. Sólo asegúrensé no cerrar nunca esa xterm, sino se les cierra
todo sin preguntar nada.</p>
<p>Un detalle es que el sistema queda solamente en inglés. Ya me voy a
sentar a ver cómo meter los módulos de traducción al español.</p>
<p>Ok, ya estoy cansadísimo y esto es larguísimo. Cualquier duda la
seguimos en el thread en
<a href="http://listas.usla.org.ar/pipermail/kde-ar/">kde-ar</a> y lo vamos
puliendo.</p>
<p><a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/kde/">kde</a></p>
</div>
<div class="inlinefooter">
<span class="pagedate">
Posted <span class="date">Mon 16 Feb 2009 07:59:25 PM CET</span>
</span>
<span class="tags">
Tags:
<a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/kde/" rel="tag">kde</a>
</span>
</div>
</div>
debian-hal-policykithttp://grulicueva.homelinux.net/~mdione/glob//posts/debian-hal-policykit/2010-01-27T22:55:54Z2009-05-27T15:25:03Z
<p>Since a couple of <code>hal</code> versions (<code>0.5.12~git20090406.46dc48-1</code>) in
Debian Sid, it stopped using system groups as the method to grant
privileges to users, and started using something called <code>PolicyKit</code>
instead. Just to remember what are we talking about here, a user in the
<code>powerdevil</code> group used to suspend or hibernate his machine sucessfully.
But now Mr. PL is a not-understood monster and <a href="http://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg643465.html">the package does not
give a smooth
transition</a>.
That's what I'll try to do here.</p>
<p>To make sure this is the problem, let's try to suspend the machine
simply by calling <code>hal</code> through <code>d-bus</code>. I use <code>qdbus</code> here, found in the
<code>libqt4-dbus</code> package, because it lets me introspect the dbus
interface, but you could use <code>dbus-send</code> instead:</p>
<pre><code>qdbus --system org.freedesktop.Hal /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Suspend 0
Error: org.freedesktop.Hal.Device.PermissionDeniedByPolicy
org.freedesktop.hal.power-management.suspend no <-- (action, result)
</code></pre>
<p>If we edit the file <code>/etc/PolicyKit/PolicyKit.conf</code> we'll see the empty
default config that comes with the package. According to <a href="http://grulicueva.homelinux.net/usr/share/doc/policykit-doc/html/PolicyKit.conf.5.html">its
documentation</a>,
we just need to add a couple of nested <code><match></code> tags with a <code><return></code>
inside. The outher <code>match</code> will filter the <code>hal</code> <code>action</code>, the inner one
the group, and the <code>return</code> will grant access.</p>
<p>... we wish! There's no way to match to a group, only to a user. Ok, the
first shot will use the user, then we'll see if we really can do it.</p>
<p>How do we discover which action we must use? We can use <code>polkit-action</code>
to see what are the available actions. In the first case,
<code>org.freedesktop.hal.power-management.*</code> will do. </p>
<pre><code><match action="org.freedesktop.hal.power-management.*">
<!--match group="powerdev"-->
<match user="mdione">
<return result="yes"/>
</match>
</match>
</code></pre>
<p>Now the previous command suspends the machine allright! Next, removable
devices:</p>
<pre><code><match action="org.freedesktop.hal.storage.mount-removable">
<!--match group="plugdev"-->
<match user="mdione">
<return result="yes"/>
</match>
</match>
<match action="org.freedesktop.hal.storage.eject">
<!--match group="plugdev"-->
<match user="mdione">
<return result="yes"/>
</match>
</match>
</code></pre>
<p>I added the <code>eject</code> action just in case. All this works fine for my
user, but I really liked the group interface. The complaining about it
was that it was too coarse, and now this way one can grant specific
actions in amore fine grained way, but I think is too fine grained.
Unluckly we cannot (ab)use the <code>define_admin_auth</code> tag to give a similar
functionality, it doesn't work that way (I don't know what way it works
either).</p>
<p>As a final note, see that I used a per-action approach, where the outer
match points to an action. we could use a per-user approach, where the
outer match points to a user:</p>
<pre><code><match user="mdione">
<match action="...">
<match action="...">
<match action="...">
</match>
</code></pre>
<p><a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/debian/">debian</a> <a href="http://grulicueva.homelinux.net/~mdione/glob//archives/2009/05/../../../tags/sysadmin/">sysadmin</a></p>