summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleg Bulatov <oleg@bulatov.me>2014-09-01 23:23:36 +0400
committerJames Cammarata <jimi@sngx.net>2014-09-24 13:59:43 -0500
commit39d85a9bf5398b80c16b908d1735e89137e645a7 (patch)
tree31eea4806fdd86728273565800b0d2e4c72ebfce
parent6e9d45e2b121dac35bffceb5d319482d999ffa8f (diff)
downloadansible-39d85a9bf5398b80c16b908d1735e89137e645a7.tar.gz
Fix #7711
Fix relative symlinks creation in file module Signed-off-by: Oleg Bulatov <oleg@bulatov.me>
-rw-r--r--library/files/file4
-rw-r--r--test/integration/roles/test_file/tasks/main.yml191
2 files changed, 193 insertions, 2 deletions
diff --git a/library/files/file b/library/files/file
index 6e663e52f0..7d725a2eae 100644
--- a/library/files/file
+++ b/library/files/file
@@ -237,8 +237,8 @@ def main():
else:
relpath = os.path.dirname(path)
- absrc = os.path.normpath('%s/%s' % (relpath, os.path.basename(src)))
- if not os.path.exists(src) and not os.path.exists(absrc) and not force:
+ absrc = os.path.join(relpath, src)
+ if not os.path.exists(absrc) and not force:
module.fail_json(path=path, src=src, msg='src file does not exist, use "force=yes" if you really want to create the link: %s' % absrc)
if state == 'hard':
diff --git a/test/integration/roles/test_file/tasks/main.yml b/test/integration/roles/test_file/tasks/main.yml
index 92457fcd79..55f99f73bc 100644
--- a/test/integration/roles/test_file/tasks/main.yml
+++ b/test/integration/roles/test_file/tasks/main.yml
@@ -228,3 +228,194 @@
that:
- 'file17_result.failed == true'
- 'file17_result.state == "directory"'
+
+- name: create soft link to directory using absolute path
+ file: src=/ dest={{output_dir}}/root state=link
+ register: file18_result
+
+- name: verify that the result was marked as changed
+ assert:
+ that:
+ - "file18_result.changed == true"
+
+- name: create another test sub-directory
+ file: dest={{output_dir}}/sub2 state=directory
+ register: file19_result
+
+- name: verify that the new directory was created
+ assert:
+ that:
+ - 'file19_result.changed == true'
+ - 'file19_result.state == "directory"'
+
+- name: create soft link to relative file
+ file: src=../sub1/file1 dest={{output_dir}}/sub2/link1 state=link
+ register: file20_result
+
+- name: verify that the result was marked as changed
+ assert:
+ that:
+ - "file20_result.changed == true"
+
+- name: create soft link to relative directory
+ file: src=sub1 dest={{output_dir}}/sub1-link state=link
+ register: file21_result
+
+- name: verify that the result was marked as changed
+ assert:
+ that:
+ - "file21_result.changed == true"
+
+- name: test file creation with symbolic mode
+ file: dest={{output_dir}}/test_symbolic state=touch mode=u=rwx,g=rwx,o=rwx
+ register: result
+
+- name: assert file mode
+ assert:
+ that:
+ - result.mode == '0777'
+
+- name: modify symbolic mode for all
+ file: dest={{output_dir}}/test_symbolic state=touch mode=a=r
+ register: result
+
+- name: assert file mode
+ assert:
+ that:
+ - result.mode == '0444'
+
+- name: modify symbolic mode for owner
+ file: dest={{output_dir}}/test_symbolic state=touch mode=u+w
+ register: result
+
+- name: assert file mode
+ assert:
+ that:
+ - result.mode == '0644'
+
+- name: modify symbolic mode for group
+ file: dest={{output_dir}}/test_symbolic state=touch mode=g+w
+ register: result
+
+- name: assert file mode
+ assert:
+ that:
+ - result.mode == '0664'
+
+- name: modify symbolic mode for world
+ file: dest={{output_dir}}/test_symbolic state=touch mode=o+w
+ register: result
+
+- name: assert file mode
+ assert:
+ that:
+ - result.mode == '0666'
+
+- name: modify symbolic mode for owner
+ file: dest={{output_dir}}/test_symbolic state=touch mode=u+x
+ register: result
+
+- name: assert file mode
+ assert:
+ that:
+ - result.mode == '0766'
+
+- name: modify symbolic mode for group
+ file: dest={{output_dir}}/test_symbolic state=touch mode=g+x
+ register: result
+
+- name: assert file mode
+ assert:
+ that:
+ - result.mode == '0776'
+
+- name: modify symbolic mode for world
+ file: dest={{output_dir}}/test_symbolic state=touch mode=o+x
+ register: result
+
+- name: assert file mode
+ assert:
+ that:
+ - result.mode == '0777'
+
+- name: remove symbolic mode for world
+ file: dest={{output_dir}}/test_symbolic state=touch mode=o-wx
+ register: result
+
+- name: assert file mode
+ assert:
+ that:
+ - result.mode == '0774'
+
+- name: remove symbolic mode for group
+ file: dest={{output_dir}}/test_symbolic state=touch mode=g-wx
+ register: result
+
+- name: assert file mode
+ assert:
+ that:
+ - result.mode == '0744'
+
+- name: remove symbolic mode for owner
+ file: dest={{output_dir}}/test_symbolic state=touch mode=u-wx
+ register: result
+
+- name: assert file mode
+ assert:
+ that:
+ - result.mode == '0444'
+
+- name: set sticky bit with symbolic mode
+ file: dest={{output_dir}}/test_symbolic state=touch mode=o+t
+ register: result
+
+- name: assert file mode
+ assert:
+ that:
+ - result.mode == '01444'
+
+- name: remove sticky bit with symbolic mode
+ file: dest={{output_dir}}/test_symbolic state=touch mode=o-t
+ register: result
+
+- name: assert file mode
+ assert:
+ that:
+ - result.mode == '0444'
+
+- name: add setgid with symbolic mode
+ file: dest={{output_dir}}/test_symbolic state=touch mode=g+s
+ register: result
+
+- name: assert file mode
+ assert:
+ that:
+ - result.mode == '02444'
+
+- name: remove setgid with symbolic mode
+ file: dest={{output_dir}}/test_symbolic state=touch mode=g-s
+ register: result
+
+- name: assert file mode
+ assert:
+ that:
+ - result.mode == '0444'
+
+- name: add setuid with symbolic mode
+ file: dest={{output_dir}}/test_symbolic state=touch mode=u+s
+ register: result
+
+- name: assert file mode
+ assert:
+ that:
+ - result.mode == '04444'
+
+- name: remove setuid with symbolic mode
+ file: dest={{output_dir}}/test_symbolic state=touch mode=u-s
+ register: result
+
+- name: assert file mode
+ assert:
+ that:
+ - result.mode == '0444'
+