diff options
author | Arjen Hiemstra <ahiemstra@heimr.nl> | 2016-12-08 16:23:33 +0300 |
---|---|---|
committer | Arjen Hiemstra <ahiemstra@heimr.nl> | 2016-12-08 16:23:33 +0300 |
commit | ae389742ff430d5861c0989e5e1122a7766da068 (patch) | |
tree | a3b9c0fff92b112c7f17b9523c33e68f11676913 /plugins/RemovableDriveOutputDevice | |
parent | d3f58a049ba5675f2e7ce1f90614febf07b67987 (diff) |
Update OSX removable drive code to handle 10.12 plist format
Fixes CURA-2618
Diffstat (limited to 'plugins/RemovableDriveOutputDevice')
-rw-r--r-- | plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py | 63 |
1 files changed, 41 insertions, 22 deletions
diff --git a/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py b/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py index c96bf8bacf..6d8b5021ae 100644 --- a/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py +++ b/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py @@ -17,41 +17,60 @@ class OSXRemovableDrivePlugin(RemovableDrivePlugin.RemovableDrivePlugin): drives = {} p = subprocess.Popen(["system_profiler", "SPUSBDataType", "-xml"], stdout = subprocess.PIPE) plist = plistlib.loads(p.communicate()[0]) - p.wait() - for entry in plist: - if "_items" in entry: - for item in entry["_items"]: - for dev in item["_items"]: - if "removable_media" in dev and dev["removable_media"] == "yes" and "volumes" in dev and len(dev["volumes"]) > 0: - for vol in dev["volumes"]: - if "mount_point" in vol: - volume = vol["mount_point"] - drives[volume] = os.path.basename(volume) + result = self._recursiveSearch(plist, "removable_media") p = subprocess.Popen(["system_profiler", "SPCardReaderDataType", "-xml"], stdout=subprocess.PIPE) plist = plistlib.loads(p.communicate()[0]) - p.wait() - for entry in plist: - if "_items" in entry: - for item in entry["_items"]: - for dev in item["_items"]: - if "removable_media" in dev and dev["removable_media"] == "yes" and "volumes" in dev and len(dev["volumes"]) > 0: - for vol in dev["volumes"]: - if "mount_point" in vol: - volume = vol["mount_point"] - drives[volume] = os.path.basename(volume) + result.extend(self._recursiveSearch(plist, "removable_media")) + + for drive in result: + # Ignore everything not explicitly marked as removable + if drive["removable_media"] != "yes": + continue + + # Ignore any removable device that does not have an actual volume + if "volumes" not in drive or not drive["volumes"]: + continue + + for volume in drive["volumes"]: + if not "mount_point" in volume: + continue + + mount_point = volume["mount_point"] + + if "_name" in volume: + drive_name = volume["_name"] + else: + drive_name = os.path.basename(mount_point) + + drives[mount_point] = drive_name return drives def performEjectDevice(self, device): p = subprocess.Popen(["diskutil", "eject", device.getId()], stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE) output = p.communicate() - Logger.log("d", "umount returned: %s.", repr(output)) return_code = p.wait() if return_code != 0: return False else: - return True
\ No newline at end of file + return True + + # Recursively search for key in a plist parsed by plistlib + def _recursiveSearch(self, plist, key): + result = [] + for entry in plist: + if key in entry: + result.append(entry) + continue + + if "_items" in entry: + result.extend(self._recursiveSearch(entry["_items"], key)) + + if "Media" in entry: + result.extend(self._recursiveSearch(entry["Media"], key)) + + return result |