a 'Dg@slUdZddlZddlZddlZddlZddlZddlZddlmZddl m Z ddl m Z m Z ddlmZddlmZddlmZdd lmZmZdd lmZdd lmZd eegd gdZeed<eeZdZ Gdddej!Z"Gddde"Z#Gddde"Z$e%eee&ddddZ'e(dddZ)e(e(dddZ*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-pullN)deepcopy)Optional) lifecyclesubp)Cloud)Config) MetaSchema) ALL_DISTROSDistro) PER_INSTANCE)get_cfg_by_pathZ cc_ansibleansible)idZ frequencyZdistrosZactivate_by_schema_keysmetaansible_configc@s|eZdZedddZeejdddZe dddZ d d Z e d d d Z ddZejddZeje dddZdS) AnsiblePull)distrocCs<dg|_ddg|_||_i|_d|_tjdd|jd<dS)Nz ansible-pullz --versionHOMEz/root)cmd_pull cmd_versionrenvrun_userosenvironget)selfrr?/usr/lib/python3.9/site-packages/cloudinit/config/cc_ansible.py__init__ s  zAnsiblePull.__init__returncCsH||j\}}|d}td|}|rD|d}tj |SdS)Nrz ([\d\.]+)) do_asr splitlinespopresearchgrouprVersionZfrom_str)rstdout_Z first_linematchesversionrrr get_version+s   zAnsiblePull.get_versioncGs|g|j|\}}|SN)r!r)rargsr(r)rrrpull4szAnsiblePull.pullcCs|stddS)Nz!command: ansible is not installed) is_installed ValueErrorrrrr check_deps8szAnsiblePull.check_deps)commandcKs0|js|j|fi|S|jj||jfi|Sr-)rrrr!rr4kwargsrrrr!<szAnsiblePull.do_ascKstj|fd|ji|S)NZ update_env)rrr5rrrrAszAnsiblePull.subpcCsdSr-rr2rrrr0DszAnsiblePull.is_installedpkg_namecCsdSr-rrr8rrrinstallHszAnsiblePull.installN)__name__ __module__ __qualname__r rrrr'r,strr/r3listr!rabcabstractmethodr0r:rrrrrs   rcsDeZdZeeedfdd ZedddZeddd Z Z S) AnsiblePullPip)rusercsft|||_|tjddg\}}|d}|jd}|rXd||g|jd<n ||jd<dS)Nz-cz('import site; print(site.getuserbase())'z/bin/PATH:) superrrr!sys executablerrjoin)rrrC user_baser)Z ansible_pathZold_path __class__rrrNs    zAnsiblePullPip.__init__r7cCs|sz ddl}Wn$ty8|j|jjgYn0tjdddg}tj tj t ddrn|d|jr~|d |g|d d|g||dS) zishould cloud-init grow an interface for non-distro package managers? this seems reusable rN-mpipr:ZstdlibzEXTERNALLY-MANAGEDz--break-system-packagesz--userz --upgrade)r0rN ImportErrorrinstall_packagesZpip_package_namerGrHrpathexistsrI sysconfigZget_pathappendrr!)rr8rNcmdrrrr:]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(eZdZedddZedddZdS)AnsiblePullDistror7cCs|s|j|gdSr-)r0rrPr9rrrr:~szAnsiblePullDistro.installrcCsttdS)Nr )rVrwhichr2rrrr0szAnsiblePullDistro.is_installedN)r;r<r=r>r:rVr0rrrrrX}srX)namecfgcloudr.r cCs|di}|d}|d}|d}|d}|d} |dd} |rt||j} |d krpt| |} nt| } | | | |d d} | r| | jt<|rt || | rt | t | |rt || dS) Nr rinstall_methodsetup_controllerZgalaxyr/ package_namerNr) rvalidate_configrrBrXr:r3r CFG_OVERRIDEansible_galaxyrun_ansible_pullransible_controller)rZr[r\r.Z ansible_cfgZ ansible_userr]r^Z galaxy_cfgZpull_cfgr_rr rrrrhandles0            rfr[cCsd}|D]"}t||std|d|q|dr^dD]"}t||s:td|d|q:|d}|rt|d|dgstd ||d }|d vrtd 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 r1rany)r[ required_keyskeyZcontroller_cfgr:rrrras&    ra)r[r cCsdd|DS)zremove boolean false valuescSs&i|]\}}|dur|dd|qS)Fr)-)replace.0rlvaluerrr szfilter_args..)itemsrgrrr filter_argssrt)r/r[cCs|d}|}|s"tdn>|tdddkr`|dr`td|jd|j d|j d |j gd d t | D|R}|rtj|dS) N playbook_namezCannot parse ansible versionrdiffzAnsible version .z%doesn't support --diff flag, exiting.cSs2g|]*\}}|dur$d|d|nd|qS)T--=rrorrr sz$run_ansible_pull..)r#r,LOGwarningrr'rr1majorminorZpatchr/rtrsrGr(write)r/r[ruvr(rrrrds$    rd)r[r cCs4|dg}|std||D]}||q dS)NactionszInvalid config: %s)rr}r~r!)r[r rr4rrrrcs   rccCs|dgD]}|dd|d|dgq |dgD]D}|d}|d}d |gd d t|D}|j||d q8dS) NrhgitZclonesourcerQri playbook_dirruzansible-playbookcSs g|]\}}d|d|qS)rzr{rrorrrr|z&ansible_controller..)cwd)rr!r#rtrs)r[r Z repositoryr.rrur4rrrres  re).__doc__r@Zloggingrr$rGrScopyrtypingrZ cloudinitrrZcloudinit.cloudrZcloudinit.configrZcloudinit.config.schemarZcloudinit.distrosr r Zcloudinit.settingsr Zcloudinit.utilr r__annotations__Z getLoggerr;r}rbABCrrBrXr>r?rfdictrartrdrcrerrrrs>        .0 %