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 3c5bb759ce
commit 6341cc23fb

View file

@ -2,6 +2,7 @@
# -*- coding: utf-8 -*-
# (c) 2012, Daniel Hokka Zakrisson <daniel@hozac.com>
# (c) 2014, Ahti Kitsik <ak@ahtik.com>
#
# This file is part of Ansible
#
@ -25,7 +26,7 @@ import tempfile
DOCUMENTATION = """
---
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
existing line using a back-referenced regular expression.
description:
@ -251,6 +252,11 @@ def present(module, dest, regexp, line, insertafter, insertbefore, create,
# if insertafter=/insertbefore didn't match anything
# (so default behaviour is to add at the end)
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)
msg = 'line added'
changed = True