a 'DgS@sddlZddlZddlZddlZddlZddlmZddlmZddl m Z m Z m Z ddl mZmZmZddlmZeeZgdZgdZgd Zd d Zd d ZdddZddZe dddZddZGdddej Z dddZ!dS)N)suppress)Optional) performancesubputil) ParserErrorrenderersubnet_is_ipv6) NetworkState)zpre-upupzpost-updownzpre-downz post-down)Z bridge_ageingZbridge_bridgeprioZ bridge_fdZ bridge_gcinitZ bridge_helloZ bridge_maxageZbridge_maxwaitZ bridge_stp)addressnetmask broadcastnetworkmetricgatewayZ pointtopointZmediamtuhostnameZ leasehoursZ leasetimeZvendorZclientZbootfileserverZhwaddrZproviderframeZnetnumZendpointlocalZttlcCsg}gd}|D]t\}}|dkr&q|dkrBd|d|df}|r||vrt|trbd|}d|vrv|dd}|d ||qt|S) N) r rrrrZ pointopointrZscope dns_searchdns_nameserversrr z%s/%sprefix _- {0} {1})items isinstancelistjoinreplaceappendformatsorted)ifacesubnetcontentZ valid_mapkeyvaluer,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|trh||rddnd }|rF||vrvqF|d kr|r||krFtd |d ||qF||vr|D]} |d |||| qqFt|trd |}|d ||||qFt |S)Nr) controlZ device_idZdriverindexinetmodenamesubnetstype)bridge_pathcostbridge_portprioZbridge_waitport mac_address hwaddressr5)bondbridge infinibandvlanZonZoffrzZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.r3rr) r$rr boolLOGZwarningr%getr!r"r&) r'r0ipv4_subnet_mtur)Z ignore_mapZmultiline_keysrenamesr*r+vr,r,r-_iface_add_attrs_s<       rDFcCs|d}|d}|dkrd}n|dvr0d|}nd|}|}|||ddjfi|d jfi|g}|r|d r|d jfi||S) Nr3r/auto)Zhotplugzallow-z # control-)fullnamecverbz{cverb} {fullname}ziface {fullname} {inet} {mode}r8z hwaddress {mac_address})copyupdater%r@r$)r'r0render_hwaddressrFr/rGsubstlinesr,r,r-_iface_start_entrys rMc sJd}|D] }|}|dr&q |d}|d}|dkr|d}|ds`tj||}t|D]Zt} fdd | D} | D]4} t | } tj | } t || tj | | qqjq |d kr^|d} | dstj|| } t| D]^td }|} Wdn1s.0Ytj }t || tj ||qq |d kr|ddD](}||vrd |i||<d||d <qtq |dkr|dd\}}}||vrd |i||<nd||vrtd||f|||d<|||d<|}q |dkrH|ddkr2|d}n|d}|||d<q |tvrd|d|||<q |tvr|||vrg|||<|||d|ddq |dr\d||vri||d<|dkrg||dd<|ddD]}||dd|qnD|dkrg||dd<|ddD]}||dd|qsz*_parse_deb_config_data..sourcerrEZ _source_pathTr'familyz:Interface %s can only be defined once. Re-defined in '%s'.methodr9Zetherzdns-dnsz dns-searchsearchzdns-nameservers nameserversZbridge_r;Z bridge_portsZportsZ bridge_hwZmacr6Zpathcostr7Zportpriozbond-r:F) splitlinesstrip startswithsplitrQrRr"globlistdirrZload_text_fileabspath_parse_deb_config_datadirnameopenreadrNET_CONFIG_OPTIONSNET_CONFIG_COMMANDSr$NET_CONFIG_BRIDGE_OPTIONSr#lowerkeys)ifacescontentssrc_dirsrc_pathZcurriflinerfoptionZparsed_src_dirZ dir_contentsentryZsrc_dataZ abs_entryZ new_src_pathfpZabs_pathr'r\r]valdomainrZ bridge_optionZ bond_optionr,rWr-rjs           ,             "              rjzConverting eni datacCsi}t||dddt|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] \}}|dd}|vrf|dkr:d}nd}||gd|<d|vrf|d|d<||d d }|d rd |d <nd |d <|d dkr|d|d<dD]}||vr||||<qd|vrdD]0}||dvr|d|r|d||d|<qֈ|d|q dfddtDdS)zReturn 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).:rloloopbackphysical)r5r3r4r9r8r])Z_orig_eni_namer5rEr/Zmanualstaticr )rrrr_)rar`Zdns_r4rOcsg|] }|qSr,r,)rVdZdevsr,r-rXez._ifaces_to_net_config_data..)versionconfig)r partitionr@r$r&)rsr3dataZdevnameZdtyper(Zcopy_keynr,rr-r}?s2    r}c@sPeZdZdZdddZdddZdd d Zdd d Zdee e dd ddZ dS)Rendererz@Renders network information in a /etc/network/interfaces format.NcCs6|si}|dd|_|dd|_|dd|_dS)Neni_pathetc/network/interfaces eni_header netrules_pathz(etc/udev/rules.d/70-persistent-net.rules)r@rrr)selfrr,r,r-__init__kszRenderer.__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| dkr d|| vr| d7} n |d dkr| d7} n| d7} d |vr"| d|| |d f7} qh| d|| || f7} qh||| |||| ||S)aWhen 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$) rrouteindentr)r r Zor_truemappingZ default_gwZ route_linekr,r,r- _render_routets>      zRenderer._render_routeFc svtttdWdn1s20Yg}di}dd}dd}|rpdd<|rt|D]\}}d} |d<|dd <|d d d <d } t|r| d 7} n |d} | d <|ddks|ddks|ddkr$dd <|dur|rdndd<nn|ddkrDd d <dd<nN|ddkrdd d <dd<n.t|rdd <|dur|rdndd<dfdd|Dvrdd <tt ||dt |t || } |dgD]} | |j | dd q|| q~nbg} d!vs(d"vr>| d#jfi| d$jfi| t d%dd&|| |S)'NZ config_idr4z accept-raZ wakeonlangz ethernet-wolr0r5r2r/rEr16rZdhcp4Zdhcp6zipv6_dhcpv6-statefulZdhcp10 accept_razipv6_dhcpv6-statelessZ ipv6_slaacrTcsg|]}dd|vqS)zauto %sr3r,)rVrwr'r,r-rXsz*Renderer._render_iface..aliasrJZroutesz )rz bond-masterz bond-slavesz auto {name}ziface {name} {inet} {mode}r)r0rA)rHdeepcopyrKeyErrorpopr@ enumerater r!rMr.rDextendrr$r%) rr'rJsectionsr4rZ ethernet_wolr0r(rAZ subnet_inetrLrr,rr- _render_ifaces  (                   zRenderer._render_ifacec sddddddgd}|D]}|ddkrt|}q|j}|r\d ||d d d <|j}|r|d ||d d d <d ddddddg}|||t |fdddD](}|ddkrq||j||dq| D]}| | |qddd|DdS)z1Given state, emit etc/network/interfaces content.rrr1rrE)r5r/)r3r5r1r4r3rr4rrrrOr^r[)rrr<r:r;r=cs|d|dfS)Nr5r3r,)rorderr,r- rz-Renderer._render_interfaces..)r*rz cSsg|]}d|qS) )r")rVsr,r,r-rX,rz/Renderer._render_interfaces..r) Ziter_interfacesr@rHrrr"Zdns_searchdomainsrrr&Z iter_routesr$r) r network_staterJrr'raZ searchdomainsrrr,rr-_render_interfacessF       zRenderer._render_interfaces)r templatesreturncCst||j}ttj||jr,|jnd}t ||| ||j rt||j }ttj|tj || |dddS)NrbT)r)Z preserve_mode) r target_pathrrZ ensure_dirrQrRrkrZ write_filerrZ_render_persistent_net)rrrtargetZfpeniheaderZnetrulesr,r,r-render_network_state.szRenderer.render_network_state)N)rb)F)F)NN) __name__ __module__ __qualname____doc__rrrrr rdictrr,r,r,r-rhs 4 R 7rcCsPgd}ddg}|D]}tj|||dsdSqt|d}tj|sLdSdS)N)ZifqueryZifupZifdownz/sbinz /usr/sbin)r`rFrT)rwhichrrQrRrS)rZexpectedr`pZenir,r,r- availableCs  r)F)N)"rHrgZloggingrQrT contextlibrtypingrZ cloudinitrrrZ cloudinit.netrrr Zcloudinit.net.network_stater Z getLoggerrr?rorprnr.rDrMrjZtimedr~r}rrr,r,r,r-s0      <  )\