53 lines
1.8 KiB
Python
53 lines
1.8 KiB
Python
# Copyright (c), Yanis Guenane <yanis+ansible@guenane.org>, 2016
|
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
|
|
from __future__ import absolute_import, division, print_function
|
|
__metaclass__ = type
|
|
|
|
|
|
import os
|
|
import tempfile
|
|
|
|
|
|
# This is taken from community.crypto
|
|
|
|
def write_file(module, content):
|
|
'''
|
|
Writes content into destination file as securely as possible.
|
|
Uses file arguments from module.
|
|
'''
|
|
# Find out parameters for file
|
|
file_args = module.load_file_common_arguments(module.params)
|
|
# Create tempfile name
|
|
tmp_fd, tmp_name = tempfile.mkstemp(prefix=b'.ansible_tmp')
|
|
try:
|
|
os.close(tmp_fd)
|
|
except Exception:
|
|
pass
|
|
module.add_cleanup_file(tmp_name) # if we fail, let Ansible try to remove the file
|
|
try:
|
|
try:
|
|
# Create tempfile
|
|
file = os.open(tmp_name, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o600)
|
|
os.write(file, content)
|
|
os.close(file)
|
|
except Exception as e:
|
|
try:
|
|
os.remove(tmp_name)
|
|
except Exception:
|
|
pass
|
|
module.fail_json(msg='Error while writing result into temporary file: {0}'.format(e))
|
|
# Update destination to wanted permissions
|
|
if os.path.exists(file_args['path']):
|
|
module.set_fs_attributes_if_different(file_args, False)
|
|
# Move tempfile to final destination
|
|
module.atomic_move(tmp_name, file_args['path'])
|
|
# Try to update permissions again
|
|
module.set_fs_attributes_if_different(file_args, False)
|
|
except Exception as e:
|
|
try:
|
|
os.remove(tmp_name)
|
|
except Exception:
|
|
pass
|
|
module.fail_json(msg='Error while writing result: {0}'.format(e))
|