Better error recovery and error message when trying to find mount points on OS X fails

This commit is contained in:
Kovid Goyal 2009-12-24 19:08:16 -07:00
parent ef4f68c6b6
commit 12871ae8ce
4 changed files with 23 additions and 76 deletions

View File

@ -23,7 +23,7 @@ class LinuxFreeze(Command):
is64bit = platform.architecture()[0] == '64bit'
arch = 'x86_64' if is64bit else 'i686'
ffi = '/usr/lib/libffi.so.5' if is64bit else '/usr/lib/gcc/i686-pc-linux-gnu/4.4.1/libffi.so.4'
ffi = '/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.2/libffi.so.4' if is64bit else '/usr/lib/gcc/i686-pc-linux-gnu/4.4.1/libffi.so.4'
stdcpp = '/usr/lib/gcc/%s-pc-linux-gnu/%s/libstdc++.so.6'%(arch, '4.4.2'
if is64bit else '4.4.1')

View File

@ -6,9 +6,9 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
Embedded console for debugging.
'''
import sys, os, pprint
import sys, os
from calibre.utils.config import OptionParser
from calibre.constants import iswindows, isosx
from calibre.constants import iswindows
from calibre import prints
def option_parser():
@ -61,77 +61,8 @@ def migrate(old, new):
print 'Database migrated to', os.path.abspath(new)
def debug_device_driver():
from calibre.customize.ui import device_plugins
from calibre.devices.scanner import DeviceScanner
s = DeviceScanner()
s.scan()
devices = s.devices
if not iswindows:
devices = [list(x) for x in devices]
for d in devices:
for i in range(3):
d[i] = hex(d[i])
print 'USB devices on system:\n', pprint.pprint(devices)
if iswindows:
wmi = __import__('wmi', globals(), locals(), [], -1)
drives = []
print 'Drives detected:'
print '\t', '(ID, Partitions, Drive letter)'
for drive in wmi.WMI(find_classes=False).Win32_DiskDrive():
if drive.Partitions == 0:
continue
try:
partition = drive.associators("Win32_DiskDriveToDiskPartition")[0]
logical_disk = partition.associators('Win32_LogicalDiskToPartition')[0]
prefix = logical_disk.DeviceID+os.sep
drives.append((str(drive.PNPDeviceID), drive.Index, prefix))
except IndexError:
drives.append((str(drive.PNPDeviceID), 'No mount points found'))
for drive in drives:
print '\t', drive
if isosx:
from calibre.devices.usbms.device import Device
raw = Device.run_ioreg()
open('/tmp/ioreg.txt', 'wb').write(raw)
print 'ioreg output saved to /tmp/ioreg.txt'
connected_devices = []
for dev in device_plugins():
print 'Looking for', dev.__class__.__name__
connected = s.is_device_connected(dev, debug=True)
if connected:
connected_devices.append(dev)
errors = {}
success = False
for dev in connected_devices:
print 'Device possibly connected:', dev.__class__.name
print 'Trying to open device...',
try:
dev.open()
print 'OK'
except:
import traceback
errors[dev] = traceback.format_exc()
print 'failed'
continue
success = True
if hasattr(dev, '_main_prefix'):
print 'Main memory:', repr(dev._main_prefix)
print 'Total space:', dev.total_space()
break
if not success and errors:
print 'Opening of the following devices failed'
for dev,msg in errors.items():
print dev
print msg
print
if isosx and os.path.exists('/tmp/ioreg.txt'):
print
print
print "Don't forget to send the file /tmp/ioreg.txt as well"
print "You can view it by typing the command: open /tmp/ioreg.txt"
from calibre.devices import debug
print debug()
if iswindows:
raw_input('Press Enter to continue...')

View File

@ -76,7 +76,9 @@ def debug():
ioreg = None
if isosx:
from calibre.devices.usbms.device import Device
mount = repr(Device.osx_run_mount())
ioreg = Device.run_ioreg()
ioreg = 'Output from mount:\n\n'+mount+'\n\n'+ioreg
connected_devices = []
for dev in device_plugins():
out('Looking for', dev.__class__.__name__)

View File

@ -380,14 +380,28 @@ class Device(DeviceConfig, DevicePlugin):
break
return self.osx_sort_names(names)
@classmethod
def osx_run_mount(cls):
for i in range(3):
try:
return subprocess.Popen('mount',
stdout=subprocess.PIPE).communicate()[0]
except IOError: # Probably an interrupted system call
if i == 2:
raise
time.sleep(2)
def open_osx(self):
mount = subprocess.Popen('mount', shell=True, stdout=subprocess.PIPE).stdout.read()
mount = self.osx_run_mount()
names = self.get_osx_mountpoints()
dev_pat = r'/dev/%s(\w*)\s+on\s+([^\(]+)\s+'
if 'main' not in names.keys():
raise DeviceError(_('Unable to detect the %s disk drive. Try rebooting.')%self.__class__.__name__)
main_pat = dev_pat % names['main']
self._main_prefix = re.search(main_pat, mount).group(2) + os.sep
main_match = re.search(main_pat, mount)
if main_match is None:
raise DeviceError(_('Unable to detect the %s mount point. Try rebooting.')%self.__class__.__name__)
self._main_prefix = main_match.group(2) + os.sep
card_a_pat = names['carda'] if 'carda' in names.keys() else None
card_b_pat = names['cardb'] if 'cardb' in names.keys() else None