Skip to content

Instantly share code, notes, and snippets.

@von
Last active June 22, 2019 01:03
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 von/edc512df2faeca050c2cc359c3d48ade to your computer and use it in GitHub Desktop.
Save von/edc512df2faeca050c2cc359c3d48ade to your computer and use it in GitHub Desktop.
Initial stab at vifm-media-osx - see https://github.com/vifm/vifm/issues/438
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""vifm mediaprg for Mac OSX"""
from __future__ import print_function
import argparse
import plistlib
import subprocess
import sys
DISKUTIL="diskutil"
def make_parser():
"""Return arparse.ArgumentParser instance"""
parser = argparse.ArgumentParser(
description=__doc__, # printed with -h/--help
# Don't mess with format of description
formatter_class=argparse.RawDescriptionHelpFormatter,
# To have --help print defaults with trade-off it changes
# formatting, use: ArgumentDefaultsHelpFormatter
)
subparsers = parser.add_subparsers(help='command')
parser_list = subparsers.add_parser('list', help='list mounted media')
parser_list.set_defaults(func=list)
parser_mount = subparsers.add_parser('mount', help='mount a device')
parser_mount.add_argument("device", metavar="device", type=str, nargs=1,
help="device to mount")
parser_mount.set_defaults(func=mount)
parser_unmount = subparsers.add_parser('unmount', help='unmount given mount point')
parser_unmount.add_argument("path", metavar="path", type=str, nargs=1,
help="path to unmount")
parser_unmount.set_defaults(func=unmount)
return parser
def list(args):
"""List media"""
try:
# Use '-plist' to get XML output
output = subprocess.check_output(
[DISKUTIL, "list", "-plist"])
except subprocess.CalledProcessError:
print("Failed to execute '{}'".format(DISKUTIL), file=sys.stderr)
return(1)
root = plistlib.readPlistFromString(output)
for disk in root["AllDisksAndPartitions"]:
# By experimentation, these seem to be root and other uninteresting
# disks
if disk["Content"] == "GUID_partition_scheme":
continue
if "Partitions" in disk:
for partition in disk["Partitions"]:
print_disk_or_partition(partition)
else:
print_disk_or_partition(disk)
return(0)
def print_disk_or_partition(node):
"""Given a PList node, print the associated disk or partition"""
print("device=/dev/" + node["DeviceIdentifier"])
try:
print("label=" + node["VolumeName"])
except KeyError:
pass
try:
print("mount-point=" + node["MountPoint"])
except KeyError:
# Unmounted disk
pass
def mount(args):
"""Mount a device"""
device = args.device[0]
try:
subprocess.check_call([DISKUTIL, "mount", device])
except OSError:
print("Failed to execute {}".format(DISKUTIL), file=sys.stderr)
return(1)
except subprocess.CalledProcessError:
# Trust diskutil to have output a useful error message
return(1)
return(0)
def unmount(args):
"""Unmount given mount point"""
path = args.path[0]
try:
subprocess.check_call([DISKUTIL, "unmount", path])
except OSError:
print("Failed to execute {}".format(DISKUTIL), file=sys.stderr)
return(1)
except subprocess.CalledProcessError:
# Trust diskutil to have output a useful error message
return(1)
return(0)
def main(argv=None):
parser = make_parser()
args = parser.parse_args(argv if argv else sys.argv[1:])
return(args.func(args))
if __name__ == "__main__":
sys.exit(main())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment