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

ini_file - support optional spaces around section names (#8075)

* ini_file - support optional spaces between section names and their surrounding brackets

Some ini files have spaces between some of their section names and the
brackets that enclose them. This is documented in the 'openssl.cnf(5)' man
page. In order to manage files such as /etc/ssl/openssl.cnf with ini_file
before now, one would have to include spaces in the section name like this:
    section: ' crypto_policy '
    option: Options
    value: UnsafeLegacyRenegotiation

This change implements matching section headers with such optional spaces.
Existing tasks using the workaround above will continue to work, even in
cases where spaces in section headers are subsequently removed.

* readability improvement in the test content expressions

---------

Co-authored-by: Todd Lewis <todd_lewis@unc.edu>
This commit is contained in:
Todd Lewis 2024-03-24 13:02:13 -04:00 committed by GitHub
parent 4947786d36
commit 4363f8764b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 111 additions and 1 deletions

View file

@ -0,0 +1,2 @@
minor_changes:
- "ini_file - support optional spaces between section names and their surrounding brackets (https://github.com/ansible-collections/community.general/pull/8075)."

View file

@ -304,9 +304,11 @@ def do_ini(module, filename, section=None, option=None, values=None,
before = after = [] before = after = []
section_lines = [] section_lines = []
section_pattern = re.compile(to_text(r'^\[\s*%s\s*]' % re.escape(section.strip())))
for index, line in enumerate(ini_lines): for index, line in enumerate(ini_lines):
# find start and end of section # find start and end of section
if line.startswith(u'[%s]' % section): if section_pattern.match(line):
within_section = True within_section = True
section_start = index section_start = index
elif line.startswith(u'['): elif line.startswith(u'['):

View file

@ -47,3 +47,6 @@
- name: include tasks to test modify_inactive_option - name: include tasks to test modify_inactive_option
include_tasks: tests/06-modify_inactive_option.yml include_tasks: tests/06-modify_inactive_option.yml
- name: include tasks to test optional spaces in section headings
include_tasks: tests/07-section_name_spaces.yml

View file

@ -0,0 +1,103 @@
---
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
## testing support for optional spaces between brackets and section names
- name: Test-section_name_spaces 1 (does legacy workaround still work) - create test file
ansible.builtin.copy: # noqa risky-file-permissions
dest: "{{ output_file }}"
content: |
[ foo ]
; bar=baz
- name: Test-section_name_spaces 1 - update with optional spaces specified
community.general.ini_file: # noqa risky-file-permissions
path: "{{ output_file }}"
section: ' foo '
option: bar
value: frelt
register: result
- name: Test-section_name_spaces 1 - read content from output file
ansible.builtin.slurp:
src: "{{ output_file }}"
register: output_content
- name: Test-section_name_spaces 1 - verify results
vars:
actual_content: "{{ output_content.content | b64decode }}"
expected_content: |
[ foo ]
bar = frelt
ansible.builtin.assert:
that:
- actual_content == expected_content
- result is changed
- result.msg == 'option changed'
- name: Test-section_name_spaces 2 (optional spaces omitted) - create test file
ansible.builtin.copy: # noqa risky-file-permissions
dest: "{{ output_file }}"
content: |
[ foo ]
bar=baz"
- name: Test-section_name_spaces 2 - update without optional spaces
community.general.ini_file: # noqa risky-file-permissions
path: "{{ output_file }}"
section: foo
option: bar
value: frelt
ignore_spaces: true
register: result
- name: Test-section_name_spaces 2 - read content from output file
ansible.builtin.slurp:
src: "{{ output_file }}"
register: output_content
- name: Test-section_name_spaces 2 - verify results
vars:
actual_content: "{{ output_content.content | b64decode }}"
expected_content: "[ foo ]\nbar = frelt\n"
ansible.builtin.assert:
that:
- actual_content == expected_content
- result is changed
- result.msg == 'option changed'
- name: Test-section_name_spaces 3 (legacy workaround when not required) - create test file
ansible.builtin.copy: # noqa risky-file-permissions
dest: "{{ output_file }}"
content: |
[foo]
; bar=baz
- name: Test-section_name_spaces 3 - update with optional spaces specified
community.general.ini_file: # noqa risky-file-permissions
path: "{{ output_file }}"
section: ' foo '
option: bar
value: frelt
register: result
- name: Test-section_name_spaces 3 - read content from output file
ansible.builtin.slurp:
src: "{{ output_file }}"
register: output_content
- name: Test-section_name_spaces 3 - verify results
vars:
actual_content: "{{ output_content.content | b64decode }}"
expected_content: |
[foo]
bar = frelt
ansible.builtin.assert:
that:
- actual_content == expected_content
- result is changed
- result.msg == 'option changed'