1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2024-09-14 20:13:21 +02:00

Bugfix to lineinfile to properly handle files with no newline at EOF when using insertafter=EOF.

Looks like #6881 is also affected by this bug.

Currently when using lineinfile insertafter=EOF for a file that has no newline then the added line is not prefixed with a newline.
As a concrete example, ubuntu distro default /etc/ssh/sshd_config has no newline so lineinfile module cannot be used to add a new line to the end of the file.
This commit is contained in:
Ahti Kitsik 2014-06-09 19:58:45 +03:00
parent aaa16acdf1
commit 1caf9be109
4 changed files with 57 additions and 2 deletions

View file

@ -2,6 +2,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# (c) 2012, Daniel Hokka Zakrisson <daniel@hozac.com> # (c) 2012, Daniel Hokka Zakrisson <daniel@hozac.com>
# (c) 2014, Ahti Kitsik <ak@ahtik.com>
# #
# This file is part of Ansible # This file is part of Ansible
# #
@ -25,7 +26,7 @@ import tempfile
DOCUMENTATION = """ DOCUMENTATION = """
--- ---
module: lineinfile module: lineinfile
author: Daniel Hokka Zakrisson author: Daniel Hokka Zakrisson, Ahti Kitsik
short_description: Ensure a particular line is in a file, or replace an short_description: Ensure a particular line is in a file, or replace an
existing line using a back-referenced regular expression. existing line using a back-referenced regular expression.
description: description:
@ -110,7 +111,7 @@ options:
validate: validate:
required: false required: false
description: description:
- validation to run before copying into place. The command is passed - validation to run before copying into place. The command is passed
securely so shell features like expansion and pipes won't work. securely so shell features like expansion and pipes won't work.
required: false required: false
default: None default: None
@ -251,6 +252,11 @@ def present(module, dest, regexp, line, insertafter, insertbefore, create,
# if insertafter=/insertbefore didn't match anything # if insertafter=/insertbefore didn't match anything
# (so default behaviour is to add at the end) # (so default behaviour is to add at the end)
elif insertafter == 'EOF': elif insertafter == 'EOF':
# If the file is not empty then ensure there's a newline before the added line
if len(lines)>0 and not (lines[-1].endswith('\n') or lines[-1].endswith('\r')):
lines.append(os.linesep)
lines.append(line + os.linesep) lines.append(line + os.linesep)
msg = 'line added' msg = 'line added'
changed = True changed = True

View file

@ -0,0 +1,2 @@
This is line 1
This is line 2

View file

@ -209,3 +209,50 @@
that: that:
- "result.stat.md5 == 'fef1d487711facfd7aa2c87d788c19d9'" - "result.stat.md5 == 'fef1d487711facfd7aa2c87d788c19d9'"
# Test EOF in cases where file has no newline at EOF
- name: testnoeof deploy the file for lineinfile
copy: src=testnoeof.txt dest={{output_dir}}/testnoeof.txt
register: result
- name: testnoeof insert a line at the end of the file
lineinfile: dest={{output_dir}}/testnoeof.txt state=present line="New line at the end" insertafter="EOF"
register: result
- name: testempty assert that the line was inserted at the end of the file
assert:
that:
- "result.changed == true"
- "result.msg == 'line added'"
- name: testnoeof stat the no newline EOF test after the insert at the end
stat: path={{output_dir}}/testnoeof.txt
register: result
- name: testnoeof assert test md5 matches after the insert at the end
assert:
that:
- "result.stat.md5 == 'f75c9d51f45afd7295000e63ce655220'"
# Test EOF with empty file to make sure no unneccessary newline is added
- name: testempty deploy the testempty file for lineinfile
copy: src=testempty.txt dest={{output_dir}}/testempty.txt
register: result
- name: testempty insert a line at the end of the file
lineinfile: dest={{output_dir}}/testempty.txt state=present line="New line at the end" insertafter="EOF"
register: result
- name: testempty assert that the line was inserted at the end of the file
assert:
that:
- "result.changed == true"
- "result.msg == 'line added'"
- name: testempty stat the test after the insert at the end
stat: path={{output_dir}}/testempty.txt
register: result
- name: testempty assert test md5 matches after the insert at the end
assert:
that:
- "result.stat.md5 == '357dcbee8dfb4436f63bab00a235c45a'"