diff options
Diffstat (limited to 'lib')
-rwxr-xr-x | lib/isodumper.py | 63 |
1 files changed, 57 insertions, 6 deletions
diff --git a/lib/isodumper.py b/lib/isodumper.py index 6e111b1..ffc56cc 100755 --- a/lib/isodumper.py +++ b/lib/isodumper.py @@ -68,10 +68,10 @@ class UDisks2(object): self.iface = self.bus.get(self.SERVICE) except : raise NoUDisks2() + self._udisks2_obj_manager = self.iface["org.freedesktop.DBus.ObjectManager"] def find_devices(self): - _udisks2_obj_manager = self.iface["org.freedesktop.DBus.ObjectManager"] - objects=_udisks2_obj_manager.GetManagedObjects() + objects = self._udisks2_obj_manager.GetManagedObjects() re_drive = re.compile('(?P<path>.*?/drives/(?P<id>.*))') re_block = re.compile('(?P<path>.*?/block_devices/(?P<id>.*))') devs= [m.groupdict() for m in @@ -104,6 +104,38 @@ class UDisks2(object): list.append(item) return list + def do_unmount(self, target): + # keep only the end, like sdb + target = os.path.basename(target) + objects = self._udisks2_obj_manager.GetManagedObjects() + re_drive = re.compile('(?P<path>.*?/drives/(?P<id>.*))') + re_block = re.compile('(?P<path>.*?/block_devices/(?P<id>.*))') + blocks = [m.groupdict() for m in + [re_block.match(path) for path in (objects.keys())] + if m] + for block in blocks: + if (self.SERVICE + '.Partition' in objects[block['path']]): # we skip non partition blocks + # Table should be something like '/org/freedesktop/UDisks2/block_devices/sdb' + if objects[block['path']][self.SERVICE + '.Partition']['Table'].split('/')[-1] == target : + print("Unmounting: {}".format(block['path'].split('/')[-1])) + if (self.SERVICE + '.Encrypted' in objects[block['path']]): # Is the partition encrypted ? + path_to_encrypted = objects[block['path']][self.SERVICE + '.Encrypted']['CleartextDevice'] + print(path_to_encrypted) + if path_to_encrypted != '/' : + iface = self.bus.get(self.SERVICE, path_to_encrypted) + fs = iface[self.SERVICE + '.Filesystem'] + if fs.MountPoints : # partition is mounted + fs.Unmount({}) + iface = self.bus.get(self.SERVICE, block['path']) + fs = iface[self.SERVICE + '.Encrypted'] + fs.Lock({}) + else: + iface = self.bus.get(self.SERVICE, block['path']) + fs = iface[self.SERVICE + '.Filesystem'] + if fs.MountPoints : # partition is mounted + fs.Unmount({}) + return True, "" + def eject(self, device): ''' device is expected like /dev/sda''' block = os.path.basename(device) @@ -139,6 +171,22 @@ class IsoDumper(object): self.devicelist.addItem(str(name+' ('+path.lstrip()+') ' + self.sizeof_fmt(size)),False) return True + def udev_wait(self, operation): + wait = Popen(["udevadm","settle","--timeout=15"], stderr=PIPE) + outs, errs = wait.communicate() + working=True + while working: + time.sleep(0.5) + wait.poll() + rc=wait.returncode + if not (rc is None): + wait = None + working= False + if rc != 0: + self.return_state = False + self.return_message = _("Timeout reached when {}".format(operation)) + return False + return True def update_list(self ): self.devicelist.deleteAllItems() @@ -210,7 +258,7 @@ class IsoDumper(object): self.ima.setDisabled() self.writebt.setDisabled() self.devicelist.setEnabled() - self.progress.setLabel("") + self.progress.setLabel(_("Progress")) self.progress.setValue(0) self.progress.setDisabled() self.refreshbt.setEnabled() @@ -312,7 +360,8 @@ class IsoDumper(object): self.logger(_('Executing copy from ')+source+_(' to ')+target) bus = SystemBus() iface = bus.get("org.mageia.Magiback", "Isodumper") - success, message = iface.do_unmount(target) + success, message = self.u.do_unmount(target) + self.udev_wait(_("unmounting")) if success: # Writing step iface.do_write(source, target, b) @@ -372,7 +421,8 @@ class IsoDumper(object): time.sleep(.5) self.logger(_("Added persistent partition")) # Unmount if partitions are automatically mounted and then eject - success, message = iface.do_unmount(target) + success, message = self.u.do_unmount(target) + self.udev_wait(_("unmounting")) if success: self.u.eject(target) self.success() @@ -779,7 +829,8 @@ exFAT, NTFS or ext. You can specify a volume name and the format in a new dialog try: self.handleevent() except Exception as e: - print(str(e)) + import traceback + traceback.print_exc() yui.YDialog.deleteAllDialogs() |