1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
#!/usr/bin/python3
'''
Helper to mount ceph-fuse from /etc/fstab. To use, add an entry
like:
DEVICE PATH TYPE OPTIONS
none /mnt/ceph fuse.ceph ceph.id=admin,_netdev,defaults 0 0
none /mnt/ceph fuse.ceph ceph.name=client.admin,_netdev,defaults 0 0
none /mnt/ceph fuse.ceph ceph.id=myuser,ceph.conf=/etc/ceph/foo.conf,_netdev,defaults 0 0
ceph-fuse options are specified in the fs_mntops(4) column and must begin
with 'ceph.' prefix. This way ceph related fs options will be passed to
ceph-fuse and others will be ignored by ceph-fuse.
The first two examples above specify that ceph-fuse will authenticate
as client.admin. The third example specify that ceph-fuse will authenticate as
client.myuser and also sets 'conf' option to '/etc/ceph/foo.conf' via ceph-fuse
command line. Any valid ceph-fuse options can be passed this way.
NOTE:
Old format is also supported
DEVICE PATH TYPE OPTIONS
id=admin /mnt/ceph fuse.ceph defaults 0 0
id=myuser,conf=/etc/ceph/foo.conf /mnt/ceph fuse.ceph defaults 0 0
'''
import sys
import argparse
import errno
import platform
from subprocess import Popen
def ceph_options(mntops):
ceph_opts = [o for o in mntops if o.startswith('ceph.')]
return ceph_opts
def ceph_options_compat(device):
return [ 'ceph.' + opt for opt in device.split(',') ]
def fs_options(opts, ceph_opts):
# strip out noauto and _netdev options; libfuse doesn't like it
strip_opts = ['defaults', 'noauto', '_netdev']
return ','.join(list(set(opts) - set(ceph_opts) - set(strip_opts)))
def main(arguments):
parser = argparse.ArgumentParser(description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument('device', type=str, nargs='+',
help='Device')
parser.add_argument('mountpoint', type=str, nargs='+',
help='Mount point')
parser.add_argument('-o', dest='options', type=str, nargs='+',
help='Filesystem options')
args = parser.parse_known_args(arguments)[0]
device = args.device[0]
mountpoint = args.mountpoint[0]
options = ''.join(args.options).split(',')
if '=' in device:
ceph_opts = ceph_options_compat(device)
else:
ceph_opts = ceph_options(options)
fs_opts = fs_options(options, ceph_opts)
ceph_opts = ' '.join(['--' + o.replace('ceph.', '', 1) for o in ceph_opts])
command = 'ceph-fuse %s %s' % (ceph_opts, mountpoint)
if fs_opts:
command += ' -o %s' % (fs_opts)
mount_cmd = Popen(command, shell=True)
mount_cmd.communicate()
if (mount_cmd.returncode != 0):
if (platform.system() == "Linux"):
if (mount_cmd.returncode != errno.EBUSY):
print("Mount failed with status code: {}".format(mount_cmd.returncode))
else:
print("Mount failed with status code: {}".format(mount_cmd.returncode))
if __name__ == '__main__':
sys.exit(main(sys.argv[1:]))
|