#!/bin/python2
import os
import sys
import stat
import errno
import libmount 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.Cxt()
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.Cxt()
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.Cxt()
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.Cxt()
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))