Skip to content

Instantly share code, notes, and snippets.

@matthew-brett
Created July 13, 2022 11:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save matthew-brett/3b48978c783f58f5cb63f19df97fa509 to your computer and use it in GitHub Desktop.
Save matthew-brett/3b48978c783f58f5cb63f19df97fa509 to your computer and use it in GitHub Desktop.
Script to do VMDK disk reset after reboot
#!/usr/bin/env python
""" Reset disk for VirtualBox vmdk
"""
import os.path as op
from subprocess import check_output
import plistlib
import re
from argparse import ArgumentParser, RawDescriptionHelpFormatter
DISK_RE = re.compile(r'"/dev/disk\d+"')
def get_disk_for_uuid(disk_uuid):
disk_out = check_output(['diskutil', 'list', '-plist'])
disk_info = plistlib.loads(disk_out)
disks = disk_info['AllDisksAndPartitions']
target_disk = None
for di in disks:
if not 'Partitions' in di:
continue
for partition in di['Partitions']:
if partition.get('DiskUUID') == disk_uuid:
target_disk = di['DeviceIdentifier']
break
return '/dev/' + target_disk
def set_target_disk(vmdk_fname, target_disk):
vmdk_fname = op.expanduser(vmdk_fname)
with open(vmdk_fname, 'rt') as fobj:
contents = fobj.read()
if not DISK_RE.search(contents):
raise RuntimeError(
f"Could not find disk id in vmdk file {vmdk_fname}")
with open(vmdk_fname + '.bak', 'wt') as fobj:
fobj.write(contents)
contents = DISK_RE.sub(f'"{target_disk}"', contents)
with open(vmdk_fname, 'wt') as fobj:
fobj.write(contents)
def get_parser():
parser = ArgumentParser(description=__doc__, # Usage from docstring
formatter_class=RawDescriptionHelpFormatter)
parser.add_argument('vmdk_fname',
help='VMDK filename')
parser.add_argument('disk_uuid',
default='5C4BE972-BB2D-4ABF-934A-4A57B585EBFA',
help='UUID for disk partition')
return parser
def main():
parser = get_parser()
args = parser.parse_args()
target_disk = get_disk_for_uuid(args.disk_uuid)
if target_disk is None:
raise RuntimeError(f'Could not find disk {args.disk_uuid}')
set_target_disk(args.vmdk_fname, target_disk)
# https://apple.stackexchange.com/a/339445/100293
print(f"""\
sudo chown ${{USER}} {target_disk}
sudo chmod 660 {target_disk}""")
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment