# Copyright 2018-2023 Chris Croome
#
# This file is part of the Webarchitects Apache Ansible role.
#
# The Webarchitects Apache Ansible role is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
#
# The Webarchitects Apache Ansible role is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with the Webarchitects Apache Ansible role. If not, see <https://www.gnu.org/licenses/>.
---
- name: Enable Apache mpm_event if mpm_prefork or no MPM loaded
  block:

    - name: Include Apache checks
      ansible.builtin.include_tasks: checks.yml

    - name: Debug Apache modules loaded
      ansible.builtin.debug:
        msg: "Apache modules loaded: {{ apache_modules_loaded }}"
        verbosity: 1
      when:
        - ( apache_modules_loaded is defined ) and ( apache_modules_loaded | length > 0 )

    - name: "Disable Apache module {{ apache_phpfpm_mod }}"
      community.general.apache2_module:
        name: "{{ apache_phpfpm_mod }}"
        state: absent
      when:
        - ( apache_modules_loaded is defined ) and ( apache_modules_loaded | length > 0 )
        - ( apache_phpfpm_mod is defined ) and ( apache_phpfpm_mod in apache_modules_loaded )

    - name: Disable Apache module mpm_itk
      community.general.apache2_module:
        name: mpm_itk
        state: absent
      when: ( apache_mpm_loaded is defined ) and ( apache_mpm_loaded == "mpm_itk" )

    - name: Disable Apache module mpm_prefork
      community.general.apache2_module:
        name: mpm_prefork
        state: absent
        ignore_configcheck: true
      when: ( apache_mpm_loaded is defined ) and ( apache_mpm_loaded == "mpm_prefork" )

    - name: "Enable Apache mpm_event"
      community.general.apache2_module:
        name: mpm_event
        state: present
        ignore_configcheck: true
      register: apache_mpm_event_enabled

    - name: Restart Apache if the MPM has changed
      ansible.builtin.service:
        name: apache2
        state: restarted
      when: apache_mpm_event_enabled.changed

  when:
    - ( apache_mpm_loaded == "mpm_prefork" ) or ( apache_mpm_loaded | length == 0 )
    - ( apache_mods_enabled is defined ) and ( "mpm_event" in apache_mods_enabled )
  tags:
    - apache

- name: Enable Apache mpm_prefork if mpm_event or no MPM loaded
  block:

    - name: "Disable Apache module mpm_event"
      community.general.apache2_module:
        name: mpm_event
        state: absent
        ignore_configcheck: true
      when: ( apache_mpm_loaded is defined ) and  ( apache_mpm_loaded == "mpm_event" )

    - name: "Enable Apache mpm_prefork"
      community.general.apache2_module:
        name: mpm_prefork
        state: present
        ignore_configcheck: true
      register: apache_mpm_prefork_enabled

    - name: Restart Apache if the MPM has changed
      ansible.builtin.service:
        name: apache2
        state: restarted
      when: apache_mpm_prefork_enabled.changed

  when:
    - ( apache_mpm_loaded == "mpm_event" ) or ( apache_mpm_loaded | length == 0 )
    - ( "mpm_prefork" in apache_mods_enabled )
  tags:
    - apache

- name: Re-check the MPM
  block:

    - name: Check the enabled MPM
      ansible.builtin.command: a2query -M
      check_mode: false
      changed_when: false
      register: apache_mpm_check

    - name: Debug the enabled MPM
      ansible.builtin.debug:
        msg: "{{ apache_mpm_check.stdout }}"
        verbosity: 2

    - name: Set a fact for the enabled MPM
      ansible.builtin.set_fact:
        apache_mpm_loaded: "mpm_{{ apache_mpm_check.stdout | trim }}"
      when: apache_mpm_check.stdout != "invalid"

    - name: Fail if no Apache MPM loaded
      ansible.builtin.fail:
        msg: "No Apache MPM loaded"
      when: apache_mpm_check.stdout == "invalid"

  tags:
    - apache

- name: Re-check modules enabled
  block:

    - name: Check loaded modules
      block:

        - name: Register the loaded modules
          ansible.builtin.command: a2query -m
          check_mode: false
          changed_when: false
          register: apache_modules_check

      rescue:

        - name: No mod enabled
          ansible.builtin.set_fact:
            apache_modules_loaded: []
          when: '"No module matches" in apache_modules_check.stderr'

    - name: Debug the loaded modules
      ansible.builtin.debug:
        var: apache_modules_check.stdout_lines
        verbosity: 2
      when: apache_modules_check.stdout is defined

    - name: Set an array of the loaded modules
      ansible.builtin.set_fact:
        apache_modules_loaded: "{{ apache_modules_loaded | default([]) + [line.split(' ')[0]] }}"
      when: apache_modules_check.stdout is defined
      loop: "{{ apache_modules_check.stdout_lines }}"
      loop_control:
        loop_var: line
        label: "{{ line }}"

    - name: Debug loaded modules
      ansible.builtin.debug:
        var: apache_modules_loaded
        verbosity: 2
      when: apache_modules_loaded is defined

  tags:
    - apache
...