Listado de detalles de unidades USB usando python y udisk2

He desarrollado una aplicación que usa udisks versión 1 para buscar y enumerar detalles de las unidades USB conectadas. Los detalles incluyen el dispositivo (/dev/sdb1…etc), el punto de assembly y el espacio libre. Sin embargo, encontré que las distribuciones modernas tienen udisks2 instalado por defecto. Aquí está el pequeño código que se encuentra en el otro hilo SO:

#!/usr/bin/python2.7 import dbus bus = dbus.SystemBus() ud_manager_obj = bus.get_object('org.freedesktop.UDisks2', '/org/freedesktop/UDisks2') om = dbus.Interface(ud_manager_obj, 'org.freedesktop.DBus.ObjectManager') for k,v in om.GetManagedObjects().iteritems(): drive_info = v.get('org.freedesktop.UDisks2.Drive', {}) if drive_info.get('ConnectionBus') == 'usb' and drive_info.get('Removable'): if drive_info['MediaRemovable']: print("Device Path: %s" % k) 

Produce:-

[sundar@arch ~]$ ./udisk2.py Device Path: /org/freedesktop/UDisks2/drives/JetFlash_Transcend_8GB_GLFK4LYSFG3HZZ48

El resultado anterior está bien, pero ¿cómo puedo conectar org.freedesktop.UDisks2.Block y obtener las propiedades de los dispositivos?

http://udisks.freedesktop.org/docs/latest/gdbus-org.freedesktop.UDisks2.Block.html

Después de muchos golpes y pruebas, pude conseguir lo que quería. Solo publicándolo para que alguien pueda beneficiarse en el futuro. Aquí está el código: –

 #!/usr/bin/python2.7 # coding: utf-8 import dbus def get_usb(): devices = [] bus = dbus.SystemBus() ud_manager_obj = bus.get_object('org.freedesktop.UDisks2', '/org/freedesktop/UDisks2') om = dbus.Interface(ud_manager_obj, 'org.freedesktop.DBus.ObjectManager') try: for k,v in om.GetManagedObjects().iteritems(): drive_info = v.get('org.freedesktop.UDisks2.Block', {}) if drive_info.get('IdUsage') == "filesystem" and not drive_info.get('HintSystem') and not drive_info.get('ReadOnly'): device = drive_info.get('Device') device = bytearray(device).replace(b'\x00', b'').decode('utf-8') devices.append(device) except: print "No device found..." return devices def usb_details(device): bus = dbus.SystemBus() bd = bus.get_object('org.freedesktop.UDisks2', '/org/freedesktop/UDisks2/block_devices%s'%device[4:]) try: device = bd.Get('org.freedesktop.UDisks2.Block', 'Device', dbus_interface='org.freedesktop.DBus.Properties') device = bytearray(device).replace(b'\x00', b'').decode('utf-8') print "printing " + device label = bd.Get('org.freedesktop.UDisks2.Block', 'IdLabel', dbus_interface='org.freedesktop.DBus.Properties') print 'Name od partition is %s'%label uuid = bd.Get('org.freedesktop.UDisks2.Block', 'IdUUID', dbus_interface='org.freedesktop.DBus.Properties') print 'UUID is %s'%uuid size = bd.Get('org.freedesktop.UDisks2.Block', 'Size', dbus_interface='org.freedesktop.DBus.Properties') print 'Size is %s'%uuid file_system = bd.Get('org.freedesktop.UDisks2.Block', 'IdType', dbus_interface='org.freedesktop.DBus.Properties') print 'Filesystem is %s'%file_system except: print "Error detecting USB details..." 

Las propiedades completas del dispositivo de bloque se pueden encontrar aquí http://udisks.freedesktop.org/docs/latest/gdbus-org.freedesktop.UDisks2.Block.html

Editar Tenga en cuenta que el objeto Block no tiene propiedades ConnectionBus o Removable . Tendrá que cambiar el código para eliminar las referencias a las propiedades del objeto Drive para que el código funcione. /Editar

Si desea conectarse a Block , no a Drive , entonces en lugar de

 drive_info = v.get('org.freedesktop.UDisks2.Drive', {}) 

tratar

 drive_info = v.get('org.freedesktop.UDisks2.Block', {}) 

Luego puedes iterar a través de drive_info y generar sus propiedades. Por ejemplo, para obtener la propiedad Id , podría:

 print("Id: %s" % drive_info['Id']) 

Estoy seguro de que hay una buena forma en Pythonic para iterar a través de todos los pares de clave / valor de propiedad y mostrar los valores, pero se lo dejo a usted. La clave es 'Id' y el valor es la cadena almacenada en drive_info['Id'] . Buena suerte