From 3cab65f6229dfc35e91af0acee8180c5fb4b5d3a Mon Sep 17 00:00:00 2001 From: Trevor Schellhorn Date: Sun, 14 Jul 2024 20:50:57 -0600 Subject: [PATCH] Adding parameter to prefix option with spaces for ini_file --- plugins/modules/ini_file.py | 27 ++++- .../targets/ini_file/tasks/main.yml | 3 + .../tasks/tests/09-option_prefix_spaces.yml | 108 ++++++++++++++++++ 3 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 tests/integration/targets/ini_file/tasks/tests/09-option_prefix_spaces.yml diff --git a/plugins/modules/ini_file.py b/plugins/modules/ini_file.py index affee2a4f7..364e165d8c 100644 --- a/plugins/modules/ini_file.py +++ b/plugins/modules/ini_file.py @@ -153,6 +153,12 @@ options: type: bool default: false version_added: 7.1.0 + option_prefix_spaces: + description: + - This flag indicates that the option should start with spaces. + type: int + default: 0 + version_added: 8.0.0 notes: - While it is possible to add an O(option) without specifying a O(value), this makes no sense. - As of community.general 3.2.0, UTF-8 BOM markers are discarded when reading files. @@ -257,6 +263,14 @@ EXAMPLES = r''' value: xxxxxxxxxxxxxxxxxxxx mode: '0600' state: present +- name: Update the option and indent with spaces + community.general.ini_file: + path: /etc/influxdb/config.toml + section: default + option: url + value: http://localhost:8086 + option_prefix_spaces: 2 + state: present ''' import io @@ -311,7 +325,8 @@ def check_section_has_values(section_has_values, section_lines): def do_ini(module, filename, section=None, section_has_values=None, option=None, values=None, state='present', exclusive=True, backup=False, no_extra_spaces=False, - ignore_spaces=False, create=True, allow_no_value=False, modify_inactive_option=True, follow=False): + ignore_spaces=False, create=True, allow_no_value=False, modify_inactive_option=True, + follow=False, option_prefix_spaces=0): if section is not None: section = to_text(section) @@ -384,6 +399,9 @@ def do_ini(module, filename, section=None, section_has_values=None, option=None, else: assignment_format = u'%s = %s\n' + if option_prefix_spaces > 0: + assignment_format = (' ' * option_prefix_spaces) + assignment_format + option_no_value_present = False non_blank_non_comment_pattern = re.compile(to_text(r'^[ \t]*([#;].*)?$')) @@ -599,7 +617,8 @@ def main(): allow_no_value=dict(type='bool', default=False), modify_inactive_option=dict(type='bool', default=True), create=dict(type='bool', default=True), - follow=dict(type='bool', default=False) + follow=dict(type='bool', default=False), + option_prefix_spaces=dict(type='int', default=0) ), mutually_exclusive=[ ['value', 'values'] @@ -623,6 +642,7 @@ def main(): modify_inactive_option = module.params['modify_inactive_option'] create = module.params['create'] follow = module.params['follow'] + option_prefix_spaces = module.params['option_prefix_spaces'] if state == 'present' and not allow_no_value and value is None and not values: module.fail_json(msg="Parameter 'value(s)' must be defined if state=present and allow_no_value=False.") @@ -642,7 +662,8 @@ def main(): (changed, backup_file, diff, msg) = do_ini( module, path, section, section_has_values, option, values, state, exclusive, backup, - no_extra_spaces, ignore_spaces, create, allow_no_value, modify_inactive_option, follow) + no_extra_spaces, ignore_spaces, create, allow_no_value, modify_inactive_option, + follow, option_prefix_spaces) if not module.check_mode and os.path.exists(path): file_args = module.load_file_common_arguments(module.params) diff --git a/tests/integration/targets/ini_file/tasks/main.yml b/tests/integration/targets/ini_file/tasks/main.yml index 8fd88074b2..87759a343e 100644 --- a/tests/integration/targets/ini_file/tasks/main.yml +++ b/tests/integration/targets/ini_file/tasks/main.yml @@ -52,3 +52,6 @@ - name: include tasks to test section_has_values include_tasks: tests/08-section.yml + + - name: include tasks to test optional spaces at beginning of option lines + include_tasks: tests/09-option_prefix_spaces.yml diff --git a/tests/integration/targets/ini_file/tasks/tests/09-option_prefix_spaces.yml b/tests/integration/targets/ini_file/tasks/tests/09-option_prefix_spaces.yml new file mode 100644 index 0000000000..2f53161160 --- /dev/null +++ b/tests/integration/targets/ini_file/tasks/tests/09-option_prefix_spaces.yml @@ -0,0 +1,108 @@ +--- +# 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 at beginning of option lines + +- name: Test-options_start_spaces 1 - update option with prefix spaces - create test file + ansible.builtin.copy: # noqa risky-file-permissions + dest: "{{ output_file }}" + content: | + [foo] + ; bar=baz + +- name: Test-options_start_spaces 1 - update option with prefix spaces - set new value + community.general.ini_file: # noqa risky-file-permissions + path: "{{ output_file }}" + section: 'foo' + option: bar + value: frelt + option_prefix_spaces: 2 + register: result + +- name: Test-options_start_spaces 1 - update option with prefix spaces - read content from output file + ansible.builtin.slurp: + src: "{{ output_file }}" + register: output_content + +- name: Test-options_start_spaces 1 - update option with prefix spaces - 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-options_start_spaces 2 - set same value with prefix spaces - create test file + ansible.builtin.copy: # noqa risky-file-permissions + dest: "{{ output_file }}" + content: | + [foo] + bar = baz + +- name: Test-options_start_spaces 2 - set same value with prefix spaces - set same value + community.general.ini_file: # noqa risky-file-permissions + path: "{{ output_file }}" + section: 'foo' + option: bar + value: baz + option_prefix_spaces: 2 + register: result + +- name: Test-options_start_spaces 2 - set same value with prefix spaces - read content from output file + ansible.builtin.slurp: + src: "{{ output_file }}" + register: output_content + +- name: Test-options_start_spaces 2 - set same value with prefix spaces - verify results + vars: + actual_content: "{{ output_content.content | b64decode }}" + expected_content: | + [foo] + bar = baz + ansible.builtin.assert: + that: + - actual_content == expected_content + - result is not changed + - result.msg == 'OK' + +- name: Test-options_start_spaces 3 - set new value in new sectio with prefix spaces - create test file + ansible.builtin.copy: # noqa risky-file-permissions + dest: "{{ output_file }}" + content: | + [foo] + bar = baz + +- name: Test-options_start_spaces 3 - set new value in new sectio with prefix spaces - set same value + community.general.ini_file: # noqa risky-file-permissions + path: "{{ output_file }}" + section: 'boo' + option: url + value: daz + option_prefix_spaces: 2 + register: result + +- name: Test-options_start_spaces 3 - set new value in new sectio with prefix spaces - read content from output file + ansible.builtin.slurp: + src: "{{ output_file }}" + register: output_content + +- name: Test-options_start_spaces 3 - set new value in new sectio with prefix spaces - verify results + vars: + actual_content: "{{ output_content.content | b64decode }}" + expected_content: | + [foo] + bar = baz + + [boo] + url = daz + ansible.builtin.assert: + that: + - actual_content == expected_content + - result is changed + - result.msg == 'section and option added'