
    쑛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
mZ ddl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)ListOptional)	lifecycle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                 F    t        j                   |fd| j                  i|S )N
update_env)r   r   rB   s      r$   r   zAnsiblePull.subpA   s    yy@TXX@@@r&   c                      y r8    r>   s    r$   r<   zAnsiblePull.is_installedD       r&   pkg_namec                      y r8   rG   r#   rI   s     r$   installzAnsiblePull.installH   rH   r&   N)__name__
__module____qualname__r   r%   r   r   r/   r6   strr:   r?   listr)   r   abcabstractmethodr<   rL   rG   r&   r$   r   r      s    	;v 	;Xi&7&78 S BCT C
A 	  	  r&   r   c                   ^     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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   rV   	__class__s      r$   r%   zAnsiblePullPip.__init__N   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$   rY   z+AnsiblePullPip.add_pip_install_site_to_pathS   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#   rf   s     r$   bootstrap_pip_if_requiredz(AnsiblePullPip.bootstrap_pip_if_requiredd   s;    	I 	IKK(($++*F*F)GH	Is    9AArI   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                  |       t        j                  d|       | j                  g ||       t        j                  d	|       y
y
)zishould cloud-init grow an interface for non-distro package
        managers? this seems reusable
        -mrf   rL   stdlibzEXTERNALLY-MANAGEDz--break-system-packages--userzInstalling the %s packagezInstalled the %s packageN)rj   r<   r_   r`   r    pathexistsra   	sysconfigget_pathappendr   _AnsiblePullPip__upgrade_pipLOGinfor)   )r#   rI   cmds      r$   rL   zAnsiblePullPip.installj   s     	&&(  "	C ww~~&&x02F
 

45}}

8$s#HH0(;JJ''h'(HH/:) #r&   rw   c                     t         j                  d       	 | j                  g |dd       t         j                  d       y# t        j                  $ r }t         j                  d|       Y d}~yd}~ww xY w)zOTry to upgrade pip then not raise an exception
        if the pip upgrade failszUpgrading pipz	--upgraderf   zUpgraded pipzZFailed at upgrading pip. This is usually not criticalso the script will skip this step.
%sN)ru   rv   r)   r   ProcessExecutionErrorwarning)r#   rw   es      r$   __upgrade_pipzAnsiblePullPip.__upgrade_pip   sr     	!	%JJ11k1512 HH^$ )) 	KK=  	s   A A7A22A7r'   c                     t         j                  dddg}| j                  r|j                  d       | j	                  |      \  }}d|v S )Nrl   rf   rQ   rn   r   )r_   r`   r   rs   r)   )r#   rw   r1   r2   s       r$   r<   zAnsiblePullPip.is_installed   sC    ~~tUF3==JJx JJsO	F""r&   )rM   rN   rO   r   r   rP   r%   rY   rj   rL   rQ   rt   boolr<   __classcell__r[   s   @r$   rU   rU   M   sI    ,v ,Xc] ,
0"I; ;8% %"#d #r&   rU   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   rV   c                 2    t         |   |       || _        y r8   )rX   r%   r   rZ   s      r$   r%   zAnsiblePullDistro.__init__   s     r&   rI   c                 ^    | j                         s| j                  j                  |g       y y r8   )r<   r   rh   rK   s     r$   rL   zAnsiblePullDistro.install   s'      "KK(((4 #r&   r'   c                 >    t        t        j                  d            S )Nr   )r~   r   whichr>   s    r$   r<   zAnsiblePullDistro.is_installed   s    DJJy)**r&   )rM   rN   rO   r   r   rP   r%   rL   r~   r<   r   r   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|	g}	|	D ]  }t        |t        |              |rt        ||       y y y )Nr   r   install_methodsetup_controllergalaxyr:   package_name rf   r   )r"   validate_configr   rU   r   rL   r?   r   CFG_OVERRIDEansible_galaxy
isinstancedictrun_ansible_pullr   ansible_controller)r   r   r   r9   ansible_cfgansible_userr   r   
galaxy_cfgpull_cfgr   r   r   r   s                 r$   handler      s1   	2.K??:.L __%56N"'9:*Jv&H??>26L$U"$V\:G'=G%$)92>(6GKK%:w/(D)$: 9 (3-89 /9 3 r&   c                    d}|D ]  }t        | |      rt        d| d|         | j                  d      }|rt        |t              r|g}nt        |t
              st        d|       |D ]  }t        |t              st        d|       t        |d      st        d|       t        |d	      }t        |d
      }t        ||g      st        d|       t        ||g      s|t        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:   zLInvalid value ansible.pull. Expected either dict of list of dicts but found z7Invalid value of ansible.pull. Expected dict but found urlz Missing required key 'url' from playbook_nameplaybook_namesz+Missing required key 'playbook_names' from zzKey 'ansible.pull.playbook_name' and 'ansible.pull.playbook_names' are mutually exclusive. Please use 'playbook_names' in r   repositoriesrun_ansiblezMissing required key from r   )rf   r   z Invalid install method {install})r   r=   r"   r   r   rQ   anyall)	r   required_keyskeyr   p_cfghas_playbookhas_playbookscontroller_cfgrL   s	            r$   r   r      s   M  IsC(5cU'#GHHI wwvHh% zHHd+$$,:/   	EeT* w   #5%0 #CE7!KLL*5/BL+E3CDMm45 A%I  m\23 77<g? 	* 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d       }|j                  dd       }|r|g}| j                         }|st        j                  d       n^|t	        j
                  ddd      k  rD|j                  d      r3t        d|j                   d	|j                   d	|j                   d
      t        |      j                         D cg c]  \  }}|durd| d| nd|  }}}|rR|t	        j
                  ddd      k\  r8 | j                  g || }|r!t        j                  j!                  |        y y |D ]9  }	 | j                  g ||	 }|st        j                  j!                  |        ; y c c}}w )Nr   r   zCannot parse ansible version      r   diffzAnsible version .z%doesn't support --diff flag, exiting.T--=   )r+   r6   ru   rz   r   r/   r"   r=   majorminorpatchr   r   r:   r_   r1   write)
r:   r   r   r   vr   r   	pull_argsr1   playbooks
             r$   r   r     s   $7M #(8$ ?N'A23	
Yq!Q'	'776?"177)1QWWIQqwwi78  &c*002C $4/"SE5'r#Z?I  	Q)##Ar1-- 7I77JJx)  ' 	.HTYY4	484F

  F8-	.s   E=c                     | j                  dg       }|st        j                  d|        |D ]  }|j                  |        y )NactionszInvalid config: %s)r"   ru   rz   r)   )r   r   r   r@   s       r$   r   r   5  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sourcero   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__rR   loggingr    r,   r_   rq   copyr   typingr   r   	cloudinitr   r   cloudinit.cloudr   cloudinit.configr	   cloudinit.config.schemar
   cloudinit.distrosr   r   cloudinit.settingsr   cloudinit.utilr   r   __annotations__	getLoggerrM   ru   r   ABCr   rU   r   rP   rQ   r   r   r   r   r   r   r   rG   r&   r$   <module>r      s   ? 
  	 	 
   ! % ! # . 1 + * } ){	j  g!+#'' +\Q#[ Q#h
+ 
+%: %:6 %:% %:t %: %:P2= 2=jT d .; .T .B { 1D 1; 1r&   