From 8c5d321a23136e621642feececace1920adb6691 Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Tue, 20 Dec 2016 15:53:46 -0500 Subject: [PATCH] simplified unsafe writes --- lib/ansible/module_utils/basic.py | 34 ++++++++++++++----------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/lib/ansible/module_utils/basic.py b/lib/ansible/module_utils/basic.py index ee134f0e3ee..50aad659d0a 100644 --- a/lib/ansible/module_utils/basic.py +++ b/lib/ansible/module_utils/basic.py @@ -2091,8 +2091,8 @@ class AnsibleModule(object): os.rename(b_tmp_dest_name, b_dest) except (shutil.Error, OSError, IOError): e = get_exception() - if unsafe_writes: - self._unsafe_writes(b_tmp_dest_name, b_dest, e) + if unsafe_writes and e.errno == errno.EBUSY: + self._unsafe_writes(b_tmp_dest_name, b_dest) else: self.fail_json(msg='Unable to rename file: %s to %s: %s' % (src, dest, e)) except (shutil.Error, OSError, IOError): @@ -2114,27 +2114,23 @@ class AnsibleModule(object): # rename might not preserve context self.set_context_if_different(dest, context, False) - def _unsafe_writes(self, src, dest, exception): + def _unsafe_writes(self, src, dest): # sadly there are some situations where we cannot ensure atomicity, but only if # the user insists and we get the appropriate error we update the file unsafely - if exception.errno == errno.EBUSY: - #TODO: issue warning that this is an unsafe operation, but doing it cause user insists + try: try: - try: - out_dest = open(dest, 'wb') - in_src = open(src, 'rb') - shutil.copyfileobj(in_src, out_dest) - finally: # assuring closed files in 2.4 compatible way - if out_dest: - out_dest.close() - if in_src: - in_src.close() - except (shutil.Error, OSError, IOError): - e = get_exception() - self.fail_json(msg='Could not write data to file (%s) from (%s): %s' % (dest, src, e)) + out_dest = open(dest, 'wb') + in_src = open(src, 'rb') + shutil.copyfileobj(in_src, out_dest) + finally: # assuring closed files in 2.4 compatible way + if out_dest: + out_dest.close() + if in_src: + in_src.close() + except (shutil.Error, OSError, IOError): + e = get_exception() + self.fail_json(msg='Could not write data to file (%s) from (%s): %s' % (dest, src, e)) - else: - self.fail_json(msg='Could not replace file: %s to %s: %s' % (src, dest, exception)) def _read_from_pipes(self, rpipes, rfds, file_descriptor): data = b('')