fţTddlZddlZddlZddlZddlZddlZddlmZmZddl m Z m Z ddl m Z mZddlmZmZmZmZmZddlmZej.eZgdZddZd Zd ZGd d ZGd deZGddeZ GddejBZ!dZ"ddZ#ddZ$ddZ%y)N)MappingOptional)subputil)networkmanager_conf resolv_conf)IPV6_DYNAMIC_TYPESis_ipv6_addressnet_prefix_to_ipv4_maskrenderersubnet_is_ipv6) NetworkState) almalinuxcentos cloudlinux eurolinuxfedora miraclelinux openeuler OpenCloudOS openmandrivarhelrockysuse TencentOS virtuozzocddg}tt|D]}||r|dz||z||<|||<dj|S)Nz1Created by cloud-init automatically, do not edit.  )rangelenjoin)seplinesis 9/usr/lib/python3/dist-packages/cloudinit/net/sysconfig.py _make_headerr()s`;  E3u:  8Sy58+E!HE!H  99U c(d}|ddk(xr|d|vS)N)z::z0.0.0.0prefixrnetwork)route default_netss r'_is_default_router06s%$L ?a  DE)$4 $DDr)ctjd|r)|jdr|jdr|Sd|zS|S)Nz\s"z"%s")research startswithendswith)values r' _quote_valuer8;s= yy   C U^^C%8LE> ! r)cVeZdZdZdddZdZdZdZdZd Z d Z d Z d Z d Z dZy) ConfigMapz!Sysconfig like dictionary object.yesno)TFci|_yN_confselfs r'__init__zConfigMap.__init__Os  r)c"||j|<yr>r?)rBkeyr7s r' __setitem__zConfigMap.__setitem__Rs 3r)c |j|Sr>r?rBrEs r' __getitem__zConfigMap.__getitem__Uszz#r)c8|jj|Sr>)r@getrHs r'rKz ConfigMap.getXszz~~c""r)c||jvSr>r?rHs r' __contains__zConfigMap.__contains__[sdjj  r)c<|jj|dyr>)r@poprHs r'dropzConfigMap.drop^s sD!r)c,t|jSr>)r"r@rAs r'__len__zConfigMap.__len__as4::r)cy)z6Skip the pair key, value if it matches a certain rule.Fr-rBrEvals r'skip_key_valuezConfigMap.skip_key_valuedsr)ctj}|jt|jr|jdt |jj D]~}|j|}|j||r%t|tr|j|}t|ts t|}|j|dt|d|jS)Nr =)ioStringIOwriter(r@sortedkeysrV isinstancebool _bool_mapstrr8getvalue)rBbufrEr7s r' to_stringzConfigMap.to_stringhskkm ,.! :: IIdO$**//+, >CJJsOE""3.%&u-eS)E  II3 U(;< = >||~r)c:|jj|yr>)r@update)rBupdatess r'rfzConfigMap.updatexs '"r)N)__name__ __module__ __qualname____doc__r`rCrFrIrKrMrPrRrVrdrfr-r)r'r:r:FsF+I  #!" #r)r:cVeZdZdZfdZdZedZedZdZ ddZ xZ S) Routez!Represents a route configuration.ctt| d|_d|_d|_||_||_||_||_ y)NF) superrmrClast_idxhas_set_default_ipv4has_set_default_ipv6 _route_name_base_sysconf_dirroute_fn_tpl_ipv4route_fn_tpl_ipv6)rB route_namebase_sysconf_diripv4_tplipv6_tpl __class__s r'rCzRoute.__init__sG eT#% $)!$)!%!1!)!)r)ct|j|j|j|j}|j j |_|j|_|j|_|j|_ |Sr>) rmrtrurvrwr@copyrqrrrs)rBrs r'r~z Route.copysp      " "  " "  " "   **//#]] !%!:!:!%!:!:r)cN|j|j|jdzSN)basename)rvrurtrAs r' path_ipv4zRoute.path_ipv4)%%++T5E5E F  r)cN|j|j|jdzSr)rwrurtrAs r' path_ipv6zRoute.path_ipv6rr)c d|vS)N:r-)rBaddresss r' is_ipv6_routezRoute.is_ipv6_routes g~r)c ,|dvrtdt|ztj}|j t |j r|j dd}t|j jD]}d|vr |jdd}t|j |}t|j d|z}|dk(r|j|st|j d |z}|d z}|j dt|zd t|d|j dt|zd t|d|j d t|zd t|dd |z} | |j vst|j d |z} |j d t|zd t| dh|d k(so|j|st|j d|} d |z|j vrdt|j d |zznd} |j |d| d|d| d|jd |jS)N)ipv4ipv6zUnknown protocol '%s'r ADDRESSrGATEWAYrNETMASKrorXMETRICrPREFIXzmetric /z via rz dev ) ValueErrorrarYrZr[r(r@r\r]replacerr8rtrb) rBprotorcreindexrEindex address_value gateway_value netmask_value metric_key metric_value prefix_values r'rdzRoute.to_stringsW ( (4E CD Dkkm ,.! :: IIdO$**//+,5 C#KK 2.E 30M 9u+< =>Mt'9'9-'H #DJJy5/@$A B !A+  3w</m1LN  3w</m1LN  3w</m1LN&- +#&tzz(U2B'C#DLII#c'l2L4NP&T%7%7 %F"4::ug.>#?@  %'4::5DJJx%/?$@ AA  &$%$((  Y5 n||~r))r) rhrirjrkrCr~propertyrrrrd __classcell__r|s@r'rmrm|sC+*     Br)rmceZdZdZddddddZ dfd Zed Zejd Zed Z e jd Z ed Z ddZ dZ xZ S) NetInterfacezERepresents a sysconfig/networking-script (and its config + children).EthernetBondBridge InfiniBandVlan)ethernetbondbridge infinibandvlanchtt| g|_||_|jj d}t |||j d|j d|_|jj d|_||_ ||_ ||jd<||_ y)Nroute_templatesrr)rzr{iface_templatesDEVICE) rprrCchildren templatesrKrmroutes iface_fn_tplkind _iface_namer@ru)rB iface_nameryrr route_tplr|s r'rCzNetInterface.__init__s lD*, "NN&&'89   ]]6*]]6*   !NN../@A %) 8!1r)c|jSr>)rrAs r'rzNetInterface.name sr)c0||_||jd<y)Nr)rr@)rBrs r'rzNetInterface.name s%) 8r)c|jSr>)_kindrAs r'rzNetInterface.kinds zzr)c|||jvr t|||_|j||jd<y)NTYPE) iface_typesrrr@)rBrs r'rzNetInterface.kinds; t'' 'T" " !--d3 6r)cN|j|j|jdzSr)rrurrAs r'pathzNetInterface.paths'  ++TYY ?  r)c,t|j|j|j|j}|j j |_|rt|j|_|r|jj |_ |S)N)r) rrrurrr@r~listrr)rB copy_children copy_routescs r'r~zNetInterface.copy#sj  IIt--t~~DJJ **//# dmm,AJ {{'')AHr)c|dk(r|dk(ryy)NrrTFr-rTs r'rVzNetInterface.skip_key_value.s &=SF]r))r)FF)rhrirjrkrrCrrsetterrrr~rVrrs@r'rrsO" K=G2(   [[** [[44   r)rcbeZdZUdZddddddddd Zd d d d dddddddddd ZegdZiZe e d<d)dZ e dZ e dZe dZe dZe dZe dZe d Zed)d!Zed)d"Ze d#Ze d$Ze d)d%Z d*d&edee d'dfd(Zy)+Rendererz7Renders network information in a /etc/sysconfig format.TFnone)ONBOOTUSERCTL NM_CONTROLLED BOOTPROTOstaticauto)r STARTMODE)rrIPV6_FORCE_ACCEPT_RASTPAGEINGPRIOHWADDRMTU) accept-ra bridge_stp bridge_ageingbridge_bridgeprio mac_addressmtu BRIDGE_STPBRIDGE_AGEINGTIMEBRIDGE_PRIORITYLLADDR)rrrrr)) bond_modezmode=%s)bond_xmit_hash_policyzxmit_hash_policy=%s) bond_miimonz miimon=%s)bond_min_linksz min_links=%s)bond_arp_intervalzarp_interval=%s)bond_arp_ip_targetzarp_ip_target=%s)bond_arp_validatezarp_validate=%s)bond_ad_selectz ad_select=%s)bond_num_grat_arpznum_grat_arp=%s)bond_downdelayz downdelay=%s) bond_updelayz updelay=%s)bond_lacp_ratez lacp_rate=%s)bond_fail_over_maczfail_over_mac=%s) bond_primaryz primary=%s)bond_primary_reselectzprimary_reselect=%srNcf|si}|jdd|_|jdd|_|jdd|_d}|jd||_|jd |jd |jd d |_|jd d|_y)N sysconf_dirz etc/sysconfig netrules_pathz(etc/udev/rules.d/70-persistent-net.rulesdns_pathzetc/resolv.confz,etc/NetworkManager/conf.d/99-cloud-init.confnetworkmanager_conf_pathcontrolrr)rrrflavorr)rKrrrrrr)rBconfig nm_conf_paths r'rCzRenderer.__init__qsF!::m_E#ZZ G  :/@A E (. & ) %zz),%zz*;<%zz*;<  jj62 r)cRtj|jj|i}|j |dD]I}|j|}||dk(r|ddvr$|j |j|}|sE|||<Kd|vr|dr|ddk(rd|d<yyyy) N)rrrrtype)physicalr wakeonlanrzwol g ETHTOOL_OPTS)r~deepcopyiface_defaultsrKrf cfg_key_maps)clsiface iface_cfgrflavor_defaultsold_key old_valuenew_keys r'_render_iface_sharedzRenderer._render_iface_shareds--(:(:(>(>vr(JK): 3G '*I$m+f F1**6266w?)2Ig& 3 5 k"f +(/In %,# !r)c L|dk(r d|d<d|vrd|d<|jdnd|d<t|t|jD]\}}d}|j d }|d k(s|d k(rJ|dk(r|dd vrd|d<nd |d<d |d<n|dk(r|d k(rd|d<d|d<d|d<d|d<nvd|d<d|d<nj|dk(r4|dk(r|dd vrd|d<nd |d<d|d<nGd|d<d|d<d|d<d|d<n1|dk(r*|dk(r|dd vrd|d<nd |d<d|d<nd|d<d|d<n|d vr|d} d|d<|dk(r| dvrd|d<n|dvrt |r |dk7rd}d|d<d|vrft ||vxr |d||k7} | r(tjd |j|||dt |r|dk(rn|d||<n|d||<t |rU|dk(rPd|d!<d|d<nE|d"k(r$|dk(rtjd#|n$||v|d$<ntd%|d&|jd'|j d(d"k(s|dk(rd"|d)<d|d$<d*} d*} t|t|jD]\}}|j d }d+|vr |dk7r|d+|d,<|d-vr|dk7r|r |ddk7rd|d.<B|tvrK|dvsPt |r]| d/z} |d0d1|d2} | d3k(r|dk(r| |d4<nq| |d5<nk| d/k(r|dk(r| |d6<n[| |d7<nU|dk(r | |d8| z<nG|d7xxd9| zz cc<n6| d/z} | d3k(rd:n t| }|d0|d;|z<t|d2|d<|z<d=|vr)|dk7r$d|d><t|d=r |d=|d?<n|d=|d@<dA|vr|dk7rd9j!|dA|dB<dC|vsA|dk7sHt|dCdDkDr-tjdE|jt|dCt|dCddDd/D]\}}||dFt|z<y)GNrrrBRIDGEdhcprstartrrdhcp6zipv6_dhcpv6-stateful)dhcp4rmanagedDHCLIENT6_MODErTDHCPV6CIPV6INITF IPV6_AUTOCONFIPV6_FAILURE_FATALzipv6_dhcpv6-statelessinfoz-SDHCPV6C_OPTIONS ipv6_slaac)rrr)rstatic6IPV6_MTUrzZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.rmanualz Unknown subnet type setting "%s"rzUnknown subnet type 'z' found for interface ''rrrmetricrrrDHCLIENT_SET_DEFAULT_ROUTErorrr+rIPADDR6IPV6ADDR IPADDR6_1IPV6ADDR_SECONDARIESz IPADDR6_%drrIPADDRrgatewayDEFROUTEIPV6_DEFAULTGWr dns_searchDOMAINdns_nameserversz6%s has %d entries in dns_nameservers. Only 3 are used.DNS)rP enumerater"rrKr r_LOGwarningrdebugrr rar r r#)rrsubnetshas_default_routerr&subnetmtu_key subnet_type bootproto_in mtu_mismatch ipv4_index ipv6_index ipv6_cidrsuffks r'_render_subnetszRenderer._render_subnetss V %-Ik "9$)/ +&x(%+Ik "#7#i6H6H2IJu 0IAvG **V,Kg%8N)NV# -1BB17 +.29 +.2;I./v%#99+/Ii(,0Ij)16Io.6:I23,0Ij)+/Ii( 77V# -1BB17 +.29 +.28I./,0Ij)26Io.+/Ii(48I/0 ,V# -1BB17 +.29 +.28I./,0Ij)15Io. 11(5 )/ +&V#$+<<18 +. 55"&)f.>(G,0Ij)F?#'9,@"5MYw-??$L$ J%NN%g."5M &f-!V+!17Ig.-3E] '*!&)f.>8=I4516Io.(V#II@+N+2Y*>Ih' "INN4zz)$0V#-5Ik**/Ih'ku 0p  "7#i6H6H2IJ@ 6IAv **V,K6!V#*0*:Ih'//V#(Y{-Cv-MBG ">? 22 55!&)!+aJ+1)+N OI!Q!V+3Ik2@II&<=!V+CLIlZ&?@%&<= #i=",aJ!+q2c*oD17 1BIho.2Ix(3Ii$./&6V+;,0Ij)&vi'896*-((6,3G*HIh'$.6V3C6"3459 /%NN'8 9:  !*&1B*CBQ*G K6145 %#a&.16@ 6r)c|dk(ryt|t|jD]6\}}|jd}|jdgD] }|jdxst |d} t |r|t vr|jdr |js|jdr$|jrtd|jzd |d <|d d vrd |d <d|vr!| r|d|d<d |_n|d|d<d |_d|vs|d|d<dD]"\} } | |vs | |j} || || <$|xjdz c_  9y)Nrrrrrr*rz?Duplicate declaration of default route found for interface '%s'Tr+rr#r$r,rr"r))r*r)r"r)r+r)netmaskr)r,rro) r2r"rrKr r0r rrrsrrrq) rr route_cfgr6r_r8r:r.is_ipv6r new_namer s r'_render_subnet_routeszRenderer._render_subnet_routesfs V  "7#i6H6H2IJ5 ,IAv **V,KHb13 , **V,)$1&e,#+== 6*y/M/M 6*y/M/M(=@IP-1Ij) -1BBBF ">? E)":? :JI&67=AI:383CIi0=AI:5(.3Ho (+ . @)#e+)1 93E3E2F&GG16wIg. @&&!+&g3 ,5 ,r)cTg}|jD]f\}}||jddg}|D]H}||vs||}t|ttfrdj |}|j ||zfh|r/|dk(rdj ||d<ydj ||d<yy)NrF-rrBONDING_MODULE_OPTS BONDING_OPTS) bond_tpl_optsrr^tuplerr#append) rrrr bond_optsbond_key value_tpl bond_keys bond_values r'_render_bonding_optszRenderer._render_bonding_optss %(%6%6  !Xy!8#3#3C#=>I% u$!&xJ!*udm<%(XXj%9 $$Y*%=>     4788I3F /0 -0HHY,? .) r)ctj}|j|D]\}|d}|jdg}||}|j} |j |||j ||j|| ||^y)Nrr6)r filter_by_physicaliter_interfacesrKrrBr7rI) r network_stateiface_contentsrphysical_filterrr iface_subnetsrrEs r'_render_physical_interfacesz$Renderer._render_physical_interfacess#55"22?C EvJ!IIi4M&z2I!((I   //    % %9mV  r)cLtjd}tjd}|j|D]`}|d}||}|j ||||g} | j |j | D]} d| d<|dk7sd| _|jdr.|dk(r|jd|d<n|jd|d <|jd g} |j} |j|| |j||j|| | |t|j|D cgc]} | d|k(r| dc} }t|D]9\}}|dk(rd |z}nd |z}|||<||}|dk(r d |d<d|d<0||d<d|d<;cycc} w)Nrz bond-masterrTBONDING_MASTERrrrMACADDRr6zBONDING_SLAVE_%szBONDING_SLAVE%srrhotplugrMASTERSLAVE)r filter_by_typefilter_by_attrrYrVextendrrrKrrBr7rIr\r2)rrZr[r bond_filter slave_filterrrr master_cfgs master_cfgr]rE slave_iface bond_slavesr bond_slaveslavestr slave_cfgs r'_render_bond_interfacesz Renderer._render_bond_interfacess--f5 ..}= "22;?9 .EvJ&z2I  $ $Yv >%+K   y11 2) - /3 +,V#&,JO - yy'V#*/))M*BIh'+099]+CIi(!IIi4M!((I   //    % %9mV  !(5'D'D$(##=1Z?  'K&/{%; .!zV#1E9H058H&0 (#*:6 V#-3Ik*-6Ik**4Ih')-Ig& .Y9 .Fs;F! c tjd}|j|D]}|d}||}|dk(r0|jd}|r||d<|d|j d|d<nPd|d <d|_|d } t | |d} || vr'tjd || d j| | |d <|jdg} |j} |j|| |j||j|| | |y)Nrrrvlan_idVLAN_ID. ETHERDEVICETVLANzvlan-raw-devicezIName '%s' for vlan '%s' is not officially supportedby RHEL. Supported: %srPHYSDEVr6)r rerYrKrfindr_supported_vlan_namesr3rr#rrBr7rI) rrZr[r vlan_filterrrrrsrdev supportedr]rEs r'_render_vlan_interfacesz Renderer._render_vlan_interfacess8--f5 "22;?" EvJ&z2I))I.+2Ii(+56M 8H8H8M+N -($( &!!' ./1$i8HI Y.HH1"+ (, )$!IIi4M!((I   //    % %9mV A" r)ctt|jt|jgsyt j d}|rGt jj|r(t j tj|}|jD]}|j||jD]}|j|td}t|}|j|s|dz|z}|S)Nr;r )anyr"r/dns_searchdomainsr ResolvConfosrisfilerload_text_fileadd_nameserveradd_search_domainr(rar5)rZexisting_dns_pathcontent nameserver searchdomainheader content_strs r' _render_dnszRenderer._render_dns:sM112M334  ((, 0A!B!,,##$56G(77 /J  " ": . /);; 4L  % %l 3 4c"'l %%f- 4-+5Kr)ctjd}|jr|jdddt |dk(rydj t ddj |jdg}|S)Nrmaindnsrrr )rNetworkManagerConfr/set_section_keypairr"r#r(r[)rZrrouts r'_render_networkmanager_confz$Renderer._render_networkmanager_confSsk%88<  ( (  ' 'v > w<1 gg|~tTYYw}}-GNO r)c|j|jDcic]\}}|jdr||}}}tjd}|j |D]m}|d} || } |dk7rd| _|jD]\} } | |vs || | | <|dk(r d| vr| jdrd| d<nd| d<|jdrd} |dk(rd } |jd| | <|dk(r8|jd gr&d d j|jd z| d <|jd gD]:}||}|g}|j|j|D]}| }|dk(rd}||d<<|jdg}| j}|j| ||j||j| |||pycc}}w)Nrrrronoffrra LLADDRESS bridge_portsz%sr BRIDGE_PORTSr;rr6)ritemsr5r rerYrrKr#rgrrrBr7rI)rrZr[rold_knew_kbridge_key_map bridge_filterrrrr r rEbridged_iface_name bridged_cfg bridged_cfgs bridge_cfg bridge_valuer]rEs r'_render_bridge_interfacesz"Renderer._render_bridge_interfacesgs6!$ 0 0 8 > > @ u) 5L  !//9 "22=A2 EvJ&z2I!) $2$8$8$: 8 e#).wIg& 89, }}\226 ,/27 ,/yy'V#%C!&=!9 #99^R004sxx .181In-',ii&C 8"--?@ +} ##K$8$89".8J#-L'', +7Jx( 8 8"IIi4M!((I   //    % %9mV a2  sGctjd}|j|D]c}|d}||}d|_|j dg}|j } |j |||j||j|| ||ey)Nrrr6) r rerYrrKrrBr7rI) rrZr[r ib_filterrrrr]rEs r'_render_ib_interfaceszRenderer._render_ib_interfacess++L9 "229= EvJ&z2I)IN!IIi4M!((I   //    % %9mV  r)c|s |j}i}|jD]\}|ddk(r |d}t|||}|dk(r"|jd|jd|j ||||||<^|j ||||j ||||j||||j||||j|||i} |jD]\}}|s |jrN|j| |j<|jD]"}|s|j| |j<$|jsot|jj |jj"gddgD](\} } | | vs |jj| | | <*| S) z3Given state, return /etc/sysconfig files + contentsrloopbackrrrrrr)rrYrrPr r^rqr~rrrrrdrrziprr) rryrZrrr[rrrcontentscpathrs r'_render_sysconfigzRenderer._render_sysconfigs  I57"224 3EV} *vJ$Z1A9MIx(v&  $ $UIv >)2N: & 3 '' ~vN ##M>6J ##M>6J %%m^VL !!-H%3%9%9%; L !J I..+4+>+>+@(!*!3!3II 3<3F3F3H0I$'%%//1A1A1K1KLV$%LLE5H,*3*:*:*D*DU*K L Lr)rZreturnc|s |j}d}tj||j}|j |||j |j D]\}}tj||||jrLtj||j}|j||} | rtj|| ||jrKtj||j} |j||} | rtj| | ||jrJ|j|} tj||j} tj| | |dtj||jd}|j!drtj"t$j&j)|t+dg}|j,r"|j/d |j/d tj|d j1|d z|yy) Ni)r)rT)rmode preserve_moderr,zNETWORKING=yeszNETWORKING_IPV6=yeszIPV6_AUTOCONF=nor )rr target_pathrrrrr write_filerrrrr_render_persistent_netrKr6 ensure_dirrrdirnamer(use_ipv6rPr#)rBrZrtarget file_moderyrdatarresolv_contentrnm_conf_contentnetrules_contentrsysconfig_pathnetcfgs r'render_network_statezRenderer.render_network_states I ++FD4D4DE00 mT[[I1 %' 3JD$ OOD$ 2 3 =='' >H!--.N.)D  ( (++55L#>>yO oyI   #::=I  ,,VT5G5GHM OO("  ))&)-- 2JK  " "9 - OOBGGOON; <"n&67F%% 34 01 OO & 1D 8)  .r)r>)NN)rhrirjrkrrrOrNrdict__annotations__rC classmethodr rBrIrVr^rqr~ staticmethodrrrrrrrrr-r)r'rr4sA"  'V<N0%!'#  '0!2#  L* M(It3&002E6E6N;,;,z@@4(<.<.|$$L0&::x$@D%%T%) 2#2D>2  2r)rc `dDcgc]}|j|t| c}Scc}w)ziReturn list of supported names for vlan devices per RHEL doc 11.5. Naming Scheme for VLAN Interfaces.)z{rdev}{vid:04}z {rdev}{vid}z{rdev}.{vid:04}z {rdev}.{vid})r|vid)formatint)r|rvs r'rzrzs5     dC)  s#+cptjdtvryt|ryt |ryy)NvariantFT)r system_info KNOWN_DISTROSavailable_sysconfigavailable_nm_ifcfg_rhrs r' availabler"s4 )$M96"V$ r)cTtjtj|dS)Nz;usr/lib*/NetworkManager/*/libnm-settings-plugin-ifcfg-rh.so)globrrrs r'rr,s) 99   I  r)cddg}ddg}|D]}tj|||ryddg}|D]7}tjj tj ||s7y y) Nifupifdownz/sbinz /usr/sbin)r4rFz/etc/sysconfig/network-scripts/network-functionszetc/sysconfig/configT)rwhichrrrr)rexpectedr4pexpected_pathss r'rr7s}!H{ #F zz!F6: :N 77>>$**615 6 r))#r>)&r~rrYloggingrr3typingrr cloudinitrrcloudinit.distros.parsersrr cloudinit.netr r r r r cloudinit.net.network_stater getLoggerrhr3rr(r0r8r:rmrrrzrrrr-r)r'rs  $ F5g! $ E 3#3#lkIk\G9GT] x  ] @ r)