• [^] # Re: ubuntu?

    Posté par . En réponse au message montage automatique. Évalué à 2.

    je me suis bidouillé un petit script python qui se connecte a HAL via DBUS et qui utilise pmount pour monter les clefs usb et les cdrom.
    c'est en grande partie repompé de hal-device-manager
    et il faut parfois utiliser pumount a la main pour demonter.
    en attendant une vraie integration dans kde (deja dans le CVS je crois)...
    import sys, os
    import dbus
    import gtk
    class DeviceWatcher:
     def __init__ (self):
     
     self.bus = dbus.SystemBus()
     self.hal_service = self.bus.get_service('org.freedesktop.Hal')
     self.hal_manager = self.hal_service.get_object("/org/freedesktop/Hal/Manager", "org.freedesktop.Hal.Manager")
     #print self.hal_manager.ListServices()
     
     # gdl_changed will be invoked when the Global Device List is changed
     # per the hal spec
     self.bus.add_signal_receiver(self.gdl_changed,
     "DeviceAdded",
     "org.freedesktop.Hal.Manager",
     "org.freedesktop.Hal",
     "/org/freedesktop/Hal/Manager")
     self.bus.add_signal_receiver(self.gdl_changed,
     "DeviceRemoved",
     "org.freedesktop.Hal.Manager",
     "org.freedesktop.Hal",
     "/org/freedesktop/Hal/Manager")
     self.bus.add_signal_receiver(self.gdl_changed,
     "NewCapability",
     "org.freedesktop.Hal.Manager",
     "org.freedesktop.Hal",
     "/org/freedesktop/Hal/Manager")
     # Add listeners for all devices
     try:
     device_names = self.hal_manager.GetAllDevices()
     except:
     print "Could not get device list. Make sure hald is running!\n"
     sys.exit(1)
     for name in device_names:
     
     dev = self.hal_service.get_object(name, "org.freedesktop.Hal.Device")
     
     if dev.PropertyExists('info.category') and dev.GetProperty('info.category') == 'volume':
     self.add_device_signal_recv (name)
     parent = self.hal_service.get_object(dev.GetProperty('info.parent') , "org.freedesktop.Hal.Device")
     print dev.GetProperty('info.product') 
     
     
     def add_device_signal_recv (self, udi):
     print "listening: " + udi
     self.bus.add_signal_receiver(self.device_changed,
     "PropertyModified",
     "org.freedesktop.Hal.Device",
     "org.freedesktop.Hal",
     udi)
     return
     self.bus.add_signal_receiver(self.device_changed,
     "Condition",
     "org.freedesktop.Hal.Device",
     "org.freedesktop.Hal",
     udi)
     def remove_device_signal_recv (self, udi):
     self.bus.remove_signal_receiver(self.device_changed,
     "PropertyModified",
     "org.freedesktop.Hal.Device",
     "org.freedesktop.Hal",
     udi)
     return
     self.bus.remove_signal_receiver(self.device_changed,
     "Condition",
     "org.freedesktop.Hal.Device",
     "org.freedesktop.Hal",
     udi)
     
     
     def device_changed(self, dbus_if, dbus_member, dbus_svc,
     dbus_obj_path, dbus_message):
     """This method is called when signals on the Device interface is
     received"""
     print "entering device_changed"
     print dbus_member
     if dbus_member=="Condition":
     args = dbus_message.get_args_list()
     print "\nCondition %s, device=%s"%(args[0], dbus_obj_path)
     print " message = ", args 
     
     elif dbus_member=="PropertyModified":
     args = dbus_message.get_args_list()
     num_modifications = args[0]
     
     print "\nPropertyModified, device=%s"%dbus_obj_path
     for i in range(0, num_modifications):
     property_name = args[1+3*i]
     removed = args[2+3*i]
     added = args[3+3*i]
     print " key=%s, rem=%d, add=%d"%(property_name, removed, added)
     if property_name=="info.parent":
     pass 
     else:
     device_udi = dbus_obj_path
     device_udi_obj = self.hal_service.get_object(device_udi,
     "org.freedesktop.Hal.Device")
     
     if device_udi_obj.PropertyExists(property_name):
     print " value=%s"%(device_udi_obj.GetProperty(property_name))
     def gdl_changed(self, dbus_if, dbus_member, dbus_svc, dbus_obj_path, dbus_message):
     """This method is called when a HAL device is added or removed."""
     print "entering gdl_changed"
     print dbus_member
     
     if dbus_member=="DeviceAdded":
     [device_udi] = dbus_message.get_args_list()
     print "\nDeviceAdded, udi=%s"%(device_udi)
     self.add_device_signal_recv (device_udi)
     dev = self.hal_service.get_object(device_udi, "org.freedesktop.Hal.Device")
     
     #conditions pour etre montable
     if dev.PropertyExists('info.category') and dev.GetProperty('info.category') == 'volume':
     
     fstype = dev.GetProperty('volume.fstype')
     blockdevice = dev.GetProperty('block.device') 
     label = dev.GetProperty('info.product').replace(" ","_")
     
     if fstype == 'iso9660':
     #cdrom
     cmd = "pmount %s %s" % (blockdevice,label)
     else:
     #usb
     label = 'usb_' + label
     cmd = "pmount %s %s" % (blockdevice,label)
     
     print cmd
     os.system(cmd)
     
     elif dbus_member=="DeviceRemoved":
     [device_udi] = dbus_message.get_args_list()
     print "\nDeviceRemoved, udi=%s"%(device_udi)
     self.remove_device_signal_recv (device_udi)
     elif dbus_member=="NewCapability":
     [device_udi, cap] = dbus_message.get_args_list()
     print "\nNewCapability, cap=%s, udi=%s"%(cap, device_udi)
     device_dbus_obj = self.hal_service.get_object(device_udi,
     "org.freedesktop.Hal.Device")
     print device_dbus_obj.GetAllProperties()
     else:
     print "*** Unknown signal %s"%dbus_member
     
    watcher = DeviceWatcher()
    gtk.main()