a -@=j³ã@sddlZddlZddlZddlZddlZddlZddlmZmZddl m Z m Z ddl m Z mZddlmZmZmZmZmZddlmZe e¡Zgd¢Zdd d „Zd d „Zd d„ZGdd„dƒZGdd„deƒZGdd„deƒZ Gdd„dej!ƒZ!dd„Z"d dd„Z#d!dd„Z$d"dd„Z%dS)#éN)ÚDictÚOptional)ÚsubpÚutil)Únetworkmanager_confÚ resolv_conf)ÚIPV6_DYNAMIC_TYPESÚis_ipv6_addressÚnet_prefix_to_ipv4_maskÚrendererÚsubnet_is_ipv6)Ú NetworkState)Z almalinuxZcentosZ cloudlinuxZ eurolinuxZfedoraZ miraclelinuxZ openeulerZ OpenCloudOSZ openmandrivaÚrhelZrockyÚsuseZ TencentOSZ virtuozzoú#cCsJddg}tt|ƒƒD]*}||r6|d||||<q|||<qd |¡S)Nz1Created by cloud-init automatically, do not edit.Úú Ú )ÚrangeÚlenÚjoin)ÚsepÚlinesÚi©rú;/usr/lib/python3.9/site-packages/cloudinit/net/sysconfig.pyÚ _make_header)sþ rcCsd}|ddko|d|vS)N)z::z0.0.0.0ÚprefixrÚnetworkr)ÚrouteZ default_netsrrrÚ_is_default_route6sr cCs6t d|¡r.| d¡r$| d¡r$|Sd|Sn|SdS)Nz\sú"z"%s")ÚreÚsearchÚ startswithÚendswith)ÚvaluerrrÚ _quote_value;s   r'c@sjeZdZdZdddœZdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„ZdS)Ú ConfigMapz!Sysconfig like dictionary object.ÚyesÚno)TFcCs i|_dS©N©Ú_conf©ÚselfrrrÚ__init__OszConfigMap.__init__cCs||j|<dSr+r,)r/Úkeyr&rrrÚ __setitem__RszConfigMap.__setitem__cCs |j|Sr+r,©r/r1rrrÚ __getitem__UszConfigMap.__getitem__cCs |j |¡Sr+)r-Úgetr3rrrr5Xsz ConfigMap.getcCs ||jvSr+r,r3rrrÚ __contains__[szConfigMap.__contains__cCs|j |d¡dSr+)r-Úpopr3rrrÚdrop^szConfigMap.dropcCs t|jƒSr+)rr-r.rrrÚ__len__aszConfigMap.__len__cCsdS)z6Skip the pair key, value if it matches a certain rule.Fr©r/r1ÚvalrrrÚskip_key_valuedszConfigMap.skip_key_valuecCs”t ¡}| tƒ¡|jr$| d¡t|j ¡ƒD]X}|j|}| ||¡rNq2t|t ƒrb|j |}t|t ƒstt |ƒ}| d|t |ƒf¡q2|  ¡S)Nrú%s=%s )ÚioÚStringIOÚwriterr-ÚsortedÚkeysr<Ú isinstanceÚboolÚ _bool_mapÚstrr'Úgetvalue)r/Úbufr1r&rrrÚ to_stringhs       zConfigMap.to_stringcCs|j |¡dSr+)r-Úupdate)r/ZupdatesrrrrJxszConfigMap.updateN)Ú__name__Ú __module__Ú __qualname__Ú__doc__rEr0r2r4r5r6r8r9r<rIrJrrrrr(Fsþr(csReZdZdZ‡fdd„Zdd„Zedd„ƒZedd „ƒZd d „Z dd d„Z ‡Z S)ÚRoutez!Represents a route configuration.cs<tt|ƒ ¡d|_d|_d|_||_||_||_||_ dS)NéF) ÚsuperrOr0Úlast_idxÚhas_set_default_ipv4Úhas_set_default_ipv6Ú _route_nameÚ_base_sysconf_dirÚroute_fn_tpl_ipv4Úroute_fn_tpl_ipv6)r/Z route_nameÚbase_sysconf_dirÚipv4_tplÚipv6_tpl©Ú __class__rrr0szRoute.__init__cCs>t|j|j|j|jƒ}|j ¡|_|j|_|j|_|j |_ |Sr+) rOrUrVrWrXr-ÚcopyrRrSrT)r/Úrrrrr^‰sü z Route.copycCs|j|j|jdœS©N)ÚbaseÚname)rWrVrUr.rrrÚ path_ipv4–s ÿzRoute.path_ipv4cCs|j|j|jdœSr`)rXrVrUr.rrrÚ path_ipv6œs ÿzRoute.path_ipv6cCsd|vS)Nú:r)r/ÚaddressrrrÚ is_ipv6_route¢szRoute.is_ipv6_routeÚipv4c CsÊ|dvrtdt|ƒƒ‚t ¡}| tƒ¡|jr<| d¡d}t|j ¡ƒD�]p}d|vr^qN|  dd¡}t|j|ƒ}t|jd|ƒ}|dk�rV|  |¡�sVt|jd |ƒ}|d }| d dt|ƒt |ƒf¡| d dt|ƒt |ƒf¡| d d t|ƒt |ƒf¡d |} | |jv�rÀt|j| ƒ} | d d t|ƒt | ƒf¡qN|d krN|  |¡rNt|jd|›�ƒ} d ||jv�r¢dt|jd |ƒnd} | d|| || |j f¡qN|  ¡S)N)rhÚipv6zUnknown protocol '%s'réÿÿÿÿÚADDRESSrÚGATEWAYrhÚNETMASKrPr=ÚMETRICriÚPREFIXzmetric z%s/%s via %s %s dev %s )Ú ValueErrorrFr>r?r@rr-rArBÚreplacergr'rUrG) r/ÚprotorHZreindexr1ÚindexZ address_valueZ gateway_valueZ netmask_valueZ metric_keyZ metric_valueZ prefix_valuerrrrI¥sp   ÿÿÿÿÿÿ ÿÿ ÿýûÿÿ zRoute.to_string)rh) rKrLrMrNr0r^ÚpropertyrcrdrgrIÚ __classcell__rrr\rrO|s    rOcs„eZdZdZddddddœZd‡fd d „ Zed d „ƒZejd d „ƒZedd„ƒZ e jdd„ƒZ edd„ƒZ ddd„Z dd„Z ‡Z S)Ú NetInterfacezERepresents a sysconfig/networking-script (and its config + children).ZEthernetZBondZBridgeZ InfiniBandÚVlan)ÚethernetÚbondÚbridgeÚ infinibandÚvlanrxcsrtt|ƒ ¡g|_||_|j d¡}t||| d¡| d¡d�|_|j d¡|_||_ ||_ ||j d<||_ dS)NÚroute_templatesrhri)rZr[Úiface_templatesÚDEVICE) rQrvr0ÚchildrenÚ templatesr5rOÚroutesÚ iface_fn_tplÚkindÚ _iface_namer-rV)r/Ú iface_namerYr�r„Z route_tplr\rrr0õs ü zNetInterface.__init__cCs|jSr+)r…r.rrrrb szNetInterface.namecCs||_||jd<dS)Nr)r…r-)r/r†rrrrb scCs|jSr+)Ú_kindr.rrrr„szNetInterface.kindcCs,||jvrt|ƒ‚||_|j||jd<dS)NÚTYPE)Ú iface_typesrpr‡r-)r/r„rrrr„s cCs|j|j|jdœSr`)rƒrVrbr.rrrÚpaths ÿzNetInterface.pathFcCsHt|j|j|j|jd�}|j ¡|_|r4t|jƒ|_|rD|j  ¡|_ |S)N)r„) rvrbrVr�r‡r-r^Úlistr€r‚)r/Z copy_childrenZ copy_routesÚcrrrr^#sÿ   zNetInterface.copycCs|dkr|dkrdSdS)NrˆrwTFrr:rrrr<.szNetInterface.skip_key_value)rx)FF)rKrLrMrNr‰r0rtrbÚsetterr„rŠr^r<rurrr\rrvês*û ÿ      rvc@s,eZdZUdZdddddœddd œd œZd d d ddddœddddddœd œZegd¢ƒZiZe e d<d8dd„Z e dd„ƒZ e dd„ƒZe d d!„ƒZe d"d#„ƒZe d$d%„ƒZe d&d'„ƒZe d(d)„ƒZed9d*d+„ƒZed:d,d-„ƒZe ed.œd/d0„ƒZe d1d2„ƒZe d;ed.œd3d4„ƒZd<t|d=ƒ�rø|d=|d?<n |d=|d@<dA|v�r*|dk�r*d9 |dA¡|dB<dC|v�r"|dk�r"t|dCƒdDk�rht  dE|j t|dCƒ¡t|dCddD…d/ƒD]\}}||dFt |ƒ<�q~�q"dS)GNrr“r’ÚBRIDGEÚdhcpr�©Ústartr—r§Údhcp6zipv6_dhcpv6-stateful)Údhcp4r´ZmanagedZDHCLIENT6_MODErTZDHCPV6CZIPV6INITFÚ IPV6_AUTOCONFZIPV6_FAILURE_FATALzipv6_dhcpv6-statelessÚinfoz-SZDHCPV6C_OPTIONSZ ipv6_slaac)r·r´r¸)r“Zstatic6ZIPV6_MTUr�zZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.r–Zmanualz Unknown subnet type setting "%s"r‘z1Unknown subnet type '%s' found for interface '%s'r¤r•rjÚmetricÚIPV6_ROUTE_METRICÚIPV4_ROUTE_METRICrn©r´r¸ÚDHCLIENT_SET_DEFAULT_ROUTErPz%s/%srfrrZIPADDR6ZIPV6ADDRZ IPADDR6_1ZIPV6ADDR_SECONDARIESz IPADDR6_%drrZIPADDRrmÚgatewayÚDEFROUTEÚIPV6_DEFAULTGWrlÚ dns_searchZDOMAINÚdns_nameserverséz6%s has %d entries in dns_nameservers. Only 3 are used.ZDNS)r8Ú enumeraterr€r5r rDÚLOGZwarningrbÚdebugrprrFr r r)r¬r®ÚsubnetsÚhas_default_router¥rÚsubnetZmtu_keyÚ subnet_typeZ bootproto_inZ mtu_mismatchZ ipv4_indexZ ipv6_indexZ ipv6_cidrZsuffÚkrrrÚ_render_subnetsžs     ÿ                   þû      ÿÿ                       ÿÿ   üzRenderer._render_subnetsc Cs||dkr dSt|t|jƒd�D�]V\}}| d¡}| dg¡D�]4}| d¡pXt|dƒ} t|ƒ�r2|tv�r2| d¡r~|jsŽ| d¡rœ|jrœt d|j ƒ‚d |d <|d d vr¸d |d <d|vrê| rØ|d|d<d |_n|d|d<d |_d|v�rt|dk�r$t |ƒ�r|d|d<n |d|d<n |d|d<q>dD].\} } | |v�r6| ›|j ›�} || || <�q6|j d7_ q>qdS)Nrrµr§r‚rirÀrhz?Duplicate declaration of default route found for interface '%s'TrÁr’r¾r¿rÂrlr»rr¼r½rn))rÀrl)r»rn)rro)Únetmaskrm)rrkrP) rÆrr€r5r r rrSrTrprbr rR) r¬r®Ú route_cfgrÉr¥Ú_rËrÌrZis_ipv6r¯Únew_namer±rrrÚ_render_subnet_routesksb  ÿÿþÿÿýýÿÿ       ÿ ÿ   zRenderer._render_subnet_routesc Cs–g}|jD]\\}}|| dd¡g}|D]>}||vr&||}t|ttfƒrRd |¡}| ||¡q q&q |r’|dkr„d |¡|d<nd |¡|d<dS)NrÑú-rrZBONDING_MODULE_OPTSZ BONDING_OPTS)Ú bond_tpl_optsrqrCÚtupler‹rÚappend) r¬r®r­r¥Z bond_optsZbond_keyZ value_tplZ bond_keysZ bond_valuerrrÚ_render_bonding_opts³s zRenderer._render_bonding_optsc Cshtj}| |¡D]R}| d¡p$|d}| dg¡}||}|j} | |||j|¡| || ||¡qdS)NÚ config_idrbrÉ)r Zfilter_by_physicalÚiter_interfacesr5r‚rÎrÊrÓ) r¬Ú network_stateÚiface_contentsr¥Zphysical_filterr­r†Ú iface_subnetsr®rÐrrrÚ_render_physical_interfacesÎs üÿz$Renderer._render_physical_interfacescsdt d¡}t d¡}| |¡D�]>}|d‰|ˆ}| |||¡|g}| |j¡|D]} d| d<|dkrXd| _qX| d¡r¤|dkr–| d¡|d<n| d¡|d <| d g¡} |j } |  || |j |¡|  || | |¡t ‡fd d „| |¡Dƒƒ} t| ƒD]`\} }|dk�rd | }nd| }|||<||}|dk�rLd|d<d|d<qüˆ|d<d|d<qüqdS)Nryú bond-masterrbTZBONDING_MASTERrrœrŸÚMACADDRrÉcs g|]}|dˆkr|d‘qS)rßrbr)Ú.0Z slave_iface©r†rrÚ s üz4Renderer._render_bond_interfaces..zBONDING_SLAVE_%szBONDING_SLAVE%sr�r’Zhotplugr•ZMASTERZSLAVE)r Úfilter_by_typeZfilter_by_attrrÚrØÚextendr€r„r5r‚rÎrÊrÓrArÆ)r¬rÛrÜr¥Z bond_filterZ slave_filterr­r®Z master_cfgsZ master_cfgrÝrÐZ bond_slavesrsZ bond_slaveZslavestrZ slave_cfgrrârÚ_render_bond_interfacesãsZ     üÿ ÿþÿ     z Renderer._render_bond_interfacesc Csât d¡}| |¡D]È}|d}||}|dkr^| d¡}|rF||d<|d| d¡…|d<nJd|d <d|_|d } t| |dƒ} || vr t d || d   | ¡¡| |d <| dg¡} |j } |  || |j |¡|  || | |¡qdS)Nr|rbrÚvlan_idZVLAN_IDÚ.Z ETHERDEVICETZVLANzvlan-raw-devicezIName '%s' for vlan '%s' is not officially supportedby RHEL. Supported: %srZPHYSDEVrÉ)r rärÚr5Úrfindr„Ú_supported_vlan_namesrÇrºrr‚rÎrÊrÓ) r¬rÛrÜr¥Z vlan_filterr­r†r®rçÚrdevZ supportedrÝrÐrrrÚ_render_vlan_interfaces"s@  û üÿz Renderer._render_vlan_interfacesc sng‰g‰| ¡D]‚}|dD]0}d|vr6ˆ |d¡d|vrˆ |d¡qd|vrˆ‡fdd„|ddDƒ7‰ˆ‡fdd„|dd Dƒ7‰q|jr²ˆ‡fd d„|jDƒ7‰|jrЈ‡fd d„|jDƒ7‰ttˆƒtˆƒgƒsèdSt d ¡}|�rtj   |¡�rt t   |¡¡}ˆD]}|  |¡�qˆD]}| |¡�q0td ƒ}t|ƒ}| |¡�sj|d|}|S)NrÉrÄrÃÚdnscsg|]}|ˆvr|‘qSrr)rárí©Úfound_nameserversrrrãYsþz(Renderer._render_dns..Ú nameserverscsg|]}|ˆvr|‘qSrr©rár#©Úfound_dns_searchrrrã^sþr#csg|]}|ˆvr|‘qSrr)ráÚ nameserverrîrrrãisþcsg|]}|ˆvr|‘qSrrrñròrrrãosþrú;r)rÚrårÄÚdns_searchdomainsÚanyrrZ ResolvConfÚosrŠÚisfilerÚload_text_fileZadd_nameserverZadd_search_domainrrFr$) rÛÚexisting_dns_pathr­rËÚcontentrôZ searchdomainÚheaderZ content_strr)rórïrÚ _render_dnsIsV    þ  þ  þ þþÿ ÿ  zRenderer._render_dnscCs¾d}t d¡}| ¡D]V}|dD]}d|vs6d|vr"d}q@q"|sd|vr|ddsd|dd rd}qnq|js~|js~|rŒ| d dd ¡t|ƒd krœdSd tƒd d  |  ¡¡d g¡}|S)NFrrÉrÄrÃTrírðr#Úmainr�rr) rZNetworkManagerConfrÚrÄröZset_section_keypairrrrr@)rÛr�Z iface_dnsrür­rËÚoutrrrÚ_render_networkmanager_confŒs8   ÿþ ý ý ÿþý z$Renderer._render_networkmanager_conf)rÛcCs„dd„|j| ¡Dƒ}t d¡}| |¡D�]P}|d}||}|dkrPd|_| ¡D]\} } | |vrX|| || <qX|dkr¢d|vr¢| d¡ršd|d<nd|d<| d ¡rÊd } |dkr¼d } | d ¡|| <|dkrö| d g¡röd d | d ¡¡|d<| d g¡D]F} || } | g}| | j ¡|D] }|}|dk�r:d}||d<�q$�q| dg¡}|j }|  |||j |¡|  ||||¡q,dS)NcSs i|]\}}| d¡r||“qS)rz)r$)ráZold_kZnew_krrrÚ ¶s þz6Renderer._render_bridge_interfaces..rzrbrržZonZoffrœràZ LLADDRESSZ bridge_portsz%srZ BRIDGE_PORTSr)r³rÉ)r«Úitemsr rärÚr„r5rrår€r‚rÎrÊrÓ)r¬rÛrÜr¥Zbridge_key_mapZ bridge_filterr­r†r®r¯r±r1Zbridged_iface_nameZ bridged_cfgZ bridged_cfgsZ bridge_cfgZ bridge_valuerÝrÐrrrÚ_render_bridge_interfaces²s^ þ     ÿ    üÿz"Renderer._render_bridge_interfacesc Csht d¡}| |¡D]N}|d}||}d|_| dg¡}|j} | |||j|¡| || ||¡qdS)Nr{rbrÉ) r rärÚr„r5r‚rÎrÊrÓ) r¬rÛrÜr¥Z ib_filterr­r†r®rÝrÐrrrÚ_render_ib_interfacesñs   üÿzRenderer._render_ib_interfacesc Cs\|s |j}i}| ¡D]f}|ddkr(q| d¡p8|d}t|d||ƒ}|dkrf| d¡| d¡| |||¡|||<q| |||¡| |||¡| |||¡|  |||¡|  |||¡i} |  ¡D]†\} }|sä|j �r|  ¡| |j<|j D]}|rø|  ¡| |j<qø|jrÐt|jj|jjgdd gƒD]$\} } | | v�r0|j  | ¡| | <�q0qÐ| S) z3Given state, return /etc/sysconfig files + contentsr§ZloopbackrÙrbrrrˆrhri)r�rÚr5rvr8r²rÞrærìrrrr€rIrŠr‚Úziprcrd) r¬rYrÛr¥r�rÜr­rÙr®Úcontentsr†ZcpathrrrrrÚ_render_sysconfigsF    ÿ     þ  zRenderer._render_sysconfig)rÛr�Úreturncsª|s |j}d}t ||j¡}|j|||j|d� ¡D]\}}t |||¡q4|j r€t ||j ¡}|j ||d�} | r€t || |¡|j r²t ||j ¡} |  ||¡} | r²t | | |¡|j râ| |¡} t ||j ¡} tj| | |dd�t || d¡¡}| d¡�r¦t tj |¡¡tƒdg}|j�r8| d ¡| d ¡tj |¡�rŽt |¡ ¡D]8‰t‡fd d „d Dƒƒ�sTˆtƒ ¡v�rT| ˆ¡�qTt |d |¡d|¡dS)Ni¤)r�)rûT)rüÚmodeZ preserve_moder¤rzNETWORKING=yeszNETWORKING_IPV6=yeszIPV6_AUTOCONF=noc3s|]}|ˆvVqdSr+r)ráZsetting©ÚlinerrÚ hsÿz0Renderer.render_network_state..)Z NETWORKINGZNETWORKING_IPV6r¹r)r�rÚ target_pathr rr¥rrZ write_filer¢rþr£rr¡Z_render_persistent_netr5r%Z ensure_dirrørŠÚdirnamerZuse_ipv6r×ÚexistsrúÚ splitlinesr÷r)r/rÛr�ÚtargetZ file_moderYrŠÚdatar¢Zresolv_contentr¦Znm_conf_contentZnetrules_contentr¡Zsysconfig_pathZnetcfgrr rÚrender_network_state2sh ÿÿÿÿ ü     þÿ ÷ ÿzRenderer.render_network_state)N)N)N)N)NN)rKrLrMrNrªr«rÖrÕr�ÚdictÚ__annotations__r0Ú classmethodr²rÎrÓrØrÞrærìÚ staticmethodrþrr rrrrrrrrrrŽ4s~  üù ú û÷ÿ    M G   > & B %ÿ> ûý0üûrŽcs‡‡fdd„dDƒS)ziReturn list of supported names for vlan devices per RHEL doc 11.5. Naming Scheme for VLAN Interfaces.csg|]}|jˆtˆƒd�‘qS)©rëZvid)ÚformatÚint)ráÚvrrrrã|sÿz)_supported_vlan_names..)z{rdev}{vid:04}z {rdev}{vid}z{rdev}.{vid:04}z {rdev}.{vid}rrrrrrêys þrêcCs0t ¡dtvrdSt|ƒr dSt|ƒr,dSdS)NZvariantFT)rZ system_infoÚ KNOWN_DISTROSÚavailable_sysconfigÚavailable_nm_ifcfg_rh©rrrrÚ available‡sr!cCst t |d¡¡S)Nz;usr/lib*/NetworkManager/*/libnm-settings-plugin-ifcfg-rh.so)Úglobrrr rrrr‘s þÿrcCs`ddg}ddg}|D]}tj|||d�sdSqddg}|D]}tj t ||¡¡r<d SqZloggingrør"ÚtypingrrZ cloudinitrrZcloudinit.distros.parsersrrZ cloudinit.netrr r r r Zcloudinit.net.network_stater Z getLoggerrKrÇrrr r'r(rOrvrŽrêr!rrrrrrÚs:    6nJK