You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.7 KiB
72 lines
2.7 KiB
#!/usr/bin/env python3 |
|
|
|
import sys, os |
|
import argparse |
|
import subprocess |
|
|
|
def existing_filename(f): |
|
if not os.path.exists(f): |
|
raise ValueError("No such file or directory.") |
|
return f |
|
|
|
def existing_dirname_or_dash(f): |
|
if f == '-': |
|
pass |
|
elif not os.path.exists(f): |
|
raise ValueError("No such file or directory.") |
|
elif not os.path.isdir(f): |
|
raise ValueError("Not a directory: %s" % f) |
|
return f |
|
|
|
def int_1plus(s): |
|
i = int(s) |
|
if i < 1: |
|
raise ValueError("Index must be greater 0.") |
|
return i |
|
|
|
def parse_args(argv): |
|
parser = argparse.ArgumentParser(prog=argv[0]) |
|
parser.add_argument("image", help="image file", type=existing_filename) |
|
parser.add_argument("mountpoint", help="mount point/loop device ['-' uses next available]", type=existing_dirname_or_dash) |
|
parser.add_argument("-p", help="partition index, 1-based [default: 1]", type=int_1plus, default=1, metavar="index", dest="part") |
|
parser.add_argument("-l", help="Don't mount, just setup the loop device.", action="store_true", default=False) |
|
parser.add_argument("-t", help="filesystem type [default: auto]", metavar="vfstype") |
|
parser.add_argument("-o", help="mount options [default: none]", metavar="options") |
|
parser.add_argument("-parted", help="parted executable [default: parted]", default="parted") |
|
parser.add_argument("-mount", help="mount executable [default: mount]", default="mount") |
|
parser.add_argument("-losetup", help="losetup executable [default: losetup]", default="losetup") |
|
return parser.parse_args(argv[1:]) |
|
|
|
def main(argv): |
|
args = parse_args(argv) |
|
|
|
parted = subprocess.check_output([args.parted, args.image, "-s", "-m", "u", "b", "p"]) |
|
partitions = parted.split(b";\n")[2:] |
|
|
|
try: |
|
part = partitions[args.part-1] |
|
except IndexError: |
|
raise SystemExit("Partition index out of range: %i, has %i" % (args.part, len(partitions))) |
|
|
|
offset = part.split(b':')[1].rstrip(b'B').decode("ascii") |
|
|
|
if args.l: |
|
if args.mountpoint == '-': |
|
args.mountpoint = "-f" |
|
losetup = [args.losetup, "--show", "--offset", offset, args.mountpoint, args.image] |
|
subprocess.check_call(losetup) |
|
else: |
|
if args.mountpoint == '-': |
|
raise ValueError("Mountpoint cannot be '-' unless -l (only setup loop device) is also given") |
|
options = "offset=%s" % offset |
|
if args.o: |
|
options += ',' + args.o |
|
mount = [args.mount, args.image, args.mountpoint, "-o", options] |
|
if args.t: |
|
mount.append("-t") |
|
mount.append(args.t) |
|
subprocess.check_call(mount) |
|
|
|
if __name__ == "__main__": |
|
import sys |
|
sys.exit(main(sys.argv))
|
|
|