a '¡Dgª>ã@s ddlZddlZddlZddlZddlZddlZddlZddlZddlm Z m Z m Z m Z m Z e e¡ZdZdZdgZdZGdd„de jƒZGd d „d eƒZGd d „d eƒZGd d„dƒZdd„Zdd„Zdd„Zddd„Zddd„Zdd„Z eZ!ee j"ffgZ#dd„Z$dS)éN)Ú atomic_helperÚnetÚsourcesÚsubpÚutilziid-dsopennebulaZnobodyú context.sh)Z EPOCHREALTIMEZ EPOCHSECONDSZRANDOMZLINENOZSECONDSÚ_ZSRANDOMZ__vc@sFeZdZdZdd„Zdd„Zdd„Zdd „Zed d „ƒZ dd d„Z dS)ÚDataSourceOpenNebulaZ OpenNebulacCs4tj ||||¡d|_tj |jd¡|_d|_dS)NZ opennebula) rÚ DataSourceÚ__init__ÚseedÚosÚpathÚjoinÚseed_dirÚnetwork)ÚselfZsys_cfgÚdistroÚpaths©rúJ/usr/lib/python3.9/site-packages/cloudinit/sources/DataSourceOpenNebula.pyr /szDataSourceOpenNebula.__init__cCstj |¡}d||j|jfS)Nz%s [seed=%s][dsmode=%s])rr Ú__str__r Údsmode)rÚrootrrrr5s zDataSourceOpenNebula.__str__c Cs‚dti}d}d}t}d|jvr*|j d¡}|jg}| tƒ¡|D]Æ}zLtj  |j¡rht ||j |d}n(|  d¡rt jt ||j d}t ||¡}WnZty¨YqBYnFtyÎ}z|‚WYd}~n(d}~0tjyìt d|¡Yn0|rB|}t d|¡q qB|sdS|d } t | |g¡} | | d ¡|j d ¡g¡|_|jtjkrZdS||_| d ¡|_| |_| d ¡|_dS)Nz instance-idÚ parseuser©Úasuserz/dev)rrz%s was not mountablezfound datasource in %sFÚmetadataZDSMODErúnetwork-interfacesÚuserdataT) Ú DEFAULT_IIDÚDEFAULT_PARSEUSERZds_cfgÚgetrÚextendÚfind_candidate_devsr rÚisdirÚread_context_disk_dirrÚ startswithÚ functoolsÚpartialrZmount_cbÚNonContextDiskDirÚBrokenContextDiskDirZMountFailedErrorÚLOGÚwarningÚdebugZ mergemanydictZ_determine_dsmoderrZDSMODE_DISABLEDr rrZ userdata_raw) rÚdefaultsÚresultsr rZ candidatesZcdevZpartially_applied_funcÚexcZmdrrrÚ _get_data9sZ   ÿ ý  ÿ  zDataSourceOpenNebula._get_datacCs$|j|jvrd}nd}d||jfS)z/Return the subplatform metadata source details.zseed-dirz config-diskz%s (%s))rr )rZsubplatform_typerrrÚ_get_subplatformvs z%DataSourceOpenNebula._get_subplatformcCs|jdur|jSdSdS©N)r)rrrrÚnetwork_config~s z#DataSourceOpenNebula.network_configFcCs.|dur|jtjkrd}nd}tj |||¡S)NTF)rrZDSMODE_NETWORKr Ú get_hostname)rZfqdnZ resolve_ipZ metadata_onlyrrrr6…s  z!DataSourceOpenNebula.get_hostnameN)FFF) Ú__name__Ú __module__Ú __qualname__Zdsnamer rr2r3Úpropertyr5r6rrrrr +s= r c@s eZdZdS)r*N©r7r8r9rrrrr*Žsr*c@s eZdZdS)r+Nr;rrrrr+’sr+c@speZdZddd„Zdd„Zdd„Zdd „Zd d „Zd d „Zdd„Z dd„Z dd„Z dd„Z ddd„Z dd„ZdS)ÚOpenNebulaNetworkNcCs|||_|durt|ƒ}t dd„t| ¡dd„dDƒ¡|_i|_| ¡D],\}}t  d|¡}|rJ|  d¡|j|  ¡<qJdS)NcSsg|]}|‘qSrr©Ú.0ÚkrrrÚ œsÿz.OpenNebulaNetwork.__init__..cSst |d¡S)Né)rZnatural_sort_key)r?rrrÚ óz,OpenNebulaNetwork.__init__..)Úkeyz ^(.+)_MAC$rA) ÚcontextÚget_physical_nics_by_macÚ collectionsÚ OrderedDictÚsortedÚitemsÚifacesÚcontext_devnameÚreÚmatchÚgroupÚlower)rrErZsystem_nics_by_macr?ÚvÚmrrrr —s þþÿ  zOpenNebulaNetwork.__init__cCs"d dd„| d¡dd…Dƒ¡S)NÚ.cSsg|]}tt|dƒƒ‘qS)é)ÚstrÚint)r>Úcrrrr@®rCz,OpenNebulaNetwork.mac2ip..ú:é)rÚsplit)rÚmacrrrÚmac2ip­szOpenNebulaNetwork.mac2ipcCs\i}| |dd¡ ¡}| |j dd¡ ¡¡|r:||d<| |dd¡ ¡}|rX||d<|S)NÚdnsÚZDNSÚ addressesÚ search_domainÚsearch)Ú get_fieldrZr#rEr")rÚdevÚ nameserversr]r`rrrÚget_nameservers°sz!OpenNebulaNetwork.get_nameserverscCs | |d¡S)NÚmtu©rb©rrcrrrÚget_mtu»szOpenNebulaNetwork.get_mtucCs| |d| |¡¡S)NÚip)rbr\)rrcr[rrrÚget_ip¾szOpenNebulaNetwork.get_ipcCs<g}| |d¡}|r| |¡| |d¡}|r8| |¡|S)NÚip6Úip6_ula)rbÚappend)rrcÚ addresses6rlrmrrrÚget_ip6Ás    zOpenNebulaNetwork.get_ip6cCs| |dd¡S)NZip6_prefix_lengthZ64rgrhrrrÚget_ip6_prefixËsz OpenNebulaNetwork.get_ip6_prefixcCs | |d¡S)NÚgatewayrgrhrrrÚ get_gatewayÎszOpenNebulaNetwork.get_gatewaycCs| |d| |d¡¡S)NZ ip6_gatewayÚgateway6rgrhrrrÚ get_gateway6ÑsÿzOpenNebulaNetwork.get_gateway6cCs| |dd¡S)NÚmaskz 255.255.255.0rgrhrrrÚget_maskÙszOpenNebulaNetwork.get_maskcCs*|j d ||f¡ ¡¡}|dvr&|S|S)z¤return the field name in context for device dev. context stores _ (example: eth0_DOMAIN). an empty string for value will return default.r)Nr^)rEr"rÚupper)rrcÚnameÚdefaultÚvalrrrrbÜsþÿÿ zOpenNebulaNetwork.get_fieldcs6i}d|d<i|d<i}|j ¡D]\}}| ¡}|j ||¡}i}d|i|d<g|d<| |¡}tt |¡ƒ}|d  |  ||¡d|¡|  |¡} | rÄ|  |¡‰|d  ‡fdd „| Dƒ¡| |¡} | rÚ| |d <| |¡} | rð| |d <| |¡} | r| |d <| |¡} | r | |d <|||<q"||d<|S)NrYÚversionÚ ethernetsZ macaddressrNr_ú/csg|]}|dˆ‘qS)r~r)r>Úi©Zprefix6rrr@ rCz.OpenNebulaNetwork.gen_conf..Zgateway4rtrdrf)rKrJrPrLr"rwrUrZipv4_mask_to_net_prefixrnrkrprqr#rsrureri)rZnetconfr}r[rcZc_devZdevconfrvÚprefixrorrrtrdrfrr€rÚgen_confìsD    ÿ     zOpenNebulaNetwork.gen_conf)N)N)r7r8r9r r\rerirkrprqrsrurwrbr‚rrrrr<–s    r<cCs@g}dD]2}t |¡}| ¡|D]}||vr"| |¡q"q|S)zE Return a list of devices that may contain the context disk. )z LABEL=CONTEXTz LABEL=CDROMz TYPE=iso9660)rZfind_devs_withÚsortrn)ZcombinedÚfÚdevsÚdrrrr$&s r$cCs dd|gS)NZsudoz-ur©ÚuserrrrÚswitch_user_cmd5sr‰cCs t d¡S)zDprint the shell environment variables within delimiters to be parsedzŸ printf "%s\0" _start_ [ $0 != 'sh' ] && set -o posix set [ $0 != 'sh' ] && set +o posix printf "%s\0" _start_ )ÚtextwrapÚdedentrrrrÚ varprinter9sÿrŒc Csd| ¡vrt d¡tƒd|tƒd}g}|durBt|ƒ}| ddg¡tj||dj}i}| d ¡d d…}|d |d }}t d d„t  |¡Dƒƒ} t dd„t  |¡Dƒƒ} t |   ¡ƒ  t |   ¡ƒ¡D]6} | tvràqÒ|  | ¡} | durÒ| |  | ¡krÒ| || <qÒ|S)a<run content and return environment variables which changed WARNING: the special variable _start_ is used to delimit content a context.sh that defines this variable might break in unexpected ways compatible with posix shells such as dash and ash and any shell which supports `set -o posix` s_start_zYUser defined _start_ variable in context.sh, this may breakcloud-init in unexpected ways.z{ %s : } > /dev/null Ú NÚshz-e)Údataz_start_rArrYcss|]}|jdddVqdS©ú=rA)ÚmaxsplitN©rZ©r>ÚvariablerrrÚ }sz%parse_shell_config..css|]}|jdddVqdSrr“r”rrrr–€s)Úencoder,r-rŒr‰r#rÚstdoutrZÚdictÚshlexÚsetÚkeysÚunionÚ EXCLUDED_VARSr") ÚcontentrZbcmdÚcmdÚoutputÚretZsectionsÚbeforeZafterZpre_envZpost_envrDÚvaluerrrÚparse_shell_configFsB ÿÿþýÿÿÿ  r¥c Csˆi}tD]&}tj ||¡}tj |¡r|||<q|sDtd|dfƒ‚i}didœ}d|vr>|durªzt |¡Wn6ty¨}zt dj |dƒ|‚WYd}~n d}~00z(tj |d¡} t   | ¡} t | |d}Wnhtjy}zt d |ƒ|‚WYd}~nÚlinerrrr@Æsz)read_context_disk_dir..z public-keys)Z SET_HOSTNAMEZHOSTNAMEZ PUBLIC_IPZ IP_PUBLICZETH0_IPzlocal-hostnameZ USER_DATArZUSERDATAZUSERDATA_ENCODINGZUSER_DATA_ENCODINGÚbase64z"Failed base64 decoding of userdatacSsg|]}t d|¡r|‘qS)z ^ETH\d+_IP.*$)rMrNr=rrrr@årCr)ÚCONTEXT_DISK_FILESr rrÚisfiler*ÚpwdÚgetpwnamÚKeyErrorr+ÚformatrZload_text_filer¥rZProcessExecutionErrorÚIOErrorr"Ú splitlinesrZb64dÚ TypeErrorr,r-r<r‚)Z source_dirrrÚfoundÚafÚfnrEr0ÚerrŸZ ssh_key_varÚlinesr?ÚencodingZ ipaddr_keysZonetrrrr&s’    ÿÿü ÿþÿþ  ÿ       ÿ   r&cs"t ¡}t‡fdd„| ¡DƒƒS)Ncs$g|]\}}ˆj |¡r||f‘qSr)Z networkingZ is_physical)r>rRÚn©rrrr@ðrCz,get_physical_nics_by_mac..)rZget_interfaces_by_macr™rJ)rr…rrºrrFísÿrFcCs t |t¡Sr4)rZlist_from_dependsÚ datasources)ZdependsrrrÚget_datasource_listþsr¼)N)N)%rGr(Zloggingr r¬rMršrŠZ cloudinitrrrrrZ getLoggerr7r,r r!rªržr r Ú Exceptionr*r+r<r$r‰rŒr¥r&rFZDataSourceOpenNebulaNetZDEP_FILESYSTEMr»r¼rrrrÚs8  c G ` ÿ