@ -1758,39 +1758,39 @@ class AnsibleModule(object):
# only try workarounds for errno 18 (cross device), 1 (not permitted), 13 (permission denied)
# only try workarounds for errno 18 (cross device), 1 (not permitted), 13 (permission denied)
# and 26 (text file busy) which happens on vagrant synced folders and other 'exotic' non posix file systems
# and 26 (text file busy) which happens on vagrant synced folders and other 'exotic' non posix file systems
self . fail_json ( msg = ' Could not replace file: %s to %s : %s ' % ( src , dest , e ) )
self . fail_json ( msg = ' Could not replace file: %s to %s : %s ' % ( src , dest , e ) )
else :
dest_dir = os . path . dirname ( dest )
dest_dir = os . path . dirname ( dest )
dest_file = os . path . basename ( dest )
dest_file = os . path . basename ( dest )
try :
tmp_dest = tempfile . NamedTemporaryFile (
prefix = " .ansible_tmp " , dir = dest_dir , suffix = dest_file )
except ( OSError , IOError ) :
e = get_exception ( )
self . fail_json ( msg = ' The destination directory ( %s ) is not writable by the current user. ' % dest_dir )
try : # 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
shutil . copy2 ( src , tmp_dest . name )
else :
shutil . move ( src , tmp_dest . name )
if self . selinux_enabled ( ) :
self . set_context_if_different (
tmp_dest . name , context , False )
try :
try :
tmp_stat = os . stat ( tmp_dest . name )
tmp_dest = tempfile . NamedTemporaryFile (
if dest_stat and ( tmp_stat . st_uid != dest_stat . st_uid or tmp_stat . st_gid != dest_stat . st_gid ) :
prefix = " .ansible_tmp " , dir = dest_dir , suffix = dest_file )
os . chown ( tmp_dest . name , dest_stat . st_uid , dest_stat . st_gid )
except ( OSError , IOError ) :
except OSError :
e = get_exception ( )
e = get_exception ( )
if e . errno != errno . EPERM :
self . fail_json ( msg = ' The destination directory ( %s ) is not writable by the current user. ' % dest_dir )
raise
os . rename ( tmp_dest . name , dest )
try : # leaves tmp file behind when sudo and not root
except ( shutil . Error , OSError , IOError ) :
if switched_user and os . getuid ( ) != 0 :
e = get_exception ( )
# cleanup will happen by 'rm' of tempdir
self . cleanup ( tmp_dest . name )
# copy2 will preserve some metadata
self . fail_json ( msg = ' Could not replace file: %s to %s : %s ' % ( src , dest , e ) )
shutil . copy2 ( src , tmp_dest . name )
else :
shutil . move ( src , tmp_dest . name )
if self . selinux_enabled ( ) :
self . set_context_if_different (
tmp_dest . name , context , False )
try :
tmp_stat = os . stat ( tmp_dest . name )
if dest_stat and ( tmp_stat . st_uid != dest_stat . st_uid or tmp_stat . st_gid != dest_stat . st_gid ) :
os . chown ( tmp_dest . name , dest_stat . st_uid , dest_stat . st_gid )
except OSError :
e = get_exception ( )
if e . errno != errno . EPERM :
raise
os . rename ( tmp_dest . name , dest )
except ( shutil . Error , OSError , IOError ) :
e = get_exception ( )
self . cleanup ( tmp_dest . name )
self . fail_json ( msg = ' Could not replace file: %s to %s : %s ' % ( src , dest , e ) )
if creating :
if creating :
# make sure the file has the correct permissions
# make sure the file has the correct permissions