
    x[h               
          % S r SSKrSSKrSSKrSSKrSSKrSSKrSSKJr  SSK	J
r
  SSKJrJrJr  SSKJr  SSKJr  SSKJr  SS	KJrJr  SS
KJr  SSKJr  S\\/S/S.r\\S'   \R<                  " \5      r Sr! " S S\RD                  5      r# " S S\#5      r$ " S S\#5      r%S\&S\S\S\'SS4
S jr(S\)4S jr*S\)S\)4S jr+S\#S\)4S  jr,S\)S\#4S! jr-S\)S\#4S" jr.g)#z9ansible enables running on first boot either ansible-pull    N)deepcopy)Optional)	lifecyclesignal_handlersubp)Cloud)Config)
MetaSchema)ALL_DISTROSDistro)PER_INSTANCE)get_cfg_by_path
cc_ansibleansible)id	frequencydistrosactivate_by_schema_keysmetaansible_configc                       \ rS rSrS\4S jrS\\R                     4S jr	S\
4S jrS rS\4S	 jrS
 r\R"                  S 5       r\R"                  S\
4S j5       rSrg)AnsiblePull   distroc                     S/U l         SS/U l        Xl        0 U l        S U l        [
        R                  R                  SS5      U R                  S'   g )Nzansible-pullz	--versionHOMEz/root)cmd_pullcmd_versionr   envrun_userosenvironget)selfr   s     =/usr/lib/python3/dist-packages/cloudinit/config/cc_ansible.py__init__AnsiblePull.__init__    sK    '(*K8'+ ::>>&':    returnc                    U R                  U R                  5      u  pUR                  5       R                  S5      n[        R
                  " SU5      nU(       a0  UR                  S5      n[        R                  R                  U5      $ g )Nr   z	([\d\.]+))
do_asr   
splitlinespopresearchgroupr   Versionfrom_str)r$   stdout_
first_linematchesversions         r%   get_versionAnsiblePull.get_version+   sl    JJt//0	&&(,,Q/
))L*5mmA&G$$--g66r(   c                 H    U R                  / U R                  QUQ5      u  p#U$ N)r+   r   )r$   argsr3   r4   s       r%   pullAnsiblePull.pull4   s&    JJ6667	r(   c                 D    U R                  5       (       d  [        S5      eg )Nz!command: ansible is not installed)is_installed
ValueErrorr$   s    r%   
check_depsAnsiblePull.check_deps8   s"      ""@AA #r(   commandc                     U R                   (       d  U R                  " U40 UD6$ U R                  R                  " XR                   40 UD6$ r;   )r    r   r   r+   r$   rE   kwargss      r%   r+   AnsiblePull.do_as<   s;    }}99W///{{  --B6BBr(   c                     [         R                  " 5          [        R                  " U4SU R                  0UD6sS S S 5        $ ! , (       d  f       g = f)N
update_env)r   suspend_crashr   r   rG   s      r%   r   AnsiblePull.subpA   s4    ))+99WDDVD ,++s   #A
Ac                     g r;    rB   s    r%   r@   AnsiblePull.is_installedE       r(   pkg_namec                     g r;   rO   r$   rR   s     r%   installAnsiblePull.installI   rQ   r(   )r   r   r   r   r    N)__name__
__module____qualname____firstlineno__r   r&   r   r   r1   r8   strr=   rC   listr+   r   abcabstractmethodr@   rU   __static_attributes__rO   r(   r%   r   r      s    	;v 	;Xi&7&78 S BCT C
E 	  	  r(   r   c                   b   ^  \ rS rSrS\S\\   4U 4S jjrS rS r	S\4S jr
S	\4S
 jrSrU =r$ )AnsiblePullPipN   r   userc                 P   > [         TU ]  U5        X l        U R                  5         g r;   )superr&   r    add_pip_install_site_to_pathr$   r   rc   	__class__s      r%   r&   AnsiblePullPip.__init__O   s!     ))+r(   c                    U R                   (       az  U R                  [        R                  SS/5      u  pU S3nU R                  R                  S5      nU(       a   SR                  XC/5      U R                  S'   g X0R                  S'   g g )Nz-cz&import site; print(site.getuserbase())z/bin/PATH:)r    r+   sys
executabler   r#   join)r$   	user_baser4   ansible_pathold_paths        r%   rf   +AnsiblePullPip.add_pip_install_site_to_pathT   sy    ==::NN<LI ([.Lxx||F+H#&88X,D#E #/  r(   c                      SS K ng ! [         a3    U R                  R                  U R                  R                  /5         g f = f)Nr   )pipImportErrorr   install_packagespip_package_name)r$   ru   s     r%   bootstrap_pip_if_required(AnsiblePullPip.bootstrap_pip_if_requirede   s;    	I 	IKK(($++*F*F)GH	Is    :AArR   c                    U R                  5         U R                  5       (       d  [        R                  SSS/n[        R
                  R                  [        R
                  R                  [        R                  " S5      S5      5      (       a  UR                  S5        U R                  (       a  UR                  S5        U R                  / UQSPSP5        U R                  / UQUP5        g	g	)
zYshould cloud-init grow an interface for non-distro package
managers? this seems reusable
-mru   rU   stdlibzEXTERNALLY-MANAGEDz--break-system-packages--userz	--upgradeN)ry   r@   rm   rn   r!   pathexistsro   	sysconfigget_pathappendr    r+   )r$   rR   cmds      r%   rU   AnsiblePullPip.installk   s     	&&(  ""	C ww~~&&x02F 
 

45}}

8$JJ11k1512JJ''h'(% #r(   r)   c                     [         R                  SSS/nU R                  (       a  UR                  S5        U R	                  U5      u  p#SU;   $ )Nr|   ru   r\   r~   r   )rm   rn   r    r   r+   )r$   r   r3   r4   s       r%   r@   AnsiblePullPip.is_installed   sA    ~~tUF3==JJx JJsO	F""r(   r    )rW   rX   rY   rZ   r   r   r[   r&   rf   ry   rU   boolr@   r_   __classcell__rh   s   @r%   ra   ra   N   sB    ,v ,Xc] ,
0"I) )4#d # #r(   ra   c                   V   ^  \ rS rSrS\S\\   4U 4S jjrS\4S jrS\	4S jr
S	rU =r$ )
AnsiblePullDistro   r   rc   c                 0   > [         TU ]  U5        X l        g r;   )re   r&   r    rg   s      r%   r&   AnsiblePullDistro.__init__   s     r(   rR   c                 h    U R                  5       (       d  U R                  R                  U/5        g g r;   )r@   r   rw   rT   s     r%   rU   AnsiblePullDistro.install   s*      ""KK(((4 #r(   r)   c                 @    [        [        R                  " S5      5      $ )Nr   )r   r   whichrB   s    r%   r@   AnsiblePullDistro.is_installed   s    DJJy)**r(   r   )rW   rX   rY   rZ   r   r   r[   r&   rU   r   r@   r_   r   r   s   @r%   r   r      s7    v Xc] 5 5+d + +r(   r   namecfgcloudr<   r)   c                    UR                  S0 5      nUR                  S5      nUR                  S5      nUR                  S5      nUR                  S5      nUR                  S5      n	UR                  SS5      n
U(       a  [        U5        UR                  nUS	:X  a  [        X5      nO[	        X5      nUR                  U
5        UR                  5         UR                  S
S5      nU(       a  XR                  [        '   U(       a  [        X5        U	(       a  [        U[        U	5      5        U(       a  [        X|5        g g g )Nr   r    install_methodsetup_controllergalaxyr=   package_name ru   r   )r#   validate_configr   ra   r   rU   rC   r   CFG_OVERRIDEansible_galaxyrun_ansible_pullr   ansible_controller)r   r   r   r<   ansible_cfgansible_userr   r   
galaxy_cfgpull_cfgr   r   r   r   s                 r%   handler      s   	2.K??:.L __%56N"'9:*Jv&H??>26L$U"$V:G'=G%$)92>(6KK%:/Whx&89/9 - r(   c                    SnU H$  n[        X5      (       a  M  [        SU SU  35      e   U R                  S5      (       a*  S H$  n[        X5      (       a  M  [        SU SU  35      e   U R                  S5      nU(       a>  [        UR                  S5      UR                  S5      /5      (       d  [        S	U 35      eU S
   nUS;  a  [        S5      eg )N)r   r   zMissing required key 'z' from r=   )zpull/urlzpull/playbook_namer   repositoriesrun_ansiblezMissing required key from r   )ru   r   z Invalid install method {install})r   rA   r#   any)r   required_keyskeycontroller_cfgrU   s        r%   r   r      s    M s((5cU'#GHH  wwv3C"3,, #9#gcU!KLL 4 WW/0N"">2""=1
 
 9.9IJKK"#G'';<< (r(   c                     U R                  5        VVs0 s H  u  pUSLd  M  UR                  SS5      U_M!     snn$ s  snnf )zremove boolean false valuesFr4   -)itemsreplace)r   r   values      r%   filter_argsr      sK      IIK'LS 	%Cu$'  s   >>r=   c                 F   UR                  S5      nU R                  5       nU(       d  [        R                  S5        OeU[        R
                  " SSS5      :  aI  UR                  S5      (       a3  [        SUR                   SUR                   SUR                   S	35      eU R                  " / [        U5      R                  5        VVs/ s H  u  pEUS
La  SU SU 3OSU 3PM     snnQUP76 nU(       a!  [        R                  R!                  U 5        g g s  snnf )Nplaybook_namezCannot parse ansible version      r   diffzAnsible version .z%doesn't support --diff flag, exiting.T--=)r-   r8   LOGwarningr   r1   r#   rA   majorminorpatchr=   r   r   rm   r3   write)r=   r   r   vr   r   r3   s          r%   r   r      s   1MA23	
Yq!Q'	'776??"177)1QWWIQqwwi78  YY  *#.446

6
 #(t"3bQug2cUC6


 	F 

F8% 

s   Dc                     U R                  S/ 5      nU(       d  [        R                  SU 5        U H  nUR                  U5        M     g )NactionszInvalid config: %s)r#   r   r   r+   )r   r   r   rE   s       r%   r   r      s:    ggi$G(#.g r(   c           
      |   U R                  S/ 5       H  nUR                  SSUS   US   /5        M      U R                  S/ 5       Hl  nUR                  S5      nUR                  S5      nS	U/[        U5      R	                  5        VVs/ s H  u  pgS
U SU 3PM     snnQnUR                  XS9  Mn     g s  snnf )Nr   gitclonesourcer   r   playbook_dirr   zansible-playbookr   r   )cwd)r#   r+   r-   r   r   )	r   r   
repositoryr<   r   r   r   r   rE   s	            r%   r   r     s    ggnb1
GZ1:f3EF	
 2 r*xx/1
 4?t3D3J3J3LM3LZS3%q 3LM

 	g0 + Ns   B8
)/__doc__r]   loggingr!   r.   rm   r   copyr   typingr   	cloudinitr   r   r   cloudinit.cloudr   cloudinit.configr	   cloudinit.config.schemar
   cloudinit.distrosr   r   cloudinit.settingsr   cloudinit.utilr   r   __annotations__	getLoggerrW   r   r   ABCr   ra   r   r[   r\   r   dictr   r   r   r   r   rO   r(   r%   <module>r      s   ? 
  	 	 
    5 5 ! # . 1 + * } ){	j  !,#'' ,^>#[ >#B
+ 
+": ":6 ":% ":t ": ":J= =8T d &; &T &0 { 1D 1; 1r(   