summaryrefslogblamecommitdiffstats
path: root/libmount/python/test_mount_context.py
blob: 3508cf60f2b2b07a56ea90dec82b90e78665e99d (plain) (tree)











































































































































































                                                                                                           
#!/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))