x[hbUddlZddlZddlZddlmZmZmZmZddlm Z m Z m Z ddl m Z mZmZmZmZmZmZmZmZerddlmZej0eZdZdgdiZgdZd d d d d ddddddddddddddddddddd dd! d"Zeeeeeffe d#<d$e!d%dfd&Z"d'Z#Gd(d)e$Z%d*Z&Gd+d,Z'Gd-d.Z(d/Z)d6d0Z*d1Z+d2Z, d7d3e!d4e-d%e'fd5Z.y)8N) TYPE_CHECKINGAnyDictOptional) lifecyclesafeyamlutil) find_interface_name_from_macget_interfaces_by_macipv4_mask_to_net_prefixipv6_mask_to_net_prefix is_ip_networkis_ipv4_networkis_ipv6_addressis_ipv6_networknet_prefix_to_ipv4_maskRendererversionconfig network_state) addressesdhcp4dhcp4-overridesdhcp6dhcp6-overridesgateway4gateway6 interfacesmatchmtu nameserversrendererset-name wakeonlan accept-raoptionalz ad-selectz arp-intervalz arp-ip-targetz arp-validatez down-delayzfail-over-mac-policyz lacp-ratezmii-monitor-intervalz min-linksmodegratuitous-arpprimaryzprimary-reselect-policyzup-delayztransmit-hash-policy)zbond-ad-selectzbond-arp-intervalzbond-arp-ip-targetzbond-arp-validatezbond-downdelayzbond-fail-over-maczbond-lacp-ratez bond-miimonzbond-min-linksz bond-modezbond-num-grat-arpz bond-primaryzbond-primary-reselectz bond-updelayzbond-xmit-hash-policyz ageing-timepriorityz forward-delayz hello-timezmax-agez path-costz port-prioritystp) bridge_ageingbridge_bridgeprio bridge_fd bridge_gcint bridge_hello bridge_maxagebridge_maxwaitbridge_pathcostbridge_portprio bridge_stpbridge_waitport)bondbridgeNET_CONFIG_TO_V2diktreturncFd|vsd|vrtjdddyy)z8Warn about deprecations of v2 properties for all devicesrr z$The use of `gateway4` and `gateway6`z22.4zbFor more info check out: https://docs.cloud-init.io/en/latest/topics/network-config-format-v2.html) deprecateddeprecated_version extra_messageN)r deprecate)r=s =/usr/lib/python3/dist-packages/cloudinit/net/network_state.pywarn_deprecated_all_devicesrEWs0TZ4/=%X 0cLt|}|D]}|j||SN)setdiscard)expectedactualmissingkeys rD diff_keysrObs+(mG NrFc eZdZy)InvalidCommandN)__name__ __module__ __qualname__rFrDrQrQisrFrQcfd}|S)NcFtjfd}|S)Nc`rt|}|rtd|d||g|i|S)NzCommand missing z of required keys )rOrQ)selfcommandargskwargs missing_keysfunc required_keyss rD decoratorz7ensure_command_keys..wrapper..decoratorosE(@ ('8g777 7rF) functoolswraps)r^r`r_s` rDwrapperz$ensure_command_keys..wrapperns&   8  8rFrU)r_rcs` rDensure_command_keysrdms  NrFceZdZefdedefdZedefdZedZ edZ edZ ed Z dd Z dd Zd ZdZededdfdZy ) NetworkStaterrctj||_||_|j dd|_d|_y)Nuse_ipv6F)copydeepcopy_network_state_versiongetrh_has_default_route)rYrrs rD__init__zNetworkState.__init__s8#mmM: %))*e< "&rFr>c |jdS)Nr)rkrYs rDrzNetworkState.configs""8,,rFc|jSrH)rlrqs rDrzNetworkState.versions }}rFcJ |jddS#t$rgcYSwxYw)Ndnsr$rkKeyErrorrqs rDdns_nameserverszNetworkState.dns_nameserverss1 &&u-m< < I   ""cJ |jddS#t$rgcYSwxYw)Nrtsearchrurqs rDdns_searchdomainszNetworkState.dns_searchdomainss1 &&u-h7 7 I rxc\|j|j|_|jSrH)rn_maybe_has_default_routerqs rDhas_default_routezNetworkState.has_default_routes+  " " *&*&C&C&ED #&&&rFNc#K|jjdi}|jD]}|| ||s|yw)Nr!)rkrmvalues)rY filter_funcifacesifaces rDiter_interfaceszNetworkState.iter_interfacessK$$((r:]]_ E" u%K  s ?A A c#vK|jjdgD]}|||s||ywNroutesrkrm)rYrroutes rD iter_routeszNetworkState.iter_routess@((,,Xr: E&u%K  s*9 9c|jD]}|j|sy|jD]E}|jdgD].}|jdgD]}|j|sy0Gy)NTsubnetsrF)r_is_default_routerrm)rYrrsubnets rDr}z%NetworkState._maybe_has_default_routes%%' E%%e, ))+ $E))Ir2 $#ZZ"5$E--e4#$ $ $ rFcXd}|jddk(xr|jd|vS)N)z::z0.0.0.0prefixrnetwork)rm)rYr default_netss rDrzNetworkState._is_default_routes0( IIh 1 $ M9)=)M rFc4i}d|vr|d|d<|d|ifi|S)zInstantiates a `NetworkState` without interpreting its data. That means only `config` and `version` are copied. :param network_state: Network state data. :return: Instance of `NetworkState`. rrrU)clsrr\s rDto_passthroughzNetworkState.to_passthroughs5  % -i 8F9 Hm,777rFrH)rRrSrTNETWORK_STATE_VERSIONdictintropropertyrrrwr{r~rrr}r classmethodrrUrFrDrfrfs2G'!',/'---  ''     84 8N 8 8rFrfceZdZigggddddZeddf d)dZedefdZedZ e jd Z d Z d Z d Z d Zd*dZd*dZd*dZedgdZedgdZegddZegddZeddgdZedgdZdZedgdZedgdZedgd Zd!Zd"Zd#Zd$Z d%Z!d+d&Z"d,d'Z#d(Z$y)-NetworkStateInterpreterr$rzFN)r!rrtrhrc||_||_tj|j|_||j d<d|_i|_||_|j|j|j|j|j|j|j|j |j"|j$|j&|j(|j*d |_y)NrF) r:bondsr;bridges ethernets infinibandloopback nameserverphysicalrvlanvlanswifis)rl_configrirjinitial_network_staterk_parsed_interface_dns_map _renderer handle_bond handle_bonds handle_bridgehandle_bridgeshandle_ethernetshandle_infinibandhandle_loopbackhandle_nameserverhandle_physical handle_route handle_vlan handle_vlans handle_wifiscommand_handlers)rYrrr%s rDroz NetworkStateInterpreter.__init__s    "mmD,F,FG(.H% (*!$$&&((**..00,,00,,&&$$&&&&! rFr>cddlm}|jdk(rJt|j|r4t j dtj|jSt|j|jS)NrrzPassthrough netplan v2 configr) cloudinit.net.netplanrrl isinstancerLOGdebugrfrrrk)rYNetplanRenderers rDrz%NetworkStateInterpreter.network_statesWE ==A *T^^_"M II5 6..t||< <D//GGrFc8|jjdSNrhrrqs rDrhz NetworkStateInterpreter.use_ipv6s""&&z22rFc>|jjd|iyr)rkupdate)rYvals rDrhz NetworkStateInterpreter.use_ipv6 s ""J#45rFct|j|j|jd}tj|S)Nr)rlrrkrdumps)rYstates rDdumpzNetworkStateInterpreter.dumps1}}ll!00  ~~e$$rFc(d|vr tjdtdt|d}t ||}|r%d|z}tj|t||Dcgc] }|dvs| c}D]}t ||||ycc}w)Nrz$Invalid state, missing version fieldzInvalid state, missing keys: %sr)rerror ValueErrorNETWORK_STATE_REQUIRED_KEYSrOsetattr)rYrr_r]msgkrNs rDloadzNetworkStateInterpreter.loads E ! II< =CD D3E)4DE  6 3|DC IIcNS/ ! -E!0DAE +C D#uSz * +Es ( B2Bc@tj|jSrH)rrrkrqs rDdump_network_statez*NetworkStateInterpreter.dump_network_state's~~d1122rFc4|j|jdS)N)rr)rlrrqs rDas_dictzNetworkStateInterpreter.as_dict*s==DLLAArFc|jdk(r|j|d|_y|jdk(r|j|d|_yy)Nr skip_brokenTr)rlparse_config_v1rparse_config_v2)rYrs rD parse_configz$NetworkStateInterpreter.parse_config-sO ==A   [ 9DL ]]a   [ 9DL rFc"|jD] }|d} |j|} ||"|jjD]*\}}d} |jd|}|s|\} } | | d|d <,y#t$r}td|z|d}~wwxYw#t$rA|st j d|dt j|jYwxYw#t$r }tdj||d}~wwxYw) Ntypez"No handler found for command '%s'Skipping invalid command: %sTexc_infor!zINameserver specified for interface {0}, but interface {0} does not exist!rrt)rrrv RuntimeErrorrQrwarningrrritemsrkrformat) rYrrZ command_typehandlere interfacertrr$rzs rDrz'NetworkStateInterpreter.parse_config_v15sD|| 9G"6?L // = 9  9$#55;;= NIsE ++L9)D &)# V#.$ e   "8<G  " 9"KK6$ IId5578 9  88>y8I sAA8BC%8 BBBAC"!C"% D.D  Dcddlm}t|j|ry|jj D]4\}}|dvr |j |} |||j|6y#t$r}td|z|d}~wwxYw#t$rA|stjd|dtj|jYwxYw)Nrr)rr%z!No handler found for command '%s'rTr)rrrrrrrrvr _v2_commonrQrrrr)rYrrrrZrrs rDrz'NetworkStateInterpreter.parse_config_v2XsE dnno 6 %)\\%7%7%9 9 !L'66 // = 9 ( 9  "7,F " 9"KK6$ IId5578 9s+A0B0 B 9BB ACCnamec$|j|SrHrrYrZs rDrz'NetworkStateInterpreter.handle_loopbackts##G,,rFc(|jjdi}|j|di}|jdijD]\}}|j||it |jd}|j sJ|D]E}|jdj dst|jds>d|_n|jd d }|tj|}|jd d } | tj| } |jd d } | tj| } |j|jd |jd|jd|jddd|jdd d ||| | d |jd |jd} |jdj| |i|jy )z command = { 'type': 'physical', 'mac_address': 'c0:d6:9f:2c:e8:80', 'name': 'eth0', 'subnets': [ {'type': 'dhcp4'} ], 'accept-ra': 'true' } r!rparamsrr6addressTr(Nr'r) config_id mac_addressinetmanualr#) rrrrrr*r#rgatewayrr(r'r)) rkrmrr_normalize_subnetsrhendswithrr is_truer) rYrZr!rparamrrr accept_rar'r) iface_keys rDrz'NetworkStateInterpreter.handle_physicalxs((,,\2> wv3!++h399; 'JE3 LL% & '%W[[%;<}}! ::f%..s3JJy)8%)DM  KK T2   Y/IKK T2   Y/I;;z40  ||H-H $[[5 F+ F+&{{=9 {{5)"&&$  "KK W[[-@A  L)00)U1CD !rF)rvlan_id vlan_linkc|jjdi}|j||j|jdi}|jd|d<|jd|d<|j|d|iy)z auto eth0.222 iface eth0.222 inet static address 10.10.10.1 netmask 255.255.255.0 hwaddress ether BC:76:4E:06:96:B3 vlan-raw-device eth0 r!rrzvlan-raw-devicerN)rkrmrr)rYrZr!rs rDrz#NetworkStateInterpreter.handle_vlans((,,\2>  W%w{{62B7#*;;{#; ";;y1i5=%01rF)rbond_interfacesrc|j||jjd}|j|jdi}|jdjD]\}}|j ||i|j ddi|jdj |d|i|jdD]}||vr|dd}|j||jjdi}|j|}|jd|d <|jdjD]\}}|j ||i|jdj ||iy ) aU #/etc/network/interfaces auto eth0 iface eth0 inet manual bond-master bond0 bond-mode 802.3ad auto eth1 iface eth1 inet manual bond-master bond0 bond-mode 802.3ad auto bond0 iface bond0 inet static address 192.168.0.10 gateway 192.168.0.1 netmask 255.255.255.0 bond-slaves none bond-mode 802.3ad bond-miimon 100 bond-downdelay 200 bond-updelay 200 bond-lacp-rate 4 r!rrz bond-slavesnonerr:)rrz bond-masterN)rrkrmrr) rYrZr!rrrifnamecmdbond_ifs rDrz#NetworkStateInterpreter.handle_bondsw6 W%((,,\: w{{62B7!++h/557 'JE3 LL% & ' mV,- L)00%-1GHkk"34 HFZ'"" $$S),,00rBJ nnV,G%,[[%8GM "%kk(399; - ss|, -    - 4 4fg5F G HrFbridge_interfacesc|jjdi}|jdD]}||vrd|i}|j||jjdi}|j||j|jdi}|d|d<|jdijD]\}}|j ||i|jd}|Lt |t s<|dvrd }n"|d vrd }ntd j| |j d|i|j |d|iy)a auto br0 iface br0 inet static address 10.10.10.1 netmask 255.255.255.0 bridge_ports eth0 eth1 bridge_stp off bridge_fd 0 bridge_maxwait 0 bridge_params = [ "bridge_ports", "bridge_ageing", "bridge_bridgeprio", "bridge_fd", "bridge_gcint", "bridge_hello", "bridge_hw", "bridge_maxage", "bridge_maxwait", "bridge_pathcost", "bridge_portprio", "bridge_stp", "bridge_waitport", ] r!r r bridge_portsrr8N)on1rT)off0rFz2Cannot convert bridge_stp value ({stp}) to boolean)r.) rkrmrrrrboolrr) rYrZr!rrrrrr8s rDrz%NetworkStateInterpreter.handle_bridgesg>((,,\2> kk"56 &F#C   % &((,,\2>  W%w{{62B7 '(; <n!++h399; 'JE3 LL% & 'YY|,  !*Z*F^+! ."  %v*v5 LL, 3 45=%01rFc&|j|yrHrrs rDrz)NetworkStateInterpreter.handle_infiniband<s W%rFcg}g}d|vr0|d}t|ts|g}|D]}|j|d|vr0|d}t|ts|g}|D]}|j|||fS)Nrrz)rlistappend)rYrZr$rzaddrsaddrpathspaths rD _parse_dnsz"NetworkStateInterpreter._parse_dns@s   I&EeT* )""4( ) w H%EeT* $ d# $F""rFrc|jjd}|j|\}}d|vr||f|j|d<y|dj ||dj |y)Nrtrr$rz)rkrmrrextend)rYrZrtr$rzs rDrz)NetworkStateInterpreter.handle_nameserverQsw!!%%e,"oog6 V ' !=D # #GK$8 9   % %k 2 M  (rFcx|jjd}|j|\}}||d||d<y)Nr!rrt)rkrmr)rYrZr_ifacer$rzs rD_handle_individual_nameserverz5NetworkStateInterpreter._handle_individual_nameserver^s>$$((6"oog6 V/:fMu erF destinationcR|jdjt|yr)rkr_normalize_routers rDrz$NetworkStateInterpreter.handle_routeds! H%,,-=g-FGrFc*|j|dy)a v2_command = { bond0: { 'interfaces': ['interface0', 'interface1'], 'parameters': { 'mii-monitor-interval': 100, 'mode': '802.3ad', 'xmit_hash_policy': 'layer3+4'}}, bond1: { 'bond-slaves': ['interface2', 'interface7'], 'parameters': { 'mode': 1, } } } v1_command = { 'type': 'bond' 'name': 'bond0', 'bond_interfaces': [interface0, interface1], 'params': { 'bond-mode': '802.3ad', 'bond_miimon: 100, 'bond_xmit_hash_policy': 'layer3+4', } } r:cmd_typeN_handle_bond_bridgers rDrz$NetworkStateInterpreter.handle_bondsis:   6 :rFc*|j|dy)a v2_command = { br0: { 'interfaces': ['interface0', 'interface1'], 'forward-delay': 0, 'stp': False, 'maxwait': 0, } } v1_command = { 'type': 'bridge' 'name': 'br0', 'bridge_interfaces': [interface0, interface1], 'params': { 'bridge_stp': 'off', 'bridge_fd: 0, 'bridge_maxwait': 0 } } r;r$Nr&rs rDrz&NetworkStateInterpreter.handle_bridgess.   8  v1(physical): %s) r rrmrrstrlowerr rE_v2_to_v1_ipcfglenrr)rYrZ ifaces_by_macethcfgphy_cmdr"rrset_namelcase_mac_addressmacr+rNrs rDrz(NetworkStateInterpreter.handle_ethernetssfZ./  . *HC "GGGGR(E))L$7K .H  &1GM "Dwwz*H$/$5$5$7!23DED"GFOYYx.F%-v$6!M ,#:#&s8GCL , ( ,**3/G7|a 734 II:G D   )]. *rFc^|jD]\}}d||jd|jdd}d|vr|d|d<t||j|}t |dkDr|j d|it jd||j|y ) aq v2_vlans = { 'eth0.123': { 'id': 123, 'link': 'eth0', 'dhcp4': True, } } v1_command = { 'type': 'vlan', 'name': 'eth0.123', 'vlan_link': 'eth0', 'vlan_id': 123, 'subnets': [{'type': 'dhcp4'}], } ridlink)rrrrr#rrzv2(vlans) -> v1(vlan): %sN) rrmrEr.r/rrrr)rYrZrr2vlan_cmdrs rDrz$NetworkStateInterpreter.handle_vlanss$! 'ID#774= WWV_ H |"%e* ' ,**3/G7|aG 45 II2H =   X & 'rFc.tjdy)NzOWifi configuration is only available to distros with netplan rendering support.)rrrs rDrz$NetworkStateInterpreter.handle_wifis"s  * rFc2tjd||jD]n\}}d|vs |jdjd}|jdjd}ddi}|r||d<|r||d<|j ||py)Nzv2_common: handling config: %sr$rzrrrr)rrrrmr)rYr2rdev_cfgrzrtname_cmds rDrz"NetworkStateInterpreter._v2_common(s 3S9!iik DNE7' ]377Akk-044[A"L1)/HX&*-HY'228UC DrFc  tdtj|jD |jD]7\}}td|jD}|jdi}|j dd}|r||d<d|d||d z|jd d t fd |jDi}d |vr|d |d <t ||j |} t| dkDr|jd| itjd||||dk(r|j||dk(r|j|tdj|y)z(Common handler for bond and bridge typesc3*K|] \}}||f ywrHrU.0rvs rD z>NetworkStateInterpreter._handle_bond_bridge..:s q!QF sc3:K|]\}}|tvr||fywrH)NETWORK_V2_KEY_FILTER)rBrNvalues rDrDz>NetworkStateInterpreter._handle_bond_bridge..?s) S%33e s parameterszgratuitious-arpNr+rr _interfacesr!rc32K|]\}}||fywrHrU)rBrrC v2key_to_v1s rDrDz>NetworkStateInterpreter._handle_bond_bridge..OsNtq! A2Nsr#rrzv2(%s) -> v1(%s): %sr;r:z Unknown command type: {cmd_type}r$)rr<rmrpoprEr.r/rrrrrrr) rYrZr% item_nameitem_cfg item_paramsr grat_valuev1_cmdrrKs @rDr'z+NetworkStateInterpreter._handle_bond_bridge6s /33H=CCE  $+==?%  Ix$,NN$4K!__\26F$5tC% rFc  d}g}|jdr.ddi}||jdi||j||jdr5ddi}d|_||jdi||j|d}d}i}|jd gD]}d |d }d |vr+d |vrQ|O|jd }|jd|in*d|vr&|$|jd}|jd|id|vra|s_|jdjd } | r| |d<|jdjd} | r| |d<|j||j|g} |jdgD]]} | jt | jd| jd| jd| jdd_t |rt | r| |dd<|S)z7Common ipconfig extraction from v2 to v1 subnets array.cd|vr |d|d<yy)Nz route-metricmetricrU) overridesrs rD_add_dhcp_overrideszDNetworkStateInterpreter._v2_to_v1_ipcfg.._add_dhcp_overrideshs*#,^#<x +rFrrrrTrNrstatic)rr:r rrr$rwrz dns_searchrtoviarTr#)r rrTr#r)rmrrhrr"r/) rYr2rVrrrr r$rrrzrrs rDr.z'NetworkStateInterpreter._v2_to_v1_ipcfges = 777 g&F (92 > G NN6 " 777 g&F DM (92 > G NN6 " ww{B/ #G "F g~$)9"wwz2HMM9h"78$)9"wwz2HMM9h"78#KGGM266{C 5>K 12/33H=06K - k* NN6 "1 #4WWXr* E MM ',yy#(99U#3"'))H"5$yy/    wNrH)%rRrSrTrrrorrfrrhsetterrrrrrrrrdrrrrrrrrrrrrrrrrr'r.rUrFrDrrs  &)-  '  :H|HH33__66%+ 3B !F98&"-#-&":"#:"x9:2;2 >?2H@2Hh&"567>28>2@&"&#&#")% )& ))%N&N -)H*H;>=2]*~ 'D D-^ArFrcVtj|}td|jD}|j ddvr|j t |d|j dgDcgc] }t|c}|d<d}dD] }||| |Scc}w) Nc30K|]\}}|s ||fywrHrUrAs rDrDz$_normalize_subnet..s@DAqa!Q@s  r)rWstatic6)r ip_address address_keysrcb||vr+t||ts||j||<yyyrH)rrsplit)snetrs rDlistifyz"_normalize_subnet..listifys3 4< 4:t <d))+DJ!=.s$1aAZ,?As  r r)rr rarTz(Route config metric {} is not an integerN) rrrrgrmrr TypeErrorr)r normal_routerTrs rDr"r"s ;;=L $".}"= Y  ' 'A    h 'F  %([L " <  :AA&I  s A22 B;BBcF|sg}|Dcgc] }t|c}Scc}wrH)rj)rss rDrr4s$ *1 2Q a 22 2s net_configrcd}|jd}|jd}|dk(r|}|r.|,t|||}|j||j}|st d||S)zfParses the config, returns NetworkState object :param net_config: curtin network config dict Nrrr)rrr%rzpNo valid network_state object created from network config. Did you specify the correct version? Network config: )rmrrrr)rrr%rrrnsis rDparse_net_config_datar:s EnnY'G ^^H %F!|6%%FX  [1!!  El   LrF)rU)TN)/riraloggingtypingrrrr cloudinitrrr cloudinit.netr r r r rrrrrcloudinit.net.rendererr getLoggerrRrrrrFr<r,__annotations__rrErO ExceptionrQrdrfrrjrgr"rrrrUrFrDrs` 55//   /g!-*&+-+&4%-%-!!:"!7 $''$$"&* %/$sDcN*+D d t  Y $S8S8lQ Q h:IXD3  rF