܍~cfEddlZddlZddlZddlmZmZddlmZddlm Z m Z m Z ddl m Z mZmZmZmZddlmZmZdZejeZdZdd Zd Zdd ZGd d ejZddZddZdS)N)Optionalcast)log)safeyamlsubputil)IPV6_DYNAMIC_TYPES SYS_CLASS_NETget_devicelistrenderersubnet_is_ipv6)NET_CONFIG_TO_V2 NetworkStates4# This is the initial network config. # It can be overwritten by cloud-init or console-conf. network: version: 2 ethernets: all-en: match: name: "en*" dhcp4: true all-eth: match: name: "eth*" dhcp4: true c^tfd|DS)Nc3PK|] \}}|||fV!dSN) startswith).0keyvaluematchs 7/usr/lib/python3/dist-packages/cloudinit/net/netplan.py z,_get_params_dict_by_match..'sQ S% >>%  e )dictitems)configrs `r_get_params_dict_by_matchr&sC "LLNN  rc d#d}|g}g}g}g}g}|dg} | g} | D]V} | d} | dr#| dkr| dz } || diP| tvr|d diq| d vrd | d z} d | vr| d| d zz } d| vr]| drH| d} d| vr|d| in|d| id| vr"||| dgz }d| vr"||| dgz }d| vrAd}t | rd|vrd}||| di| dgD]}|dd|d }|d|d}d|vr+|d|ddi|||| Xd|vrR|d}|r0|d|kr$t d||d|n |d|d<t|dkr|d|it|dkr|d|it|dkrd|i}|d |it|dkrD|d i}|d!|i|d |id"|vrF|d"@|d"tj |d"idSdSdS)$aThis method parse a cloudinit.net.network_state dictionary (config) and maps netstate keys/values into a dictionary (entry) to represent netplan yaml. An example config dictionary might look like: {'mac_address': '52:54:00:12:34:00', 'name': 'interface0', 'subnets': [ {'address': '192.168.1.2/24', 'mtu': 1501, 'type': 'static'}, {'address': '2001:4800:78ff:1b:be76:4eff:fe06:1000", 'mtu': 1480, 'netmask': 64, 'type': 'static'}], 'type: physical', 'accept-ra': 'true' } An entry dictionary looks like: {'set-name': 'interface0', 'match': {'macaddress': '52:54:00:12:34:00'}, 'mtu': 1501} After modification returns {'set-name': 'interface0', 'match': {'macaddress': '52:54:00:12:34:00'}, 'mtu': 1501, 'address': ['192.168.1.2/24', '2001:4800:78ff:1b:be76:4eff:fe06:1000"], 'ipv6-mtu': 1480}  cp|rt|tfvr|S||vr||S|gS)zBHelper to convert strings to list of strings, handle single string)typestrsplit)objtokens r_listifyz$_extract_addresses.._listifySsK d3iiu,,J C<<99U## # rNsubnetsr"dhcp4Tdhcp6)staticstatic6z%saddressprefixz/%dgateway:gateway6gateway4dns_nameservers dns_searchmtuzipv6-mturoutesnetwork/)viatometricdzZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.r addresses nameserverssearchz accept-ra)r ) getrupdater r appendLOGwarninglenris_true)rentryifnamefeaturesr'r>r7r? searchdomainsr(subnetsn_typeaddrr0mtukeyrouteto_net new_route entry_mtunss r_extract_addressesrU.sJ    I FKMjjB''G%#%#**V$$   f % %# #&  3 LL'4 ) ) ) ) * * * LL'4 ) ) ) ) - - -&**Y///D6!! 8 4 444F""vzz)'<'<" **Y//'>>LL*g!67777LL*g!6777 F**xx 3Db(I(IJJJ v%%&**\2*F*F!G!GG !&))(jH.D.D'F ffjj&7&78999Hb11 ) )$)IIi$8$8$8$8%))H:M:M:MN 99Y//  u$$$$h (C0H0H%IJJJ i((((   T " " " IIe$$  ))33 KK6u      "%=E%L 9~~ k9-... 6{{Q h'((( ;!; ' mR())) =A YY}b ) ) 8]+,,, mR()))f !4!@ k4< ;0G0G#H#HIJJJJJ!@!@rctfd|D}t|dkr|d|idSdS)NcNg|]!\}}|ddk|"S)z bond-masterN)rA)rnamecfg bond_masters r z0_extract_bond_slaves_by_name..s@   sww}d++{:: :::rr interfaces)sortedrrFrB)r\rHrZbond_slave_namess ` r_extract_bond_slaves_by_namer_s    )//11    q   l$4566666! rc`tjd}tj|sdSt j|d}|tkrdSfddD}d|D}t d|||g|zD]}tj |dS)Nz etc/netplan/00-snapd-config.yamlF)decodec:g|]}tj|S)r target_path)rftargets rr[z"_clean_default..s6  ##r)z-run/systemd/network/10-netplan-all-en.networkz.run/systemd/network/10-netplan-all-eth.networkz#run/systemd/generator/netplan.stampcPg|]#}tj|!|$Src)ospathisfile)rres rr[z"_clean_default..s+888abgnnQ&7&78888rz9removing known config '%s' and derived existing files: %s) rrdrhrirjr load_fileKNOWN_SNAPD_CONFIGrDdebugunlink)rftpathcontentderivedexistingres` r_clean_defaultrss  V%G H HE 7>>% nU5111G$$$ G987888HIIC  Wx  ! rceZdZdZddgZddgZddZedZ dde d e e d dfd Z dd Z ddZde fdZdS)RendererzBRenders network information in a /etc/netplan/network.yaml format.netplangenerateinfoNc|si}|dd|_|dd|_|dd|_|dd|_|dd|_dS) N netplan_pathzetc/netplan/50-cloud-init.yamlnetplan_headerpostcmdsF clean_defaultTrJ)rArzr{ _postcmdsr} _features)selfrs r__init__zRenderer.__init__s F"JJ <  %jj)94@@J66#ZZ>>J55rc>|j tj|jd\}}tj|}|dd|_nI#tj$rYn8t tf$r%}t d|Yd}~nd}~wwxYw|jS)NTcapturez netplan.iorJz-Failed to list features from netplan info: %s) rr NETPLAN_INFOr load_yamlProcessExecutionError TypeErrorKeyErrorrDrm)r info_blob_errrxes rrJzRenderer.featuress > ! N"&)D,=t"L"L"L 4~i00!%l!3J!?-   x( N N N I1MMMMMMMM N~sAAB B0BB network_state templatesreturnctjtj||j}t jtj||j r|j nd}| |}| ds|dz }t j |||z|j rt|||j||jdS)N )rf)run)rhrijoinrrdrzr ensure_dirdirnamer{_render_contentendswith write_filer}rs_netplan_generater~_net_setup_link)rrrrffpnplanheaderrps rrender_network_statezRenderer.render_network_states',,t/779JKK 00111(,(;C$$&&}55t$$  dNF '!1222   * & ) ) ) ) 4>222 00000rFcx|stddStj|jddS)Nz!netplan generate postcmd disabledTr)rDrmrNETPLAN_GENERATE)rrs rrzRenderer._netplan_generate s@  II9 : : : F $'666666rc|stddSgd}t}tdD]}} t D]K}t jt|zr"tj |t|zgzdLdS#tj $r }|}Yd}~vd}~wwxYwtd|)zTo ensure device link properties are applied, we poke udev to re-evaluate networkd .link files and call the setup_link udev builtin command z'netplan net_setup_link postcmd disabledN)udevadmz test-builtinnet_setup_linkTrzQ'udevadm test-builtin net_setup_link' unable to run successfully for all devices.) rDrm Exceptionranger rhriislinkr rr RuntimeError)rr setup_lnklast_exception_ifacers rrzRenderer._net_setup_links   II? @ @ @ FAAA #q " "A #+--Ew~~me&;<< %)>(??- # # #!" #0" "sABB4(B//B4c  |jdkr8tdtjd|jiddSi}i}i}i}i}g}|jdg}|j} |j } | D]l} | d} td| D} | d }|d kr| | d dd }|d 8| d d}|d| i|d <n|d =|d=t| || |j|| |i|dkrUi}i}t#tt%jd}dD]o}t'| |}| D]H\}}||dd}|1|||iIpt+|dkr|d|i| d r| d  |d<| d}|dkrt-||| t| || |j|| |iB|dkr| d}t/t1j|}d|i}d}t'| |}i}t#tt%jd} | D]\}}| |}||||i|dvrGi}!|D]+}"|"\}#}$t5|$|!|#<,|||!it+|dkr|d|i| d r| d  |d<t| || |j|| |i|dkr| d| dd}%| d d}|| |%d<t| |%| |j|| |%in| s| rI| | d }&|||||fD]<}'|' D]%\}(})d!|)vsd"|)vr|)d!|&i&=d#}*|d$||*d%|z }||*d&|z }||*d'|z }||*d(|z }||*d)|z }d*|S)+NzV2 to V2 passthroughr8F)explicit_start explicit_endr\rXc3(K|] \}}|||fVdSrrc)rrrs rrz+Renderer._render_content..Ks< S%$e $$$$rr"physicalr)set-namer mac_address macaddressrbond)bond_zbond-r-r parametersz bond-slavesnonebridge bridge_portsbridge_)z path-costz port-priorityvlanvlan_idzvlan-raw-device)idlink)r>r@r?r>cn|r2tj||iddd}tj|d}|gSgS)NFT)rrnoaliasz )rdumpstextwrapindent)rXsectiondumptxts r_render_sectionz1Renderer._render_content.._render_sectionsO ~7O#(!&  odG44u Irznetwork: version: 2 ethernetswifisbondsbridgesvlansr)versionrDrmrrr_network_staterAr4dns_searchdomainsiter_interfacesrrlowerrUrJrBrrrreplacerFr_r]copyr$intrCr)+rrrrrrrrpr\r?rKrrIifcfgif_typeethmacaddrr bond_config v2_bond_mapr bond_paramsparamrnewnameslave_interfacesrportsr match_prefixparams br_config v2_bridge_mapnewvaluevalportportvalrnscfgr_namerYrs+ rrzRenderer._render_content1s  A % % II, - - ->M01$"   "155lBGG #3 %7 #3355h -h -FZZ''F$*LLNNE ii''G*$$!'"YYw55w<'#ii t< >NUE+//66G $$gu%5666"@@@#%#(::C.1iikkOT7-0\\HTNN!(('8)<===y>>A%%MM<";<<<99]++H+0+?+E+E+G+GF<("5&&$-HHH/0000F"" ))I..!II&788 ))M488&)0D&"5$ FFF fd^,,,  7- 7"-GGE%ueWeD 7 7")--//77JE3$++{#/E/E JJ u566667    3444??; :::??7E222??7E222??9g666??7E222wwwrr)NN)F)__name__ __module__ __qualname____doc__rrrpropertyrJrrrrrrrrcrrrurusLL!:.v&L 6 6 6 6  X "%) 11#1D>1  111147777 """">_ \_ _ _ _ _ _ rrucRdg}ddg}|D]}tj|||sdSdS)Nrvz /usr/sbinz/sbin)r@rfFT)rwhich)rfexpectedr@ps r availablersL{H7 #F z!F6::: 55  4rcd}t||d}|sd}|ds|dz }|j|}||zS)Nzetc/network/50-cloud-init.yaml)rzr{rr)rurr)rrrzr contentss rnetwork_state_to_netplanrso3L($  H  ??4 $'x' 66H H rr) rrhrtypingrr cloudinitrloggingrrr cloudinit.netr r r r r cloudinit.net.network_staterrrl getLoggerrrDrrUr_rsrurrrcrrrs !!!!!!!!$$$$$$**********GFFFFFFF g!!xKxKxKxKv 7 7 7:~ ~ ~ ~ ~ x ~ ~ ~ Br