x[hʲTddlZddlZddlZddlZddlZddlZddlmZmZddl m Z m Z ddl m Z mZddlmZmZmZmZmZddlmZej.eZgdZddZd Zd ZGd d ZGd deZGddeZ GddejBZ!dZ"ddZ#ddZ$ddZ%y)N)DictOptional)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 | } |j d t|zd t| dd|d k(sk|j|s~t|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_stringsR ( (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*'=#>LII#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)rcleZdZUdZdddddddd 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#efd$Ze d%Ze d)d#efd&Z d*d#edee d'dfd(Zy)+Rendererz7Renders network information in a /etc/sysconfig format.TFnone)ONBOOTUSERCTL 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__psF!::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 |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/|dk(rt |r |d+|d,<n|d+|d-<n |dk7r|d+|d.<|d/vr|dk7r|r |ddk7rd|d0<d|tvrm|dvsrt |r]| d1z} |d2d3|d4} | d5k(r|dk(r| |d6<nq| |d7<nk| d1k(r|dk(r| |d8<n[| |d9<nU|dk(r | |d:| z<nG|d9xxd;| zz cc<n6| d1z} | d5k(rd|z<d?|vr)|dk7r$d|d@<t|d?r |d?|dA<n|d?|dB<dC|vr|dk7rd;j!|dC|dD<dE|vsc|dk7sjt|dEdFkDr-tjdG|jt|dEt|dEddFd1D]\}}||dHt|z<y)INrrrBRIDGEdhcprstartrrdhcp6zipv6_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 ''rrrmetricIPV6_ROUTE_METRICIPV4_ROUTE_METRICrrrDHCLIENT_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#i6H6H2IJE 6IAv **V,K6!V#%f-9?9I "569?9I "56v%*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&.16IE 6r)c|dk(ryt|t|jD]X\}}|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|dk(rt|r |d|d<|d|d<|d|d<dD]"\} } | |vs | |j} || || <$|xjdz c_ .[y)Nrrrrrr+rz?Duplicate declaration of default route found for interface '%s'Tr,rr$r%r-rr!rr"r#r))r+r)r!r)r+r)netmaskr)r,rro) r3r"rrKr r0r rrrsrrr rq) rr route_cfgr7r_r9r;r.is_ipv6r new_namer s r'_render_subnet_routeszRenderer._render_subnet_routesjs V  "7#i6H6H2IJ? ,IAv **V,KHb1= , **V,)$1&e,#+== 6*y/M/M 6*y/M/M(=@IP-1Ij) -1BBBF ">? E)":? :JI&67=AI:383CIi0=AI:5(!V+-f5AF$,B" *= >BG$,B" *= >38/Ih/ . @)#e+)1 93E3E2F&GG16wIg. @&&!+&{= ,? ,r)cTg}|jD]f\}}||jddg}|D]H}||vs||}t|ttfrdj |}|j ||zfh|r/|dk(rdj ||d<ydj ||d<yy)NrG-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 ##4  Hi!8#3#3C#=>I% u$!&xJ!*udm<%(XXj%9 $$Y*%=>     4788I3F /0 -0HHY,? .) r)c0|jtjdD]o}|jdxs|d}|jdg}||}|j}|j |||j ||j||||qy)Nr config_idrr7)iter_interfacesr filter_by_typerKrrCr8rJ) r network_stateiface_contentsrrr iface_subnetsrrFs r'_render_physical_interfacesz$Renderer._render_physical_interfacess#22  # #J /  E;/@5=J!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_MASTERrrrMACADDRr7zBONDING_SLAVE_%szBONDING_SLAVE%srrhotplugrMASTERSLAVE)r r[filter_by_attrrZrWextendrrrKrrCr8rJr\r3)rr\r]r bond_filter slave_filterrrr master_cfgs master_cfgr^rF 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: %srPHYSDEVr7)r r[rZrKrfindr_supported_vlan_namesr4rr#rrCr8rJ) rr\r]r vlan_filterrrrrsrdev supportedr^rFs r'_render_vlan_interfacesz Renderer._render_vlan_interfaces"s8--f5 "22;?" EvJ&z2I))I.+2Ii(+56M 8H8H8M+N -($( &!!' ./1$i8HI Y.HH1"+ (, )$!IIi4M!((I   //    % %9mV A" r)cg}g}|jD]|}|dD]3}d|vr|j|dd|vs |j|d5d|vsC||ddDcgc]}||vr| c}z }||ddDcgc]}||vr| c}z }~|jr!||jDcgc]}||vr| c}z }|jr!||jDcgc]}||vr| c}z }t t |t |gsyt jd} |rGtjj|r(t jtj|} |D]}| j||D]} | j| td} t!| } | j#| s| d z| z} | Scc}wcc}wcc}wcc}w) Nr7r0r.dns nameserversr4r;r )rZrgr0dns_searchdomainsanyr"r ResolvConfosrisfilerload_text_fileadd_nameserveradd_search_domainr(rar5) r\existing_dns_pathfound_nameserversfound_dns_searchrr9rr4 nameservercontent searchdomainheader content_strs r' _render_dnszRenderer._render_dnsIsJ"224 E * B$.%,,V4E-FG6)$++F<,@A  B~!$U|M:&"33&! !"',x"8%%55%  2  ( ( "/"?"?"%66"    * * +==!!11!  %&$%  ((, 0A!B!,,##$56G, /J  " ": . /, 4L  % %l 3 4c"'l %%f- 4-+5Kc& %" !s# G  G/ G Gcd}tjd}|jD]4}|dD]}d|vsd|vs d}n|rd|vs!|dds |dd s2d}n|js|js|r|j d dd |sydj td d j |jd g}|S) NFrr7r0r.Trrr4mainrr ) rNetworkManagerConfrZr0rset_section_keypairr#r(r[)r\r iface_dnsrrr9outs r'_render_networkmanager_confz$Renderer._render_networkmanager_confs %88<"224 E * $.,&2H $I  UN5\-0E%L4J  ,  ) )..  ' 'v >gg|~tTYYw}}-GNO r)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)Nrrrronoffrrb LLADDRESS bridge_portsz%sr BRIDGE_PORTSr;rr7)ritemsr5r r[rZrrKr#rgrrrCr8rJ)rr\r]rold_knew_kbridge_key_map bridge_filterrrrr r rEbridged_iface_name bridged_cfg bridged_cfgs bridge_cfg bridge_valuer^rFs r'_render_bridge_interfacesz"Renderer._render_bridge_interfacess6 !$ 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)Nrrr7) r r[rZrrKrrCr8rJ) rr\r]r ib_filterrrrr^rFs r'_render_ib_interfaceszRenderer._render_ib_interfacess++L9 "229= EvJ&z2I)IN!IIi4M!((I   //    % %9mV  r)c|s |j}i}|jD]r}|ddk(r |jdxs|d}t|d||}|dk(r"|j d|j d|j ||||||<t|j ||||j||||j||||j||||j|||i} |jD]\} }|s |jrN|j| |j<|jD]"}|s|j| |j<$|jsot!|jj"|jj$gdd gD](\} } | | vs |jj| | | <*| S) z3Given state, return /etc/sysconfig files + contentsrloopbackrYrrrrrr)rrZrKrrPr r_rqr~rrrrrdrrziprr) rryr\rrr]rrYrcontentsrcpathrs r'_render_sysconfigzRenderer._render_sysconfigs I24"224 2EV} *"YY{3DuV}I$f /Ix(v&  $ $UIv >(1N9 % 2 '' ~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)returnc|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 t$j&j1|ritj2|j5D]Ct7fd d Drt+j5vs3|j/Etj|d j9|d z|yy)Ni)r)rT)rmode preserve_moderr,zNETWORKING=yeszNETWORKING_IPV6=yeszIPV6_AUTOCONF=noc3&K|]}|v ywr>r-).0settinglines r' z0Renderer.render_network_state..hs  '$tO s) NETWORKINGNETWORKING_IPV6rr )rr target_pathrrrrr write_filerrrrr_render_persistent_netrKr6 ensure_dirrrdirnamer(use_ipv6rQexistsr splitlinesrr#)rBr\rtarget file_moderyrdatarresolv_contentrnm_conf_contentnetrules_contentrsysconfig_pathnetcfgrs @r'render_network_statezRenderer.render_network_state2si I ++FD4D4DE00 mT[[I1 %' 3JD$ OOD$ 2 3 =='' >H!--.N.)D  ( (++55L#>>yO oyI   #::=I  ,,VT5G5GHM OO("  ))&)-- 2JK  " "9 - OOBGGOON; <"n&67F%% 34 01ww~~n- //?JJL ,D , ! (A(A(CC d+ , OO & 1D 8) 1 .r)r>)NN)rhrirjrkrrrPrOrdict__annotations__rC classmethodr rCrJrWr_rqr~ staticmethodrrrrrrrrr-r)r'rr4sA 'V< N0%!'#  '0!2#  L* M(It3&002J6J6XE,E,N@@4*<.<.|$$L@@D##J<(<<|$  +$++`%) D#DD>D  Dr)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'rzrzys5     dC)  s#+cptjdtvryt|ryt |ryy)NvariantFT)r system_info KNOWN_DISTROSavailable_sysconfigavailable_nm_ifcfg_rhrs r' availablers4 )$M96"V$ r)cTtjtj|dS)Nz;usr/lib*/NetworkManager/*/libnm-settings-plugin-ifcfg-rh.so)globrrrs r'rrs) 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'rrs}!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 getLoggerrhr4rr(r0r8r:rmrrrzrrrr-r)r'rs  ! F5g! $ E 3#3#lkIk\G9GTB x  B J r)