From c5d4134f37695283f74804ad4575b7a8b0dfdf2c Mon Sep 17 00:00:00 2001 From: Toshio Kuratomi Date: Wed, 26 Oct 2016 14:51:38 -0700 Subject: [PATCH] Add hint that python3 might be too old This limitation of python-3.4 mkstemp() is the final reason we made python-3.5 our minimum version. Since we know about it, give a nice error to the user with a hint that Python3.4 could be the issue. Fixes #18160 (cherry picked from commit fda933723c8cb60248d41b5691edd86fe0a40807) --- lib/ansible/module_utils/basic.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/ansible/module_utils/basic.py b/lib/ansible/module_utils/basic.py index b183322937c..177396d4d72 100644 --- a/lib/ansible/module_utils/basic.py +++ b/lib/ansible/module_utils/basic.py @@ -1960,13 +1960,21 @@ class AnsibleModule(object): except (OSError, IOError): e = get_exception() self.fail_json(msg='The destination directory (%s) is not writable by the current user. Error was: %s' % (os.path.dirname(dest), e)) + except TypeError: + # We expect that this is happening because python3.4.x and + # below can't handle byte strings in mkstemp(). Traceback + # would end in something like: + # file = _os.path.join(dir, pre + name + suf) + # TypeError: can't concat bytes to str + self.fail_json(msg='Failed creating temp file for atomic move. This usually happens when using Python3 less than Python3.5. Please use Python2.x or Python3.5 or greater.', exception=sys.exc_info()) + b_tmp_dest_name = to_bytes(tmp_dest_name, errors='surrogate_or_strict') try: try: # close tmp file handle before file operations to prevent text file busy errors on vboxfs synced folders (windows host) os.close(tmp_dest_fd) - # leaves tmp file behind when sudo and not root + # leaves tmp file behind when sudo and not root if switched_user and os.getuid() != 0: # cleanup will happen by 'rm' of tempdir # copy2 will preserve some metadata