
    x[h               
          U d Z ddlZddlZddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZmZmZ ddlmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZ deegdgdZeed<    ej<                  e      Z dZ! G d dejD                        Z# G d de#      Z$ G d de#      Z%de&dedede'ddf
dZ(de)fdZ*de)de)fdZ+de#de)fd Z,de)de#fd!Z-de)de#fd"Z.y)#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                       e Zd ZdefdZdeej                     fdZde	fdZ
d ZdefdZd	 Zej                   d
        Zej                   de	fd       Zy)AnsiblePulldistroc                     dg| _         ddg| _        || _        i | _        d | _        t
        j                  j                  dd      | j                  d<   y )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__zAnsiblePull.__init__    sM    '(*K8'+ ::>>&':    returnc                    | j                  | j                        \  }}|j                         j                  d      }t	        j
                  d|      }|r0|j                  d      }t        j                  j                  |      S y )Nr   z	([\d\.]+))
do_asr   
splitlinespopresearchgroupr   Versionfrom_str)r#   stdout_
first_linematchesversions         r$   get_versionzAnsiblePull.get_version+   sn    JJt//0	&&(,,Q/
))L*5mmA&G$$--g66r&   c                 J    | j                  g | j                  |      \  }}|S N)r)   r   )r#   argsr1   r2   s       r$   pullzAnsiblePull.pull4   s(    JJ6667	r&   c                 :    | j                         st        d      y )Nz!command: ansible is not installed)is_installed
ValueErrorr#   s    r$   
check_depszAnsiblePull.check_deps8   s      "@AA #r&   commandc                     | j                   s | j                  |fi |S  | j                  j                  || j                   fi |S r8   )r   r   r   r)   r#   r@   kwargss      r$   r)   zAnsiblePull.do_as<   sA    }}499W/// t{{  $--B6BBr&   c                     t        j                         5  t        j                  |fd| j                  i|cd d d        S # 1 sw Y   y xY w)N
update_env)r   suspend_crashr   r   rB   s      r$   r   zAnsiblePull.subpA   sA    ))+ 	E99WDDVD	E 	E 	Es   "AA
c                      y r8    r>   s    r$   r<   zAnsiblePull.is_installedE       r&   pkg_namec                      y r8   rH   r#   rJ   s     r$   installzAnsiblePull.installI   rI   r&   N)__name__
__module____qualname__r   r%   r   r   r/   r6   strr:   r?   listr)   r   abcabstractmethodr<   rM   rH   r&   r$   r   r      s    	;v 	;Xi&7&78 S BCT C
E 	  	  r&   r   c                   R     e Zd Zdedee   f fdZd Zd ZdefdZ	de
fd	Z xZS )
AnsiblePullPipr   userc                 R    t         |   |       || _        | j                          y r8   )superr%   r   add_pip_install_site_to_pathr#   r   rW   	__class__s      r$   r%   zAnsiblePullPip.__init__O   s#     ))+r&   c                    | j                   rx| j                  t        j                  ddg      \  }}| d}| j                  j                  d      }|r!dj                  ||g      | j                  d<   y || j                  d<   y y )Nz-cz&import site; print(site.getuserbase())z/bin/PATH:)r   r)   sys
executabler   r"   join)r#   	user_baser2   ansible_pathold_paths        r$   rZ   z+AnsiblePullPip.add_pip_install_site_to_pathT   s    ==::NN<LIq ([.Lxx||F+H#&88X|,D#E #/  r&   c                     	 dd l }y # t        $ r3 | j                  j                  | j                  j                  g       Y y w xY w)Nr   )pipImportErrorr   install_packagespip_package_name)r#   rg   s     r$   bootstrap_pip_if_requiredz(AnsiblePullPip.bootstrap_pip_if_requirede   s;    	I 	IKK(($++*F*F)GH	Is    9AArJ   c                    | j                          | j                         st        j                  dddg}t        j
                  j                  t        j
                  j                  t        j                  d      d            r|j                  d       | j                  r|j                  d       | j                  g |dd       | j                  g ||       y	y	)
zishould cloud-init grow an interface for non-distro package
        managers? this seems reusable
        -mrg   rM   stdlibzEXTERNALLY-MANAGEDz--break-system-packages--userz	--upgradeN)rk   r<   r`   ra   r    pathexistsrb   	sysconfigget_pathappendr   r)   )r#   rJ   cmds      r$   rM   zAnsiblePullPip.installk   s     	&&(  "	C ww~~&&x02F
 

45}}

8$JJ11k1512JJ''h'(% #r&   r'   c                     t         j                  dddg}| j                  r|j                  d       | j	                  |      \  }}d|v S )Nrm   rg   rR   ro   r   )r`   ra   r   rt   r)   )r#   ru   r1   r2   s       r$   r<   zAnsiblePullPip.is_installed   sC    ~~tUF3==JJx JJsO	F""r&   )rN   rO   rP   r   r   rQ   r%   rZ   rk   rM   boolr<   __classcell__r\   s   @r$   rV   rV   N   s=    ,v ,Xc] ,
0"I) )4#d #r&   rV   c                   F     e Zd Zdedee   f fdZdefdZdefdZ	 xZ
S )AnsiblePullDistror   rW   c                 2    t         |   |       || _        y r8   )rY   r%   r   r[   s      r$   r%   zAnsiblePullDistro.__init__   s     r&   rJ   c                 ^    | j                         s| j                  j                  |g       y y r8   )r<   r   ri   rL   s     r$   rM   zAnsiblePullDistro.install   s'      "KK(((4 #r&   r'   c                 >    t        t        j                  d            S )Nr   )rw   r   whichr>   s    r$   r<   zAnsiblePullDistro.is_installed   s    DJJy)**r&   )rN   rO   rP   r   r   rQ   r%   rM   rw   r<   rx   ry   s   @r$   r{   r{      s2    v Xc] 5 5+d +r&   r{   namecfgcloudr9   r'   c                 ^   |j                  di       }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }	|j                  dd      }
|rt        |       |j                  }|d	k(  rt        ||      }nt	        ||      }|j                  |
       |j                          |j                  d
d      }|r||j                  t        <   |rt        ||       |	rt        |t        |	             |rt        ||       y y y )Nr   r   install_methodsetup_controllergalaxyr:   package_name rg   r   )r"   validate_configr   rV   r{   rM   r?   r   CFG_OVERRIDEansible_galaxyrun_ansible_pullr   ansible_controller)r   r   r   r9   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>(6GKK%:w/Whx&89/9 - r&   c                 z   d}|D ]  }t        | |      rt        d| d|         | j                  d      r$dD ]  }t        | |      rt        d| d|         | j                  d      }|r9t        |j                  d      |j                  d      g      st        d	|       | d
   }|dvrt        d      y )N)r   r   zMissing required key 'z' from r:   )zpull/urlzpull/playbook_namer   repositoriesrun_ansiblezMissing required key from r   )rg   r   z Invalid install method {install})r   r=   r"   any)r   required_keyskeycontroller_cfgrM   s        r$   r   r      s    M  IsC(5cU'#GHHI wwv3 	MC"3, #9#gcU!KLL	M WW/0N"">2""=1
 9.9IJKK"#G'';<< (r&   c                 ~    | j                         D ci c]  \  }}|dur|j                  dd      | c}}S c c}}w )zremove boolean false valuesFr2   -)itemsreplace)r   r   values      r$   filter_argsr      sF      IIKS% 	Cu$  s   !9r:   c                    |j                  d      }| j                         }|st        j                  d       n^|t	        j
                  ddd      k  rD|j                  d      r3t        d|j                   d|j                   d|j                   d	       | j                  g t        |      j                         D cg c]  \  }}|d
urd| d| nd|  c}}| }|r!t        j                  j!                  |        y y c c}}w )Nplaybook_namezCannot parse ansible version      r   diffzAnsible version .z%doesn't support --diff flag, exiting.T--=)r+   r6   LOGwarningr   r/   r"   r=   majorminorpatchr:   r   r   r`   r1   write)r:   r   r   vr   r   r1   s          r$   r   r      s   1MA23	
Yq!Q'	'776?"177)1QWWIQqwwi78  TYY  *#.446

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

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

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

s   D	c                     | j                  dg       }|st        j                  d|        |D ]  }|j                  |        y )NactionszInvalid config: %s)r"   r   r   r)   )r   r   r   r@   s       r$   r   r      s?    ggi$G(#. gr&   c           
      x   | j                  dg       D ]  }|j                  dd|d   |d   g        | j                  dg       D ]m  }|j                  d      }|j                  d      }d	|gt        |      j	                         D cg c]  \  }}d
| d|  c}}}|j                  ||       o y c c}}w )Nr   gitclonesourcerp   r   playbook_dirr   zansible-playbookr   r   )cwd)r"   r)   r+   r   r   )	r   r   
repositoryr9   r   r   r   r   r@   s	            r$   r   r     s    ggnb1 

GZ1:f3EF	

 r* 1xx/1
 4?t3D3J3J3LMZS%3%q M

 	g<01 Ns   	B6
)/__doc__rS   loggingr    r,   r`   rr   copyr   typingr   	cloudinitr   r   r   cloudinit.cloudr   cloudinit.configr	   cloudinit.config.schemar
   cloudinit.distrosr   r   cloudinit.settingsr   cloudinit.utilr   r   __annotations__	getLoggerrN   r   r   ABCr   rV   r{   rQ   rR   r   dictr   r   r   r   r   rH   r&   r$   <module>r      s   ? 
  	 	 
    5 5 ! # . 1 + * } ){	j  g!,#'' ,^>#[ >#B
+ 
+": ":6 ":% ":t ": ":J= =8T d &; &T &0 { 1D 1; 1r&   