fUddlZddlZddlZddlmZmZmZmZddlm Z m Z ddl m Z m Z mZmZmZmZmZmZmZerddlmZej.eZdZdgdiZgdZd d d d d ddddddddddddddddddddd dd! d"Zeeeeeffed#<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)safeyamlutil) 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-raz 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 devicesrrz$The use of `gateway4` and `gateway6`z22.4zhFor more info check out: https://cloudinit.readthedocs.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_devicesrCVs.TZ4/ =%^ 0cLt|}|D]}|j||SN)setdiscard)expectedactualmissingkeys rB diff_keysrMas+(mG NrDc eZdZy)InvalidCommandN)__name__ __module__ __qualname__rDrBrOrOhsrDrOcfd}|S)NcFtjfd}|S)Nc`rt|}|rtd|d||g|i|S)NzCommand missing z of required keys )rMrO)selfcommandargskwargs missing_keysfunc required_keyss rB decoratorz7ensure_command_keys..wrapper..decoratornsE(@ ('8g777 7rD) functoolswraps)r\r^r]s` rBwrapperz$ensure_command_keys..wrapperms&   8  8rDrS)r]ras` rBensure_command_keysrbls  NrDceZdZefdedefdZedefdZedZ edZ edZ ed Z dd Z dd Zd ZdZededdfdZy ) NetworkStaterrctj||_||_|j dd|_d|_y)Nuse_ipv6F)copydeepcopy_network_state_versiongetrf_has_default_route)rWrrs rB__init__zNetworkState.__init__s8#mmM: %))*e< "&rDr<c |jdS)Nr)rirWs rBrzNetworkState.configs""8,,rDc|jSrF)rjros rBrzNetworkState.versions }}rDcJ |jddS#t$rgcYSwxYw)Ndnsr#riKeyErrorros rBdns_nameserverszNetworkState.dns_nameserverss1 &&u-m< < I   ""cJ |jddS#t$rgcYSwxYw)Nrrsearchrsros rBdns_searchdomainszNetworkState.dns_searchdomainss1 &&u-h7 7 I rvc\|j|j|_|jSrF)rl_maybe_has_default_routeros rBhas_default_routezNetworkState.has_default_routes+  " " *&*&C&C&ED #&&&rDNc#K|jjdi}|jD]}|| ||s|yw)Nr )rirkvalues)rW filter_funcifacesifaces rBiter_interfaceszNetworkState.iter_interfacessK$$((r:]]_ E" u%K  s ?A A c#vK|jjdgD]}|||s||ywNroutesrirk)rWrroutes rB iter_routeszNetworkState.iter_routess@((,,Xr: E&u%K  s*9 9c|jD]}|j|sy|jD]E}|jdgD].}|jdgD]}|j|sy0Gy)NTsubnetsrF)r_is_default_routerrk)rWrrsubnets rBr{z%NetworkState._maybe_has_default_routes%%' E%%e, ))+ $E))Ir2 $#ZZ"5$E--e4#$ $ $ rDcXd}|jddk(xr|jd|vS)N)z::z0.0.0.0prefixrnetwork)rk)rWr default_netss rBrzNetworkState._is_default_routes0( IIh 1 $ M9)=)M rDc4i}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`. rrrS)clsrrZs rBto_passthroughzNetworkState.to_passthroughs5  % -i 8F9 Hm,777rDrF)rPrQrRNETWORK_STATE_VERSIONdictintrmpropertyrrruryr|rrr{r classmethodrrSrDrBrdrd~s2G'!',/'---  ''     84 8N 8 8rDrdceZdZigggddddZeddf 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#rxFN)r rrrrfrc||_||_tj|j|_||j d<d|_i|_||_|j|j|j|j|j|j|j|j |j"|j$|j&|j(|j*d |_y)NrF) r8bondsr9bridges ethernets infinibandloopback nameserverphysicalrvlanvlanswifis)rj_configrgrhinitial_network_stateri_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)rWrrr$s rBrmz NetworkStateInterpreter.__init__s    "mmD,F,FG(.H% (*!$$&&((**..00,,00,,&&$$&&&&! rDr<cddlm}|jdk(rJt|j|r4t j dtj|jSt|j|jS)NrrzPassthrough netplan v2 configr) cloudinit.net.netplanrrj isinstancerLOGdebugrdrrri)rWNetplanRenderers rBrz%NetworkStateInterpreter.network_statesWE ==A *T^^_"M II5 6..t||< <D//GGrDc8|jjdSNrfrros rBrfz NetworkStateInterpreter.use_ipv6s""&&z22rDc>|jjd|iyr)riupdate)rWvals rBrfz NetworkStateInterpreter.use_ipv6 s ""J#45rDct|j|j|jd}tj|S)Nr)rjrrirdumps)rWstates rBdumpzNetworkStateInterpreter.dumps1}}ll!00  ~~e$$rDc(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_KEYSrMsetattr)rWrr]r[msgkrLs rBloadzNetworkStateInterpreter.loads E ! II< =CD D3E)4DE  6 3|DC IIcNS/ ! -E!0DAE +C D#uSz * +Es ( B2Bc@tj|jSrF)rrriros rBdump_network_statez*NetworkStateInterpreter.dump_network_state&s~~d1122rDc4|j|jdS)N)rr)rjrros rBas_dictzNetworkStateInterpreter.as_dict)s==DLLAArDc|jdk(r|j|d|_y|jdk(r|j|d|_yy)Nr skip_brokenTr)rjparse_config_v1rparse_config_v2)rWrs rB parse_configz$NetworkStateInterpreter.parse_config,sO ==A   [ 9DL ]]a   [ 9DL rDc"|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!rrr)rrrt RuntimeErrorrOrwarningrrritemsrirformat) rWrrX command_typehandlere interfacerrrr#rxs rBrz'NetworkStateInterpreter.parse_config_v14sD|| 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)rrrrrrrrtr _v2_commonrOrrrr)rWrrrrXrrs rBrz'NetworkStateInterpreter.parse_config_v2WsE dnno 6 %)\\%7%7%9 9 !L'66 // = 9 ( 9  "7,F " 9"KK6$ IId5578 9s+A0B0 B 9BB ACCnamec$|j|SrFrrWrXs rBrz'NetworkStateInterpreter.handle_loopbackss##G,,rDc|jjdi}|j|di}|jdijD]\}}|j||it |jd}|j sJ|D]E}|jdj dst|jds>d|_n|jd d }|tj|}|jd d } | tj| } |j|jd|jd|jd d d|jdd d ||| d |jdj|jd|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& mac_addressinetmanualr") rrrrr(r"rgatewayrr'r&) rirkrr_normalize_subnetsrfendswithrris_truer) rWrXr rparamrrr accept_rar&s rBrz'NetworkStateInterpreter.handle_physicalws((,,\2> wv3!++h399; 'JE3 LL% & '%W[[%;<}}! ::f%..s3JJy)8%)DM  KK T2   Y/IKK T2   Y/I  F+ F+&{{=9 {{5)"&&   L)00'++f2Eu1MN !rD)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)rirkrr)rWrXr rs rBrz#NetworkStateInterpreter.handle_vlans((,,\2>  W%w{{62B7#*;;{#; ";;y1i5=%01rD)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-slavesnonerr8)rrz bond-masterN)rrirkrr) rWrXr rrrifnamecmdbond_ifs rBrz#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 HrDbridge_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 rr bridge_portsrr6N)on1rT)off0rFz2Cannot convert bridge_stp value ({stp}) to boolean)r,) rirkrrrrboolrr) rWrXr rrrrrr6s rBrz%NetworkStateInterpreter.handle_bridgesg>((,,\2> kk"56 &F#C   % &((,,\2>  W%w{{62B7 '(; <n!++h399; 'JE3 LL% & 'YY|,  !*Z*F^+! ."  %v*v5 LL, 3 45=%01rDc&|j|yrFrrs rBrz)NetworkStateInterpreter.handle_infiniband5s W%rDcg}g}d|vr0|d}t|ts|g}|D]}|j|d|vr0|d}t|ts|g}|D]}|j|||fS)Nrrx)rlistappend)rWrXr#rxaddrsaddrpathspaths rB _parse_dnsz"NetworkStateInterpreter._parse_dns9s   I&EeT* )""4( ) w H%EeT* $ d# $F""rDrc|jjd}|j|\}}d|vr||f|j|d<y|dj ||dj |y)Nrrrr#rx)rirkrrextend)rWrXrrr#rxs rBrz)NetworkStateInterpreter.handle_nameserverJsw!!%%e,"oog6 V ' !=D # #GK$8 9   % %k 2 M  (rDcx|jjd}|j|\}}||d||d<y)Nr rrr)rirkr)rWrXr_ifacer#rxs rB_handle_individual_nameserverz5NetworkStateInterpreter._handle_individual_nameserverWs>$$((6"oog6 V/:fMu erD destinationcR|jdjt|yr)rir_normalize_routers rBrz$NetworkStateInterpreter.handle_route]s! H%,,-=g-FGrDc*|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', } } r8cmd_typeN_handle_bond_bridgers rBrz$NetworkStateInterpreter.handle_bondsbs:   6 :rDc*|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 } } r9r Nr"rs rBrz&NetworkStateInterpreter.handle_bridgess.   8  v1(physical): %s) r rrkrrstrlowerr rC_v2_to_v1_ipcfglenrr)rWrX ifaces_by_macethcfgphy_cmdr!rrset_namelcase_mac_addressmacr'rLrs rBrz(NetworkStateInterpreter.handle_ethernetsseZ./  - *HC GGGGR(E))L$7K .H  &1GM "Dwwz*H$/$5$5$7!23DED"GFOYYx.F%-v$6!A ,#:#&s8GCL , ( ,**3/G7|a 734 II:G D   )[- *rDc^|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) rrkrCr*r+rrrr)rWrXrr.vlan_cmdrs rBrz$NetworkStateInterpreter.handle_vlanss$! 'ID#774= WWV_ H |"%e* ' ,**3/G7|aG 45 II2H =   X & 'rDc.tjdy)NzOWifi configuration is only available to distros with netplan rendering support.)rrrs rBrz$NetworkStateInterpreter.handle_wifiss  * rDc4tjd||jD]\}}d|vr|jd}|r|}d|vs$|jdjdg}|jdjdg}ddi}t |dkDr|j d|it |dkDr|j d |i|jd ijd }|rt |} | r| }|j||y) Nzv2_common: handling config: %sr%r#rxrrrrrr!r&)rrrrkr+rr r) rWr.rdev_cfgset_name_ifacerxrrname_cmdr real_if_names rBrz"NetworkStateInterpreter._v2_common s 3S9!iik DNE7W$!(Z!8!*E' ]377"Ekk-044["E"L1v;?OOXv$67s8a<OOY$45-4[["-E-I-I . #? #LL# ,228UC- DrDc  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 ywrFrS.0rvs rB z>NetworkStateInterpreter._handle_bond_bridge..>s q!QF sc3:K|]\}}|tvr||fywrF)NETWORK_V2_KEY_FILTER)r@rLvalues rBrBz>NetworkStateInterpreter._handle_bond_bridge..Cs) S%33e s parameterszgratuitious-arpNr)rr _interfacesr rc32K|]\}}||fywrFrS)r@rrA v2key_to_v1s rBrBz>NetworkStateInterpreter._handle_bond_bridge..SsNtq! A2Nsr"rrzv2(%s) -> v1(%s): %sr9r8z Unknown command type: {cmd_type}r )rr:rkrpoprCr*r+rrrrrrr) rWrXr! item_nameitem_cfg item_paramsr grat_valuev1_cmdrrIs @rBr#z+NetworkStateInterpreter._handle_bond_bridge:s /33H=CCE  $+==?%  Ix$,NN$4K!__\26F$5tC% rDc  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-metricmetricrS) overridesrs rB_add_dhcp_overrideszDNetworkStateInterpreter._v2_to_v1_ipcfg.._add_dhcp_overridesls*#,^#<x +rDrrrrTrNrstatic)rr:rrrr#rurx dns_searchrtoviarRr")rrrRr"r)rkrrfrrr+) rWr.rTrrrrr#rrrxrrs rBr*z'NetworkStateInterpreter._v2_to_v1_ipcfgis = 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/    w?2H@2Hh&"567>28>2@&"&#&#")% )& ))%N&N -)H*H;>=2\*| 'D D4-^ArDrcVtj|}td|jD}|j ddvr|j t |d|j dgDcgc] }t|c}|d<d}dD] }||| |Scc}w) Nc30K|]\}}|s ||fywrFrSr?s rBrBz$_normalize_subnet..s@DAqa!Q@s  r)rUstatic6)r ip_address address_keysrcb||vr+t||ts||j||<yyyrF)rrsplit)snetrs rBlistifyz"_normalize_subnet..listifys3 4< 4:t <d))+DJ!=. s$1aAZ,?As  rr)rrr_rRz(Route config metric {} is not an integerN) rrrrerkrr TypeErrorr)r normal_routerRrs rBrrs ;;=L $".}"= Y  ' 'A    h 'F  %([L " <  :AA&I  s A22 B;BBcF|sg}|Dcgc] }t|c}Scc}wrF)rh)rss rBrr8s$ *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: )rkrrrr)rrr$rrrnsis rBparse_net_config_datar>s EnnY'G ^^H %F!|6%%FX  [1!!  El   LrD)rS)TN).rgr_loggingtypingrrrr cloudinitrr cloudinit.netr r r r r rrrrcloudinit.net.rendererr getLoggerrPrrrrDr:r(__annotations__rrCrM ExceptionrOrbrdrrhrerrr rrSrDrBrs] 55$   /g!-(&+-+&4%-%-!!:"!7 $''$$"&* %/$sDcN*+D d t  Y $S8S8lV V r:IXD3  rD