
    Vh|y                     n   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Zd dlZd dlmZ d dlmZ  ej                   d	ej"                        Z ej                   d
      Zg dZ G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      ZddZd Zedk(  r e        yy)    )absolute_importdivisionprint_functiona  
module: pamd
author:
  - Kenneth D. Evensen (@kevensen)
short_description: Manage PAM Modules
description:
  - Edit PAM service's type, control, module path and module arguments.
  - In order for a PAM rule to be modified, the type, control and module_path must match an existing rule. See man(5) pam.d
    for details.
notes:
  - This module does not handle authselect profiles.
extends_documentation_fragment:
  - community.general.attributes
attributes:
  check_mode:
    support: full
  diff_mode:
    support: none
options:
  name:
    description:
      - The name generally refers to the PAM service file to change, for example system-auth.
    type: str
    required: true
  type:
    description:
      - The type of the PAM rule being modified.
      - The O(type), O(control), and O(module_path) options all must match a rule to be modified.
    type: str
    required: true
    choices: [account, -account, auth, -auth, password, -password, session, -session]
  control:
    description:
      - The control of the PAM rule being modified.
      - This may be a complicated control with brackets. If this is the case, be sure to put "[bracketed controls]" in quotes.
      - The O(type), O(control), and O(module_path) options all must match a rule to be modified.
    type: str
    required: true
  module_path:
    description:
      - The module path of the PAM rule being modified.
      - The O(type), O(control), and O(module_path) options all must match a rule to be modified.
    type: str
    required: true
  new_type:
    description:
      - The new type to assign to the new rule.
    type: str
    choices: [account, -account, auth, -auth, password, -password, session, -session]
  new_control:
    description:
      - The new control to assign to the new rule.
    type: str
  new_module_path:
    description:
      - The new module path to be assigned to the new rule.
    type: str
  module_arguments:
    description:
      - When O(state=updated), the O(module_arguments) will replace existing module_arguments.
      - When O(state=args_absent) args matching those listed in O(module_arguments) will be removed.
      - When O(state=args_present) any args listed in O(module_arguments) are added if missing from the existing rule.
      - Furthermore, if the module argument takes a value denoted by C(=), the value will be changed to that specified in
        module_arguments.
    type: list
    elements: str
  state:
    description:
      - The default of V(updated) will modify an existing rule if type, control and module_path all match an existing rule.
      - With V(before), the new rule will be inserted before a rule matching type, control and module_path.
      - Similarly, with V(after), the new rule will be inserted after an existing rulematching type, control and module_path.
      - With either V(before) or V(after) O(new_type), O(new_control), and O(new_module_path) must all be specified.
      - If state is V(args_absent) or V(args_present), O(new_type), O(new_control), and O(new_module_path) will be ignored.
      - State V(absent) will remove the rule.
    type: str
    choices: [absent, before, after, args_absent, args_present, updated]
    default: updated
  path:
    description:
      - This is the path to the PAM service files.
    type: path
    default: /etc/pam.d
  backup:
    description:
      - Create a backup file including the timestamp information so you can get the original file back if you somehow clobbered
        it incorrectly.
    type: bool
    default: false
aK  
- name: Update pamd rule's control in /etc/pam.d/system-auth
  community.general.pamd:
    name: system-auth
    type: auth
    control: required
    module_path: pam_faillock.so
    new_control: sufficient

- name: Update pamd rule's complex control in /etc/pam.d/system-auth
  community.general.pamd:
    name: system-auth
    type: session
    control: '[success=1 default=ignore]'
    module_path: pam_succeed_if.so
    new_control: '[success=2 default=ignore]'

- name: Insert a new rule before an existing rule
  community.general.pamd:
    name: system-auth
    type: auth
    control: required
    module_path: pam_faillock.so
    new_type: auth
    new_control: sufficient
    new_module_path: pam_faillock.so
    state: before

- name: Insert a new rule pam_wheel.so with argument 'use_uid' after an existing rule pam_rootok.so
  community.general.pamd:
    name: su
    type: auth
    control: sufficient
    module_path: pam_rootok.so
    new_type: auth
    new_control: required
    new_module_path: pam_wheel.so
    module_arguments: 'use_uid'
    state: after

- name: Remove module arguments from an existing rule
  community.general.pamd:
    name: system-auth
    type: auth
    control: required
    module_path: pam_faillock.so
    module_arguments: ''
    state: updated

- name: Replace all module arguments in an existing rule
  community.general.pamd:
    name: system-auth
    type: auth
    control: required
    module_path: pam_faillock.so
    module_arguments: 'preauth silent deny=3 unlock_time=604800 fail_interval=900'
    state: updated

- name: Remove specific arguments from a rule
  community.general.pamd:
    name: system-auth
    type: session
    control: '[success=1 default=ignore]'
    module_path: pam_succeed_if.so
    module_arguments: crond,quiet
    state: args_absent

- name: Ensure specific arguments are present in a rule
  community.general.pamd:
    name: system-auth
    type: session
    control: '[success=1 default=ignore]'
    module_path: pam_succeed_if.so
    module_arguments: crond,quiet
    state: args_present

- name: Ensure specific arguments are present in a rule (alternative)
  community.general.pamd:
    name: system-auth
    type: session
    control: '[success=1 default=ignore]'
    module_path: pam_succeed_if.so
    module_arguments:
      - crond
      - quiet
    state: args_present

- name: Module arguments requiring commas must be listed as a Yaml list
  community.general.pamd:
    name: special-module
    type: account
    control: required
    module_path: pam_access.so
    module_arguments:
      - listsep=,
    state: args_present

- name: Update specific argument value in a rule
  community.general.pamd:
    name: system-auth
    type: auth
    control: required
    module_path: pam_faillock.so
    module_arguments: 'fail_interval=300'
    state: args_present

- name: Add pam common-auth rule for duo
  community.general.pamd:
    name: common-auth
    new_type: auth
    new_control: '[success=1 default=ignore]'
    new_module_path: '/lib64/security/pam_duo.so'
    state: after
    type: auth
    module_path: pam_sss.so
    control: 'requisite'
z
change_count:
  description: How many rules were changed.
  type: int
  sample: 1
  returned: success
backupdest:
  description:
    - The file name of the backup file, if created.
  returned: success
  type: str
)AnsibleModuleN)NamedTemporaryFile)datetimez(?P<rule_type>-?(?:auth|account|session|password))\s+
                        (?P<control>\[.*\]|\S*)\s+
                        (?P<path>\S*)\s*
                        (?P<args>.*)\s*z(\[.*\]|\S*))accountz-accountauthz-authpasswordz	-passwordsessionz-sessionc                   6    e Zd Zd Zed        Zd ZddZd Zy)PamdLinec                 .    || _         d | _        d | _        y N)lineprevnext)selfr   s     j/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/modules/pamd.py__init__zPamdLine.__init__   s    			    c                 @    | j                   j                         dk(  ryy)N TF)r   stripr   s    r   is_validzPamdLine.is_valid  s    99??"r   c                 ^    | j                   sdd| j                  z   fS dd| j                  z   fS )NFzRule is not valid TRule is valid )r   r   r   s    r   validatezPamdLine.validate  s3    }}.:::%		111r   Nc                      y)NF r   	rule_typerule_control	rule_path	rule_argss        r   matcheszPamdLine.matches  s    r   c                 ,    t        | j                        S r   )strr   r   s    r   __str__zPamdLine.__str__  s    499~r   r   )	__name__
__module____qualname__r   propertyr   r   r'   r*   r!   r   r   r   r      s*    
  
2r   r   c                       e Zd Zy)PamdEmptyLineN)r+   r,   r-   r!   r   r   r0   r0     s    r   r0   c                   .     e Zd Z fdZed        Z xZS )PamdCommentc                 ,    t         t        |   |       y r   )superr2   r   r   r   	__class__s     r   r   zPamdComment.__init__      k4)$/r   c                 <    | j                   j                  d      ryy)N#TFr   
startswithr   s    r   r   zPamdComment.is_valid  s    99$r   r+   r,   r-   r   r.   r   __classcell__r6   s   @r   r2   r2     s    0  r   r2   c                   .     e Zd Z fdZed        Z xZS )PamdIncludec                 ,    t         t        |   |       y r   )r4   r@   r   r5   s     r   r   zPamdInclude.__init__%  r7   r   c                 <    | j                   j                  d      ryy)N@includeTFr:   r   s    r   r   zPamdInclude.is_valid(  s    99
+r   r<   r>   s   @r   r@   r@   $  s    0  r   r@   c                       e Zd Zg dZg dZg dZddZddZed        Z	d Z
ed	        Zej                  d
        Zed        Zej                  d        Zed        Zed        Zed        Zd Zy)PamdRule)required	requisite
sufficientoptionalincludesubstack
definitive)!successopen_err
symbol_errservice_err
system_errbuf_errperm_deniedauth_errcred_insufficientauthinfo_unavailuser_unknownmaxtriesnew_authtok_reqdacct_expiredsession_errcred_unavailcred_expiredcred_errno_module_dataconv_errauthtok_errauthtok_recover_errauthtok_lock_busyauthtok_disable_aging	try_againignoreabortauthtok_expiredmodule_unknownbad_item
conv_again
incompletedefault)rf   baddieokdoneresetNc                 t    d | _         d | _        d | _        d | _        || _        || _        || _        || _        y r   )r   r   _control_argsr#   r$   r%   r&   r"   s        r   r   zPamdRule.__init__;  s;    		
"(""r   c                 d    || j                   k(  xr  || j                  k(  xr || j                  k(  S r   )r#   r$   r%   r"   s        r   r'   zPamdRule.matchesG  s7    T^^+ , 1 11,T^^+	-r   c                     t         j                  |      }t        |j                  d            } | |j                  d      |j                  d      |j                  d      |      S )Nargsr#   controlpath)
RULE_REGEXsearchparse_module_argumentsgroup)clsr   
rule_matchr&   s       r   rule_from_stringzPamdRule.rule_from_stringL  s[    &&t,
*:+;+;F+CD	:##K0*2B2B92MzO_O_`fOgirssr   c                    | j                   rKdj                  | j                  | j                  | j                  dj                  | j                               S dj                  | j                  | j                  | j                        S )Nz{0: <11}{1} {2} {3} z{0: <11}{1} {2})r&   formatr#   r$   r%   joinr   s    r   r*   zPamdRule.__str__R  sg    >>(//@Q@QSWSaSacfckcklplzlzc{|| ''8I8I4>>ZZr   c                     t        | j                  t              r!ddj                  | j                        z   dz   S | j                  S )N[r   ])
isinstancert   listr   r   s    r   r$   zPamdRule.rule_controlW  s7    dmmT*$--00366}}r   c                     |j                  d      rI|j                  dd      j                  dd      j                  dd      }|j                  d      | _        y || _        y )Nr   z = =r   r   r   )r;   replacesplitrt   )r   ry   s     r   r$   zPamdRule.rule_control]  sR    c"ooeS199#rBJJ3PRSG#MM#.DM#DMr   c                 6    | j                   sg S | j                   S r   )ru   r   s    r   r&   zPamdRule.rule_argse  s    zzIzzr   c                 $    t        |      | _        y r   )r}   ru   )r   rx   s     r   r&   zPamdRule.rule_argsk  s    +D1
r   c                     t        |       S r   )r)   r   s    r   r   zPamdRule.lineo  s    4yr   c                 J    d}	 t        |      }|dk\  ryy# t        $ r Y yw xY w)Nr   FT)int
ValueError)r   
string_numnumbers      r   is_action_unsigned_intzPamdRule.is_action_unsigned_ints  s8    	_F Q;  		s    	""c                 (    | j                         d   S )Nr   )r   r   s    r   r   zPamdRule.is_valid  s    }}q!!r   c                    | j                   t        vr!dd| j                   z   dz   | j                  z   fS t        | j                  t
              r=| j                  t        j                  vr!dd| j                  z   dz   | j                  z   fS t        | j                  t              r| j                  D ]  }|j                  d      \  }}|t        j                  vrdd|z   dz   | j                  z   fc S |t        j                  vsUt        j                  |      rkdd|z   dz   | j                  z   fc S  dd	| j                  z   fS )
NFzRule type, z, is not valid in rule zRule control, r   zRule control value, zRule control action, Tr   )r#   VALID_TYPESr   r   rt   r)   r$   rE   valid_simple_controlsr   r   valid_control_valuesvalid_control_actionsr   )r   ry   valueactions       r   r   zPamdRule.validate  s:   >>,-$..8;TTW[W`W````dmmS)d.?.?xGeGe.e*T->->>AZZ]a]f]fffft,== k 'c 2v = == "85"@C\"\_c_h_h"hhh!?!??HgHghnHo "9F"BE^"^aeajaj"jjjk %		111r   r   )r+   r,   r-   r   r   r   r   r'   classmethodr   r*   r.   r$   setterr&   r   r   r   r   r!   r   r   rE   rE   /  s    t5 L	#-
 t t
[
  
 $ $  
 2 2   	 	 " "2r   rE   c                   `    e Zd Zd Zd Zd Zd Zd Z	 ddZ	 ddZ		 dd	Z
d
 Zd Zd Zd Zy)PamdServicec                    d | _         d | _        |j                         D ]  }|j                         j	                  d      rt        |      }n_|j                         j	                  d      rt        |      }n4|j                         dk(  rt        |      }nt        j                  |      }| j                  |        y )Nr9   rC   r   )_head_tail
splitlineslstripr;   r2   r@   r   r0   rE   r   append)r   contentr   	pamd_lines       r   r   zPamdService.__init__  s    

&&( 
	#D{{}'','-	))*5'-	#)$/	$55d;	KK	"
	#r   c                     | j                   |x| _         | _        y | j                  |_        d |_        || j                  _        || _        y r   )r   r   r   r   )r   r   s     r   r   zPamdService.append  s>    ::&//DJ!ZZIN!IN'DJJO"DJr   c                 V   | j                   }d}||j                  |||      rv|j                  C|j                  |j                  _        |j                  >|j                  |j                  _        n"|j                  | _         d |j                  _        |dz  }|j                  }||S Nr      )r   r'   r   r   )r   r#   r$   r%   current_linechangeds         r   removezPamdService.remove  s    zz&##I|YG$$0-9->->L%%*#((41=1B1B)).!-!2!2DJ-1L%%*1',,L & r   c                     g }| j                   }|Ct        |t              r$|j                  |||      r|j	                  |       |j
                  }|C|S r   )r   r   rE   r'   r   r   )r   r#   r$   r%   linesr   s         r   getzPamdService.get  sY    zz&,1l6J6J9Vbdm6n\*',,L & r   c                 ,    | j                  |||      ryy)NTF)r   )r   r#   r$   r%   s       r   has_rulezPamdService.has_rule  s    88I|Y7r   Nc                 <   | j                  |||      }t        |d      }d}	|D ]t  }
d}|r|
j                  |k7  r	d}||
_        |r|
j                  |k7  r	d}||
_        |r|
j                  |k7  r	d}||
_        ||
j
                  |k7  r	d}||
_        |sp|	dz  }	v |	S )NT)return_noner   Fr   )r   r}   r#   r$   r%   r&   )r   r#   r$   r%   new_typenew_controlnew_pathnew_argsrules_to_findchangescurrent_rulerule_changeds               r   update_rulezPamdService.update_rule  s     L)D)(E) 	L L))X5#'L-5L*,,;#'L0;L-))X5#'L-5L*#))X5#'L-5L*1)	, r   c                    | j                  |||      }d}	|D ]  }
t        ||||      }|
j                  }|;t        |t        t
        f      r%|j                  }|t        |t        t
        f      r%|5|j                  |||      s"||_        ||_        |
|_        ||
_        |	dz  }	||
j                  || _        n||
j                  _        |
j                  |_        |
|_        ||
_        |	dz  }	 |	S r   )	r   rE   r   r   r2   r0   r'   r   r   )r   r#   r$   r%   r   r   r   r   r   r   r   new_ruleprevious_rules                r   insert_beforezPamdService.insert_before  s    L)D
 * #	L+xJH(--M  +
=;XeJf0g - 2 2  +
=;XeJf0g (1F1FxQ\^f1g%-" - ,$,!1 &  $$,!)DJ .6L%%* , 1 1 ,$,!1G#	J r   c                    | j                  |||      }d}	|D ]  }
|
j                  }|;t        |t        t        f      r%|j                  }|t        |t        t        f      r%t        ||||      }|5|j                  |||      s"||_        ||_        |
|_        ||
_        |	dz  }	|| j                  |_        d |_        || j                  _        || _        ||
_        |	dz  }	 |	S r   )	r   r   r   r2   r0   rE   r'   r   r   )r   r#   r$   r%   r   r   r   r   r   r   r   	next_ruler   s                r   insert_afterzPamdService.insert_after&  s    L)D *  	L$))I 'Jy;P]B^,_%NN	 'Jy;P]B^,_  +xJH$Y->->xV^-_ "*	 ) ,$,!1 " $

 $"*

%
$,!1A 	D r   c                 J   | j                  |||      }t        |      }d}|D ]  }d}t               }	t               }
|D ]C  }|j	                  d      rd|v r|j                  d      \  }}||
|<   3|	j                  |       E t        |
      }t               }t               }|j                  D ]C  }|j	                  d      rd|v r|j                  d      \  }}|||<   3|j                  |       E t        |      }t               }|	j                  |      r'|	j                  |      D ]  }|j                  |        |j                  |      r0|j                  |      D ]  }|j                  |dz   |
|   z           |r|xj                  |z  c_        d}|j                  |      ri|j                  |      D ]U  }||   |
|   k7  s|j                  j                  |dz   ||   z         }t        |dz   |
|   z         |j                  |<   d}W |s|dz  } |S )Nr   Fr   r   Tr   )r   r}   setdictr;   r   addr&   r   
differencer   intersectionindexr)   )r   r#   r$   r%   args_to_addr   r   r   r   simple_new_argskey_value_new_argsargkeyr   key_value_new_args_setsimple_current_argskey_value_current_argskey_value_current_args_setnew_args_to_add	arg_indexs                       r   add_module_argumentsz PamdService.add_module_argumentsR  se   L)D,[9) 9	L L "eO!%" ->>#&CZ!$3JC.3&s+#'',- &));%<""%%%)V"#-- 1>>#&CZ!$3JC27*3/'++C01 *--C)D&"fO ))*=>*556IJ 0C#**3/0 &001KL1<<=WX PC#**397I#7N+NOP &&/9&# &223MN1>>?YZ ,C-c26H6MM$0$:$:$@$@sMcdgMhAh$i	<?c	L^_bLc@c<d..y9'+	, 1s9	v r   c                    | j                  |||      }t        |      }d}|D ]Z  }|sg }t        t        |j                        t        |      z        s2|j                  D cg c]	  }||vs| c}|_        |dz  }\ |S c c}w r   )r   r}   r   r   r&   )	r   r#   r$   r%   args_to_remover   r   r   r   s	            r   remove_module_argumentsz#PamdService.remove_module_arguments  s    L)D/?) 	L!!# L223c.6IIJ 6B5K5K%icsZhOhc%iL"qLG	 	 &js   #	B-Bc                 l    | j                   }|&|j                         }|d   s|S |j                  }|&y)Nr   )TzModule is valid)r   r   r   )r   r   curr_validates      r   r   zPamdService.validate  sE    zz&(113M #$$',,L	 &
 'r   c                    g }| j                   }dt        j                         j                         z  }|)|j	                  t        |             |j                  }|)t        |      dk  r%|j                  dd       |j                  d|       n,|d   j                  d      r||d<   n|j                  d|       dj                  |      dz   S )Nz# Updated by Ansible - %sr   r   r   z# Updated by Ansible
)r   r   now	isoformatr   r)   r   leninsertr;   r   )r   r   r   marks       r   r*   zPamdService.__str__  s    zz*X\\^-E-E-GG&LL\*+',,L & u:?LLBLLD!Qx""#9:aQ%yy$&&r   )NNNN)r+   r,   r-   r   r   r   r   r   r   r   r   r   r   r   r*   r!   r   r   r   r     sX    ##$
 NRB PT.b OS*XCJ2''r   r   c                 r   | |rd S g S t        | t              rt        |       dk(  r| d   sg S t        | t              s| g} g }t        j                  d      }| D ]Z  }t        d t        j                  |            D ]6  }|j                  d      s|j                  d|       |j                  |       8 \ |S )Nr   r   z\s*=\s*r   r   )r   r   r   recompilefilterRULE_ARG_REGEXfindallr;   subr   )module_argumentsr   parsed_argsre_clear_spacesr   items         r   r}   r}     s     "t**"D)c2B.Cq.HQabcQd	&-,- Kjj,O %4!7!7!<= 	%D??3'##C.t$	%% r   c                  
   t        t        t        dd      t        ddt              t        dd      t        dd      t        dt              t        d      t        d      t        dd      t        dd	g d
      t        dd      t        dd            ddddgfdddgfddg dfddg dfg      } t               }t        j
                  j                  | j                  d   | j                  d         }	 t        |d      5 }|j                         }d d d        t        |      }| j                  d   }d }|d	k(  rt|j                  | j                  d!   | j                  d"   | j                  d#   | j                  d$   | j                  d%   | j                  d&   | j                  d         }n|dk(  rt|j                  | j                  d!   | j                  d"   | j                  d#   | j                  d$   | j                  d%   | j                  d&   | j                  d         }n|dk(  rt|j                  | j                  d!   | j                  d"   | j                  d#   | j                  d$   | j                  d%   | j                  d&   | j                  d         }n%|dk(  rI|j!                  | j                  d!   | j                  d"   | j                  d#   | j                  d         }n|dk(  rt#        | j                  d         D cg c]  }|j%                  d'      s| c}r| j                  d(       |j'                  | j                  d!   | j                  d"   | j                  d#   | j                  d         }n?|d)k(  r:|j)                  | j                  d!   | j                  d"   | j                  d#         }|j+                         \  }	}
|	s| j                  |
       t        |d kD  |d*+      }| j,                  s|d,   r| j                  d-   r| j/                  |      |d.<   	 t1        d/| j2                  d0      }t        |j4                  d/      5 }|j7                  t        |             d d d        | j9                  |j4                  t        j
                  j;                  |              | j<                  d2i | y # 1 sw Y   xY w# t        $ r-}| j                  d|dt        |      d       Y d }~d }~ww xY wc c}w # 1 sw Y   xY w# t        $ r | j                  d1z         Y w xY w)3Nr)   T)typerF   )r   rF   choices)r   r   )r   r   )r   elementsupdated)absentafterargs_absentargs_presentbeforer   )r   rm   r   rz   z
/etc/pam.d)r   rm   boolF)namer   ry   module_pathr   r   new_module_pathr   staterz   backupr  r   r   r   r   )r   r   r  r   )argument_specsupports_check_moderequired_ifr   rz$Unable to open/read PAM module file z with error .)msgr   r   ry   r   r   r   r  r   z\Unable to process bracketed '[' complex arguments with 'args_present'. Please use 'updated'.r   r   )r   change_count
backupdestr   r  r  w)modedirdeletez"Unable to create temporary file %sr!   )r   r   r   r)   osrz   r   paramsopenreadIOError	fail_jsonr   r   r   r   r   r}   r;   r   r   r   
check_modebackup_localr   tmpdirr   writeatomic_moverealpath	exit_json)moduler   fnameservice_file_objeservicer   r   r   validr	  result	temp_filefds                 r   mainr&    s   54054Eed3%$7uk:%( e,!v>E9  ?F  G6<8VU3
 !n'9&:;m&8%9:h NOgMN	
F, eGGGLLv.f0EFEh% 	.!1&++-G	. '"G]]7#FG %%fmmF&;V]]9=UW]WdWderWs&,mmJ&?}A]_e_l_lm~_&,mm4F&GI 
8	''f(=v}}Y?WY_YfYfgtYu(.j(A6==Q^C_aganan  pA  bB(.6H(IK 
7	&&v}}V'<fmmI>VX^XeXefsXt'-}}Z'@&--P]B^`f`m`mn  aA'-}}5G'HJ 
=	 11&--2GW`Iacicpcpq~c28--@R2SU	>	!1&--@R2STlCX[XfXfgjXkCl!  A..v}}V/DfmmT]F^`f`m`mn{`|/5}}=O/PR	8	..v!6i8PRXR_R_`mRno!!#JE3 S!1F 	!2=="#)#6#6u#=F< 	S*uUIinnc* 'bW&' 	9>>277+;+;E+BCFvC	. 	. hX]_bcd_efggh8 m6' '  	S!E	!QR	Ssf   S) SS) T"1T"?.T3 -T'T3 S&!S) )	T2"TT'T0,T3 3UU__main__)F)
__future__r   r   r   r   __metaclass__DOCUMENTATIONEXAMPLESRETURNansible.module_utils.basicr   r  r   tempfiler   r   r   Xr{   r   r   objectr   r0   r2   r@   rE   r   r}   r&  r+   r!   r   r   <module>r1     s    C BXttl
 5 	 	 '  RZZ + -/DD2
 O,fv 4	H 		( 	( e2x e2Ts'& s'l	0^B zF r   