|
|
|
@ -115,6 +115,45 @@ class VirtualBox(BaseManager):
|
|
|
|
|
|
|
|
|
|
return stdout_data.decode("utf-8", errors="ignore").splitlines()
|
|
|
|
|
|
|
|
|
|
@asyncio.coroutine
|
|
|
|
|
def _find_inaccessible_hdd_files(self):
|
|
|
|
|
"""
|
|
|
|
|
Finds inaccessible disk files (to clean up the VirtualBox media manager)
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
hdds = []
|
|
|
|
|
properties = yield from self.execute("list", ["hdds"])
|
|
|
|
|
flag_inaccessible = False
|
|
|
|
|
for prop in properties:
|
|
|
|
|
try:
|
|
|
|
|
name, value = prop.split(':', 1)
|
|
|
|
|
except ValueError:
|
|
|
|
|
continue
|
|
|
|
|
if name.strip() == "State" and value.strip() == "inaccessible":
|
|
|
|
|
flag_inaccessible = True
|
|
|
|
|
if flag_inaccessible and name.strip() == "Location":
|
|
|
|
|
hdds.append(value.strip())
|
|
|
|
|
flag_inaccessible = False
|
|
|
|
|
return reversed(hdds)
|
|
|
|
|
|
|
|
|
|
@asyncio.coroutine
|
|
|
|
|
def project_closed(self, project):
|
|
|
|
|
"""
|
|
|
|
|
Called when a project is closed.
|
|
|
|
|
|
|
|
|
|
:param project: Project instance
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
yield from super().project_closed(project)
|
|
|
|
|
hdd_files_to_close = yield from self._find_inaccessible_hdd_files()
|
|
|
|
|
for hdd_file in hdd_files_to_close:
|
|
|
|
|
log.info("Closing VirtualBox VM disk file {}".format(os.path.basename(hdd_file)))
|
|
|
|
|
try:
|
|
|
|
|
yield from self.execute("closemedium", ["disk", hdd_file])
|
|
|
|
|
except VirtualBoxError as e:
|
|
|
|
|
log.warning("Could not close VirtualBox VM disk file {}: {error}".format(os.path.basename(hdd_file), e))
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
@asyncio.coroutine
|
|
|
|
|
def get_list(self):
|
|
|
|
|
"""
|
|
|
|
|