174 lines
3.3 KiB
Python
Executable File
174 lines
3.3 KiB
Python
Executable File
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} <test> [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 <opts>] [-t <type>] <spec>|<src> <target>" ),
|
|
( "--umount", test_umount, "[-t <type>] [-f][-l][-r] <src>|<target>" ),
|
|
( "--mount-all", test_mountall, "[-O <pattern>] [-t <pattern] mount all filesystems from fstab" ),
|
|
( "--flags", test_flags, "[-o <opts>] <spec>" )
|
|
)
|
|
os.umask(stat.S_IWGRP | stat.S_IWOTH) #to be compatible with mount(8)
|
|
|
|
sys.exit(mnt_run_test(tss, sys.argv))
|