x[h UdZddlZddlZddlZddlZddlZddlZddlmZddl m Z ddl m Z m Z mZddlmZddlmZddlmZdd lmZmZdd lmZdd lmZd eegd gdZeed<ej<eZ dZ!GddejDZ#Gdde#Z$Gdde#Z%de&dedede'ddf dZ(de)fdZ*de)de)fdZ+de#de)fd Z,de)d e#fd!Z-de)d e#fd"Z.y)#z9ansible enables running on first boot either ansible-pullN)deepcopy)Optional) lifecyclesignal_handlersubp)Cloud)Config) MetaSchema) ALL_DISTROSDistro) PER_INSTANCE)get_cfg_by_path cc_ansibleansible)id frequencydistrosactivate_by_schema_keysmetaansible_configceZdZdefdZdeejfdZde fdZ dZ de fdZ d Zej d Zej d e fd Zy ) AnsiblePulldistrocdg|_ddg|_||_i|_d|_t j jdd|jd<y)Nz ansible-pullz --versionHOMEz/root)cmd_pull cmd_versionrenvrun_userosenvironget)selfrs =/usr/lib/python3/dist-packages/cloudinit/config/cc_ansible.py__init__zAnsiblePull.__init__ sM'( *K8 '+ ::>>&':returnc|j|j\}}|jjd}t j d|}|r0|j d}tjj|Sy)Nrz ([\d\.]+)) do_asr splitlinespopresearchgrouprVersionfrom_str)r#stdout_ first_linematchesversions r$ get_versionzAnsiblePull.get_version+snJJt//0 &&(,,Q/ ))L*5 mmA&G$$--g6 6r&cJ|jg|j|\}}|SN)r)r)r#argsr1r2s r$pullzAnsiblePull.pull4s(JJ6667  r&c:|js tdy)Nz!command: ansible is not installed) is_installed ValueErrorr#s r$ check_depszAnsiblePull.check_deps8s  "@A A#r&commandc |js|j|fi|S|jj||jfi|Sr8)rrrr)r#r@kwargss r$r)zAnsiblePull.do_as<sA}}499W// / t{{  $--B6BBr&c tj5tj|fd|ji|cdddS#1swYyxYw)N update_env)r suspend_crashrrrBs r$rzAnsiblePull.subpAsA  ) ) + E99WDDVD E E Es "AA cyr8r>s r$r<zAnsiblePull.is_installedE r&pkg_namecyr8rHr#rJs r$installzAnsiblePull.installIrIr&N)__name__ __module__ __qualname__r r%rrr/r6strr:r?listr)rabcabstractmethodr<rMrHr&r$rrs ;v ;Xi&7&78SBCTC E       r&rcReZdZdedeeffd ZdZdZdefdZ de fd Z xZ S) AnsiblePullPiprusercRt||||_|jyr8)superr%radd_pip_install_site_to_pathr#rrW __class__s r$r%zAnsiblePullPip.__init__Os#    ))+r&c |jrx|jtjddg\}}|d}|jj d}|r!dj ||g|jd<y||jd<yy)Nz-cz&import site; print(site.getuserbase())z/bin/PATH:)rr)sys executablerr"join)r# user_baser2 ansible_pathold_paths r$rZz+AnsiblePullPip.add_pip_install_site_to_pathTs ==::NN<LIq([.Lxx||F+H#&88X|,D#E #/  r&c ddl}y#t$r3|jj|jjgYywxYw)Nr)pip ImportErrorrinstall_packagespip_package_name)r#rgs r$bootstrap_pip_if_requiredz(AnsiblePullPip.bootstrap_pip_if_requiredes; I  I KK ( ($++*F*F)G H Is9AArJc|j|jstjdddg}tj j tj jtjddr|jd|jr|jd|jg|dd|jg||y y ) zishould cloud-init grow an interface for non-distro package managers? this seems reusable -mrgrMstdlibzEXTERNALLY-MANAGEDz--break-system-packages--userz --upgradeN) rkr<r`rar pathexistsrb sysconfigget_pathappendrr))r#rJcmds r$rMzAnsiblePullPip.installks &&(  " Cww~~ &&x02F  45}} 8$ JJ11k151 2 JJ''h' (%#r&r'ctjdddg}|jr|jd|j |\}}d|vS)NrmrgrRror)r`rarrtr))r#rur1r2s r$r<zAnsiblePullPip.is_installedsC~~tUF3 == JJx JJsO F""r&) rNrOrPr rrQr%rZrkrMboolr< __classcell__r\s@r$rVrVNs=,v,Xc], 0"I ))4#d#r&rVcFeZdZdedeeffd ZdefdZdefdZ xZ S)AnsiblePullDistrorrWc2t||||_yr8)rYr%rr[s r$r%zAnsiblePullDistro.__init__s   r&rJc^|js|jj|gyyr8)r<rrirLs r$rMzAnsiblePullDistro.installs'  " KK ( (( 4#r&r'c>ttjdS)Nr)rwrwhichr>s r$r<zAnsiblePullDistro.is_installedsDJJy)**r&) rNrOrPr rrQr%rMrwr<rxrys@r$r{r{s2vXc]55+d+r&r{namecfgcloudr9r'c^|jdi}|jd}|jd}|jd}|jd}|jd} |jdd} |rt||j} |d k(r t| |} n t | |} | j | | j |jd d} | r| | jt<|r t|| | rt| t| |r t|| yyy) Nrrinstall_methodsetup_controllergalaxyr: package_namergr) r"validate_configrrVr{rMr?r CFG_OVERRIDEansible_galaxyrun_ansible_pullransible_controller)rrrr9 ansible_cfg ansible_userrr galaxy_cfgpull_cfgrrrrs r$handlers 2.K??:.L __%56N"'9:*Jv&H??>26L $ U "$V\:G' =G %$)92> (6GKK %  :w /  Whx&8 9  / 9 -r&czd}|D]}t||rtd|d||jdr$dD]}t||rtd|d||jd}|r9t|jd|jdgstd ||d }|d vr td y) N)rrzMissing required key 'z' from r:)zpull/urlzpull/playbook_namer repositories run_ansiblezMissing required key from r)rgrz Invalid install method {install})rr=r"any)r required_keyskeycontroller_cfgrMs r$rrsMIsC(5cU'#GH HI wwv3 MC"3, #9#gcU!KLL MWW/0N"">2""=1  9.9IJK K"#G'';<<(r&c~|jDcic]\}}|dur|jdd|c}}Scc}}w)zremove boolean false valuesFr2-)itemsreplace)rrvalues r$ filter_argsrsF IIK  S%   Cu$  s!9r:c |jd}|j}|stjdn^|t j dddkrD|j dr3td|jd|jd|jd |jgt|jDcgc]\}}|d urd |d |nd |c}}|}|r!tjj!|yycc}}w) N playbook_namezCannot parse ansible versionrdiffzAnsible version .z%doesn't support --diff flag, exiting.T--=)r+r6LOGwarningrr/r"r=majorminorpatchr:rrr`r1write)r:rrvrrr1s r$rrs1M A  23 Y  q!Q ' ' 776?"177)1QWWIQqwwi78 TYY*#.446 U#(t"3bQug 2cU C   F F8%  sD c|jdg}|stjd||D]}|j|y)NactionszInvalid config: %s)r"rrr))rrrr@s r$rrs?ggi$G  (#. gr&c x|jdgD]}|jdd|d|dg|jdgD]m}|jd}|jd}d |gt|j Dcgc] \}}d |d |c}}}|j|| oycc}}w) Nrgitclonesourcerpr playbook_dirrzansible-playbookrr)cwd)r"r)r+rr) rr repositoryr9rrrrr@s r$rrsggnb1  GZ1:f3E F   r*1xx/ 1   4?t3D3J3J3L MZS%3%q M   g< 01 Ns B6 )/__doc__rSloggingr r,r`rrcopyrtypingr cloudinitrrrcloudinit.cloudrcloudinit.configr cloudinit.config.schemar cloudinit.distrosr r cloudinit.settingsr cloudinit.utilrr__annotations__ getLoggerrNrrABCrrVr{rQrRrdictrrrrrrHr&r$rs?  55!#.1+* } ){ jg! , #'', ^>#[>#B + +":":6":%":t":":J==8Td&;&T&0{ 1D 1; 1r&