
    Vh<                         d dl mZmZmZ eZdZdZdZd dl	m
Z
 d dlmZ d dlmZ d dlmc mc mc mc mZ  G d	 d
e      Zd Zedk(  r e        yy)    )absolute_importdivisionprint_functiona$  
---
module: zabbix_authentication

short_description: Update Zabbix authentication

description:
   - This module allows you to modify Zabbix authentication setting.

author:
    - ONODERA Masaru(@masa-orca)

requirements:
    - "python >= 3.9"

version_added: 1.6.0

options:
    authentication_type:
        description:
            - Choose default authentication type.
        required: false
        type: str
        choices: [ "internal", "ldap" ]
    http_auth_enabled:
        description:
            - HTTP authentication will be enabled if C(true).
        required: false
        type: bool
    http_login_form:
        description:
            - Choose default login form.
        required: false
        type: str
        choices: [ "zabbix_login_form", "http_login_form" ]
    http_strip_domains:
        description:
            - A list of domain names that should be removed from the username.
        required: false
        type: list
        elements: str
    http_case_sensitive:
        description:
            - Case sensitive login for HTTP authentication will be enabled if C(true).
        required: false
        type: bool
    ldap_configured:
        description:
            - LDAP authentication will be enabled if C(true).
            - Works only with Zabbix <= 6.2 and is silently ignored in higher versions.
            - Removed in Zabbix 6.4
        required: false
        type: bool
    ldap_auth_enabled:
        description:
            - LDAP authentication will be enabled if C(true).
            - This parameter is available since Zabbix 6.4.
        required: false
        type: bool
    ldap_host:
        description:
            - LDAP server name.
            - e.g. C(ldap://ldap.zabbix.com)
            - This setting is required if current value of I(ldap_configured) is C(false).
            - Works only with Zabbix <= 6.0 and is silently ignored in higher versions.
        required: false
        type: str
    ldap_port:
        description:
            - A port number of LDAP server.
            - This setting is required if current value of I(ldap_configured) is C(false).
            - Works only with Zabbix <= 6.0 and is silently ignored in higher versions.
        required: false
        type: int
    ldap_base_dn:
        description:
            - Base DN of LDAP.
            - This setting is required if current value of I(ldap_configured) is C(false).
            - Works only with Zabbix <= 6.0 and is silently ignored in higher versions.
        required: false
        type: str
    ldap_search_attribute:
        description:
            - Search attribute of LDAP.
            - This setting is required if current value of I(ldap_configured) is C(false).
            - Works only with Zabbix <= 6.0 and is silently ignored in higher versions.
        required: false
        type: str
    ldap_bind_dn:
        description:
            - Bind DN of LDAP.
            - Works only with Zabbix <= 6.0 and is silently ignored in higher versions.
        required: false
        type: str
    ldap_case_sensitive:
        description:
            - case sensitive login for LDAP authentication will be enabled if C(true).
        required: false
        type: bool
    ldap_bind_password:
        description:
            - Bind password of LDAP.
            - Works only with Zabbix <= 6.0 and is silently ignored in higher versions.
        required: false
        type: str
    ldap_userdirectory:
        description:
            - LDAP authentication default user directory name for user groups with gui_access set to LDAP or System default.
            - Required to be set when C(ldap_configured) / C(ldap_auth_enabled) is set to 1.
        required: false
        type: str
    ldap_jit_status:
        description:
            - Status of LDAP provisioning.
            - This parameter is available since Zabbix 6.4.
        required: false
        type: bool
    jit_provision_interval:
        description:
            - Time interval between JIT provision requests for logged-in user.
            - Accepts seconds and time unit with suffix with month and year support (3600s,60m,1h,1d,1M,1y). Minimum value 1h.
            - Available only for LDAP provisioning.
            - This parameter is available since Zabbix 6.4.
        required: false
        type: str
        default: 1h
    disabled_usrgroup:
        description:
            - User group name to assign the deprovisioned user to.
            - The user group must be disabled and cannot be enabled or deleted when configured.
            - Required if C(ldap_jit_status) for C(saml_jit_status) enabled.
            - This parameter is available since Zabbix 6.4.
        required: false
        type: str
    saml_auth_enabled:
        description:
            - SAML authentication will be enabled if C(true).
        required: false
        type: bool
    saml_idp_entityid:
        description:
            - SAML identify provider's entity ID.
            - This setting is required if current value of I(saml_auth_enabled) is C(false).
            - Works only with Zabbix <= 6.2 and is silently ignored in higher versions.
        required: false
        type: str
    saml_sso_url:
        description:
            - URL for single sign on service of SAML.
            - This setting is required if current value of I(saml_auth_enabled) is C(false).
            - Works only with Zabbix <= 6.2 and is silently ignored in higher versions.
        required: false
        type: str
    saml_slo_url:
        description:
            - URL for SAML single logout service.
            - Works only with Zabbix <= 6.2 and is silently ignored in higher versions.
        required: false
        type: str
    saml_username_attribute:
        description:
            - User name attribute of SAML.
            - This setting is required if current value of I(saml_auth_enabled) is C(false).
            - Works only with Zabbix <= 6.2 and is silently ignored in higher versions.
        required: false
        type: str
    saml_sp_entityid:
        description:
            - Entity ID of SAML service provider.
            - This setting is required if current value of I(saml_auth_enabled) is C(false).
            - Works only with Zabbix <= 6.2 and is silently ignored in higher versions.
        required: false
        type: str
    saml_nameid_format:
        description:
            - Name identifier format of SAML service provider.
            - Works only with Zabbix <= 6.2 and is silently ignored in higher versions.
        required: false
        type: str
    saml_sign_messages:
        description:
            - SAML sign messages will be enabled if C(true).
            - Works only with Zabbix <= 6.2 and is silently ignored in higher versions.
        required: false
        type: bool
    saml_sign_assertions:
        description:
            - SAML sign assertions will be enabled if C(true).
            - Works only with Zabbix <= 6.2 and is silently ignored in higher versions.
        required: false
        type: bool
    saml_sign_authn_requests:
        description:
            - SAML sign AuthN requests will be enabled if C(true).
            - Works only with Zabbix <= 6.2 and is silently ignored in higher versions.
        required: false
        type: bool
    saml_sign_logout_requests:
        description:
            - SAML sign logout requests will be enabled if C(true).
            - Works only with Zabbix <= 6.2 and is silently ignored in higher versions.
        required: false
        type: bool
    saml_sign_logout_responses:
        description:
            - SAML sign logout responses will be enabled if C(true).
            - Works only with Zabbix <= 6.2 and is silently ignored in higher versions.
        required: false
        type: bool
    saml_encrypt_nameid:
        description:
            - SAML encrypt name ID will be enabled if C(true).
            - Works only with Zabbix <= 6.2 and is silently ignored in higher versions.
        required: false
        type: bool
    saml_encrypt_assertions:
        description:
            - SAML encrypt assertions will be enabled if C(true).
            - Works only with Zabbix <= 6.2 and is silently ignored in higher versions.
        required: false
        type: bool
    saml_case_sensitive:
        description:
            - Case sensitive login for SAML authentication will be enabled if C(true).
        required: false
        type: bool
    saml_jit_status:
        description:
            - Status of SAML provisioning.
            - This parameter is available since Zabbix 6.4.
        required: false
        type: bool
    passwd_min_length:
        description:
            - Minimal length of password.
            - Choose from 1-70.
            - This parameter is available since Zabbix 6.0.
        required: false
        type: int
    passwd_check_rules:
        description:
            - Checking password rules.
            - Select multiple from C(contain_uppercase_and_lowercase_letters),
              C(contain_digits). C(contain_special_characters) and C(avoid_easy_to_guess).
            - This parameter is available since Zabbix 6.0.
        required: false
        type: list
        elements: str

extends_documentation_fragment:
    - community.zabbix.zabbix
a^  
# If you want to use Username and Password to be authenticated by Zabbix Server
- name: Set credentials to access Zabbix Server API
  ansible.builtin.set_fact:
    ansible_user: Admin
    ansible_httpapi_pass: zabbix

# If you want to use API token to be authenticated by Zabbix Server
# https://www.zabbix.com/documentation/current/en/manual/web_interface/frontend_sections/administration/general#api-tokens
- name: Set API token
  ansible.builtin.set_fact:
    ansible_zabbix_auth_key: 8ec0d52432c15c91fcafe9888500cf9a607f44091ab554dbee860f6b44fac895

- name: Update all authentication setting (Zabbix <= 6.0)
  # set task level variables as we change ansible_connection plugin here
  vars:
    ansible_network_os: community.zabbix.zabbix
    ansible_connection: httpapi
    ansible_httpapi_port: 443
    ansible_httpapi_use_ssl: true
    ansible_httpapi_validate_certs: false
    ansible_zabbix_url_path: "zabbixeu"  # If Zabbix WebUI runs on non-default (zabbix) path ,e.g. http://<FQDN>/zabbixeu
    ansible_host: zabbix-example-fqdn.org
  community.zabbix.zabbix_authentication:
    authentication_type: internal
    http_auth_enabled: true
    http_login_form: zabbix_login_form
    http_strip_domains:
      - comp
      - any
    http_case_sensitive: true
    ldap_configured: true
    ldap_host: "ldap://localhost"
    ldap_port: 389
    ldap_base_dn: "ou=Users,ou=system"
    ldap_search_attribute: "uid"
    ldap_bind_dn: "uid=ldap_search,ou=system"
    ldap_case_sensitive: true
    ldap_bind_password: "password"
    saml_auth_enabled: true
    saml_idp_entityid: ""
    saml_sso_url: "https://localhost/SAML2/SSO"
    saml_slo_url: "https://localhost/SAML2/SLO"
    saml_username_attribute: "uid"
    saml_sp_entityid: "https://localhost"
    saml_nameid_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:entity"
    saml_sign_messages: true
    saml_sign_assertions: true
    saml_sign_authn_requests: true
    saml_sign_logout_requests: true
    saml_sign_logout_responses: true
    saml_encrypt_nameid: true
    saml_encrypt_assertions: true
    saml_case_sensitive: true
    passwd_min_length: 70
    passwd_check_rules:
      - contain_uppercase_and_lowercase_letters
      - contain_digits
      - contain_special_characters
      - avoid_easy_to_guess

- name: Update all authentication setting (Zabbix = 6.2)
  # set task level variables as we change ansible_connection plugin here
  vars:
    ansible_network_os: community.zabbix.zabbix
    ansible_connection: httpapi
    ansible_httpapi_port: 443
    ansible_httpapi_use_ssl: true
    ansible_httpapi_validate_certs: false
    ansible_zabbix_url_path: "zabbixeu"  # If Zabbix WebUI runs on non-default (zabbix) path ,e.g. http://<FQDN>/zabbixeu
    ansible_host: zabbix-example-fqdn.org
  community.zabbix.zabbix_authentication:
    authentication_type: internal
    http_auth_enabled: true
    http_login_form: zabbix_login_form
    http_strip_domains:
      - comp
      - any
    http_case_sensitive: true
    ldap_configured: true
    ldap_case_sensitive: true
    saml_auth_enabled: true
    saml_idp_entityid: ""
    saml_sso_url: "https://localhost/SAML2/SSO"
    saml_slo_url: "https://localhost/SAML2/SLO"
    saml_username_attribute: "uid"
    saml_sp_entityid: "https://localhost"
    saml_nameid_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:entity"
    saml_sign_messages: true
    saml_sign_assertions: true
    saml_sign_authn_requests: true
    saml_sign_logout_requests: true
    saml_sign_logout_responses: true
    saml_encrypt_nameid: true
    saml_encrypt_assertions: true
    saml_case_sensitive: true
    passwd_min_length: 70
    passwd_check_rules:
      - contain_uppercase_and_lowercase_letters
      - contain_digits
      - contain_special_characters
      - avoid_easy_to_guess

- name: Update all authentication setting (Zabbix >= 6.4)
  # set task level variables as we change ansible_connection plugin here
  vars:
    ansible_network_os: community.zabbix.zabbix
    ansible_connection: httpapi
    ansible_httpapi_port: 443
    ansible_httpapi_use_ssl: true
    ansible_httpapi_validate_certs: false
    ansible_zabbix_url_path: "zabbixeu"  # If Zabbix WebUI runs on non-default (zabbix) path ,e.g. http://<FQDN>/zabbixeu
    ansible_host: zabbix-example-fqdn.org
  community.zabbix.zabbix_authentication:
    authentication_type: internal
    http_auth_enabled: true
    http_login_form: zabbix_login_form
    http_strip_domains:
      - comp
      - any
    http_case_sensitive: true
    ldap_auth_enabled: true
    ldap_userdirectory: TestUserDirectory
    ldap_case_sensitive: true
    saml_auth_enabled: true
    saml_case_sensitive: true
    ldap_jit_status: true
    saml_jit_status: true
    jit_provision_interval: 1h
    disabled_usrgrp: Disabled
    passwd_min_length: 70
    passwd_check_rules:
      - contain_uppercase_and_lowercase_letters
      - contain_digits
      - contain_special_characters
      - avoid_easy_to_guess
z
msg:
    description: The result of the operation
    returned: success
    type: str
    sample: "Successfully update authentication setting"
)AnsibleModule)
ZabbixBase)LooseVersionNc                       e Zd Zd Zd Zy)Authenticationc                     	 | j                   j                  j                  ddi      S # t        $ r)}| j                  j                  d|z         Y d }~y d }~ww xY w)Noutputextendz(Failed to get authentication setting: %smsg)_zapiauthenticationget	Exception_module	fail_json)selfes     z/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/zabbix/plugins/modules/zabbix_authentication.pyget_authenticationz!Authentication.get_authentication  sY    	W::,,00(H1EFF 	WLL""'QTU'U"VV	Ws   &) 	AAAc&           	      ~   	 i }&|r$t        t        j                  ddg|            |&d<   t        |t              rt        t        |            |&d<   |r$t        t        j                  ddg|            |&d<   |rdj                  |      |&d<   t        |t              rt        t        |            |&d	<   t        | j                        t        d
      k  r(t        |t              r?t        t        |            |&d<   n't        |t              rt        t        |            |&d<   t        | j                        t        d      k  r4|	r|	|&d<   |
rt        |
      |&d<   |r||&d<   |r||&d<   |r||&d<   |r]||&d<   nW|rU| j                  j                  j                  dd|ii      }'|'s| j                  j                  d|z         |'d   d   |&d<   t        |t              rt        t        |            |&d<   t        |t              rt        t        |            |&d<   t        | j                        t        d
      k  rd|r||&d<   |r||&d<   |r||&d<   |r||&d <   |r||&d!<   |r||&d"<   t        |t              rt        t        |            |&d#<   t        |t              rt        t        |            |&d$<   t        |t              rt        t        |            |&d%<   t        |t              rt        t        |            |&d&<   t        |t              rt        t        |            |&d'<   t        |t              rt        t        |            |&d(<   t        |t              rt        t        |            |&d)<   t        |t              rt        t        |            |&d*<   nt        |"t              rt        t        |"            |&d+<   t        |#t              rt        t        |#            |&d,<   t        |$t               r|$|&d-<   t        |%t               rf| j                  j                  j                  d.d|%ii      }(|(s| j                  j                  d/|%z         t        t        |(d   d0               |&d1<   |"s|#r|%s| j                  j                  d2       | r5| d3k  s| d4kD  r| j                  j                  d5       nt        |       |&d6<   |!g d7})d|&d8<   t        |!t               rH|!|)vr| j                  j                  d9|!z         |&d8xx   d:t        j                  |)|!      z  z  cc<   n^t        |!t              rN|!D ]I  }*|*|)vr| j                  j                  d9|*z         |&d8xx   d:t        j                  |)|*      z  z  cc<   K t        |&d8         |&d8<   |j!                         }+|+j#                  |&       t        | j                        t        d
      k  ru|d   d;k(  r|+d   d<k(  rt        | j                        t        d      k  r%|	r|
r|r|sj| j                  j                  d=       nM|sK| j                  j                  d>       n.|d   d;k(  r&|+d   d<k(  r|s| j                  j                  d?       t        | j                        t        d
      k  rE|d   d;k(  r=|+d   d<k(  r5|s3|s1|s/|s-| j                  j                  d@j                  dAdBg             |+|k7  ru| j                  j$                  r| j                  j'                  dCD       | j                  j(                  j#                  |&       | j                  j'                  dCdEF       y | j                  j'                  dGdHF       y # t*        $ r)},| j                  j                  dI|,z         Y d },~,y d },~,ww xY w)JNinternalldapauthentication_typehttp_auth_enabledzabbix_login_formhttp_login_form,http_strip_domainshttp_case_sensitivez6.4ldap_configuredldap_auth_enabledz6.2	ldap_host	ldap_portldap_base_dnldap_search_attributeldap_bind_dnldap_bind_passwordsearchnamez'Canot find user directory with name: %sr   r   userdirectoryidldap_userdirectoryidldap_case_sensitivesaml_auth_enabledsaml_idp_entityidsaml_sso_urlsaml_slo_urlsaml_username_attributesaml_sp_entityidsaml_nameid_formatsaml_sign_messagessaml_sign_assertionssaml_sign_authn_requestssaml_sign_logout_requestssaml_sign_logout_responsessaml_encrypt_nameidsaml_encrypt_assertionssaml_case_sensitiveldap_jit_statussaml_jit_statusjit_provision_intervalfilterzUser group '%s' cannot be foundusrgrpiddisabled_usrgrpidzV'disabled_usrgroup' must be provided if 'ldap_jit_status' or 'saml_jit_status' enabled   F   z%Please set 0-70 to passwd_min_length.passwd_min_length)'contain_uppercase_and_lowercase_letterscontain_digitscontain_special_charactersavoid_easy_to_guesspasswd_check_rulesz+%s is invalid value for passwd_check_rules.   01zpPlease set ldap_host, ldap_search_attribute and ldap_base_dn when you change a value of ldap_configured to true.zQPlease set ldap_userdirectory when you change a value of ldap_configured to true.zSPlease set ldap_userdirectory when you change a value of ldap_auth_enabled to true. zXPlease set saml_idp_entityid, saml_sso_url, saml_username_attribute and saml_sp_entityidz5when you change a value of saml_auth_enabled to true.T)changedz*Successfully update authentication setting)rR   resultFz,Authentication setting is already up to datez6Failed to update authentication setting, Exception: %s)strzabbix_utilshelper_to_numeric_value
isinstanceboolintjoinr   _zbx_api_versionr   userdirectoryr   r   r   	usergrouplistcopyupdate
check_mode	exit_jsonr   r   )-r   current_authenticationr   r   r    r"   r#   r$   r%   r&   r'   r(   r)   r*   r0   r+   ldap_userdirectoryr1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   rH   rM   r@   rA   rB   disabled_usrgroupparams	directory	usrgrpidspasswd_check_rules_values_passwd_check_rules_valuefuture_authenticationr   s-                                                r   update_authenticationz$Authentication.update_authentication  s   P}	F"03 88#V,.A1,- +T2.1#6G2H.I*+,/ 88,.?@/-() "/2xx8J/K+,-t403C8K4L0M,-D112\%5HHot403C4H0IF,-/625c:K6L2MF./D112\%5HH*3F;'*-i.F;'-9F>*(6KF23-9F>*%3EF/0% $

 8 8 < <!F,>#?@!I %.. I0!1 /  6?q\BS5TF12-t403C8K4L0M,-+T2.1#6G2H.I*+D112\%5HH$2CF./-9F>*-9F>**8OF45#1AF-.%3EF/00$736s;M7N3OF/02D958=Q9R5SF126=9<45:F56 7>:=56;F67 8$?;>67<F78 14847<O8P4QF015t<8;349F45 14847<O8P4QF01ot403C4H0IF,-ot403C4H0IF,-4c:7MF34/5 $

 4 4 8 8!F,=#>?!I %..=@QQ 36c)A,z:R6S2TF./#@QLL**p !$q(,=,BLL**/V*W256G2HF./!--) 01+,0#6)1JJ.. M0!1 /  ,lBB13E  
   2D95G 15#<= !LL22$Q";%< 3  0,"F"F57P#   036:N3O/P+,$:$?$?$A!!((0D112\%5HH*+<=D-.?@CG#D$9$9:\%=PP )#,#8#/ LL22 %W 3   2 LL22$w 3 
 ++>?3F-.ABcI-.. u /  D112\%5HH*+>?3F-.ABcI-(3,LL**HH z W +  %(>><<**LL**4*8

))008&& )U '  &&!*X '   	LL""LqP #  	s   ])^
 ,^
 
	^<^77^<N)__name__
__module____qualname__r   rl        r   r
   r
     s    Werq   r
   c                  X	   t        j                         } | j                  t        d6i dt        dddg      dt        d      d	t        dd
d	g      dt        dd      dt        d      dt        d      dt        d      dt        d      dt        d      dt        d      dt        d      dt        d      dt        d      dt        dd      dt        d      dt        d      dt        d      dt        d      dt        d      d t        d      d!t        d      d"t        d      d#t        d      d$t        d      d%t        d      d&t        d      d't        d      d(t        d      d)t        d      d*t        d      d+t        d      d,t        d      d-t        dd./      d0t        d      d1t        dd2      d3t        ddd24             t	        | d5      }|j
                  d   }|j
                  d   }|j
                  d	   }|j
                  d   }|j
                  d   }|j
                  d   }|j
                  d   }|j
                  d   }	|j
                  d   }
|j
                  d   }|j
                  d   }|j
                  d   }|j
                  d   }|j
                  d   }|j
                  d   }|j
                  d   }|j
                  d   }|j
                  d   }|j
                  d    }|j
                  d!   }|j
                  d"   }|j
                  d#   }|j
                  d$   }|j
                  d%   }|j
                  d&   }|j
                  d'   }|j
                  d(   }|j
                  d)   }|j
                  d*   }|j
                  d+   }|j
                  d1   } |j
                  d3   }!|j
                  d   }"|j
                  d,   }#|j
                  d-   }$|j
                  d0   }%t        |      }&|&j                         }' |&j                  g |'||||||||	|
|||||||||||||||||||||| |!|"|#|$|%  y )7Nr   rT   r   r   )typechoicesr   rX   )rs   r    r   r"   r^   )rs   elementsr#   r$   r%   r&   r'   rY   r(   r)   r*   r0   r+   T)rs   no_logrd   r@   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   rA   rB   1h)rs   defaultre   rH   FrM   )rs   ru   rv   )argument_specsupports_check_moderp   )	rU   zabbix_common_argument_specr`   dictr   rf   r
   r   rl   )(ry   moduler   r   r    r"   r#   r$   r%   r&   r'   r(   r)   r*   r0   r+   rd   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   rH   rM   r@   rA   rB   re   r   rc   s(                                           r   mainr~     sM    <<>M '	
 $%*f9M N'	
"/'	
 !%8:K$L'	
  $%@'	
 !%& 1'	
 !f-'	
 #/'	
 &'	
 &'	
 5)'	
 #'E"2'	
 5)'	
 !%& 1'	
   $t<!'	
"  $/#'	
$ !f-%'	
& #/''	
( #.)'	
* 5)+'	
, 5)-'	
. %)e$4/'	
0 "u-1'	
2  $/3'	
4  $05'	
6 "&6!27'	
8 &*v%69'	
: '+&7;'	
< (,'8='	
> !%& 1?'	
@ %)f$5A'	
B !%& 1C'	
D !f-E'	
F $(UD#AG'	
H #.I'	
J #e<K'	
L  $%NM'	
)T DQF --(=>&9:mm$56O';< --(=>mm$56O&9:k*Ik*I==0L"MM*AB==0L --(=>';<';<&9:&9:==0L==0L$mm,EF}}%78';<';<!==)?@%}}-GH &.I J!'/K!L --(=>$mm,EF --(=>&9:';<mm$56Omm$56O#]]+CD&9:#F+N+>>@(N(( &&& 	& 		&
 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&  	!&" 	#&$ 	%&& 	'&( 	)&* 	 +&, 	-&. 	/&0 	1&2 	3&4 	!5&6 	"7&8 	#9&: 	;&< 	 =&> 	?&@ 	A&B 	C&D 	E&F 	G&H 	I&J 	K&rq   __main__)
__future__r   r   r   rs   __metaclass__DOCUMENTATIONEXAMPLESRETURNansible.module_utils.basicr   >ansible_collections.community.zabbix.plugins.module_utils.baser   #ansible.module_utils.compat.versionr   Aansible_collections.community.zabbix.plugins.module_utils.helpers	communityzabbixpluginsmodule_utilshelpersrU   r
   r~   rm   rp   rq   r   <module>r      sj    A @{zHT
 5 U < X X XoZ od	|~ zF rq   