diff --git a/tools/pusb_adm b/tools/pusb_adm new file mode 100755 index 0000000..6262782 --- /dev/null +++ b/tools/pusb_adm @@ -0,0 +1,157 @@ +#!/usr/bin/env python2.4 + +import dbus +import sys +from xml.dom import minidom + +class Device: + def __init__(self, udi): + self.__udi = udi + self.__findStorageDevice() + deviceObj = bus.get_object('org.freedesktop.Hal', + udi) + deviceProperties = deviceObj.GetAllProperties( + dbus_interface = 'org.freedesktop.Hal.Device') + self.vendor = deviceProperties['usb_device.vendor'] + self.product = deviceProperties['info.product'] + self.serialNumber = deviceProperties['usb_device.serial'] + + def __findStorageDevice(self): + for child in halManager.FindDeviceByCapability('storage'): + obj = bus.get_object('org.freedesktop.Hal', + child) + properties = obj.GetAllProperties( + dbus_interface = 'org.freedesktop.Hal.Device') + if properties['storage.physical_device'] == self.__udi + '_if0': + self.__storageUdi = child + return + raise Exception, '%s is not a storage device.' % self.__udi + + def __repr__(self): + return "%s %s (%s)" % (self.vendor, self.product, self.serialNumber) + + def volumes(self): + vols = [] + for volume in halManager.FindDeviceByCapability('volume'): + deviceObj = bus.get_object('org.freedesktop.Hal', + volume) + deviceProperties = deviceObj.GetAllProperties( + dbus_interface = 'org.freedesktop.Hal.Device') + if deviceProperties['block.storage_device'] != self.__storageUdi: + continue + vols.append({'uuid' : deviceProperties['volume.uuid'], + 'device' : deviceProperties['block.device']}) + return vols + +def listOptions(question, options, force = False): + if force == False and len(options) == 1: + return 0 + while True: + try: + print question + for i in range(len(options)): + print "%d) %s" % (i, options[i]) + print + sys.stdout.write('[%s-%s]: ' % (0, len(options) - 1)) + optionId = int(sys.stdin.readline()) + print + if optionId not in range(len(options)): + raise Exception + return optionId + except KeyboardInterrupt: sys.exit() + except Exception: pass + else: break + +def addDevice(options): + devices = [] + + for udi in halManager.FindDeviceStringMatch('info.bus', 'usb_device'): + try: + devices.append(Device(udi)) + except Exception, ex: + pass + + if len(devices) == 0: + print 'No devices detected.' + sys.exit() + + device = devices[listOptions("Please select the device you wish to add.", + devices, force = options['force'])] + volumes = device.volumes() + volume = volumes[listOptions("Which volume would you like to use for " \ + "storing data ?", + ["%s (UUID: %s)" % (volume['device'], + volume['uuid']) + for volume in volumes], + force = options['force'])] + + print 'Name\t\t: %s' % options['deviceName'] + print 'Vendor\t\t: %s' % device.vendor + print 'Model\t\t: %s' % device.product + print 'Serial\t\t: %s' % device.serialNumber + print 'Volume UUID\t: %s (%s)' % (volume['uuid'], volume['device']) + print + print 'Save device to %s ?' % options['configFile'] + + sys.stdout.write('[y/n] ') + if sys.stdin.readline().strip() != 'y': + sys.exit(1) + + doc = minidom.parse(options['configFile']) + devs = doc.getElementsByTagName('devices') + dev = doc.createElement('device') + dev.attributes['id'] = options['deviceName'] + devs[0].appendChild(dev) + + for name, value in (('vendor', device.vendor), + ('model', device.product), + ('serial', device.serialNumber), + ('volume_uuid', volume['uuid'])): + e = doc.createElement(name) + t = doc.createTextNode(value) + e.appendChild(t) + dev.appendChild(e) + + f = open(options['configFile'], 'w') + f.write(doc.toxml()) + f.close() + print 'Done.' + +def usage(): + print 'Usage: %s [--config file] --add-device [--no-autodetect]' % sys.argv[0] + sys.exit(1) + +import getopt + +try: + opts, args = getopt.getopt(sys.argv[1:], "ha:nc:", + ["help", "add-device=", "no-autodetect", + "config="]) +except getopt.GetoptError: + usage() + +if len(args) != 0: + usage() + +options = { 'force' : False, 'deviceName' : None, + 'configFile' : '/etc/pam_usb/pusb.conf' } + +for o, a in opts: + if o in ("-h", "--help"): + usage() + if o in ("-a", "--add-device"): + options['deviceName'] = a + if o in ("-n", "--no-autodetect"): + options['force'] = True + if o in ("-c", "--config"): + options['configFile'] = a + +if options['deviceName'] is None: + usage() + +bus = dbus.SystemBus() +halService = bus.get_object('org.freedesktop.Hal', + '/org/freedesktop/Hal/Manager') +halManager = dbus.Interface(halService, 'org.freedesktop.Hal.Manager') + +addDevice(options) diff --git a/tools/scan.py b/tools/scan.py deleted file mode 100755 index 21dd482..0000000 --- a/tools/scan.py +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env python2.4 - -import dbus - -bus = dbus.SystemBus() -halService = bus.get_object('org.freedesktop.Hal', - '/org/freedesktop/Hal/Manager') -halManager = dbus.Interface(halService, 'org.freedesktop.Hal.Manager') - -def getStorageDevice(udi): - for child in halManager.FindDeviceByCapability('storage'): - deviceObj = bus.get_object('org.freedesktop.Hal', - child) - deviceProperties = deviceObj.GetAllProperties( - dbus_interface = 'org.freedesktop.Hal.Device') - if deviceProperties['storage.physical_device'] == udi + '_if0': - return child - return None - -def showVolumes(udi): - for volume in halManager.FindDeviceByCapability('volume'): - deviceObj = bus.get_object('org.freedesktop.Hal', - volume) - deviceProperties = deviceObj.GetAllProperties( - dbus_interface = 'org.freedesktop.Hal.Device') - if deviceProperties['block.storage_device'] != udi: - continue - print '%s\t\t%s' % (deviceProperties['block.device'], - deviceProperties['volume.uuid']) - -def showProperties(udi): - storage = getStorageDevice(udi) - if storage is None: - return - print - deviceObj = bus.get_object('org.freedesktop.Hal', - udi) - deviceProperties = deviceObj.GetAllProperties( - dbus_interface = 'org.freedesktop.Hal.Device') - print 'Device %s' % udi - print 'Vendor: %s' % deviceProperties['usb_device.vendor'] - print 'Product: %s' % deviceProperties['info.product'] - print 'Serial Number: %s' % deviceProperties['usb_device.serial'] - print - print 'Volume\t\t\tUUID' - showVolumes(storage) - -bus = dbus.SystemBus() -halService = bus.get_object('org.freedesktop.Hal', - '/org/freedesktop/Hal/Manager') -halManager = dbus.Interface(halService, 'org.freedesktop.Hal.Manager') - -print 'Scanning USB devices...' -for udi in halManager.FindDeviceStringMatch('info.bus', 'usb_device'): - deviceObj = bus.get_object('org.freedesktop.Hal', - udi) - showProperties(udi)