fK ddlZddlZddlZddlZddlZddlZddlmZmZddl m Z m Z m Z m Z ddlmZmZmZmZmZddlmZmZdZdZej2eZdZdd ed efd Zd Zdd Z GddejBZ!ddZ"y)N)Optionalcast)featuressafeyamlsubputil)IPV6_DYNAMIC_TYPES SYS_CLASS_NETget_devicelistrenderersubnet_is_ipv6)NET_CONFIG_TO_V2 NetworkStatez/etc/netplan/50-cloud-init.yamls4# 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 cHtfd|jDS)Nc3NK|]\}}|jr||fywN) startswith).0keyvaluematchs 7/usr/lib/python3/dist-packages/cloudinit/net/netplan.py z,_get_params_dict_by_match..+s- S% >>%  e s"%)dictitems)configrs `r_get_params_dict_by_matchr*s# "LLN rentryc xd%d}|g}g}g}g}g}|jdg} | g} | D],} | jd} | jdr| dk(r| dz } |j| diD| tvr|jddi`| d vsed | jd z} d | vr| d | jd zz } | jdrx| jddd} t j | d}t j | d}||vrtjd| d| d| d<|j| d| vr||| jdgz }d| vr||| jdgz }d| vr5d}t| rd|vrd}|j|| jdi| jdgD]s}|jdd|jd }|jd|d} d|vr#| jd|jddi|j| u|j| /d|vr?|jd}|r$|d|k7rtjd||d|n|d|d<t|d kDr|jd!|it|d kDr|jd|it|d kDrd!|i}|jd"|it|d kDr8|jd"i}|jd#|i|jd"|id$|vr<|d$6|jd$tj|jd$iyyy#t$r&}tjd| d| |Yd}~d}~wwxYw)&aThis method parse a cloudinit.net.network_state dictionary (config) and maps netstate keys/values into a dictionary (entry) to represent netplan yaml. (config v1 -> netplan) 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} cZ|rt|ts|S||vr|j|S|gS)zT Helper to convert strings to list of strings, handle single string ) isinstancestrsplit)objtokens r_listifyz$_extract_addresses.._listifyWs:*S#.J C<99U# # rNsubnetstypedhcp4Tdhcp6)staticstatic6z%saddressprefixz/%dgatewaydefault)viatoF)strictzAGateway %s is not contained within subnet %s, adding on-link flagzon-linkzDFailed to check whether gateway %s is contained within subnet %s: %sdns_nameservers dns_searchmtuzipv6-mturoutesnetwork/metricdzZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.r addresses nameserverssearchz accept-ra) )getrupdater ipaddress ip_address ip_networkLOGdebug ValueErrorwarningappendr lenris_true)rrifnamerr'r>r9r? searchdomainsr(subnetsn_typeaddr new_routesubnet_gatewaysubnet_networkemtukeyrouteto_net entry_mtunss r_extract_addressesr\2sJ I FKMjjB'G;#**V$   f %& 3 LL'4 ) * * LL'4 ) - -&**Y//D6! 8 444zz)$!::i0# %.%9%9&:K%LN%.%9%9$u%MN&^; 3"9-  04 ), i( F*x 3Db(IJJ v%&**\2*F!GG !&)jH.D'F ffjj&789Hb1 )$)IIi$8%))H:MN 99Y/  u$$$h (C0H%IJ i( )   T "w;#z IIe$ )3 KK6u   "%=E%L 9~ k9-. 6{Q h'( ;!; ' mR() =A YY}b ) 8]+, mR()f !4!@ k4<< ;0G#HIJ"Ak"KK=y) s#AN  N9N44N9c t|jDcgc]\}}|jdd|k(r|c}}}t|dkDr|j d|iyycc}}w)Nz bond-masterr interfaces)sortedrrBrLrC)r^r bond_masternamecfgbond_slave_namess r_extract_bond_slaves_by_namerdsq *//1 sww}d+{:   q  l$456!  s!A% ctj|d}tjj |syt j |}|tk7rydDcgc]}tj||}}|Dcgc]$}tjj |s#|&}}tjd|||g|zD]}tj|ycc}wcc}w)Nz etc/netplan/00-snapd-config.yaml)z-run/systemd/network/10-netplan-all-en.networkz.run/systemd/network/10-netplan-all-eth.networkz#run/systemd/generator/netplan.stampz9removing known config '%s' and derived existing files: %s) r target_pathospathisfilerload_binary_fileKNOWN_SNAPD_CONFIGrGrHunlink)targettpathcontentfderivedexistings r_clean_defaultrss   V%G HE 77>>% ##E*G$$   #G#8abggnnQ&78H8IIC  Wx  ! 9sC =$C%"C%ceZdZdZddgZddgZddZedZ dde d e e d dfd Z dd e d e fdZddZde d efdZy)RendererzBRenders network information in a /etc/netplan/network.yaml format.netplangenerateinfoNc|si}|jdt|_|jdd|_|jdd|_|jdd|_|jdd|_y)N netplan_pathnetplan_headerpostcmdsF clean_defaultTr)rBCLOUDINIT_NETPLAN_FILErzr{ _postcmdsr} _features)selfrs r__init__zRenderer.__init__siF"JJ~7MN$jj)94@J6#ZZ>J5rc|jS tj|jd\}}tj|}|dd|_|jS|jS#tj $rY|jSt tf$r+}tjd|Yd}~|jSd}~wwxYw)NTcapturez netplan.iorz-Failed to list features from netplan info: %s) rr NETPLAN_INFOr load_yamlProcessExecutionError TypeErrorKeyErrorrGrH)r info_blob_errrxrVs rrzRenderer.featuress >> ! N"&))D,=,=t"L 4~~i0!%l!3J!?~~t~~ -- ~~x( N I1MM~~ NsAA,,C CCC network_state templatesreturnctjjtj||j }t jtjj||j|}|jr |jnd}|jds|dz }||z}d}tjj|rgt jtj|j!}t#|d5} t j| } ddd| k(rd}t$j&rdnd} |s>tjj|rt j(|} | | z| k(r| } t j*||| |j,r t/| |j1|j2| |j5|j2 y#1swYxYw) N FrbTii)mode)rm)run same_content)r)rgrhjoinrrfrzr ensure_dirdirname_render_contentr{endswithexists hash_bufferioBytesIOencodeopenrNETPLAN_CONFIG_ROOT_READ_ONLYget_permissions write_filer}rs_netplan_generater_net_setup_link) rrrrmfpnplanroheaderrhashed_contentrphashed_original_contentr current_modes rrender_network_statezRenderer.render_network_state s'',,t//79J9JK 01&&}5)-(;(;$$t$ dNF7" 77>>' "!--bjj9I.JKNgt$ >*.*:*:1*=' >!88#  >>uEw 7//8Ld"l2# t4    & ) 4>> M 0! > >s G<<Hrrc|stjdy|rtjdytj|jdy)Nz!netplan generate postcmd disabledzEskipping call to `netplan generate`. reason: identical netplan configTr)rGrHrNETPLAN_GENERATE)rrrs rrzRenderer._netplan_generate8sB II9 :   II4   $''6rcv|stjdygd}t}tdD]\} t D]K}t j jt|zs*tj|t|zgzdMytd|#tj$r }|}Yd}~d}~wwxYw)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.) rGrH Exceptionranger rgrhislinkr rr RuntimeError)rr setup_lnklast_exception_ifacerVs rrzRenderer._net_setup_linkDs  II? @ A #q "A #+-Eww~~me&;< %)>(??  "0" "-- #!" #s3B&$BB8,B33B8c  |jdk(r9tjdtjd|j iddSi}i}i}i}i}g}|j jdg}|j} |j} |jD]} | jd} ttd| j} | jd }|d k(rv| | jd dd }|d 0| jd d}|d|ji|d <n|d =|d=t| || |j |j#| |i|dk(r!i}i}t%tt'jd}dD]]}t)| |}|jD]<\}}|j|j+dd}|*|j#||i>_t-|dkDr|j#d|i| jd r| d j|d<| jd}|dk(r t/||| t| || |j |j#| |i|dk(r\| jd}t1t3j2|}d|i}d}t)| |}i}t%tt'jd} |jD]n\}}| j|}||j#||i|dvs2i}!|D]#}"|"j5\}#}$t7|$|!|#<%|j#||!ipt-|dkDr|j#d|i| jd r| d j|d<t| || |j |j#| |iN|dk(sU| jd| jdd}%| jd d}||j|%d<t| |%| |j |j#| |%i| s| rE| | d }&|||||fD]6}'|'jD]!\}(})d!|)vsd"|)vr|)j#d!|&i#8d#}*|j9d$||*d%|z }||*d&|z }||*d'|z }||*d(|z }||*d)|z }d*j;|S)+NzV2 to V2 passthroughr:F)explicit_start explicit_endr^rac|dduS)N)its rz*Renderer._render_content..}s2a5+<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>cr|r4tj||iddd}tj|d}|gSgS)NFT)rrnoaliasz )rdumpstextwrapindent)rasectiondumptxts r_render_sectionz1Renderer._render_content.._render_sectionsA~~7O#(!&  oodG4u Irznetwork: version: 2 ethernetswifisbondsbridgesvlansr)versionrGrHrrr_network_staterBr6dns_searchdomainsiter_interfacesrfilterrlowerr\rrCrrrreplacerLrdr_copyr$intrKr)+rrrrrrrror^r?rOrrNifcfgif_typeethmacaddrr bond_config v2_bond_mapr bond_paramsparamrnewnameslave_interfacesrportsr match_prefixparams br_config v2_bridge_mapnewvaluevalportportvalrnscfgr_namerbrs+ rrzRenderer._render_contentcsB  A % II, ->>M001$"   "1155lBG #33 %77 #335d -FZZ'F NUE+//6G $$gu%56"@@#%#(:C.1iikOT7-0\HTN:"(('8)<= >y>A%MM<";<99]++0+?+E+E+GF<("5&&$--H/0F" ))I.!II&78 ))M48&)0D&"5$ F fd^,Id -P -"-GE%ueWeD 7")--/7JE3$+{#/E JJ u567 7  34?; ::?7E22?7E22?9g66?7E22wwwrr)NN)FF)F)__name__ __module__ __qualname____doc__rrrpropertyrrrrrboolrrr#rrrrrurusL!:.v&L6  "%) *1#*1D>*1  *1X 7T 7 7">[ \[ c[ rrucTdg}ddg}|D]}tj|||ryy)Nrvz /usr/sbinz/sbin)r@rmFT)rwhich)rmexpectedr@ps r availabler s:{H7 #F zz!F6: rr)#rrrDloggingrgrtypingrr cloudinitrrrr cloudinit.netr r r r r cloudinit.net.network_staterrr~rk getLoggerrrGrrr\rdrsrur rrrrs  !44G: g!PKtPKDPKf 7:P x  P fr