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:
parent
4947786d36
commit
4363f8764b
4 changed files with 111 additions and 1 deletions
|
@ -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)."
|
|
@ -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'['):
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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'
|
Loading…
Reference in a new issue