From 483f7fd62597284d1d65e2f5e136dee1697f67eb Mon Sep 17 00:00:00 2001 From: Nikhil Singh Date: Tue, 24 Jul 2012 17:00:08 +0530 Subject: [PATCH] Standardizing the mount module --- library/mount | 241 ++++++++++++++++++++++---------------------------- 1 file changed, 105 insertions(+), 136 deletions(-) diff --git a/library/mount b/library/mount index b86735248d8..31a74f158ce 100755 --- a/library/mount +++ b/library/mount @@ -19,18 +19,6 @@ # You should have received a copy of the GNU General Public License # along with Ansible. If not, see . -try: - import json -except ImportError: - import simplejson as json -import os -import os.path -import shlex -import subprocess -import sys -import syslog - - #mount module - mount fs and define in fstab #usage: # mount name=mountpoint, src=device_to_be_mounted fstype=fstype opts=mount_opts, dump=0 passno=0 state=[present|absent|mounted|unmounted] @@ -39,14 +27,6 @@ import syslog # mounted == add to fstab if not there and make sure it is mounted # unmounted == do not change fstab state, but unmount -def exit_json(rc=0, **kwargs): - print json.dumps(kwargs) - sys.exit(rc) - -def fail_json(**kwargs): - kwargs['failed'] = True - exit_json(rc=1, **kwargs) - def write_fstab(lines, dest): fs_w = open(dest, 'w') @@ -59,10 +39,12 @@ def write_fstab(lines, dest): def set_mount(**kwargs): "set/change a mount point location in fstab" # kwargs: name, src, fstype, opts, dump, passno, state, fstab=/etc/fstab - args = { 'opts':'defaults', - 'dump':'0', - 'passno':'0', - 'fstab':'/etc/fstab' } + args = { + 'opts': 'defaults', + 'dump': '0', + 'passno': '0', + 'fstab': '/etc/fstab' + } args.update(kwargs) new_line = '%(src)s %(name)s %(fstype)s %(opts)s %(dump)s %(passno)s\n' @@ -116,10 +98,12 @@ def set_mount(**kwargs): def unset_mount(**kwargs): "remove a mount point from fstab" # kwargs: name, src, fstype, opts, dump, passno, state, fstab=/etc/fstab - args = { 'opts':'default', - 'dump':'0', - 'passno':'0', - 'fstab':'/etc/fstab' } + args = { + 'opts': 'default', + 'dump': '0', + 'passno': '0', + 'fstab': '/etc/fstab' + } args.update(kwargs) to_write = [] @@ -166,10 +150,11 @@ def mount(**kwargs): if call.returncode == 0: return 0, '' else: - return call.rc, out+err + return call.returncode, out+err def umount(**kwargs): "unmount a path" + name = kwargs['name'] cmd = ['/bin/umount', name] call = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) @@ -177,117 +162,101 @@ def umount(**kwargs): if call.returncode == 0: return 0, '' else: - return call.rc, out+err - -argfile = sys.argv[1] -args = open(argfile, 'r').read() -items = shlex.split(args) -syslog.openlog('ansible-%s' % os.path.basename(__file__)) -syslog.syslog(syslog.LOG_NOTICE, 'Invoked with %s' % args) - -if not len(items): - fail_json(msg='the module requires arguments -a') - sys.exit(1) - -params = {} -for x in items: - (k, v) = x.split("=",1) - params[k] = v - -state = params.get('state',None) -name = params.get('name', None) -opts = params.get('opts', None) -passno = params.get('passno', None) -dump = params.get('dump', None) -src = params.get('src', None) -fstype = params.get('fstype', None) -fstab = params.get('fstab', None) - - -if state not in [ 'present', 'absent', 'mounted', 'unmounted' ]: - fail_json(msg='invalid state') - -if not name: - fail_json(msg='no name option given') - -if not src: - fail_json(msg='no src option given') - -if not fstype: - fail_json(msg='no fstype option given') - - -changed = False -rc = 0 -args = {'name':name, - 'src':src, - 'fstype':fstype } -if passno is not None: - args['passno'] = passno -if opts is not None: - args['opts'] = opts -if dump is not None: - args['dump'] = dump -if fstab is not None: - args['fstab'] = fstab - - -# absent == remove from fstab and unmounted -# unmounted == do not change fstab state, but unmount -# present == add to fstab, do not change mount state -# mounted == add to fstab if not there and make sure it is mounted, if it has changed in fstab then remount it - - -if state == 'absent': - name, changed = unset_mount(**args) - if changed: + return call.returncode, out+err + +def main(): + module = AnsibleModule( + argument_spec = dict( + state = dict(required=True, choices=['present', 'absent', 'mounted', 'unmounted']), + name = dict(required=True), + opts = dict(default=None), + passno = dict(default=None), + dump = dict(default=None), + src = dict(required=True), + fstype = dict(required=True), + fstab = dict(default=None) + ) + ) + + changed = False + rc = 0 + args = { + 'name': module.params['name'], + 'src': module.params['src'], + 'fstype': module.params['fstype'] + } + if module.params['passno'] is not None: + args['passno'] = module.params['passno'] + if module.params['opts'] is not None: + args['opts'] = module.params['opts'] + if module.params['dump'] is not None: + args['dump'] = module.params['dump'] + if module.params['fstab'] is not None: + args['fstab'] = module.params['fstab'] + + + # absent == remove from fstab and unmounted + # unmounted == do not change fstab state, but unmount + # present == add to fstab, do not change mount state + # mounted == add to fstab if not there and make sure it is mounted, if it has changed in fstab then remount it + + state = module.params['state'] + name = module.params['name'] + if state == 'absent': + name, changed = unset_mount(**args) + if changed: + if os.path.ismount(name): + res,msg = umount(**args) + if res: + fail_json(msg="Error unmounting %s: %s" % (name, msg)) + + if os.path.exists(name): + try: + os.rmdir(name) + except (OSError, IOError), e: + fail_json(msg="Error rmdir %s: %s" % (name, str(e))) + + module.exit_json(changed=changed, **args) + + + if state == 'unmounted': if os.path.ismount(name): res,msg = umount(**args) if res: fail_json(msg="Error unmounting %s: %s" % (name, msg)) - - if os.path.exists(name): - try: - os.rmdir(name) - except (OSError, IOError), e: - fail_json(msg="Error rmdir %s: %s" % (name, str(e))) - - exit_json(changed=changed, **args) - - -if state == 'unmounted': - if os.path.ismount(name): - res,msg = umount(**args) - if res: - fail_json(msg="Error unmounting %s: %s" % (name, msg)) - changed = True - - exit_json(changed=changed, **args) - + changed = True - -if state in ['mounted', 'present']: - name, changed = set_mount(**args) - if state == 'mounted': - if not os.path.exists(name): - try: - os.makedirs(name) - except (OSError, IOError), e: - fail_json(msg="Error making dir %s: %s" % (name, str(e))) - - res = 0 - if os.path.ismount(name): - if changed: + module.exit_json(changed=changed, **args) + + + + if state in ['mounted', 'present']: + name, changed = set_mount(**args) + if state == 'mounted': + if not os.path.exists(name): + try: + os.makedirs(name) + except (OSError, IOError), e: + fail_json(msg="Error making dir %s: %s" % (name, str(e))) + + res = 0 + if os.path.ismount(name): + if changed: + res,msg = mount(**args) + else: + changed = True res,msg = mount(**args) - else: - changed = True - res,msg = mount(**args) - - if res: - fail_json(msg="Error mounting %s: %s" % (name, msg)) - - - exit_json(changed=changed, **args) + + if res: + fail_json(msg="Error mounting %s: %s" % (name, msg)) + + + module.exit_json(changed=changed, **args) + + module.fail_json(msg='Unexpected position reached') + sys.exit(0) + +# this is magic, see lib/ansible/module_common.py +#<> -fail_json(msg='Unexpected position reached') -sys.exit(0) +main()