blob: 1f63b955457c6675576e948173b5d1927c7889aa [file] [log] [blame]
import os
import sys
import stat
import errno
import functools as ft
# 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 parser_errcb(tb, fname, line):
print("{:s}:{:d}: parse error".format(fname, line))
return 1
def create_table(f, comments):
if not f:
return None
tb = mnt.Table()
tb.enable_comments(comments)
tb.errcb = parser_errcb
try:
tb.parse_file(f)
except Exception:
print("{:s}: parsing failed".format(f))
return None
return tb
def test_copy_fs(ts, argv):
rc = -1
tb = create_table(argv[1], False)
fs = tb.find_target("/", mnt.MNT_ITER_FORWARD)
if not fs:
return rc
print("ORIGINAL:")
fs.print_debug()
fs = fs.copy_fs(None)
if not fs:
return rc
print("COPY:")
fs.print_debug()
return 0
def test_parse(ts, argv):
parse_comments = False
if len(argv) == 3 and argv[2] == "--comments":
parse_comments = True
tb = create_table(argv[1], parse_comments)
if tb.intro_comment:
print("Initial comment:\n\"{:s}\"".format(tb.intro_comment))
#while ((fs = tb.next_fs()) != None):
for fs in iter(ft.partial(tb.next_fs), None):
fs.print_debug()
if tb.trailing_comment:
print("Trailing comment:\n\"{:s}\"".format(tb.trailing_comment))
return 0
def test_find(ts, argv, dr):
if len(argv) != 4:
print("try --help")
return -errno.EINVAL
f, find, what = argv[1:]
tb = create_table(f, False)
if find.lower() == "source":
fs = tb.find_source(what, dr)
elif find.lower() == "target":
fs = tb.find_target(what, dr)
if not fs:
print("{:s}: not found {:s} '{:s}'".format(f, find, what))
else:
fs.print_debug()
return 0
def test_find_fw(ts, argv):
return test_find(ts, argv, mnt.MNT_ITER_FORWARD)
def test_find_bw(ts, argv):
return test_find(ts, argv, mnt.MNT_ITER_BACKWARD)
def test_find_pair(ts, argv):
rc = -1
tb = create_table(argv[1], False)
fs = tb.find_pair(argv[2], argv[3], mnt.MNT_ITER_FORWARD)
if not fs:
return rc
fs.print_debug()
return 0
def test_is_mounted(ts, argv):
rc = -1
tb = mnt.Tab(path="/proc/self/mountinfo")
if not tb:
print("failed to parse mountinto")
return rc
fstab = create_table(argv[1], False)
if not fstab:
return rc
fs = ()
for fs in ft.iter(tb.next_fs(), -1):
if tb.is_fs_mounted(fs):
print("{:s} already mounted on {:s}".format(fs.source, fs.target))
else:
print("{:s} not mounted on {:s}".format(fs.source, fs.target))
return 0
def test_find_mountpoint(ts, argv):
rc = -1
tb = mnt.Table("/proc/self/mountinfo")
if not tb:
return rc
fs = tb.find_mountpoint(argv[1], mnt.MNT_ITER_BACKWARD)
if not fs:
return rc
fs.print_debug()
return 0
tss = (
( "--parse", test_parse, "<file> [--comments] parse and print(tab" ),
( "--find-forward", test_find_fw, "<file> <source|target> <string>" ),
( "--find-backward", test_find_bw, "<file> <source|target> <string>" ),
( "--find-pair", test_find_pair, "<file> <source> <target>" ),
( "--find-mountpoint", test_find_mountpoint, "<path>" ),
( "--copy-fs", test_copy_fs, "<file> copy root FS from the file" ),
( "--is-mounted", test_is_mounted, "<fstab> check what from <file> are already mounted" ),
)
sys.exit(mnt_run_test(tss, sys.argv))