a '¡Dg¶ã@slUdZddlZddlZddlZddlZddlZddlZddlmZddl m Z ddl m Z m Z ddlmZddlmZddlmZdd lmZmZdd lmZdd lmZd eegd gdœZeed<e e¡ZdZ Gdd„dej!ƒZ"Gdd„de"ƒZ#Gdd„de"ƒZ$e%eee&ddœdd„Z'e(dœdd„Z)e(e(dœdd„Z*e"e(d œd!d"„Z+e(e"d#œd$d%„Z,e(e"d#œd&d'„Z-dS)(z9ansible enables running on first boot either ansible-pulléN)Údeepcopy)ÚOptional)Ú lifecycleÚsubp)ÚCloud)ÚConfig)Ú MetaSchema)Ú ALL_DISTROSÚDistro)Ú PER_INSTANCE)Úget_cfg_by_pathZ cc_ansibleÚansible)ÚidZ frequencyZdistrosZactivate_by_schema_keysÚmetaÚansible_configc@s|eZdZedœdd„Zeejdœdd„Ze dœdd„Z d d „Z e d œd d „Z dd„Zejdd„ƒZeje dœdd„ƒZdS)Ú AnsiblePull)ÚdistrocCs<dg|_ddg|_||_i|_d|_tj dd¡|jd<dS)Nz ansible-pullz --versionÚHOMEz/root)Úcmd_pullÚ cmd_versionrÚenvÚrun_userÚosÚenvironÚget)Úselfr©rú?/usr/lib/python3.9/site-packages/cloudinit/config/cc_ansible.pyÚ__init__ s  zAnsiblePull.__init__©ÚreturncCsH| |j¡\}}| ¡ d¡}t d|¡}|rD| d¡}tj  |¡SdS)Nrz ([\d\.]+)) Údo_asrÚ splitlinesÚpopÚreÚsearchÚgrouprÚVersionZfrom_str)rÚstdoutÚ_Z first_lineÚmatchesÚversionrrrÚ get_version+s   zAnsiblePull.get_versioncGs| g|j¢|¢¡\}}|S©N)r!r)rÚargsr(r)rrrÚpull4szAnsiblePull.pullcCs| ¡stdƒ‚dS)Nz!command: ansible is not installed)Ú is_installedÚ ValueError©rrrrÚ check_deps8szAnsiblePull.check_deps)ÚcommandcKs0|js|j|fi|¤ŽS|jj||jfi|¤ŽSr-)rrrr!©rr4Úkwargsrrrr!<szAnsiblePull.do_ascKstj|fd|ji|¤ŽS)NZ update_env)rrr5rrrrAszAnsiblePull.subpcCsdSr-rr2rrrr0DszAnsiblePull.is_installed©Úpkg_namecCsdSr-r©rr8rrrÚinstallHszAnsiblePull.installN)Ú__name__Ú __module__Ú __qualname__r rrrr'r,Ústrr/r3Úlistr!rÚabcÚabstractmethodr0r:rrrrrs   rcsDeZdZeeedœ‡fdd„ Zedœdd„Zedœdd „Z ‡Z S) ÚAnsiblePullPip)rÚusercsftƒ |¡||_| tjddg¡\}}|›d�}|j d¡}|rXd ||g¡|jd<n ||jd<dS)Nz-cz('import site; print(site.getuserbase())'z/bin/ÚPATHú:) Úsuperrrr!ÚsysÚ executablerrÚjoin)rrrCÚ user_baser)Z ansible_pathZold_path©Ú __class__rrrNs  ÿ  zAnsiblePullPip.__init__r7cCsª| ¡s¦z ddl}Wn$ty8|j |jjg¡Yn0tjdddg}tj   tj   t   d¡d¡¡rn| d¡|jr~| d ¡| g|¢d ‘d‘¡| g|¢|‘¡dS) zishould cloud-init grow an interface for non-distro package managers? this seems reusable rNú-mÚpipr:ZstdlibzEXTERNALLY-MANAGEDz--break-system-packagesz--userz --upgrade)r0rNÚ ImportErrorrÚinstall_packagesZpip_package_namerGrHrÚpathÚexistsrIÚ sysconfigZget_pathÚappendrr!)rr8rNÚcmdrrrr:]s(  ü ÿÿ  zAnsiblePullPip.installrcCs | tjdddg¡\}}d|vS)NrMrNr?r )r!rGrH)rr(r)rrrr0xszAnsiblePullPip.is_installed) r;r<r=r rr>rr:Úboolr0Ú __classcell__rrrKrrBMsrBc@s(eZdZedœdd„Zedœdd„ZdS)ÚAnsiblePullDistror7cCs| ¡s|j |g¡dSr-)r0rrPr9rrrr:~szAnsiblePullDistro.installrcCstt d¡ƒS)Nr )rVrÚwhichr2rrrr0‚szAnsiblePullDistro.is_installedN)r;r<r=r>r:rVr0rrrrrX}srX)ÚnameÚcfgÚcloudr.r cCsÖ| di¡}| d¡}| d¡}| d¡}| d¡}| d¡} | dd¡} |rÒt|ƒ|j} |d krpt| |ƒ} nt| ƒ} |  | ¡|  ¡| d d¡} | r¤| | jt<|r²t || ƒ| rÄt | t | ƒƒ|rÒt || ƒdS) Nr rÚinstall_methodÚsetup_controllerZgalaxyr/Ú package_nameÚrNr) rÚvalidate_configrrBrXr:r3rÚ CFG_OVERRIDEÚansible_galaxyÚrun_ansible_pullrÚansible_controller)rZr[r\r.Z ansible_cfgZ ansible_userr]r^Z galaxy_cfgZpull_cfgr_rr rrrrÚhandle†s0            rf©r[cCs®d}|D]"}t||ƒstd|›d|›�ƒ‚q| d¡r^dD]"}t||ƒs:td|›d|›�ƒ‚q:| d¡}|r’t| d¡| d¡gƒs’td |›�ƒ‚|d }|d vrªtd ƒ‚dS) N)r]r_zMissing required key 'z' from r/)zpull/urlzpull/playbook_namer^Ú repositoriesÚ run_ansiblezMissing required key from r])rNrz Invalid install method {install})r r1rÚany)r[Ú required_keysÚkeyZcontroller_cfgr:rrrra«s&    þÿra)r[r cCsdd„| ¡DƒS)zremove boolean false valuescSs&i|]\}}|dur| dd¡|“qS)Fr)ú-)Úreplace©Ú.0rlÚvaluerrrÚ Ésþzfilter_args..)ÚitemsrgrrrÚ filter_argsÇsþrt)r/r[cCsœ| d¡}| ¡}|s"t d¡n>|t ddd¡kr`| d¡r`td|j›d|j ›d|j ›d �ƒ‚|j gd d „t |ƒ  ¡Dƒ¢|‘RŽ}|r˜tj |›¡dS) NÚ playbook_namezCannot parse ansible versionéérÚdiffzAnsible version Ú.z%doesn't support --diff flag, exiting.cSs2g|]*\}}|dur$d|›d|›�nd|›�‘qS)Tú--ú=rrorrrÚ Þsÿz$run_ansible_pull..)r#r,ÚLOGÚwarningrr'rr1ÚmajorÚminorZpatchr/rtrsrGr(Úwrite)r/r[ruÚvr(rrrrdÐs$   ÿ þÿûrd)r[r cCs4| dg¡}|st d|¡|D]}| |¡q dS)NÚactionszInvalid config: %s)rr}r~r!)r[r rƒr4rrrrcès   rccCs‚| dg¡D]}| dd|d|dg¡q | dg¡D]D}| d¡}| d¡}d |gd d „t|ƒ ¡Dƒ¢}|j||d �q8dS) NrhÚgitZcloneÚsourcerQriÚ playbook_dirruzansible-playbookcSs g|]\}}d|›d|›�‘qS)rzr{rrorrrr|üóz&ansible_controller..)Úcwd)rr!r#rtrs)r[r Z repositoryr.r†rur4rrrreñsÿ  þýre).Ú__doc__r@Zloggingrr$rGrSÚcopyrÚtypingrZ cloudinitrrZcloudinit.cloudrZcloudinit.configrZcloudinit.config.schemarZcloudinit.distrosr r Zcloudinit.settingsr Zcloudinit.utilr rÚ__annotations__Z getLoggerr;r}rbÚABCrrBrXr>r?rfÚdictrartrdrcrerrrrÚs>       ü .0 %