X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fceph%2Fsrc%2Fmount.fuse.ceph;fp=src%2Fceph%2Fsrc%2Fmount.fuse.ceph;h=5c65ddca01ae25d24144f659eae5182e9e155555;hb=812ff6ca9fcd3e629e49d4328905f33eee8ca3f5;hp=0000000000000000000000000000000000000000;hpb=15280273faafb77777eab341909a3f495cf248d9;p=stor4nfv.git diff --git a/src/ceph/src/mount.fuse.ceph b/src/ceph/src/mount.fuse.ceph new file mode 100755 index 0000000..5c65ddc --- /dev/null +++ b/src/ceph/src/mount.fuse.ceph @@ -0,0 +1,79 @@ +#!/usr/bin/env python +''' +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. +First two examples above, for example, speficy that ceph-fuse will authenticate +as client.admin. 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 +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): + print("Mount failed with status code: {}".format(mount_cmd.returncode)) + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:]))