o x[hʲ@sddlZddlZddlZddlZddlZddlZddlmZmZddl m Z m Z ddl m Z mZddlmZmZmZmZmZddlmZeeZgdZdd d Zd d Zd dZGdddZGdddeZGdddeZ Gdddej!Z!ddZ"d ddZ#d ddZ$d ddZ%dS)!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 virtuozzo#cCsJddg}tt|D]}||r|d||||<q |||<q d|S)Nz1Created by cloud-init automatically, do not edit.  )rangelenjoin)seplinesir&9/usr/lib/python3/dist-packages/cloudinit/net/sysconfig.py _make_header)s  r(cCsd}|ddko |d|vS)N)z::z0.0.0.0prefixrnetworkr&)route default_netsr&r&r'_is_default_route6sr-cCs0td|r|dr|dr|Sd|S|S)Nz\s"z"%s")research startswithendswith)valuer&r&r' _quote_value;s r4c@sjeZdZdZdddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZdS) ConfigMapz!Sysconfig like dictionary object.yesno)TFcCs i|_dSN_confselfr&r&r'__init__O zConfigMap.__init__cCs||j|<dSr8r9)r<keyr3r&r&r' __setitem__RszConfigMap.__setitem__cCs |j|Sr8r9r<r?r&r&r' __getitem__Ur>zConfigMap.__getitem__cCs |j|Sr8)r:getrAr&r&r'rCXs z ConfigMap.getcCs ||jvSr8r9rAr&r&r' __contains__[r>zConfigMap.__contains__cCs|j|ddSr8)r:poprAr&r&r'drop^szConfigMap.dropcCs t|jSr8)r!r:r;r&r&r'__len__ar>zConfigMap.__len__cCsdS)z6Skip the pair key, value if it matches a certain rule.Fr&r<r?valr&r&r'skip_key_valuedszConfigMap.skip_key_valuecCst}|t|jr|dt|jD],}|j|}|||r'qt|t r1|j |}t|t s:t |}|d|t |fq| S)Nr%s=%s )ioStringIOwriter(r:sortedkeysrJ isinstancebool _bool_mapstrr4getvalue)r<bufr?r3r&r&r' to_stringhs       zConfigMap.to_stringcCs|j|dSr8)r:update)r<updatesr&r&r'rXxszConfigMap.updateN)__name__ __module__ __qualname____doc__rSr=r@rBrCrDrFrGrJrWrXr&r&r&r'r5Fs r5csReZdZdZfddZddZeddZedd Zd d Z dd dZ Z S)Routez!Represents a route configuration.cs<tt|d|_d|_d|_||_||_||_||_ dS)NF) superr^r=last_idxhas_set_default_ipv4has_set_default_ipv6 _route_name_base_sysconf_dirroute_fn_tpl_ipv4route_fn_tpl_ipv6)r< route_namebase_sysconf_diripv4_tplipv6_tpl __class__r&r'r=s zRoute.__init__cCs>t|j|j|j|j}|j|_|j|_|j|_|j |_ |Sr8) r^rdrerfrgr:copyrarbrc)r<rr&r&r'rns z Route.copycC|j|j|jdSN)basename)rfrerdr;r&r&r' path_ipv4 zRoute.path_ipv4cCrprq)rgrerdr;r&r&r' path_ipv6ruzRoute.path_ipv6cCsd|vS)N:r&)r<addressr&r&r' is_ipv6_routeszRoute.is_ipv6_routeipv4c Cs|dvr tdt|t}|t|jr|dd}t|jD]}d|vr.q'| dd}t|j|}t|jd|}|dkr| |st|jd |}|d }|d dt|t |f|d dt|t |f|d d t|t |fd |} | |jvrt|j| } |d d t|t | fq'|d kr| |rt|jd|} d ||jvrdt|jd |nd} |d|| || |j fq'| S)N)rzipv6zUnknown protocol '%s'rADDRESSrGATEWAYrzNETMASKr_rKMETRICr{PREFIXzmetric z%s/%s via %s %s dev %s ) ValueErrorrTrLrMrNr(r:rOrPreplaceryr4rdrU) r<protorVreindexr?index address_value gateway_value netmask_value metric_key metric_value prefix_valuer&r&r'rWst     zRoute.to_string)rz) rZr[r\r]r=rnpropertyrtrvryrW __classcell__r&r&rlr'r^|s    r^cseZdZdZddddddZ dfd d Zed d Zejd d ZeddZ e jddZ eddZ dddZ ddZ Z S) NetInterfacezERepresents a sysconfig/networking-script (and its config + children).EthernetBondBridge InfiniBandVlan)ethernetbondbridge infinibandvlanrcsrtt|g|_||_|jd}t|||d|dd|_|jd|_||_ ||_ ||j d<||_ dS)Nroute_templatesrzr{)rjrkiface_templatesDEVICE) r`rr=children templatesrCr^routes iface_fn_tplkind _iface_namer:re)r< iface_namerirr route_tplrlr&r'r=s   zNetInterface.__init__cC|jSr8)rr;r&r&r'rs zNetInterface.namecCs||_||jd<dS)Nr)rr:)r<rr&r&r'rs scCrr8)_kindr;r&r&r'rrzNetInterface.kindcCs,||jvr t|||_|j||jd<dS)NTYPE) iface_typesrrr:)r<rr&r&r'rs cCrprq)rrersr;r&r&r'pathruzNetInterface.pathFcCsHt|j|j|j|jd}|j|_|rt|j|_|r"|j |_ |S)N)r) rrsrerrr:rnlistrr)r< copy_children copy_routescr&r&r'rn#s   zNetInterface.copycCs|dkr |dkr dSdS)NrrTFr&rHr&r&r'rJ.szNetInterface.skip_key_value)r)FF)rZr[r\r]rr=rrssetterrrrnrJrr&r&rlr'rs,        rc@s4eZdZUdZdddddddd Zd d d d dddddddddd ZegdZiZe e d<d7ddZ e ddZ e ddZe dd Ze d!d"Ze d#d$Ze d%d&Ze d'd(Zed7d)d*Zed7d+d,Ze d-efd.d/Ze d0d1Ze d7d-efd2d3Z  d8d-edee d4dfd5d6ZdS)9Rendererz7Renders 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=%srNcCsv|si}|dd|_|dd|_|dd|_d}|d||_|d |d |d d |_|d d|_dS)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)rCrrrrrr)r<config nm_conf_pathr&r&r'r=ps zRenderer.__init__cCst|j|i}||dD]$}||}|dur5|dkr'|ddvr'q|j||}|r5|||<qd|vrJ|drL|ddkrNd|d<dSdSdSdS) N)rrrrtype)physicalr wakeonlanrzwol g ETHTOOL_OPTS)rndeepcopyiface_defaultsrCrX cfg_key_maps)clsiface iface_cfgrflavor_defaultsold_key old_valuenew_keyr&r&r'_render_iface_shareds$    zRenderer._render_iface_sharedcCs|dkrd|d<d|vrd|d<|dnd|d<t|t|jdD]R\}}d}|d }|d ks7|d krr|dkrP|dd vrFd|d<nd |d<d |d<n|dkri|d krid|d<d|d<d|d<d|d<nd|d<d|d<n|dkr|dkr|dd vrd|d<nd |d<d|d<nd|d<d|d<d|d<d|d<n|dkr|dkr|dd vrd|d<nd |d<d|d<nd|d<d|d<n|d vr|d} d|d<|dkr| dvrd|d<n|dvr?t|r|dkrd}d|d<d|vr,t||vo|d||k} | rtd |j |||dt|r&|dkrn |d||<n|d||<t|r>|dkr>d|d!<d|d<n!|d"krW|dkrPt d#|n||v|d$<n t d%||j f|d&d"krv|dkrrd"|d'<q#d|d$<q#d(} d(} t|t|jdD]8\}}|d }d)|vr|dkrt|r|d)|d*<n|d)|d+<n |dkr|d)|d,<|d-vr|dkr|r|ddkrd|d.<q|t vrאq|dvrt|r.| d/} d0|d1|d2f} | d3kr|dkr| |d4<nQ| |d5<nL| d/kr|dkr| |d6<n=| |d7<n8|dkr#| |d8| <n,|d7d9| 7<n!| d/} | d3kr9d:nt | }|d1|d;|<t|d2|d<|<d=|vrq|dkrqd|d><t|d=rk|d=|d?<n|d=|d@<dA|vr|dkrd9|dA|dB<dC|vr|dkrt|dCdDkrt dE|j t|dCt|dCddDd/D] \}}||dFt |<qqdS)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"rz1Unknown subnet type '%s' found for interface '%s'rrr|metricIPV6_ROUTE_METRICIPV4_ROUTE_METRICrrrDHCLIENT_SET_DEFAULT_ROUTEr_z%s/%srxr)rIPADDR6IPV6ADDR IPADDR6_1IPV6ADDR_SECONDARIESz IPADDR6_%drrIPADDRrgatewayDEFROUTEIPV6_DEFAULTGWr~ dns_searchDOMAINdns_nameserversz6%s has %d entries in dns_nameservers. Only 3 are used.DNS)rF enumerater!rrCr rRLOGwarningrsdebugrrrTr r r")rrsubnetshas_default_routerr%subnetmtu_key subnet_type bootproto_in mtu_mismatch ipv4_index ipv6_index ipv6_cidrsuffkr&r&r'_render_subnetss&                                                zRenderer._render_subnetsc Csj|dkrdSt|t|jdD]\}}|d}|dgD]}|dp*t|d} t|r|tvr|dr;|jsC|drJ|jrJt d|j d |d <|d d vrXd |d <d|vrq| rh|d|d<d |_n |d|d<d |_d|vr|dkrt |r|d|d<q|d|d<q|d|d<qdD]\} } | |vr| |j } || || <q|j d7_ qqdS)Nrrrrr{r rzz?Duplicate declaration of default route found for interface '%s'Tr rrrr r~rrrrr))r r~)rr)r)r)netmaskr)r*r}r_) rr!rrCr r-rrbrcrrsr ra) rr route_cfgrr_rrr+is_ipv6rnew_namerr&r&r'_render_subnet_routesjsh         zRenderer._render_subnet_routesc Csg}|jD].\}}||ddg}|D]}||vr2||}t|ttfr)d|}|||nqq|rL|dkrCd||d<dSd||d<dSdS)Nr%-rrBONDING_MODULE_OPTS BONDING_OPTS) bond_tpl_optsrrQtuplerr"append) rrrr bond_optsbond_key value_tpl bond_keys bond_valuer&r&r'_render_bonding_optss" zRenderer._render_bonding_optsc Csh|tdD])}|dp|d}|dg}||}|j}||||j||||||qdS)Nr config_idrsr)iter_interfacesr filter_by_typerCrr"rr() r network_stateiface_contentsrrr iface_subnetsrr$r&r&r'_render_physical_interfacess" z$Renderer._render_physical_interfacescs^td}td}||D]}|d|}|||||g}||j|D] } d| d<|dkr8d| _q+|drQ|dkrJ|d|d<n|d|d <|d g} |j } | || |j || || | |t fd d ||D} t| D].\} }|dkrd | }nd| }|||<||}|dkrd|d<d|d<q}|d<d|d<q}qdS)Nr bond-masterrsTBONDING_MASTERrrrMACADDRrcs g|] }|dkr|dqS)r<rsr&).0 slave_ifacerr&r' s  z4Renderer._render_bond_interfaces..zBONDING_SLAVE_%szBONDING_SLAVE%srrhotplugrMASTERSLAVE)r r7filter_by_attrr6r4extendrrrCrr"rr(rOr)rr8r9r bond_filter slave_filterrr master_cfgs master_cfgr:r$ bond_slavesr bond_slaveslavestr slave_cfgr&rAr'_render_bond_interfacess`          z Renderer._render_bond_interfacesc Cstd}||D]d}|d}||}|dkr/|d}|r#||d<|d|d|d<n%d|d <d|_|d } t| |d} || vrPtd || d | | |d <|dg} |j } | || |j || || | |q dS)Nrrsrvlan_idVLAN_ID. ETHERDEVICETVLANzvlan-raw-devicezIName '%s' for vlan '%s' is not officially supportedby RHEL. Supported: %srPHYSDEVr)r r7r6rCrfindr_supported_vlan_namesrrr"rr"rr() rr8r9r vlan_filterrrrrQrdev supportedr:r$r&r&r'_render_vlan_interfaces"sB   z Renderer._render_vlan_interfacesc sdgg|D]A}|dD]}d|vr|dd|vr&|dqd|vrIfdd|ddD7fdd|dd D7q|jrYfd d|jD7|jrhfd d|jD7tttgstdStd }|rtj |rtt |}D]}| |qD]}||qtd }t|}||s|d|}|S)Nrrr dnscg|]}|vr|qSr&r&)r?r]found_nameserversr&r'rBY z(Renderer._render_dns.. nameserverscr^r&r&r?r0found_dns_searchr&r'rB^rar0cr^r&r&)r? nameserverr_r&r'rBiracr^r&r&rcrdr&r'rBorar;r)r6rGrdns_searchdomainsanyr!r ResolvConfosrisfilerload_text_fileadd_nameserveradd_search_domainr(rTr1) r8existing_dns_pathrrcontentrf searchdomainheader content_strr&)rer`r' _render_dnsIsZ             zRenderer._render_dnscCsd}td}|D]+}|dD]}d|vsd|vrd}nq|s6d|vr6|dds2|dd r6d}nq |js?|js?|rF|d dd |sJdSdtd d |d g}|S) NFrrrr Tr]rbr0mainrr) rNetworkManagerConfr6rrhset_section_keypairr"r(rN)r8r iface_dnsrqrroutr&r&r'_render_networkmanager_confs:      z$Renderer._render_networkmanager_confr8cCs|dd|j|D}td}||D]}|d}||}|dkr'd|_|D]\} } | |vr9|| || <q+|dkrPd|vrP|drLd|d<nd|d<|d rdd } |dkr]d } |d || <|dkrz|d grzd d|d |d<|d gD] } || } | g}|| j |D]}|}|dkrd}||d<qq|dg}|j }| |||j || ||||qdS)NcSs i|] \}}|dr||qS)r)r1)r?old_knew_kr&r&r' s z6Renderer._render_bridge_interfaces..rrsrronoffrr> LLADDRESS bridge_portsz%sr BRIDGE_PORTSr6rr)ritemsr r7r6rrCr"rGrrr"rr()rr8r9rbridge_key_map bridge_filterrrrrrr?bridged_iface_name bridged_cfg bridged_cfgs bridge_cfg bridge_valuer:r$r&r&r'_render_bridge_interfacessd           z"Renderer._render_bridge_interfacesc Cshtd}||D]'}|d}||}d|_|dg}|j} ||||j|||| ||q dS)Nrrsr) r r7r6rrCrr"rr() rr8r9r ib_filterrrrr:r$r&r&r'_render_ib_interfacess"  zRenderer._render_ib_interfacesc CsV|s|j}i}|D]3}|ddkrq |dp|d}t|d||}|dkr3|d|d|||||||<q ||||||||||||| |||| |||i} | D]@\} }|sq|j r| | |j<|j D] }|r| | |j<q{|jrt|jj|jjgdd gD]\} } | | vr|j | | | <qqh| S) z3Given state, return /etc/sysconfig files + contentsrloopbackr5rsrrrrzr{)rr6rCrrFrr;rPr\rrrrrWrrziprtrv) rrir8rrr9rr5rcontentsrcpathrr&r&r'_render_sysconfigsJ          zRenderer._render_sysconfigreturncs|s|j}d}t||j}|j|||j|dD] \}}t|||q|j r@t||j }|j ||d} | r@t|| ||j rYt||j } | ||} | rYt| | ||j rq||} t||j } tj| | |ddt||d}|drttj|tdg}|jr|d |d tj|rt|D]tfd d d Dstvr|qt|d|d|dSdS)Ni)r)rpT)rqmode preserve_moderr*zNETWORKING=yeszNETWORKING_IPV6=yeszIPV6_AUTOCONF=noc3s|]}|vVqdSr8r&)r?settingliner&r' hs  z0Renderer.render_network_state..) NETWORKINGNETWORKING_IPV6rr)rr target_pathrrrrr write_filerrurr{r_render_persistent_netrCr2 ensure_dirrkrdirnamer(use_ipv6r.existsrm splitlinesrir")r<r8rtarget file_moderirdatarresolv_contentrnm_conf_contentnetrules_contentrsysconfig_pathnetcfgr&rr'render_network_state2sn          zRenderer.render_network_stater8)NN)rZr[r\r]rrr-r,rdict__annotations__r= classmethodrr"r(r4r;rPr\ staticmethodrur{r rrrrrr&r&r&r'r4s        M G   > & B % >  0rcsfdddDS)ziReturn list of supported names for vlan devices per RHEL doc 11.5. Naming Scheme for VLAN Interfaces.csg|] }|jtdqS)rZvid)formatint)r?vrr&r'rB|sz)_supported_vlan_names..)z{rdev}{vid:04}z {rdev}{vid}z{rdev}.{vid:04}z {rdev}.{vid}r&rr&rr'rXys rXcCs0tdtvr dSt|rdSt|rdSdS)NvariantFT)r system_info KNOWN_DISTROSavailable_sysconfigavailable_nm_ifcfg_rhrr&r&r' availablesrcCstt|dS)Nz;usr/lib*/NetworkManager/*/libnm-settings-plugin-ifcfg-rh.so)globrrrr&r&r'rs rcCs`ddg}ddg}|D] }tj|||dsdSq ddg}|D]}tjt||r-d SqdS) Nifupifdownz/sbinz /usr/sbin)r0rFz/etc/sysconfig/network-scripts/network-functionszetc/sysconfig/configT)rwhichrkrrlr)rexpectedr0pexpected_pathsr&r&r'rsr)rr8)&rnrrLloggingrkr/typingrr cloudinitrrcloudinit.distros.parsersrr cloudinit.netrr r r r cloudinit.net.network_stater getLoggerrZrrr(r-r4r5r^rrrXrrrr&r&r&r's<     6nJK