a '¡Dg„Sã@sòddlZddlZddlZddlZddlZddlmZddlmZddl m Z m Z m Z ddl mZmZmZddlmZe e¡Zgd¢Zgd¢Zgd ¢Zd d „Zd d „Zddd„Zdd„Ze  d¡dd„ƒZdd„ZGdd„dej ƒZ ddd„Z!dS)éN)Úsuppress)ÚOptional)Ú performanceÚsubpÚutil)Ú ParserErrorÚrendererÚsubnet_is_ipv6)Ú NetworkState)zpre-upÚupzpost-upÚdownzpre-downz post-down)Z bridge_ageingZbridge_bridgeprioZ bridge_fdZ bridge_gcinitZ bridge_helloZ bridge_maxageZbridge_maxwaitZ bridge_stp)ÚaddressÚnetmaskÚ broadcastÚnetworkÚmetricÚgatewayZ pointtopointZmediaÚmtuÚhostnameZ leasehoursZ leasetimeZvendorZclientZbootfileÚserverZhwaddrZproviderÚframeZnetnumZendpointÚlocalZttlcCs’g}gd¢}| ¡D]t\}}|dkr&q|dkrBd|d|df}|r||vrt|tƒrbd |¡}d|vrv| dd¡}| d  ||¡¡qt|ƒS) N) r rrrrZ pointopointrZscopeÚ dns_searchÚdns_nameserversrr z%s/%sÚprefixú Ú_ú-ú {0} {1})ÚitemsÚ isinstanceÚlistÚjoinÚreplaceÚappendÚformatÚsorted)ÚifaceÚsubnetÚcontentZ valid_mapÚkeyÚvalue©r,ú5/usr/lib/python3.9/site-packages/cloudinit/net/eni.pyÚ_iface_add_subnetAs     r.c Cs|dkr gSg}gd¢}gd¢}ddi}|ddvr>| d¡| ¡D]¶\}}t|tƒrh||rddnd }|rF||vrvqF|d kr |r ||krFt d |d ||¡qF||vrÎ|D]} | d  | ||¡| ¡¡q¬qFt|tƒrâd  |¡}| d  | ||¡|¡¡qFt |ƒS)Nr) ÚcontrolZ device_idZdriverÚindexÚinetÚmodeÚnameÚsubnetsÚtype)Úbridge_pathcostÚbridge_portprioZbridge_waitportÚ mac_addressÚ hwaddressr5)ÚbondÚbridgeÚ infinibandÚvlanZonZoffrzZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.r3rr) r$rr ÚboolÚLOGZwarningr%Úgetr!r"r&) r'r0Úipv4_subnet_mtur)Z ignore_mapZmultiline_keysÚrenamesr*r+Úvr,r,r-Ú_iface_add_attrs_s<     û  rDFcCs˜|d}|d}|dkrd}n|dvr0d|}nd|}| ¡}| ||dœ¡djfi|¤Žd jfi|¤Žg}|r”| d ¡r”| d jfi|¤Ž¡|S) Nr3r/Úauto)Zhotplugzallow-z # control-)ÚfullnameÚcverbz{cverb} {fullname}ziface {fullname} {inet} {mode}r8z hwaddress {mac_address})ÚcopyÚupdater%r@r$)r'r0Úrender_hwaddressrFr/rGÚsubstÚlinesr,r,r-Ú_iface_start_entry›s þrMc sJd}| ¡D�] }| ¡}| d¡r&q | d¡}|d}|dkrÈ|d}| d¡s`tj ||¡}t |¡D]Z‰t ˆ¡} ‡fdd „| Dƒ} | D]4} t   | ¡ ¡} tj  | ¡} t || tj  | ¡| ƒqŽqjq |d k�r^|d} |  d¡sòtj || ¡} t | ¡D]^‰tˆd ƒ�}| ¡ ¡} Wdƒn1�s.0Ytj  ˆ¡}t || tj  |¡|ƒqüq |d k�r |dd…D](}||v�rŽd |i||<d||d <�qtq |dk�r|dd…\}}}||v�rÔd |i||<nd||v�ròtd||fƒ‚|||d<|||d<|}q |dk�rH|ddk�r2|d}n|d}|||d<q |tv�rd|d|||<q |tv�rª|||v�rˆg|||<||| d |dd…¡¡q | d¡�r\d||v�rÐi||d<|dk�rg||dd<|dd…D]}||dd |¡�qönD|dk�rg||dd<|dd…D]}||dd |¡�qËsüz*_parse_deb_config_data..ÚsourceÚrrEZ _source_pathTr'éÚfamilyz:Interface %s can only be defined once. Re-defined in '%s'.Úmethodr9Zetherézdns-Údnsz dns-searchÚsearchzdns-nameserversÚ nameserversZbridge_r;ÚZ bridge_portsZportsZ bridge_hwZmacr6Zpathcostr7Zportpriozbond-r:F)Ú splitlinesÚstripÚ startswithÚsplitrQrRr"ÚglobÚlistdirrZload_text_fileÚabspathÚ_parse_deb_config_dataÚdirnameÚopenÚreadrÚNET_CONFIG_OPTIONSÚNET_CONFIG_COMMANDSr$ÚNET_CONFIG_BRIDGE_OPTIONSr#ÚlowerÚkeys)ÚifacesÚcontentsÚsrc_dirÚsrc_pathZcurrifÚlinerfÚoptionZparsed_src_dirZ dir_contentsÚentryZsrc_dataZ abs_entryZ new_src_pathÚfpZabs_pathr'r\r]ÚvalÚdomainrZ bridge_optionZ bond_optionr,rWr-rj³sÒ      þ ÿ    , ÿ  þ  þ ÿÿ       "              rjzConverting eni datacCsi}t||ddd�t|ƒS)z=Return a network config representation of what is in eni_dataN)rurv)rjÚ_ifaces_to_net_config_data)Zeni_datarsr,r,r-Úconvert_eni_data7sr~cs8i‰| ¡D�] \}}| d¡d}|ˆvrf|dkr:d}nd}||gdœˆ|<d|vrf|dˆ|d<||d d œ}| d ¡rˆd |d <nd |d <| d ¡dkrª|d|d<dD]}||vr®||||<q®d|v�rdD]0}||dvrÖ|d|rÖ|d||d|<qÖˆ|d |¡q d‡fdd„tˆƒDƒdœS)zÂReturn network config that represents the ifaces data provided. ifaces = _parse_deb_config_data(...) config = ifaces_to_net_config_data(ifaces) state = parse_net_config_data(config).ú:rÚloÚloopbackÚphysical)r5r3r4r9r8r])Z_orig_eni_namer5rEr/ZmanualÚstaticr )rrrr_)rar`Zdns_r4rOcsg|] }ˆ|‘qSr,r,)rVÚd©Zdevsr,r-rXeóz._ifaces_to_net_config_data..)ÚversionÚconfig)rÚ partitionr@r$r&)rsr3ÚdataZdevnameZdtyper(Zcopy_keyÚnr,r…r-r}?s2    r}c@sPeZdZdZddd„Zddd„Zdd d „Zdd d „Zdee e dd œdd„Z dS)ÚRendererz@Renders network information in a /etc/network/interfaces format.NcCs6|si}| dd¡|_| dd¡|_| dd¡|_dS)NÚeni_pathúetc/network/interfacesÚ eni_headerÚ netrules_pathz(etc/udev/rules.d/70-persistent-net.rules)r@r�r�r�)Úselfrˆr,r,r-Ú__init__ksÿzRenderer.__init__rbc CsLg}|d}|d}d}dddœ}d}|dd krD|d d krDd }n|dd kr`|d dkr`d}d} dD]º} |rz| dkrzqh| dkrž| d||| || f7} qh| |vrh| dk�r d|| vrÆ| d7} n | d ¡dkrÞ| d7} n| d7} d |v�r"| d|| |d f7} qh| d|| || f7} qh| || |¡| || |¡|S)a¾When rendering routes for an iface, in some cases applying a route may result in the route command returning non-zero which produces some confusing output for users manually using ifup/ifdown[1]. To that end, we will optionally include an '|| true' postfix to each route line allowing users to work with ifup/ifdown without using --force option. We may at somepoint not want to emit this additional postfix, and add a 'strict' flag to this function. When called with strict=True, then we will not append the postfix. 1. http://askubuntu.com/questions/168033/ how-to-set-static-routes-in-ubuntu-server zpost-up route addzpre-down route delz || trueZgwr)rrrbrz0.0.0.0rz defaultz::rrz -A inet6 default)rrrrz%s %s %srz -A inet6é z -hostz -netz %s/%sz %s %s)r@r$) r‘ÚrouteÚindentr)r r Zor_trueÚmappingZ default_gwZ route_lineÚkr,r,r-Ú _render_routets>þ      zRenderer._render_routeFc svt ˆ¡‰ttƒ�ˆ d¡Wdƒn1s20Yg}ˆ di¡}ˆ dd¡}ˆ dd¡}|rpdˆd<|�rt|ƒD�]Œ\}}d} |ˆd<|dˆd <| d d ¡ˆd <d } t|ƒrÆ| d 7} n | d¡} | ˆd <|ddksþ|ddksþ|ddk�r$dˆd <|du�r’|�rdndˆd<nn|ddk�rDd ˆd <dˆd<nN|ddk�rdd ˆd <dˆd<n.t|ƒ�r’dˆd <|du�r’|�rŠdndˆd<d‡fdd„|Dƒv�r²dˆd <tt ˆ||d�t ˆ|ƒt ˆ|| ƒƒ} | dg¡D]} |   |j | dd �¡�qæ| | ¡q~nbg} d!ˆv�s(d"ˆv�r>|  d#jfiˆ¤Ž¡|  d$jfiˆ¤Ž¡|   t ˆd%dd&�¡| | ¡|S)'NZ config_idr4z accept-raZ wakeonlanÚgz ethernet-wolr0r5r2r/rEr1Ú6rZdhcp4Zdhcp6zipv6_dhcpv6-statefulZdhcpÚ1Ú0Ú accept_razipv6_dhcpv6-statelessZ ipv6_slaacrƒTcsg|]}dˆd|v‘qS)zauto %sr3r,)rVrw©r'r,r-rXÞsz*Renderer._render_iface..Úalias©rJZroutesz )r•z bond-masterz bond-slavesz auto {name}ziface {name} {inet} {mode}r)r0rA)rHÚdeepcopyrÚKeyErrorÚpopr@Ú enumerater r!rMr.rDÚextendr˜r$r%) r‘r'rJÚsectionsr4r�Z ethernet_wolr0r(rAZ subnet_inetrLr”r,ržr-Ú _render_iface¨s€  (       ÿ þ ý      ÿ ÿý üÿ ÿ zRenderer._render_ifacec sddddddœgdœ}| ¡D]}| d¡dkrt |¡}q|j}|r\d  |¡|d d d <|j}|r|d  |¡|d d d <d ddddddœ‰g}| | |¡¡t | ¡‡fdd„d�D](}| d¡dkrÎqº| |j||d�¡qº|  ¡D]}|  |  |¡¡qìd dd„|Dƒ¡dS)z1Given state, emit etc/network/interfaces content.r€r‚r1r�rE)r5r/)r3r5r1r4r3rr4rrrrOr^ér[é)r�r‚r<r:r;r=csˆ|d|dfS)Nr5r3r,)r—©Úorderr,r-Ú r†z-Renderer._render_interfaces..)r*r z cSsg|]}d |¡‘qS)Ú )r")rVÚsr,r,r-rX,r†z/Renderer._render_interfaces..r­) Ziter_interfacesr@rHr¡rr"Zdns_searchdomainsr¥r§r&Z iter_routesr$r˜) r‘Ú network_staterJr€r'raZ searchdomainsr¦r”r,rªr-Ú_render_interfacesúsF ü  ú  þ  ÿ zRenderer._render_interfaces)r¯Ú templatesÚreturncCs†t ||j¡}t tj |¡¡|jr,|jnd}t  |||  |¡¡|j r‚t ||j ¡}t tj |¡¡tj ||  |¡dd�dS)NrbT)r)Z preserve_mode) rÚ target_pathr�rZ ensure_dirrQrRrkr�Z write_filer°r�Z_render_persistent_net)r‘r¯r±ÚtargetZfpeniÚheaderZnetrulesr,r,r-Úrender_network_state.sýzRenderer.render_network_state)N)rb)F)F)NN) Ú__name__Ú __module__Ú __qualname__Ú__doc__r’r˜r§r°r rÚdictr¶r,r,r,r-rŒhs 4 R 7üûrŒcCsPgd¢}ddg}|D]}tj|||d�sdSqt |d¡}tj |¡sLdSdS)N)ZifqueryZifupZifdownz/sbinz /usr/sbin)r`r´FrŽT)rÚwhichr³rQrRrS)r´Zexpectedr`ÚpZenir,r,r-Ú availableCs  r¾)F)N)"rHrgZloggingrQrTÚ contextlibrÚtypingrZ cloudinitrrrZ cloudinit.netrrr Zcloudinit.net.network_stater Z getLoggerr·r?rorprnr.rDrMrjZtimedr~r}rŒr¾r,r,r,r-Ús0      <  )\