܍~cUddlZddlZddlZddlmZmZmZmZddlm Z m Z ddl m Z m Z mZmZmZmZmZmZmZerddlmZejeZdZdgdiZgdZd d d d d ddddddddddddddddddddd dd! d"Zeeeeeffed#<d$Z d%Z!Gd&d'e"Z#d(Z$Gd)d*e%Z&Gd+d,Z'Gd-d.e&/Z(d0Z)d:d2Z*d3Z+d4Z, d;d6e-d7e.d8e'fd9Z/dS)<N) 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_V2cttj|}t}|||SN)r read_confNetworkStateInterpreterload) state_filestatensis =/usr/lib/python3/dist-packages/cloudinit/net/network_state.pyfrom_state_filerDVs0 N: & &E ! # #CHHUOOO JcXt|}|D]}|||Sr<)setdiscard)expectedactualmissingkeys rC diff_keysrM]s6(mmG NrEceZdZdS)InvalidCommandN)__name__ __module__ __qualname__rErCrOrOdsDrErOcfd}|S)NcJtjfd}|S)Ncpr't|}|rtd|d||g|Ri|S)NzCommand missing z of required keys )rMrO)selfcommandargskwargs missing_keysfunc required_keyss rC decoratorz7ensure_command_keys..wrapper..decoratorjsj (@@ (.'<<84g777777 7rE) functoolswraps)r\r^r]s` rCwrapperz$ensure_command_keys..wrapperis?    8 8 8 8 8   8rErS)r]ras` rCensure_command_keysrbhs#      NrEc"eZdZdZfdZxZS)CommandHandlerMetaaMetaclass that dynamically creates a 'command_handlers' attribute. This will scan the to-be-created class for methods that start with 'handle_' and on finding those will populate a class attribute mapping so that those methods can be quickly located and called. c i}|D]G\}}t|r3|dr|tdd}|r|||<H||d<t t |||||S)Nhandle_command_handlers)itemscallable startswithlensuperrd__new__) clsnameparentsdctrg attr_nameattr handles_what __class__s rCrmzCommandHandlerMeta.__new__s"yy{{ : :OIt~~ :)"6"6y"A"A :(Y)9)9: :59$\2"2 '--55c4#NNNrE)rPrQrR__doc__rm __classcell__)rus@rCrdrdzsKOOOOOOOOOrErdceZdZefdedefdZedefdZedZ edZ edZ ed Z dd Z dd Zd ZdZededdfdZd S) NetworkStaterrctj||_||_|dd|_d|_dS)Nuse_ipv6F)copydeepcopy_network_state_versiongetr{_has_default_route)rWrrs rC__init__zNetworkState.__init__sB#mM:: %))*e<< "&rEreturnc|jdS)Nr)r~rWs rCrzNetworkState.configs"8,,rEc|jSr<)rrs rCrzNetworkState.versions }rEcN |jddS#t$rgcYSwxYw)Ndnsr#r~KeyErrorrs rCdns_nameserverszNetworkState.dns_nameserverss> &u-m< <   III   $$cN |jddS#t$rgcYSwxYw)Nrsearchrrs rCdns_searchdomainszNetworkState.dns_searchdomainss> &u-h7 7   III rcP|j||_|jSr<)r_maybe_has_default_routers rChas_default_routezNetworkState.has_default_routes(  " *&*&C&C&E&ED #&&rENc#K|jdi}|D]}||V ||r|VdS)Nr )r~rvalues)rW filter_funcifacesifaces rCiter_interfaceszNetworkState.iter_interfacessl$((r::]]__  E" ;u%% KKK   rEc#rK|jdgD]}|||r|V|VdSNroutesr~r)rWrroutes rC iter_routeszNetworkState.iter_routess_(,,Xr::  E&;u%% KKK   rEc*|D]}||rdS|D]N}|dgD]5}|dgD]}||rdS6OdS)NTsubnetsrF)r_is_default_routerr)rWrrsubnets rCrz%NetworkState._maybe_has_default_routes%%''  E%%e,, tt ))++ $ $E))Ir22 $ $#ZZ"55$$E--e44$#tttt$$ $urEcfd}|ddko|d|vS)N)z::z0.0.0.0prefixrnetwork)r)rWr default_netss rCrzNetworkState._is_default_routes6( IIh  1 $ M9)=)=)M rEc:i}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)rnrrZs rCto_passthroughzNetworkState.to_passthroughs@  % % -i 8F9 sHm,77777rEr<)rPrQrRNETWORK_STATE_VERSIONdictintrpropertyrrrrrrrrr classmethodrrSrErCryrysG2G''!',/''''----X-XX X ''X'            84 8N 8 8 8[ 8 8 8rErycneZdZigggddddZeddfdZedefdZedZ e j d Z d Z d Z d Z d Zd*dZd*dZd*dZedgdZedgdZegddZegddZeddgdZedgdZdZedgdZedgdZed gd!Zd"Zd#Zd$Zd%Z d&Z!d+d'Z"d,d(Z#d)Z$dS)-r>r#rFN)r rrr{rc||_||_tj|j|_||jd<d|_i|_||_dS)NrF) r_configr|r}initial_network_stater~_parsed_interface_dns_map _renderer)rWrrr$s rCrz NetworkStateInterpreter.__init__sN    "mD,FGG(.H% (*!rErcddlm}|jdkrNt|j|r9t dt|j St|j |jS)NrrzPassthrough netplan v2 configr) cloudinit.net.netplanrr isinstancerLOGdebugryrrr~)rWNetplanRenderers rCrz%NetworkStateInterpreter.network_statessEEEEEE =A  *T^_"M"M  II5 6 6 6..t|<< <D/GGGGrEc6|jdSNr{rrs rCr{z NetworkStateInterpreter.use_ipv6s"&&z222rEc>|jd|idSr)r~update)rWvals rCr{z NetworkStateInterpreter.use_ipv6 s$ ""J#455555rEcT|j|j|jd}tj|S)Nr)rrr~rdumps)rWrAs rCdumpzNetworkStateInterpreter.dumps0}l!0   ~e$$$rEcRd|vr)tdtdt|d}t ||}|r.d|z}t|t|d|DD]}t ||||dS)Nrz$Invalid state, missing version fieldzInvalid state, missing keys: %scg|]}|dv| S)rrS).0ks rC z0NetworkStateInterpreter.load..$s"EEE!0D0DA0D0D0DrE)rerror ValueErrorNETWORK_STATE_REQUIRED_KEYSrMsetattr)rWrAr]r[msgrLs rCr?zNetworkStateInterpreter.loads E ! ! II< = = =CDD D3E)4DE  66  "3|DC IIcNNNS// !FE}EEE + +C D#uSz * * * * + +rEc4tj|jSr<)rrr~rs rCdump_network_statez*NetworkStateInterpreter.dump_network_state's~d1222rEc |j|jdS)N)rr)rrrs rCas_dictzNetworkStateInterpreter.as_dict*s=DLAAArETc|jdkr||d|_dS|jdkr||d|_dSdS)Nr skip_brokenTr)rparse_config_v1rparse_config_v2)rWrs rC parse_configz$NetworkStateInterpreter.parse_config-sh =A    [ 9 9 9DLLL ]a    [ 9 9 9DLLL rEcX|jD]}|d} |j|}n%#t$r}td|z|d}~wwxYw |||L#t$rO|st d|dt |YwxYw|j D]`\}}d} |j d|}n5#t$r(}td ||d}~wwxYw|r |\} } | | d|d <adS) Ntypez"No handler found for command '%s'Skipping invalid command: %sTexc_infor zINameserver specified for interface {0}, but interface {0} does not exist!)rrr)rrgr RuntimeErrorrOrwarningrrrrhr~rformat) rWrrX command_typehandlere interfacerrr#rs rCrz'NetworkStateInterpreter.parse_config_v15s| 9 9G"6?L / =   "8<G  9g&&&&! 9 9 9"9KK6$ IId557788888 9#5;;==  NIsE +L9)D    88>y8I8I   &)# V!,$  e   s= ! A>A AAB-,B-C%% D/#DDcddlm}t|j|rdS|jD]\}}|dvr |j|}n%#t$r}td|z|d}~wwxYw |||| |a#t$rO|st d|dt |YwxYwdS)Nrr)rr$z!No handler found for command '%s'rTr)rrrrrrhrgrr _v2_commonrOrrrr)rWrrrrXrrs rCrz'NetworkStateInterpreter.parse_config_v2XsREEEEEE dno 6 6  F%)\%7%7%9%9 9 9 !L'666 / =   "7,F  9g&&&((((! 9 9 9"9KK6$ IId557788888 9 9 9s+ A A2A--A26!BAC10C1roc,||Sr<handle_physicalrWrXs rChandle_loopbackz'NetworkStateInterpreter.handle_loopbackts##G,,,rEc|jdi}||di}|diD]\}}|||it |d}|jsX|D]U}|dds"t|dr d|_nV|d d }|tj |}|d d } | tj | } ||d|d|d d d|dd d ||| d |jd|d|i| d S)z command = { 'type': 'physical', 'mac_address': 'c0:d6:9f:2c:e8:80', 'name': 'eth0', 'subnets': [ {'type': 'dhcp4'} ], 'accept-ra': 'true' } r roparamsrr6addressTr'Nr& mac_addressinetmanualr") rorrrr(r"rgatewayrr'r&) r~rrhr_normalize_subnetsr{endswithrris_truer) rWrXr rparamrrr accept_rar&s rCrz'NetworkStateInterpreter.handle_physicalxs(,,\2>> wv33!++h3399;; ' 'JE3 LL% & & & &%W[[%;%;<<} !  ::f%%..s33JJy))88%)DME  KK T22   Y//IKK T22   Y//I  F++ F++&{{=99 {{5))"&&      L)00'++f2E2Eu1MNNN !!!!!rE)rovlan_id vlan_linkcR|jdi}||||di}|d|d<|d|d<||d|idS)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 rorzvlan-raw-devicerN)r~rrr)rWrXr rs rC handle_vlanz#NetworkStateInterpreter.handle_vlans(,,\2>>  W%%%w{{622B77#*;;{#;#; ";;y11i5=%011111rE)robond_interfacesrc|||jd}||di}|dD]\}}|||i|ddi|jd|d|i|dD]}||vr|dd}|||jdi}||}|d|d <|dD]\}}|||i|jd||id S) 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 rorz bond-slavesnonerr8)rorz bond-masterN)rr~rrhr) rWrXr rrrifnamecmdbond_ifs rC handle_bondz#NetworkStateInterpreter.handle_bonds6 W%%%(,,\:: w{{622B77!++h//5577 ' 'JE3 LL% & & & & mV,--- L)00%-1GHHHkk"344 H HFZ''"" $$S))),00rBBJ nnV,,G%,[[%8%8GM "%kk(3399;; - - ss|,,,,   - 4 4fg5F G G G G H HrEbridge_interfacesc"|jdi}|dD] }||vrd|i}||!|jdi}||||di}|d|d<|diD]\}}|||i|d}|`t |t krH|dvrd }n*|d vrd }n#td | |d|i||d|idS)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 rro bridge_portsrr6N)on1rT)off0rFz2Cannot convert bridge_stp value ({stp}) to boolean)r,) r~rrrhrrboolrr) rWrXr rrrrrr6s rC handle_bridgez%NetworkStateInterpreter.handle_bridges>(,,\2>> kk"566 & &F##C   % % % %(,,\2>>  W%%%w{{622B77 '(; <n!++h3399;; ' 'JE3 LL% & & & &YY|,,  !d:&6&6$&>&>^++! .."  %v*v55 LL, 3 4 4 45=%011111rEc0||dSr<rrs rChandle_infinibandz)NetworkStateInterpreter.handle_infiniband6s W%%%%%rEcg}g}d|vr=|d}t|tks|g}|D]}||d|vr:|d}t|ts|g}|D]}||||fS)Nrr)rlistappendr)rWrXr#raddrsaddrpathspaths rC _parse_dnsz"NetworkStateInterpreter._parse_dns:s    I&E;;$&& ) )""4(((( w  H%EeT**  $ $ d####F""rErc|jd}||\}}d|vr||f|j|d<dS|d||d|dS)Nrrr#r)r~rrrextend)rWrXrr#rs rChandle_nameserverz)NetworkStateInterpreter.handle_nameserverKs!%%e,,"oog66 V ' ! !=D #GK$8 9 9 9   % %k 2 2 2 M  ( ( ( ( (rEc|jd}||\}}||d||d<dS)Nr rr)r~rr)rWrXr_ifacer#rs rC_handle_individual_nameserverz5NetworkStateInterpreter._handle_individual_nameserverXsJ$((66"oog66 V/:fMMu erE destinationc`|jdt|dSr)r~r_normalize_routers rC handle_routez$NetworkStateInterpreter.handle_route^s- H%,,-=g-F-FGGGGGrEc4||ddS)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 rC handle_bondsz$NetworkStateInterpreter.handle_bondscs#:   6 :::::rEc4||ddS)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 rChandle_bridgesz&NetworkStateInterpreter.handle_bridgess#0   8 <<<< v1(physical): %s) r rhrrrstrlowerr _v2_to_v1_ipcfgrkrr)rWrX ifaces_by_macethcfgphy_cmdr!rroset_namelcase_mac_addressmacr-rLrs rChandle_ethernetsz(NetworkStateInterpreter.handle_ethernetssZ.//  + *+ *HC GGGGR((E))L$77K  .HH  &1GM "Dwwz**H   $/$5$5$7$7!23DEED"GFOYYx..F 7%-v$6!A , ,#::#&s8GCL**3//G7||a 73444 II:G D D D   ) ) ) )W+ *+ *rEc|D]\}}d||d|dd}d|vr |d|d<||}t|dkr|d|it d|||d S) 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'}], } vlanidlink)rrorrr"rrzv2(vlans) -> v1(vlan): %sN)rhrr0rkrrrr)rWrXr:r3vlan_cmdrs rC handle_vlansz$NetworkStateInterpreter.handle_vlanss$! ' 'ID#774== WWV__ H ||"%e***3//G7||aG 4555 II2H = = =   X & & & & ' 'rEc:tddS)NzOWifi configuration is only available to distros with netplan rendering support.)rrrs rC handle_wifisz$NetworkStateInterpreter.handle_wifiss'  *     rEctd||D];\}}d|vr|d}|r|}d|vr|ddg}|ddg}ddi}t |dkr|d|it |dkr|d |i|||d id }|rt|} | r| }|||=dS) Nzv2_common: handling config: %sr%r#rrr nameserverrrr!r,) rrrhrrkrrr r) rWr3rdev_cfgset_name_ifacerrname_cmdr real_if_names rCrz"NetworkStateInterpreter._v2_commons 3S999!iikk D DNE7W$$!(Z!8!8!+*E'' ]3377"EEkk-0044["EE"L1v;;??OOXv$6777s88a<<OOY$4555&&x000-4[["-E-E-I-I .. -#? #L#LL#- ,228UCCC/ D DrEc  tdt|D |D]u\}}td|D}|di}|dd}|r||d<d|d||d z|d d t fd |Di}d |vr |d |d <||} t | dkr|d| it d||||dkr| |7|dkr| |Ttd |dS)z(Common handler for bond and bridge typesc3$K|] \}}||fV dSr<rSrrvs rC z>NetworkStateInterpreter._handle_bond_bridge..>s;  q!QF      rEc36K|]\}}|tv||fVdSr<)NETWORK_V2_KEY_FILTER)rrLvalues rCrKz>NetworkStateInterpreter._handle_bond_bridge..CsB S%333e 3333rE parameterszgratuitious-arpNr)rro _interfacesr rc32K|]\}}||fVdSr<rS)rrrJ v2key_to_v1s rCrKz>NetworkStateInterpreter._handle_bond_bridge..Ss0NNtq! A2NNNNNNrEr"rrzv2(%s) -> v1(%s): %sr9r8z Unknown command type: {cmd_type}r#)rr:rrhpopr0rkrrrr rrr) rWrXr$ item_nameitem_cfg item_paramsr grat_valuev1_cmdrrRs @rCr&z+NetworkStateInterpreter._handle_bond_bridge:s  /33H==CCEE     $+==??# #  Ix$,NN$4$4K!__\266F$5t<?# # rEc d}g}|dr9ddi}||di||||dr@ddi}d|_||di|||d}d}i}|d gD]}d |d }d |vr3d |vr.|,|d }|d|in2d|vr.|,|d}|d|id|vru|ss|dd } | r| |d<|dd} | r| |d<||||g} |dgD]M} | t | d| ddNt |rt | r | |dd<|S)z7Common ipconfig extraction from v2 to v1 subnets array.c(d|vr |d|d<dSdS)Nz route-metricmetricrS) overridesrs rC_add_dhcp_overrideszDNetworkStateInterpreter._v2_to_v1_ipcfg.._add_dhcp_overridesjs***#,^#<x   +*rErrrrTrNrstatic)rr:rrrr#rr dns_searchrtovia)rrr)rrr{rr rk) rWr3r]rrrrr#rrrrrs rCr0z'NetworkStateInterpreter._v2_to_v1_ipcfggs = = = 777   #g&F  (92 > > G G G NN6 " " " 777   #g&F DM  (92 > > G G G NN6 " " " ww{B// # #G "F g~~$$)9"wwz22HMM9h"7888$$)9"wwz22HMM9h"7888##K#GGM2266{CC ?5>K 12//33H==706K - k*** NN6 " " " "WWXr**  E MM ',yy#(99U#3#3     w<< *CKK *#)GAJx rE)T)rNr<)%rPrQrRrrrrryrr{setterrr?rrrrrrbrrrrr rrrrr!r'r)r8r>r@rr&r0rSrErCr>r>sg    & " " " "H|HHHXH33X3_66_6%%%+++ 333BBB    !!!!F99998&""--#"-&""4"4"#"4"l999::22;:2 >>>??2H2H@?2Hh&"5677>2>287>2@&""&&#"&###")%% ) )&% ))%%NN&%N -))HH*)H;;;>===4Z*Z*Z*x'''B   DDDD6++++Z?????rEr>) metaclasschtj|}td|D}|ddvr$|t |dd|dgD|d<d}d D]}||||S) Nc3(K|] \}}|||fVdSr<rSrIs rCrKz$_normalize_subnet..s/@@DAqa@!Q@@@@@@rEr)r^static6)r ip_address address_keysc,g|]}t|SrS)r )rrs rCrz%_normalize_subnet..s. !rErc||vr:t||ts!||||<dSdSdSr<)rrsplit)snetros rClistifyz"_normalize_subnet..listifysE 4<< 4:t < <<d))++DJJJ <<.s/77$!QQ71v777777rENz No config network address keys [,z ] found in z$Address %s is not a valid ip networkzAddress z is not a valid ip addressnetmask/r@z;Overwriting existing 'prefix' with '%s' in network info: %s)rrhrjoinrrrr.r rr partitionr r rrr)rrjnetaddr_keyrLmessageripv6ipv4rw addr_part_ maybe_prefixrs rCrqrqs 77'--//777 7 7CH 773<< H E  "" HH\ " " " " G  '!!! swwx  ! !D   F 8$???DDDDDEEE 4 D 4 Dggi  G d{{%)^^C%8%8" 1l!H  J,\::FF  J,\::FF II.s=1aAZ,?,?A,?,?,?,?rErr)rrrir[z(Route config metric {} is not an integerN) rrhrrqrrr TypeErrorr)r normal_router[rs rCr r s  ;;==L $$".}"= Y  ' 'A      h ' 'F  %([[L " "   :AA&II   s:B B?#B::B?c"|sg}d|DS)Nc,g|]}t|SrS)rs)rss rCrz&_normalize_subnets..7s! 2 2 2Q a 2 2 2rErS)rs rCrr4s#  2 2' 2 2 22rET net_configrrcd}|d}|d}|dkr|}|r1|/t|||}|||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: )rr>rrr)rrr$rArrrBs rCparse_net_config_datar:s EnnY''G ^^H % %F!||"6%%FX    [111!        LrE)rS)TN)0r|r_loggingtypingrrrr cloudinitrr cloudinit.netr r r r r rrrrcloudinit.net.rendererr getLoggerrPrrrrMr:r.__annotations__rDrM ExceptionrOrbrrdryr>rsrqr rrr rrSrErCrsB 555555555555$$$$$$$$                      0//////g!!---(&+-+&4%-%-!!:"!7  $''$$"&*  %//$sDcN*+D     Y   $OOOOOOOO&S8S8S8S8S8S8S8S8lC C C C C (:C C C C L:IIIIXD333  rE