Ver Feed RSS

root@blog:/# chmod o+r *

Mais um pouco sobre dispositivos USB

Avalie este Post de Blog
A um tempo atras postei sobre uma encrenca que tive pra alterar o label de uma pendrive. No fim falei que iria fazer um applet pra auxiliar os iniciantes no Linux. Quem leu deve ter achado que eu estava brincando! Pois é... Não estava! Como vocês puderam ver, essas últimas semana eu simplesmente desapareci. Por isso não postei nada sobre o applet.

Comecei ele nessa segunda-feira agora. E como primeiro passo eu tinha que listar todos os dispositivos de armazenamento USB conectados no PC. Como fazer isso?! Foi o que me perguntei também! Começei trabalhando com chamadas de sistema através do comando os.popen3() mas acabei desistindo por ser muito 'deselegante'. Fui em busca de uma maneira mais Pythoniana. Acabei estudando um pouco sobre DBUS e HAL. Achei a combinação DBUS&HAL simplesmente incrível! Pena que a maioria do material é um pouco incompleto e antigo (o texto da Red Hat é de 2005). Por isso resolvi postar aqui o que eu consegui juntar de tudo isso. É um script básico que lista todos os dispositivos de armazenamento utilziando o DBUS+HAL.

Código :
[FONT=Courier New]import dbus[/FONT]
 
[FONT=Courier New] def convert_bytes(size, base=0):[/FONT]
[FONT=Courier New]     if type(size) is int:[/FONT]
[FONT=Courier New]     size = float(size)[/FONT]
 
[FONT=Courier New]     if size >= 1024.0:[/FONT]
[FONT=Courier New]         base = base + 1[/FONT]
[FONT=Courier New]         size = size/1024.0[/FONT]
[FONT=Courier New]         return convert_bytes(size, base)[/FONT]
[FONT=Courier New]     else:[/FONT]
[FONT=Courier New]         return "%.2lf"%round(size,2) + " " + ['Bytes','KBytes','MBytes','GBytes','PBytes','EBytes','ZBytes','YBytes','BBytes'][base][/FONT]
 
[FONT=Courier New] count = 0[/FONT]
[FONT=Courier New] bus = dbus.SystemBus()[/FONT]
[FONT=Courier New] hal_manager_obj = bus.get_object("org.freedesktop.Hal", "/org/freedesktop/Hal/Manager")[/FONT]
[FONT=Courier New] hal_manager = dbus.Interface(hal_manager_obj, "org.freedesktop.Hal.Manager")[/FONT]
 
[FONT=Courier New] volume_udi_list = hal_manager.FindDeviceByCapability ('volume')[/FONT]
[FONT=Courier New] for volume_udi in volume_udi_list:[/FONT]
[FONT=Courier New]     volume_obj = bus.get_object ("org.freedesktop.Hal", volume_udi)[/FONT]
[FONT=Courier New]     volume = dbus.Interface(volume_obj, "org.freedesktop.Hal.Device")[/FONT]
[FONT=Courier New]     storage_udi = volume.GetProperty ('block.storage_device')[/FONT]
[FONT=Courier New]     storage_obj = bus.get_object ("org.freedesktop.Hal", storage_udi)[/FONT]
[FONT=Courier New]     storage = dbus.Interface(storage_obj, "org.freedesktop.Hal.Device")[/FONT]
 
[FONT=Courier New]     if storage.GetProperty("storage.bus") == 'usb':[/FONT]
[FONT=Courier New]         count += 1[/FONT]
[FONT=Courier New]         print "Encontrado",volume.GetProperty("volume.label"),[/FONT]
[FONT=Courier New]         print 'em ('+volume.GetProperty("block.device")+')'[/FONT]
[FONT=Courier New]         print '\tFile System:', volume.GetProperty ('volume.fstype'),[/FONT]
[FONT=Courier New]         print '('+volume.GetProperty ('volume.fsversion')+')'[/FONT]
[FONT=Courier New]         print "\tMarca:", storage.GetProperty("storage.vendor")[/FONT]
 
[FONT=Courier New]         print "\tMontado:", [/FONT]
[FONT=Courier New]         if volume.GetProperty("volume.is_mounted"): [/FONT]
[FONT=Courier New]             print 'Sim, ', 'em', volume.GetProperty("volume.mount_point")[/FONT]
[FONT=Courier New]         else:[/FONT]
[FONT=Courier New]             print 'Nao'[/FONT]
 
[FONT=Courier New]         print "\tTamanho:", convert_bytes(volume.GetProperty("volume.size"))[/FONT]
[FONT=Courier New]         print[/FONT]
 
[FONT=Courier New] print 'Encontrado um total de',count,'dispositivo(s) USB'[/FONT]
Não vou detalhar sobre como ele funciona porque se não esse post vai ficar muito longo! Mas vejam um exemplo de execução:
Código :
[FONT=Courier New]$ ./py_hal_scan.py
Encontrado Projetos em (/dev/sdc1)
    File System: vfat (FAT32)
    Marca: Kingston
    Montado: Nao
    Tamanho: 983.98 MBytes
 
Encontrado Magnun em (/dev/sdb1)
    File System: vfat (FAT32)
    Marca: Kingston
    Montado: Sim,  em /media/Magnun
    Tamanho: 983.98 MBytes
 
Encontrado um total de 2 dispositivo(s) USB[/FONT]
Hum... Mas pra que isso serve?!?! Bem, envelopando isso em uma classe e adicionando funções pra montar, desmontar e renomear o dispositivo tenho o 'coração' do meu applet!

Montar?! Como você monta os dispositivos através do DBUS + HAL?? Pra montar, é mais simples que pesquisar os objetos. Por exemplo, esse script monta todos os dispositivos USB de armazenamento:
Código :
[FONT=Courier New]import dbus[/FONT]
[FONT=Courier New]count = 0[/FONT]
[FONT=Courier New]bus = dbus.SystemBus()[/FONT]
[FONT=Courier New]hal_manager_obj = bus.get_object("org.freedesktop.Hal", "/org/freedesktop/Hal/Manager")[/FONT]
[FONT=Courier New]hal_manager = dbus.Interface(hal_manager_obj, "org.freedesktop.Hal.Manager")[/FONT]
 
[FONT=Courier New]volume_udi_list = hal_manager.FindDeviceByCapability ('volume')[/FONT]
[FONT=Courier New]for volume_udi in volume_udi_list:[/FONT]
[FONT=Courier New]    volume_obj = bus.get_object ("org.freedesktop.Hal", volume_udi)[/FONT]
[FONT=Courier New]    volume = dbus.Interface(volume_obj, "org.freedesktop.Hal.Device")[/FONT]
[FONT=Courier New]    storage_udi = volume.GetProperty ('block.storage_device')[/FONT]
[FONT=Courier New]    storage_obj = bus.get_object ("org.freedesktop.Hal", storage_udi)[/FONT]
[FONT=Courier New]    storage = dbus.Interface(storage_obj, "org.freedesktop.Hal.Device")[/FONT]
 
[FONT=Courier New]    if storage.GetProperty("storage.bus") == 'usb' and int(volume.GetProperty("volume.is_mounted")) == 0:[/FONT]
[FONT=Courier New]        count += 1[/FONT]
[FONT=Courier New]        label = volume.GetProperty("volume.label")[/FONT]
[FONT=Courier New]        print 'Montando '+label+'...',[/FONT]
[FONT=Courier New]        volume_obj.Mount('', '', '', dbus_interface="org.freedesktop.Hal.Device.Volume")[/FONT]
[FONT=Courier New]        print 'OK!'[/FONT]
 
[FONT=Courier New]print 'Montado um total de',count,'dispositivo(s) USB'[/FONT]


Vamos à execução:
Código :
[FONT=Courier New]$ ./py_hal_mounter.py
Montando Projetos... OK!
Montando Magnun... OK!
Montado um total de 2 dispositivo(s) USB[/FONT]
E como alterar o label?? Esse não vou postar o código porque você teria que escolher um dos dispositivos... Mas usando o ambiente anterior o comando seria o seguinte:

Código :
[FONT=Courier New]volume.SetPropertyString('volume.label', new_label)[/FONT]
Só um detalhe é que pra isso tenho que ser Root.

É isso ai! Simples assim... Como diria o Zen of Python: Better simple then complex!

Atualizado 22-05-2009 em 15:24 por Magnun

Categorias
Python , Dicas , Projetos , USBManager

Comentários

  1. Avatar de sergio
    Muito bom Magnun.

    thx!
  2. Avatar de krixapolinario
    Só fazendo uma visita :) Muito bom o post Magnun...
  3. Avatar de Magnun
    Olá Krix!!

    Se você gostou desse dá uma olhada nesse aqui: USBManager
  4. Avatar de Sukkubus
    "Só um detalhe é que pra isso tenho que ser Root" Poderoso, rs. Parabéns pelos esforços.
  5. Avatar de Magnun
    Pequeno detalhe... Questões de segurança, ne?! Mas acabei que usei outro método.

+ Enviar Comentário