Mind Bending

Mining Bits and Knowledge

MindBending at Twitter Mind Bending at Google Plus Mind Bending - Facebook RSS Feed em Português Full RSS Feed... Magnun at GitHub E-mail

  • Início
  • Languages
    • English
    • Português
  • Projects
    • Beholder
    • Tiamat
    • USBManager
  • Series
    • Bending Gnome Keyring with Python
    • Python e Udisks
    • PyCon 2011 Highlights
    • Dobrando o Gnome Keyring Com o Python
    • Python and Udisks
    • Destaques da PyCon 2011
    • Instalando e Configurando o Arch Linux
  • About Me

Python e UDisks – Parte 1

14/03/11

Escrito por Magnun em Languages

11221 comentáriohttp%3A%2F%2Fwww.mindbending.org%2Fpython-e-udisks-parte-1%2FPython+e+UDisks+-+Parte+12011-03-14+15%3A27%3A19Magnunhttp%3A%2F%2Fblogs.codecommunity.org%2Fmindbending%2F%3Fp%3D1122

Esta é a pate 1 de 5 da série Python e Udisks
en-us This post is also available in English

Recentemente recebi diversos contatos de pessoas querendo saber se o USBManager iria suportar ou não o DeviceKit/UDev, uma vez que o HAL foi oficialmente descontinuado, então acabei retomando o desenvolvimento desse aplicativo.

Acabei percebendo algumas diferenças e pouca referência na internet, por isso vou postar algumas informações a respeito do desenvolvimento usando o DBus e o DeviceKit para trabalhar com dispositivos de armazenamento via USB.

Há algum tempo, fiz uma pesquisa sobre Python e o DeviceKit e encontrei esse post: Accessing DeviceKit with DBus and Python. Eu havia feito alguns testes e o código funcionou perfeitamente. Escrevi algumas linhas a mais e guardei para mexer em um outro dia. Depois de muito tempo (e uma atualização de distribuição) resolvi mexer novamente no USBManager e percebi que o trecho de código não funciona mais:

>>> import dbus
>>>
>>> bus = dbus.SystemBus()
>>>
>>> proxy = bus.get_object("org.freedesktop.DeviceKit.Disks", "/org/freedesktop/DeviceKit/Disks")
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "/usr/lib/pymodules/python2.6/dbus/bus.py", line 244, in get_object
follow_name_owner_changes=follow_name_owner_changes)
File "/usr/lib/pymodules/python2.6/dbus/proxies.py", line 241, in __init__
self._named_service = conn.activate_name_owner(bus_name)
File "/usr/lib/pymodules/python2.6/dbus/bus.py", line 183, in activate_name_owner
self.start_service_by_name(bus_name)
File "/usr/lib/pymodules/python2.6/dbus/bus.py", line 281, in start_service_by_name
'su', (bus_name, flags)))
File "/usr/lib/pymodules/python2.6/dbus/connection.py", line 620, in call_blocking
message, timeout)
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.DeviceKit.Disks was not provided by any .service files
>>>

Mais >

dbus, devicekit, dispositivos, hal, Python, udev, udisks, usb

Python e UDisks – Parte 2

30/03/11

Escrito por Magnun em Languages

12241 comentáriohttp%3A%2F%2Fwww.mindbending.org%2Fpython-e-udisks-parte-2%2FPython+e+UDisks+-+Parte+22011-03-30+19%3A37%3A36Magnunhttp%3A%2F%2Fblogs.codecommunity.org%2Fmindbending%2F%3Fp%3D1224

Serie Python e Udisks - Part 2/5
en-us This post is also available in English

Há alguns posts eu mostrei como listar todos os dispositivos de armazenamento conectados ao seu PC usando Python e UDisks. Neste post irei mostrar como trabalhar com a interface Disks do DeviceKit.

Primeiramente vamor ler algumas documentações! A documentação do UDisks é dividida em cinco sessões:

  • Interface Disks;
  • Interface Device;
  • Interface Adapter;
  • Interface Expander;
  • Interface Port.

Mais >

dbus, devicekit, luks, Python, sistema de arquivos, udisks

Python e UDisks – Parte 3

25/04/11

Escrito por Magnun em Languages

12631 comentáriohttp%3A%2F%2Fwww.mindbending.org%2Fpython-e-udisks-parte-3%2FPython+e+UDisks+%E2%80%93+Parte+32011-04-25+16%3A32%3A03Magnunhttp%3A%2F%2Fblogs.codecommunity.org%2Fmindbending%2F%3Fp%3D1263

Esta é a pate 3 de 5 da série Python e Udisks
en-us This post is also available in English

No último post desta série eu mostrei como obter algumas informações úteis sobre o daemon UDisks, agora vamos ver como buscar dispositivos com ele.

O primeiro método que iremos ver é o EnumerateDevices:

>>> import dbus
>>>
>>> bus = dbus.SystemBus()
>>> proxy = bus.get_object("org.freedesktop.UDisks", "/org/freedesktop/UDisks")
>>> iface = dbus.Interface(proxy, "org.freedesktop.UDisks")
>>>
>>> devs = iface.EnumerateDevices()
>>> print devs
dbus.Array([dbus.ObjectPath('/org/freedesktop/UDisks/devices/fd0'), dbus.ObjectPath('/org/freedesktop/UDisks/devices/sdb'), dbus.ObjectPath('/org/freedesktop/UDisks/devices/sr0'), dbus.ObjectPath('/org/freedesktop/UDisks/devices/sda1'), dbus.ObjectPath('/org/freedesktop/UDisks/devices/sda2'), dbus.ObjectPath('/org/freedesktop/UDisks/devices/sdc1'), dbus.ObjectPath('/org/freedesktop/UDisks/devices/sdb1'), dbus.ObjectPath('/org/freedesktop/UDisks/devices/sda'), dbus.ObjectPath('/org/freedesktop/UDisks/devices/sdb3'), dbus.ObjectPath('/org/freedesktop/UDisks/devices/sdc'), dbus.ObjectPath('/org/freedesktop/UDisks/devices/sdb2')], signature=dbus.Signature('o'))
>>> devs[0]
dbus.ObjectPath('/org/freedesktop/UDisks/devices/fd0')
>>> type(devs[0])
<type 'dbus.ObjectPath'>
>>> dir(devs[0])
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>>

Mais >

dbus, dispositivos, python udisks

Python e UDisks – Parte 4

23/05/11

Escrito por Magnun em Mind Bending em Português

1323Nenhum comentáriohttp%3A%2F%2Fwww.mindbending.org%2Fpython-e-udisks-parte-4%2FPython+e+UDisks+-+Parte+42011-05-23+18%3A53%3A23Magnunhttp%3A%2F%2Fblogs.codecommunity.org%2Fmindbending%2F%3Fp%3D1323

Esta é a pate 4 de 5 da série Python e Udisks
en-us This post is also available in English

Nos já vimos, como conectar ao DBus e o UDisks, em seguida vimos como verificar algumas configurações e informações do daemon do UDisks e também como buscar por dispositivos conectados. Tudo isso não é muito “usável” se você não souber quando uma novo dispositivo foi conectado ao seu computador. Claro que você pode ficar testando periodicamente se algum dispositivo foi adicionado, mas esta não é uma solução muito elegante. Para uma detecção de dispositivos “em tempo real” nos utilizamos sinais.

Existem diversos sinais especificados no Udisks, mas os mais úteis (para o nosso caso) são:

  • O sinal DeviceAdded – Emitido sempre que um dispositivo é adicionado.
  • O sinal DeviceRemoved – Emitido quando um dispositivo é removido.
  • O sinal DeviceChanged – Emitido sempre que a propriedade de um dispositivo é alterada.

Essas descrições foram tiradas do Manual de Referência do UDisks.

Mas antes de seguirmos adiante, o que são sinais? Sinais são chamadas assíncronas, de uma forma simples podemos dizer que são “eventos”. Com a utilização de chamadas assíncronas nosso programa pode realizar operações e processamentos e ser “interrompido” quando um evento ocorrer. Vinculado a esse evento está uma função de tratamento (handler).

Agora vamos ver um trecho de código Python que mostra como lidar com esses sinais.

>>> import dbus #Importa módulos necessários
>>> import gobject
>>> from dbus.mainloop.glib import DBusGMainLoop
>>>
>>> DBusGMainLoop(set_as_default=True) #Informa a utilização de um main loop
>>>
>>> bus = dbus.SystemBus()  #Inicia o DBus
>>> proxy = bus.get_object("org.freedesktop.UDisks", "/org/freedesktop/UDisks")
>>> iface = dbus.Interface(proxy, "org.freedesktop.UDisks")
>>>
>>> def on_device_add(dev_path):
...  '''Handler para o evento DeviceAdded'''
...  print 'Adicionado:',dev_path
...
>>> def on_device_changed(dev_path):
...  '''Handler para o evento DeviceChanged'''
 ...  print 'Modificado:',dev_path
...
>>> def on_device_removed(dev_path):
...  '''Handler para o evento DeviceRemoved'''
...  print 'Removido:',dev_path
...
>>>
>>> iface.connect_to_signal('DeviceAdded', on_device_add)
< at 9cb8b0c "type='signal',sender=':1.38',path='/org/freedesktop/UDisks',interface='org.freedesktop.UDisks',member='DeviceAdded'" on conn >
>>> iface.connect_to_signal('DeviceChanged', on_device_changed)
< at 9cb8c2c "type='signal',sender=':1.38',path='/org/freedesktop/UDisks',interface='org.freedesktop.UDisks',member='DeviceChanged'" on conn >
>>> iface.connect_to_signal('DeviceRemoved', on_device_removed)
< at 9cb8cec "type='signal',sender=':1.38',path='/org/freedesktop/UDisks',interface='org.freedesktop.UDisks',member='DeviceRemoved'" on conn >
>>>
>>> loop = gobject.MainLoop()
>>> loop.run() #loop infinito

Adicionado: /org/freedesktop/UDisks/devices/sdc
Adicionado: /org/freedesktop/UDisks/devices/sdc1
Modificado: /org/freedesktop/UDisks/devices/sdc1
Modificado: /org/freedesktop/UDisks/devices/sdc1
Modificado: /org/freedesktop/UDisks/devices/sdc
Removido: /org/freedesktop/UDisks/devices/sdc1
Removido: /org/freedesktop/UDisks/devices/sdc

As linhas 24, 26 e 28 são responsáveis por conectar o “evento” do sinal à função de tratamento do evento (event handler).

Após a linha loop.run(), o programa parece que está “suspenso”, mas está apenas aguardando a ocorrência de algum sinal. Após isso, eu inseri uma pen drive, e ela foi montada automaticamente. Em seguida eu a desmontei e a removi. Olhando rapidamente (pelo menos se você estiver olhando a saída estática acima) temos a impressão de que estão sendo geradas outputs duplicadas. Mas isso tem uma boa explicação…

  • As primeiras duas linhas notificam que um novo “root device” (tabela de partição) foi detectado (sdc), em seguida a “nova partição” (sdc1) foi detectada. Se sua pendrive tivesse mais partições teríamos mais outputs.
  • A terceira linha notifica que a partição sdc1 foi montada.
  • A quarta, quinta e sexta linha notifica que o dispositivo foi desmontado (ambas as partições) e a partição “removida”.
  • E a última linha notifica que o dispositivo foi realmente removido.

Agora tudo parece mais claro, não? Então, quando buscamos por novos dispositivos é interessante filtrar essas notificações e manter somente as que são relevantes. Isso será feito buscando informações sobre o dispositivo. Eu irei mostrar como fazer isso no próximo post, até lá…

...  '''Handler para o evendo DeviceAdded'''
dbus, gobject, Python, sinais, udisks, usbmanager

Python e UDisks – Parte 5

05/07/11

Escrito por Magnun em Mind Bending em Português

15211 comentáriohttp%3A%2F%2Fwww.mindbending.org%2Fpython-e-udisks-parte-5%2FPython+e+UDisks+-+Parte+52011-07-05+21%3A01%3A47Magnunhttp%3A%2F%2Fblogs.codecommunity.org%2Fmindbending%2F%3Fp%3D1521

Esta é a pate 5 de 5 da série Python e Udisks
en-us This post is also available in English

Ressuscitando a série de artigos sobre Python e Udisks hoje vou mostrar como obter mais informações dos dispositivos através das propriedades.

Sobre o Atraso

Antes de tudo, peço desculpas pela demora em postar essa continuação, ela foi mais difícil de escrever do que parece. Essa demora se deve à mudança da forma como o DBus se comunica com o UDisks. Como tudo ainda é muito novo e não há um documentação completa e tão pouco tutoriais na internet, minhas buscas pela linha de erro não retornavam nenhum resultado. Abaixo está o código que eu estava utilizando e o erro que o DBus me apresentava:

>>> import dbus
>>>
>>> bus = dbus.SystemBus()
>>> proxy = bus.get_object("org.freedesktop.UDisks", "/org/freedesktop/UDisks")
>>> iface = dbus.Interface(proxy, "org.freedesktop.UDisks")
>>>
>>> devs = iface.EnumerateDevices()
>>> print devs
>>>
>>> device = devs[14]
>>> volume_obj = bus.get_object("org.freedesktop.UDisks", device)
>>> volume = dbus.Interface(volume_obj, "org.freedesktop.UDisks.Device")
>>> volume_obj.Get('','DriveConnectionInterface')
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.AccessDenied: Rejected send message, 4 matched rules; type="method_call", sender=":1.60" (uid=1000 pid=19165 comm="/usr/bin/python2 ./test-me ") interface="(unset)" member="Get" error name="(unset)" requested_reply="0" destination=":1.19" (uid=0 pid=1010 comm="/usr/lib/udisks/udisks-daemon ")

Após dias de pesquisas e tentativas frustradas resolvi fazer algo que muitos evitam: ler código fonte de outros projetos. Depois de algumas pesquisas acabei encontrando o projeto liveusb-creator que utiliza o UDisks e o DBus para detectar dispositivos removíveis. Minha solução estava no arquivo creator.py (mais especificamente no método handle_reply, linhas 445 a 450) disponível aqui.

Mais >

dbus, Python, udisks, usb, usbmanager
  • Pesquisar

    • Arquivos
    • Marcadores
    • Categorias
    • Arch Linux (21)
    • Games (4)
    • Git (4)
    • Gnome (22)
    • Languages (147)
      • Mind Bending em Português (90)
      • Mind Bending in English (58)
    • Linux (3)
    • Music (3)
    • Música (5)
    • No Category (2)
    • Project logs (24)
      • Tiamat (13)
      • USBManager (10)
    • Python (55)
    • Ubuntu (7)
    • VIM (6)
    • Xfce (1)
    arch bending blog code dbus debian design devicekit empathy games git gnome gnome3 gnome 3 gnome 3.0 gnome shell instalação keyring linux lock música news pacman palestra passwords pycon2011 pygi pygtk Python seahorse security ssh store Tiamat tutorial twitter ubuntu udisks usbmanager username vídeos video VIM wrapper yaourt
    • April 2012 (4)
    • March 2012 (2)
    • February 2012 (1)
    • January 2012 (6)
    • December 2011 (9)
    • November 2011 (5)
    • October 2011 (9)
    • September 2011 (13)
    • August 2011 (12)
    • July 2011 (15)
    • June 2011 (8)
    • May 2011 (7)
    • April 2011 (8)
    • March 2011 (26)
    • February 2011 (3)
    • January 2011 (3)
    • December 2010 (4)
    • October 2010 (2)
    • September 2010 (1)
    • June 2010 (1)
    • May 2010 (2)
    • March 2010 (6)
  • Registro do usuário






    • Cadastre-se
    • Perdeu a senha?
  • Series

    • Bending Gnome Keyring with Python (7)
    • Destaques da PyCon 2011 (7)
    • Dobrando o Gnome Keyring Com o Python (7)
    • Git Is For All (1)
    • Git para Todos (1)
    • Instalando e Configurando o Arch Linux (4)
    • PyCon 2011 Highlights (7)
    • Python and Udisks (5)
    • Python e Udisks (5)
  • Lista de Links

    • Planeta Arch Linux Brasil
    • Planeta GNU/Linux Brasil
    • Renda Bordô
  • Parceiros

    Berlotto Blog Cstropz.net
    SejaLivre.org Ad Square
  • Ad Square Ad Square
  • Tags

    arch bending blog code dbus debian design devicekit empathy games git gnome gnome3 gnome 3 gnome 3.0 gnome shell instalação keyring linux lock música news pacman palestra passwords pycon2011 pygi pygtk Python seahorse security ssh store Tiamat tutorial twitter ubuntu udisks usbmanager username vídeos video VIM wrapper yaourt
  • Tweets

    Carregando tweets...
    Siga-me no Twitter!
    • I am GNOME
    • GNU Meditate
    • Mind Bending
Tema Mystique por digitalnature | Movido a WordPress
RSS Feeds XHTML 1.1 Topo
RP

Mind Bending / Log in Stop SOPA