|
|
@ -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 <name> [--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) |