a ahi@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)Z almalinuxZcentosZ cloudlinuxZ eurolinuxZfedoraZ miraclelinuxZ openeulerZ OpenCloudOSZ openmandrivarhelZrockysuseZ TencentOSZ virtuozzo#cCsJddg}tt|D]*}||r6|d||||<q|||<qd|S)Nz1Created by cloud-init automatically, do not edit.  )rangelenjoin)seplinesir;/usr/lib/python3.9/site-packages/cloudinit/net/sysconfig.py _make_header)s rcCsd}|ddko|d|vS)N)z::z0.0.0.0prefixrnetworkr)routeZ default_netsrrr_is_default_route6sr cCs6td|r.|dr$|dr$|Sd|Sn|SdS)Nz\s"z"%s")research startswithendswith)valuerrr _quote_value;s   r'c@sjeZdZdZdddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZdS) ConfigMapz!Sysconfig like dictionary object.yesno)TFcCs i|_dSN_confselfrrr__init__OszConfigMap.__init__cCs||j|<dSr+r,)r/keyr&rrr __setitem__RszConfigMap.__setitem__cCs |j|Sr+r,r/r1rrr __getitem__UszConfigMap.__getitem__cCs |j|Sr+)r-getr3rrrr5Xsz ConfigMap.getcCs ||jvSr+r,r3rrr __contains__[szConfigMap.__contains__cCs|j|ddSr+)r-popr3rrrdrop^szConfigMap.dropcCs t|jSr+)rr-r.rrr__len__aszConfigMap.__len__cCsdS)z6Skip the pair key, value if it matches a certain rule.Frr/r1valrrrskip_key_valuedszConfigMap.skip_key_valuecCst}|t|jr$|dt|jD]X}|j|}|||rNq2t|t rb|j |}t|t stt |}|d|t |fq2| S)Nr%s=%s )ioStringIOwriterr-sortedkeysr< isinstancebool _bool_mapstrr'getvalue)r/bufr1r&rrr to_stringhs       zConfigMap.to_stringcCs|j|dSr+)r-update)r/ZupdatesrrrrJxszConfigMap.updateN)__name__ __module__ __qualname____doc__rEr0r2r4r5r6r8r9r<rIrJrrrrr(Fsr(csReZdZdZfddZddZeddZedd Zd d Z dd dZ Z S)Routez!Represents a route configuration.cs<tt|d|_d|_d|_||_||_||_||_ dS)NF) superrOr0last_idxhas_set_default_ipv4has_set_default_ipv6 _route_name_base_sysconf_dirroute_fn_tpl_ipv4route_fn_tpl_ipv6)r/Z route_namebase_sysconf_diripv4_tplipv6_tpl __class__rrr0szRoute.__init__cCs>t|j|j|j|j}|j|_|j|_|j|_|j |_ |Sr+) rOrUrVrWrXr-copyrRrSrT)r/rrrrr^s z Route.copycCs|j|j|jdSN)basename)rWrVrUr.rrr path_ipv4s zRoute.path_ipv4cCs|j|j|jdSr`)rXrVrUr.rrr path_ipv6s zRoute.path_ipv6cCsd|vS)N:r)r/addressrrr is_ipv6_routeszRoute.is_ipv6_routeipv4c Cs|dvrtdt|t}|t|jr<|dd}t|jD]p}d|vr^qN| dd}t|j|}t|jd|}|dkrV| |sVt|jd |}|d }|d dt|t |f|d dt|t |f|d d t|t |fd |} | |jvrt|j| } |d d t|t | fqN|d krN| |rNt|jd|} d ||jvrdt|jd |nd} |d|| || |j fqN| S)N)rhipv6zUnknown protocol '%s'rADDRESSrGATEWAYrhNETMASKrPr=METRICriPREFIXzmetric z%s/%s via %s %s dev %s ) ValueErrorrFr>r?r@rr-rArBreplacergr'rUrG) r/protorHZreindexr1indexZ address_valueZ gateway_valueZ netmask_valueZ metric_keyZ metric_valueZ prefix_valuerrrrIsp      zRoute.to_string)rh) rKrLrMrNr0r^propertyrcrdrgrI __classcell__rrr\rrO|s    rOcseZdZdZddddddZdfd d Zed d Zejd d ZeddZ e jddZ eddZ dddZ ddZ Z S) NetInterfacezERepresents a sysconfig/networking-script (and its config + children).ZEthernetZBondZBridgeZ InfiniBandVlan)ethernetbondbridge infinibandvlanrxcsrtt|g|_||_|jd}t|||d|dd|_|jd|_||_ ||_ ||j d<||_ dS)Nroute_templatesrhri)rZr[iface_templatesDEVICE) rQrvr0children templatesr5rOroutes iface_fn_tplkind _iface_namer-rV)r/ iface_namerYrrZ route_tplr\rrr0s  zNetInterface.__init__cCs|jSr+)rr.rrrrb szNetInterface.namecCs||_||jd<dS)Nr)rr-)r/rrrrrb scCs|jSr+)_kindr.rrrrszNetInterface.kindcCs,||jvrt|||_|j||jd<dS)NTYPE) iface_typesrprr-)r/rrrrrs cCs|j|j|jdSr`)rrVrbr.rrrpaths zNetInterface.pathFcCsHt|j|j|j|jd}|j|_|r4t|j|_|rD|j |_ |S)N)r) rvrbrVrrr-r^listrr)r/Z copy_childrenZ copy_routescrrrr^#s   zNetInterface.copycCs|dkr|dkrdSdS)NrrwTFrr:rrrr<.szNetInterface.skip_key_value)rx)FF)rKrLrMrNrr0rtrbsetterrrr^r<rurrr\rrvs*       rvc@s,eZdZUdZdddddddd d Zd d d ddddddddddd ZegdZiZe e d<d8ddZ e ddZ e ddZe d d!Ze d"d#Ze d$d%Ze d&d'Ze d(d)Zed9d*d+Zed:d,d-Ze ed.d/d0Ze d1d2Ze d;ed.d3d4Zd<t|d=r|d=|d?<n |d=|d@<dA|vr*|dkr*d9|dA|dB<dC|vr"|dkr"t|dCdDkrht dE|j t|dCt|dCddDd/D]\}}||dFt |<q~q"dS)GNrrrBRIDGEdhcprstartrrdhcp6zipv6_dhcpv6-stateful)dhcp4rZmanagedZDHCLIENT6_MODErTZDHCPV6CZIPV6INITF IPV6_AUTOCONFZIPV6_FAILURE_FATALzipv6_dhcpv6-statelessinfoz-SZDHCPV6C_OPTIONSZ ipv6_slaac)rrr)rZstatic6ZIPV6_MTUrzZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.rZmanualz Unknown subnet type setting "%s"rz1Unknown subnet type '%s' found for interface '%s'rrrjmetricIPV6_ROUTE_METRICIPV4_ROUTE_METRICrnrrDHCLIENT_SET_DEFAULT_ROUTErPz%s/%srfrrZIPADDR6ZIPV6ADDRZ IPADDR6_1ZIPV6ADDR_SECONDARIESz IPADDR6_%drrZIPADDRrmgatewayDEFROUTEIPV6_DEFAULTGWrl dns_searchZDOMAINdns_nameserversz6%s has %d entries in dns_nameservers. Only 3 are used.ZDNS)r8 enumeraterrr5r rDLOGZwarningrbdebugrprrFr r r)rrsubnetshas_default_routerrsubnetZmtu_key subnet_typeZ bootproto_inZ mtu_mismatchZ ipv4_indexZ ipv6_indexZ ipv6_cidrZsuffkrrr_render_subnetss                                                        zRenderer._render_subnetsc Cs||dkr dSt|t|jdD]V\}}|d}|dgD]4}|dpXt|d} t|r2|tvr2|dr~|js|dr|jrt d|j d |d <|d d vrd |d <d|vr| r|d|d<d |_n|d|d<d |_d|vrt|dkr$t |r|d|d<n |d|d<n |d|d<q>dD].\} } | |vr6| |j } || || <q6|j d7_ q>qdS)Nrrrrrirrhz?Duplicate declaration of default route found for interface '%s'Trrrrrrlrrrrrn))rrl)rrn)rro)netmaskrm)rrkrP) rrrr5r r rrSrTrprbr rR) rr route_cfgrr_rrrZis_ipv6rnew_namerrrr_render_subnet_routesksb             zRenderer._render_subnet_routesc Csg}|jD]\\}}||ddg}|D]>}||vr&||}t|ttfrRd|}|||q q&q |r|dkrd||d<nd||d<dS)Nr-rrZBONDING_MODULE_OPTSZ BONDING_OPTS) bond_tpl_optsrqrCtuplerrappend) rrrrZ bond_optsZbond_keyZ value_tplZ bond_keysZ bond_valuerrr_render_bonding_optss zRenderer._render_bonding_optsc Cshtj}||D]R}|dp$|d}|dg}||}|j} ||||j|||| ||qdS)N config_idrbr)r Zfilter_by_physicaliter_interfacesr5rrrr) r network_stateiface_contentsrZphysical_filterrr iface_subnetsrrrrr_render_physical_interfacess z$Renderer._render_physical_interfacescsdtd}td}||D]>}|d|}|||||g}||j|D]} d| d<|dkrXd| _qX|dr|dkr|d|d<n|d|d <|d g} |j } | || |j || || | |t fd d ||D} t| D]`\} }|dkrd | }nd| }|||<||}|dkrLd|d<d|d<q|d<d|d<qqdS)Nry bond-masterrbTZBONDING_MASTERrrrMACADDRrcs g|]}|dkr|dqS)rrbr).0Z slave_ifacerrr s z4Renderer._render_bond_interfaces..zBONDING_SLAVE_%szBONDING_SLAVE%srrZhotplugrZMASTERZSLAVE)r filter_by_typeZfilter_by_attrrrextendrrr5rrrrrAr)rrrrZ bond_filterZ slave_filterrrZ master_cfgsZ master_cfgrrZ bond_slavesrsZ bond_slaveZslavestrZ slave_cfgrrr_render_bond_interfacessZ           z Renderer._render_bond_interfacesc Cstd}||D]}|d}||}|dkr^|d}|rF||d<|d|d|d<nJd|d <d|_|d } t| |d} || vrtd || d | | |d <|dg} |j } | || |j || || | |qdS)Nr|rbrvlan_idZVLAN_ID.Z ETHERDEVICETZVLANzvlan-raw-devicezIName '%s' for vlan '%s' is not officially supportedby RHEL. Supported: %srZPHYSDEVr)r rrr5rfindr_supported_vlan_namesrrrrrrr) rrrrZ vlan_filterrrrrrdevZ supportedrrrrr_render_vlan_interfaces"s@   z Renderer._render_vlan_interfacesc sngg|D]}|dD]0}d|vr6|dd|vr|dqd|vrfdd|ddD7fdd|dd D7q|jrfd d|jD7|jrЈfd d|jD7tttgsdStd }|rtj |rtt |}D]}| |qD]}||q0td }t|}||sj|d|}|S)Nrrrdnscsg|]}|vr|qSrr)rrfound_nameserversrrrYsz(Renderer._render_dns.. nameserverscsg|]}|vr|qSrrrr#found_dns_searchrrr^sr#csg|]}|vr|qSrr)r nameserverrrrriscsg|]}|vr|qSrrrrrrrosr;r)rrrdns_searchdomainsanyrrZ ResolvConfosrisfilerload_text_fileZadd_nameserverZadd_search_domainrrFr$) rexisting_dns_pathrrcontentrZ searchdomainheaderZ content_strr)rrr _render_dnsIsV           zRenderer._render_dnscCsd}td}|D]V}|dD]}d|vs6d|vr"d}q@q"|sd|vr|ddsd|dd rd}qnq|js~|js~|r|d dd t|d krdSdtd d | d g}|S)NFrrrrTrrr#mainrrr) rZNetworkManagerConfrrrZset_section_keypairrrrr@)rrZ iface_dnsrrroutrrr_render_networkmanager_confs8       z$Renderer._render_networkmanager_conf)rcCsdd|j|D}td}||D]P}|d}||}|dkrPd|_|D]\} } | |vrX|| || <qX|dkrd|vr|drd|d<nd|d<|d rd } |dkrd } |d || <|dkr|d grd d|d |d<|d gD]F} || } | g}|| j |D] }|}|dkr:d}||d<q$q|dg}|j }| |||j || ||||q,dS)NcSs i|]\}}|dr||qS)rz)r$)rZold_kZnew_krrr s z6Renderer._render_bridge_interfaces..rzrbrrZonZoffrrZ LLADDRESSZ bridge_portsz%srZ BRIDGE_PORTSr)rr)ritemsr rrrr5rrrrrrr)rrrrZbridge_key_mapZ bridge_filterrrrrrr1Zbridged_iface_nameZ bridged_cfgZ bridged_cfgsZ bridge_cfgZ bridge_valuerrrrr_render_bridge_interfacess^          z"Renderer._render_bridge_interfacesc Cshtd}||D]N}|d}||}d|_|dg}|j} ||||j|||| ||qdS)Nr{rbr) r rrrr5rrrr) rrrrZ ib_filterrrrrrrrr_render_ib_interfacess   zRenderer._render_ib_interfacesc Cs\|s |j}i}|D]f}|ddkr(q|dp8|d}t|d||}|dkrf|d|d|||||||<q||||||||||||| |||| |||i} | D]\} }|s|j r| | |j<|j D]}|r| | |j<q|jrt|jj|jjgdd gD]$\} } | | vr0|j | | | <q0q| S) z3Given state, return /etc/sysconfig files + contentsrZloopbackrrbrrrrhri)rrr5rvr8rrrrrrrrrIrrziprcrd) rrYrrrrrrrcontentsrZcpathrrrrr_render_sysconfigsF           zRenderer._render_sysconfig)rrreturncs|s |j}d}t||j}|j|||j|dD]\}}t|||q4|j rt||j }|j ||d} | rt|| ||j rt||j } | ||} | rt| | ||j r||} t||j } tj| | |ddt||d}|drttj|tdg}|jr8|d |d tj|rt|D]8tfd d d DsTtvrT|qTt|d|d|dS)Ni)r)rT)rmodeZ preserve_moderrzNETWORKING=yeszNETWORKING_IPV6=yeszIPV6_AUTOCONF=noc3s|]}|vVqdSr+r)rZsettinglinerr hsz0Renderer.render_network_state..)Z NETWORKINGZNETWORKING_IPV6rr)rr target_pathrrrrrZ write_filerrrrrZ_render_persistent_netr5r%Z ensure_dirrrdirnamerZuse_ipv6rexistsr splitlinesrr)r/rrtargetZ file_moderYrdatarZresolv_contentrZnm_conf_contentZnetrules_contentrZsysconfig_pathZnetcfgrr rrender_network_state2sh         zRenderer.render_network_state)N)N)N)N)NN)rKrLrMrNrrrrrdict__annotations__r0 classmethodrrrrrrr staticmethodrrr rrrrrrrrrr4s~        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)rvrrrr|sz)_supported_vlan_names..)z{rdev}{vid:04}z {rdev}{vid}z{rdev}.{vid:04}z {rdev}.{vid}rrrrrrys rcCs0tdtvrdSt|r dSt|r,dSdS)NZvariantFT)rZ system_info KNOWN_DISTROSavailable_sysconfigavailable_nm_ifcfg_rhrrrr availablesr!cCstt|dS)Nz;usr/lib*/NetworkManager/*/libnm-settings-plugin-ifcfg-rh.so)globrrr rrrrs rcCs`ddg}ddg}|D]}tj|||dsdSqddg}|D]}tjt||r<d SqZloggingrr"typingrrZ cloudinitrrZcloudinit.distros.parsersrrZ cloudinit.netrr r r r Zcloudinit.net.network_stater Z getLoggerrKrrrr r'r(rOrvrrr!rrrrrrs:    6nJK