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()
[^] # Re: ubuntu?
Posté par botio2 . 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()