<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Moserei &#187; devicekit</title>
	<atom:link href="http://moserei.de/index.php/tag/devicekit/feed" rel="self" type="application/rss+xml" />
	<link>http://moserei.de</link>
	<description></description>
	<lastBuildDate>Tue, 06 Jul 2010 16:18:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.3</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Accessing DeviceKit with DBus and Python</title>
		<link>http://moserei.de/index.php/179/accessing-devicekit-with-dbus-and-python</link>
		<comments>http://moserei.de/index.php/179/accessing-devicekit-with-dbus-and-python#comments</comments>
		<pubDate>Fri, 08 Jan 2010 01:23:44 +0000</pubDate>
		<dc:creator>Moser</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[dbus]]></category>
		<category><![CDATA[devicekit]]></category>
		<category><![CDATA[devicekit-disks]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://moserei.de/?p=179</guid>
		<description><![CDATA[Under the impression of loosing some really important data because of a damaged partition table on a USB flash drive I am developing a backup strategy for my system.
I know myself and so I decided that I need to automate this. While trying to figure out how one can run a script as soon as [...]]]></description>
			<content:encoded><![CDATA[<p>Under the impression of loosing some really important data because of a damaged partition table on a USB flash drive I am developing a backup strategy for my system.<br />
I know myself and so I decided that I need to automate this. While trying to figure out how one can run a script as soon as a specific drive is mounted, I came across <a href="http://en.wikipedia.org/wiki/DeviceKit">DeviceKit</a>. It&#8217;s the planned <a href="http://www.freedesktop.org/wiki/Software/hal">replacement of HAL</a> and is used in Ubuntu Karmic. Udev is not an option for me, because I don&#8217;t want to mess around with mounting myself (and I hate running stuff as root&#8230;).<br />
So here is what I found out about using DBus and DeviceKit in Python:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> dbus
&nbsp;
bus = dbus.<span style="color: black;">SystemBus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
proxy = bus.<span style="color: black;">get_object</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;org.freedesktop.DeviceKit.Disks&quot;</span>, 
                       <span style="color: #483d8b;">&quot;/org/freedesktop/DeviceKit/Disks&quot;</span><span style="color: black;">&#41;</span>
iface = dbus.<span style="color: black;">Interface</span><span style="color: black;">&#40;</span>proxy, <span style="color: #483d8b;">&quot;org.freedesktop.DeviceKit.Disks&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #808080; font-style: italic;">#enumerates all devices</span>
<span style="color: #ff7700;font-weight:bold;">print</span> iface.<span style="color: black;">EnumerateDevices</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#gets the device kit path of a specific device</span>
path = iface.<span style="color: black;">FindDeviceByDeviceFile</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;/dev/sdc1&quot;</span><span style="color: black;">&#41;</span> 
<span style="color: #808080; font-style: italic;">#= &quot;/org/freedesktop/DeviceKit/Disks/devices/sdc&quot;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#gets an object representing the device specified by the path</span>
device = bus.<span style="color: black;">get_object</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;org.freedesktop.DeviceKit.Disks&quot;</span>, path<span style="color: black;">&#41;</span> 
&nbsp;
<span style="color: #808080; font-style: italic;">#prints some XML that shows you the available methods, signals and properties</span>
<span style="color: #ff7700;font-weight:bold;">print</span> device.<span style="color: black;">Introspect</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#gets a proxy for getting properties</span>
device_prop = dbus.<span style="color: black;">Interface</span><span style="color: black;">&#40;</span>device, <span style="color: #483d8b;">&quot;org.freedesktop.DBus.Properties&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#you need to specify an interface (properties could be ambiguous)</span>
<span style="color: #ff7700;font-weight:bold;">print</span> device_prop.<span style="color: black;">Get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;org.freedesktop.DeviceKit.Disks.Device&quot;</span>, <span style="color: #483d8b;">&quot;device-mount-paths&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#gets a proxy you can call methods on</span>
device_iface = dbus.<span style="color: black;">Interface</span><span style="color: black;">&#40;</span>device, <span style="color: #483d8b;">&quot;org.freedesktop.DeviceKit.Disks.Device&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#unmounts the partition</span>
device_iface.<span style="color: black;">FilesystemUnmount</span><span style="color: black;">&#40;</span>dbus.<span style="color: black;">Array</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>, <span style="color: #483d8b;">'s'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>The DBus API of DeviceKit is documented <a href="http://hal.freedesktop.org/docs/DeviceKit-disks/ref-dbus.html">here</a>.<br />
Now we want to be notified when a drive is mounted:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> dbus
<span style="color: #ff7700;font-weight:bold;">import</span> gobject
<span style="color: #ff7700;font-weight:bold;">from</span> dbus.<span style="color: black;">mainloop</span>.<span style="color: black;">glib</span> <span style="color: #ff7700;font-weight:bold;">import</span> DBusGMainLoop
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> device_added_callback<span style="color: black;">&#40;</span>device<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Device %s was added'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>device<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> device_changed_callback<span style="color: black;">&#40;</span>device<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Device %s was changed'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>device<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#must be done before connecting to DBus</span>
DBusGMainLoop<span style="color: black;">&#40;</span>set_as_default=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
&nbsp;
bus = dbus.<span style="color: black;">SystemBus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
proxy = bus.<span style="color: black;">get_object</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;org.freedesktop.DeviceKit.Disks&quot;</span>, 
                       <span style="color: #483d8b;">&quot;/org/freedesktop/DeviceKit/Disks&quot;</span><span style="color: black;">&#41;</span>
iface = dbus.<span style="color: black;">Interface</span><span style="color: black;">&#40;</span>proxy, <span style="color: #483d8b;">&quot;org.freedesktop.DeviceKit.Disks&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#addes two signal listeners</span>
iface.<span style="color: black;">connect_to_signal</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'DeviceAdded'</span>, device_added_callback<span style="color: black;">&#41;</span>
iface.<span style="color: black;">connect_to_signal</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'DeviceChanged'</span>, device_changed_callback<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#start the main loop</span>
mainloop = gobject.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
mainloop.<span style="color: black;">run</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>A typical output when a flash drive is plugged in looks like this:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Device <span style="color: #000000; font-weight: bold;">/</span>org<span style="color: #000000; font-weight: bold;">/</span>freedesktop<span style="color: #000000; font-weight: bold;">/</span>DeviceKit<span style="color: #000000; font-weight: bold;">/</span>Disks<span style="color: #000000; font-weight: bold;">/</span>devices<span style="color: #000000; font-weight: bold;">/</span>sdc was added
Device <span style="color: #000000; font-weight: bold;">/</span>org<span style="color: #000000; font-weight: bold;">/</span>freedesktop<span style="color: #000000; font-weight: bold;">/</span>DeviceKit<span style="color: #000000; font-weight: bold;">/</span>Disks<span style="color: #000000; font-weight: bold;">/</span>devices<span style="color: #000000; font-weight: bold;">/</span>sdc1 was added
Device <span style="color: #000000; font-weight: bold;">/</span>org<span style="color: #000000; font-weight: bold;">/</span>freedesktop<span style="color: #000000; font-weight: bold;">/</span>DeviceKit<span style="color: #000000; font-weight: bold;">/</span>Disks<span style="color: #000000; font-weight: bold;">/</span>devices<span style="color: #000000; font-weight: bold;">/</span>sdc1 was changed</pre></div></div>

<p>With this knowledge I&#8217;m currently working on a little python script that runs in background and executes a shell script when a file system is mounted. I&#8217;ll post it, when it&#8217;s finished <img src='http://moserei.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://moserei.de/index.php/179/accessing-devicekit-with-dbus-and-python/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
