(root)/
util-linux-2.39/
libmount/
python/
test_mount_context.py
       1  import os
       2  import sys
       3  import stat
       4  import errno
       5  
       6  # use "import libmount" for in a standard way installed python binding
       7  import pylibmount as mnt
       8  
       9  def usage(tss):
      10  	print("\nUsage:\n\t{:s} <test> [testoptions]\nTests:\n".format(sys.argv[0]))
      11  	for i in tss:
      12  		print("\t{15:-s}".format(i[0]))
      13  		if i[2] != "":
      14  			print(" {:s}\n".format(i[2]))
      15  
      16  	print("\n")
      17  	return 1
      18  
      19  def mnt_run_test(tss, argv):
      20  	rc = -1
      21  	if ((len(argv) < 2) or (argv[1] == "--help") or (argv[1] == "-h")):
      22  		return usage(tss)
      23  
      24  	#mnt_init_debug(0)
      25  
      26  	i=()
      27  	for i in tss:
      28  		if i[0] == argv[1]:
      29  			rc = i[1](i, argv[1:])
      30  			if rc:
      31  				print("FAILED [rc={:d}]".format(rc))
      32  			break
      33  
      34  	if ((rc < 0) and (i == ())):
      35  		return usage(tss)
      36  	return not not rc #because !!rc is too mainstream for python
      37  
      38  def test_mount(ts, argv):
      39  	idx = 1
      40  	rc = 0
      41  
      42  	if len(argv) < 2:
      43  		return -errno.EINVAL
      44  
      45  	cxt = mnt.Context()
      46  
      47  	if argv[idx] == "-o":
      48  		cxt.options = argv[idx+1]
      49  		idx += 2
      50  	if argv[idx] == "-t":
      51  		cxt.fstype = argv[idx+1]
      52  		idx += 2
      53  	if len(argv) == idx + 1:
      54  		cxt.target = argv[idx]
      55  		idx+=1
      56  	elif (len(argv) == idx + 2):
      57  		cxt.source = argv[idx]
      58  		idx += 1
      59  		cxt.target = argv[idx]
      60  		idx += 1
      61  
      62  	try:
      63  		cxt.mount()
      64  	except Exception:
      65  		print("failed to mount")
      66  		return -1
      67  	print("successfully mounted")
      68  	return rc
      69  
      70  def test_umount(ts, argv):
      71  	idx = 1
      72  	rc = 0
      73  	if len(argv) < 2:
      74  		return -errno.EINVAL
      75  
      76  	cxt = mnt.Context()
      77  
      78  	if argv[idx] == "-t":
      79  		cxt.options = argv[idx+1]
      80  		idx += 2
      81  
      82  	if argv[idx] == "-f":
      83  		cxt.enable_force(True)
      84  
      85  	if argv[idx] == "-l":
      86  		cxt.enable_lazy(True)
      87  		idx += 1
      88  	elif argv[idx] ==  "-r":
      89  		cxt.enable_rdonly_umount(True)
      90  		idx += 1
      91  
      92  	if len(argv) == idx + 1:
      93  		cxt.target = argv[idx]
      94  		idx += 1
      95  	else:
      96  		return -errno.EINVAL
      97  	try:
      98  		cxt.umount()
      99  	except Exception:
     100  		print("failed to umount")
     101  		return 1
     102  	print("successfully umounted")
     103  	return rc
     104  
     105  def test_flags(ts, argv):
     106  	idx = 1
     107  	rc = 0
     108  	opt = ""
     109  	flags = 0
     110  	cxt = mnt.Context()
     111  
     112  	if argv[idx] == "-o":
     113  		cxt.options = argv[idx + 1]
     114  		idx += 2
     115  	if len(argv) == idx + 1:
     116  		cxt.target = argv[idx]
     117  		idx += 1
     118  
     119  	try:
     120  		cxt.prepare_mount()
     121  	# catch ioerror here
     122  	except IOError as e:
     123  		print("failed to prepare mount {:s}".format(e.strerror))
     124  
     125  	opt = cxt.fs.options
     126  	if (opt):
     127  		print("options: {:s}", opt)
     128  
     129  	print("flags: {08:lx}".format(cxt.mflags()))
     130  	return rc
     131  
     132  def test_mountall(ts, argv):
     133  	mntrc = 1
     134  	ignored = 1
     135  	idx = 1
     136  	cxt = mnt.Context()
     137  
     138  	if len(argv) > 2:
     139  		if argv[idx] == "-O":
     140  			cxt.options_pattern = argv[idx+1]
     141  			idx += 2
     142  		if argv[idx] == "-t":
     143  			cxt.fstype_pattern = argv[idx+1]
     144  			idx += 2
     145  
     146  	i = ()
     147  	while (cxt.next_mount()):
     148  		tgt = i.target
     149  		if (ignored == 1):
     150  			print("{:s}: ignored: not match".format(tgt))
     151  		elif (ignored == 2):
     152  			print("{:s}: ignored: already mounted".format(tgt))
     153  		elif (not cxt.status):
     154  			if (mntrc > 0):
     155  				# ?? errno = mntrc
     156  				print("{:s}: mount failed".format(tgt))
     157  			else:
     158  				print("{:s}: mount failed".format(tgt))
     159  		else:
     160  			print("{:s}: successfully mounted".format(tgt))
     161  
     162  	return 0
     163  
     164  
     165  tss = (
     166  	( "--mount",  test_mount,  "[-o <opts>] [-t <type>] <spec>|<src> <target>" ),
     167  	( "--umount", test_umount, "[-t <type>] [-f][-l][-r] <src>|<target>" ),
     168  	( "--mount-all", test_mountall,  "[-O <pattern>] [-t <pattern] mount all filesystems from fstab" ),
     169  	( "--flags", test_flags,   "[-o <opts>] <spec>" )
     170  )
     171  os.umask(stat.S_IWGRP | stat.S_IWOTH) #to be compatible with mount(8)
     172  
     173  sys.exit(mnt_run_test(tss, sys.argv))