import os import sys import stat import errno # use "import libmount" for in a standard way installed python binding import pylibmount as mnt def usage(tss): print("\nUsage:\n\t{:s} [testoptions]\nTests:\n".format(sys.argv[0])) for i in tss: print("\t{15:-s}".format(i[0])) if i[2] != "": print(" {:s}\n".format(i[2])) print("\n") return 1 def mnt_run_test(tss, argv): rc = -1 if ((len(argv) < 2) or (argv[1] == "--help") or (argv[1] == "-h")): return usage(tss) #mnt_init_debug(0) i=() for i in tss: if i[0] == argv[1]: rc = i[1](i, argv[1:]) if rc: print("FAILED [rc={:d}]".format(rc)) break if ((rc < 0) and (i == ())): return usage(tss) return not not rc #because !!rc is too mainstream for python def test_mount(ts, argv): idx = 1 rc = 0 if len(argv) < 2: return -errno.EINVAL cxt = mnt.Context() if argv[idx] == "-o": cxt.options = argv[idx+1] idx += 2 if argv[idx] == "-t": cxt.fstype = argv[idx+1] idx += 2 if len(argv) == idx + 1: cxt.target = argv[idx] idx+=1 elif (len(argv) == idx + 2): cxt.source = argv[idx] idx += 1 cxt.target = argv[idx] idx += 1 try: cxt.mount() except Exception: print("failed to mount") return -1 print("successfully mounted") return rc def test_umount(ts, argv): idx = 1 rc = 0 if len(argv) < 2: return -errno.EINVAL cxt = mnt.Context() if argv[idx] == "-t": cxt.options = argv[idx+1] idx += 2 if argv[idx] == "-f": cxt.enable_force(True) if argv[idx] == "-l": cxt.enable_lazy(True) idx += 1 elif argv[idx] == "-r": cxt.enable_rdonly_umount(True) idx += 1 if len(argv) == idx + 1: cxt.target = argv[idx] idx += 1 else: return -errno.EINVAL try: cxt.umount() except Exception: print("failed to umount") return 1 print("successfully umounted") return rc def test_flags(ts, argv): idx = 1 rc = 0 opt = "" flags = 0 cxt = mnt.Context() if argv[idx] == "-o": cxt.options = argv[idx + 1] idx += 2 if len(argv) == idx + 1: cxt.target = argv[idx] idx += 1 try: cxt.prepare_mount() # catch ioerror here except IOError as e: print("failed to prepare mount {:s}".format(e.strerror)) opt = cxt.fs.options if (opt): print("options: {:s}", opt) print("flags: {08:lx}".format(cxt.mflags())) return rc def test_mountall(ts, argv): mntrc = 1 ignored = 1 idx = 1 cxt = mnt.Context() if len(argv) > 2: if argv[idx] == "-O": cxt.options_pattern = argv[idx+1] idx += 2 if argv[idx] == "-t": cxt.fstype_pattern = argv[idx+1] idx += 2 i = () while (cxt.next_mount()): tgt = i.target if (ignored == 1): print("{:s}: ignored: not match".format(tgt)) elif (ignored == 2): print("{:s}: ignored: already mounted".format(tgt)) elif (not cxt.status): if (mntrc > 0): # ?? errno = mntrc print("{:s}: mount failed".format(tgt)) else: print("{:s}: mount failed".format(tgt)) else: print("{:s}: successfully mounted".format(tgt)) return 0 tss = ( ( "--mount", test_mount, "[-o ] [-t ] | " ), ( "--umount", test_umount, "[-t ] [-f][-l][-r] |" ), ( "--mount-all", test_mountall, "[-O ] [-t ] " ) ) os.umask(stat.S_IWGRP | stat.S_IWOTH) #to be compatible with mount(8) sys.exit(mnt_run_test(tss, sys.argv))