Fix assemble module for python3

pull/18777/head
Toshio Kuratomi 8 years ago committed by Matt Clay
parent 9c664f424e
commit 007b5f4c32

@ -2,6 +2,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# (c) 2012, Stephen Fromm <sfromm@gmail.com> # (c) 2012, Stephen Fromm <sfromm@gmail.com>
# (c) 2016, Toshio Kuratomi <tkuratomi@ansible.com>
# #
# This file is part of Ansible # This file is part of Ansible
# #
@ -18,11 +19,6 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with Ansible. If not, see <http://www.gnu.org/licenses/>. # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
import os
import os.path
import tempfile
import re
DOCUMENTATION = ''' DOCUMENTATION = '''
--- ---
module: assemble module: assemble
@ -106,42 +102,53 @@ EXAMPLES = '''
- assemble: src=/etc/ssh/conf.d/ dest=/etc/ssh/sshd_config validate='/usr/sbin/sshd -t -f %s' - assemble: src=/etc/ssh/conf.d/ dest=/etc/ssh/sshd_config validate='/usr/sbin/sshd -t -f %s'
''' '''
import codecs
import os
import os.path
import re
import tempfile
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.pycompat24 import get_exception
from ansible.module_utils.six import b
# =========================================== # ===========================================
# Support method # Support method
def assemble_from_fragments(src_path, delimiter=None, compiled_regexp=None, ignore_hidden=False): def assemble_from_fragments(src_path, delimiter=None, compiled_regexp=None, ignore_hidden=False):
''' assemble a file from a directory of fragments ''' ''' assemble a file from a directory of fragments '''
tmpfd, temp_path = tempfile.mkstemp() tmpfd, temp_path = tempfile.mkstemp()
tmp = os.fdopen(tmpfd,'w') tmp = os.fdopen(tmpfd, 'wb')
delimit_me = False delimit_me = False
add_newline = False add_newline = False
for f in sorted(os.listdir(src_path)): for f in sorted(os.listdir(src_path)):
if compiled_regexp and not compiled_regexp.search(f): if compiled_regexp and not compiled_regexp.search(f):
continue continue
fragment = "%s/%s" % (src_path, f) fragment = u"%s/%s" % (src_path, f)
if not os.path.isfile(fragment) or (ignore_hidden and os.path.basename(fragment).startswith('.')): if not os.path.isfile(fragment) or (ignore_hidden and os.path.basename(fragment).startswith('.')):
continue continue
fragment_content = file(fragment).read() fragment_content = open(fragment, 'rb').read()
# always put a newline between fragments if the previous fragment didn't end with a newline. # always put a newline between fragments if the previous fragment didn't end with a newline.
if add_newline: if add_newline:
tmp.write('\n') tmp.write(b('\n'))
# delimiters should only appear between fragments # delimiters should only appear between fragments
if delimit_me: if delimit_me:
if delimiter: if delimiter:
# un-escape anything like newlines # un-escape anything like newlines
delimiter = delimiter.decode('unicode-escape') delimiter = codecs.escape_decode(delimiter)[0]
tmp.write(delimiter) tmp.write(delimiter)
# always make sure there's a newline after the # always make sure there's a newline after the
# delimiter, so lines don't run together # delimiter, so lines don't run together
if delimiter[-1] != '\n': if delimiter[-1] != b('\n'):
tmp.write('\n') tmp.write(b('\n'))
tmp.write(fragment_content) tmp.write(fragment_content)
delimit_me = True delimit_me = True
if fragment_content.endswith('\n'): if fragment_content.endswith(b('\n')):
add_newline = False add_newline = False
else: else:
add_newline = True add_newline = True
@ -149,6 +156,7 @@ def assemble_from_fragments(src_path, delimiter=None, compiled_regexp=None, igno
tmp.close() tmp.close()
return temp_path return temp_path
def cleanup(path, result=None): def cleanup(path, result=None):
# cleanup just in case # cleanup just in case
if os.path.exists(path): if os.path.exists(path):
@ -160,8 +168,6 @@ def cleanup(path, result=None):
if result is not None: if result is not None:
result['warnings'] = ['Unable to remove temp file (%s): %s' % (path, str(e))] result['warnings'] = ['Unable to remove temp file (%s): %s' % (path, str(e))]
# ==============================================================
# main
def main(): def main():
@ -199,7 +205,7 @@ def main():
if not os.path.isdir(src): if not os.path.isdir(src):
module.fail_json(msg="Source (%s) is not a directory" % src) module.fail_json(msg="Source (%s) is not a directory" % src)
if regexp != None: if regexp is not None:
try: try:
compiled_regexp = re.compile(regexp) compiled_regexp = re.compile(regexp)
except re.error: except re.error:
@ -246,8 +252,5 @@ def main():
result['msg'] = "OK" result['msg'] = "OK"
module.exit_json(**result) module.exit_json(**result)
# import module snippets if __name__ == '__main__':
from ansible.module_utils.basic import *
main() main()

Loading…
Cancel
Save