diff --git a/plugins/modules/mount.py b/plugins/modules/mount.py index f88a160..8d75b4a 100644 --- a/plugins/modules/mount.py +++ b/plugins/modules/mount.py @@ -105,13 +105,10 @@ options: the original file back if you somehow clobbered it incorrectly. type: bool default: no - mode: + umask: description: - - The permission applied to create a new directory for the mount point. + - The permission applied to create new directory(ies) for the mount point. If the mount point already exists, this parameter is not used. - - This parameter only affects the mount point itself. - If this module creates multiple directories recursively, - other directories follow the system's default umask. - Note that after running this task and the device being successfully mounted, the mode of the original directory will be hidden by the target device. type: raw @@ -133,7 +130,7 @@ EXAMPLES = r''' fstype: iso9660 opts: ro,noauto state: present - mode: 0755 + umask: 0022 - name: Mount up device by label ansible.posix.mount: @@ -677,7 +674,7 @@ def main(): src=dict(type='path'), backup=dict(type='bool', default=False), state=dict(type='str', required=True, choices=['absent', 'mounted', 'present', 'unmounted', 'remounted']), - mode=dict(type='raw'), + umask=dict(type='raw'), ), supports_check_mode=True, required_if=( @@ -774,7 +771,7 @@ def main(): state = module.params['state'] name = module.params['path'] - mode = module.params['mode'] + umask = module.params['umask'] changed = False if state == 'absent': @@ -832,10 +829,27 @@ def main(): msg="Error making dir %s: %s" % (name, to_native(e))) # Set permissions to the newly created mount point. - if mode is not None: + if umask is not None: + # When umask is integer, calculate logical complement of the value + # otherwise, pass it to set_mode_if_different() as is. + if isinstance(umask, int): + directory_mode = 0o0777 & ~umask + else: + try: + umask = int(umask, 8) + directory_mode = 0o0777 & ~umask + except Exception: + directory_mode = umask + try: - changed = module.set_mode_if_different(name, mode, changed) + for dirname in dirs_created: + changed = module.set_mode_if_different(dirname, directory_mode, changed) except Exception as e: + try: + for dirname in dirs_created[::-1]: + os.rmdir(dirname) + except Exception: + pass module.fail_json( msg="Error setting permissions %s: %s" % (name, to_native(e))) diff --git a/tests/integration/targets/mount/tasks/main.yml b/tests/integration/targets/mount/tasks/main.yml index 7d94fea..8d4a85c 100644 --- a/tests/integration/targets/mount/tasks/main.yml +++ b/tests/integration/targets/mount/tasks/main.yml @@ -333,43 +333,186 @@ - /tmp/myfs when: ansible_system in ('Linux') -- name: Block to test mode option in Linux +- name: Block to test umask option block: - name: Create empty file community.general.filesize: path: /tmp/myfs.img - size: 20M + size: 1M - name: Format FS community.general.filesystem: fstype: ext3 dev: /tmp/myfs.img + when: ansible_system == 'Linux' + - name: Format FS + community.general.filesystem: + fstype: nullfs + dev: /tmp/myfs.img + when: ansible_system == 'FreeBSD' - name: Make sure that mount point does not exist file: - path: /tmp/myfs + path: /tmp/myfs_mountpoint state: absent - - name: Mount the FS to non existent directory with mode option + + - name: Mount the FS to non existent directory with raw umask mount: - path: /tmp/myfs + path: /tmp/myfs_mountpoint src: /tmp/myfs.img fstype: ext3 state: mounted - mode: 0000 + umask: 0777 + when: ansible_system == 'Linux' + - name: Mount the FS to non existent directory with raw umask(FreeBSD) + mount: + path: /tmp/myfs_mountpoint + src: /tmp/myfs.img + fstype: nullfs + state: mounted + umask: 0777 + when: ansible_system == 'FreeBSD' + - name: Check status of parent directory of mount point + stat: + path: /tmp/foobar + register: parent_dir_stat + - name: Assert that the parent directory of the mount point has right permission + assert: + that: + - parent_dir_stat['stat']['mode'] == '0000' - name: Unmount FS to access underlying directory command: | umount /tmp/myfs.img - name: Check status of mount point stat: - path: /tmp/myfs + path: /tmp/myfs_mountpoint register: mount_point_stat - name: Assert that the mount point has right permission assert: that: - mount_point_stat['stat']['mode'] == '0000' + - name: Cleanup directory + file: + path: /tmp/myfs_mountpoint + state: absent + + - name: Mount the FS to non existent directory with string umask + mount: + path: /tmp/myfs_mountpoint + src: /tmp/myfs.img + fstype: ext3 + state: mounted + umask: "0777" + when: ansible_system == 'Linux' + - name: Mount the FS to non existent directory with string umask(FreeBSD) + mount: + path: /tmp/myfs_mountpoint + src: /tmp/myfs.img + fstype: nullfs + state: mounted + umask: "0777" + when: ansible_system == 'FreeBSD' + - name: Check status of parent directory of mount point + stat: + path: /tmp/foobar + register: parent_dir_stat + - name: Assert that the parent directory of the mount point has right permission + assert: + that: + - parent_dir_stat['stat']['mode'] == '0000' + - name: Unmount FS to access underlying directory + command: | + umount /tmp/myfs.img + - name: Check status of mount point + stat: + path: /tmp/myfs_mountpoint + register: mount_point_stat + - name: Assert that the mount point has right permission + assert: + that: + - mount_point_stat['stat']['mode'] == '0000' + - name: Cleanup directory + file: + path: /tmp/myfs_mountpoint + state: absent + + - name: Remount the FS to non existent directory with symbolic umask expression + mount: + path: /tmp/myfs_mountpoint + src: /tmp/myfs.img + fstype: ext3 + state: mounted + umask: "u+rw,g-wx,o-rwx" + when: ansible_system == 'Linux' + - name: Remount the FS to non existent directory with symbolic umask expression(FreeBSD) + mount: + path: /tmp/myfs_mountpoint + src: /tmp/myfs.img + fstype: nullfs + state: mounted + umask: "u+rw,g-wx,o-rwx" + when: ansible_system == 'FreeBSD' + - name: Check status of parent directory of mount point + stat: + path: /tmp/foobar + register: parent_dir_stat + - name: Assert that the parent directory of the mount point has right permission + assert: + that: + - parent_dir_stat['stat']['mode'] == '0640' + - name: Unmount FS to access underlying directory + command: | + umount /tmp/myfs.img + - name: Check status of mount point + stat: + path: /tmp/myfs_mountpoint + register: mount_point_stat + - name: Assert that the mount point has right permission + assert: + that: + - mount_point_stat['stat']['mode'] == '0640' + - name: Cleanup directory + file: + path: /tmp/myfs_mountpoint + state: absent + + - name: Remount the FS to non existent directory with symbolic umask expression + mount: + path: /tmp/myfs_mountpoint + src: /tmp/myfs.img + fstype: ext3 + state: mounted + umask: "u=rw,g=r,o=r" + when: ansible_system == 'Linux' + - name: Remount the FS to non existent directory with symbolic umask expression(FreeBSD) + mount: + path: /tmp/myfs_mountpoint + src: /tmp/myfs.img + fstype: nullfs + state: mounted + umask: "u=rw,g=r,o=r" + when: ansible_system == 'FreeBSD' + - name: Check status of parent directory of mount point + stat: + path: /tmp/foobar + register: parent_dir_stat + - name: Assert that the parent directory of the mount point has right permission + assert: + that: + - parent_dir_stat['stat']['mode'] == '0644' + - name: Unmount FS to access underlying directory + command: | + umount /tmp/myfs.img + - name: Check status of mount point + stat: + path: /tmp/myfs_mountpoint + register: mount_point_stat + - name: Assert that the mount point has right permission + assert: + that: + - mount_point_stat['stat']['mode'] == '0644' - name: Remove the test FS file: path: '{{ item }}' state: absent loop: - /tmp/myfs.img - - /tmp/myfs - when: ansible_system in ('Linux') + - /tmp/myfs_mountpoint