Ver Feed RSS

[email protected]:/# 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:
import dbus

 def convert_bytes(size, base=0):
     if type(size) is int:
     size = float(size)

     if size >= 1024.0:
         base = base + 1
         size = size/1024.0
         return convert_bytes(size, base)
     else:
         return "%.2lf"%round(size,2) + " " + ['Bytes','KBytes','MBytes','GBytes','PBytes','EBytes','ZBytes','YBytes','BBytes'][base]

 count = 0
 bus = dbus.SystemBus()
 hal_manager_obj = bus.get_object("org.freedesktop.Hal", "/org/freedesktop/Hal/Manager")
 hal_manager = dbus.Interface(hal_manager_obj, "org.freedesktop.Hal.Manager")

 volume_udi_list = hal_manager.FindDeviceByCapability ('volume')
 for volume_udi in volume_udi_list:
     volume_obj = bus.get_object ("org.freedesktop.Hal", volume_udi)
     volume = dbus.Interface(volume_obj, "org.freedesktop.Hal.Device")
     storage_udi = volume.GetProperty ('block.storage_device')
     storage_obj = bus.get_object ("org.freedesktop.Hal", storage_udi)
     storage = dbus.Interface(storage_obj, "org.freedesktop.Hal.Device")

     if storage.GetProperty("storage.bus") == 'usb':
         count += 1
         print "Encontrado",volume.GetProperty("volume.label"),
         print 'em ('+volume.GetProperty("block.device")+')'
         print '\tFile System:', volume.GetProperty ('volume.fstype'),
         print '('+volume.GetProperty ('volume.fsversion')+')'
         print "\tMarca:", storage.GetProperty("storage.vendor")

         print "\tMontado:", 
         if volume.GetProperty("volume.is_mounted"): 
             print 'Sim, ', 'em', volume.GetProperty("volume.mount_point")
         else:
             print 'Nao'

         print "\tTamanho:", convert_bytes(volume.GetProperty("volume.size"))
         print

 print 'Encontrado um total de',count,'dispositivo(s) USB'
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:
$ ./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
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:
import dbus
count = 0
bus = dbus.SystemBus()
hal_manager_obj = bus.get_object("org.freedesktop.Hal", "/org/freedesktop/Hal/Manager")
hal_manager = dbus.Interface(hal_manager_obj, "org.freedesktop.Hal.Manager")

volume_udi_list = hal_manager.FindDeviceByCapability ('volume')
for volume_udi in volume_udi_list:
    volume_obj = bus.get_object ("org.freedesktop.Hal", volume_udi)
    volume = dbus.Interface(volume_obj, "org.freedesktop.Hal.Device")
    storage_udi = volume.GetProperty ('block.storage_device')
    storage_obj = bus.get_object ("org.freedesktop.Hal", storage_udi)
    storage = dbus.Interface(storage_obj, "org.freedesktop.Hal.Device")

    if storage.GetProperty("storage.bus") == 'usb' and int(volume.GetProperty("volume.is_mounted")) == 0:
        count += 1
        label = volume.GetProperty("volume.label")
        print 'Montando '+label+'...',
        volume_obj.Mount('', '', '', dbus_interface="org.freedesktop.Hal.Device.Volume")
        print 'OK!'

print 'Montado um total de',count,'dispositivo(s) USB'


Vamos à execução:
Código:
$ ./py_hal_mounter.py
Montando Projetos... OK!
Montando Magnun... OK!
Montado um total de 2 dispositivo(s) USB
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:
volume.SetPropertyString('volume.label', new_label)
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




Visite: BR-Linux ·  VivaOLinux ·  Dicas-L